Задача: Подготовить шпаргалку по настройке mysql-server применительно к Ubuntu 22.04 Server, а то каждый раз приходится вспоминать что помимо установки нужно сделать

  • Как задать пароль на системную учетную запись Login:root
  • Как создать базу, пользователя, пароль на этого пользователя
  • Как ограничить подключение из вне к этому сервису
  • и многое другое что мне обычно в работе нужно.

Я такие документы на работе и для интересующих меня тем делаю постоянно, вот и сейчас есть время почему бы не упорядочить и собрать все воедино.

Шаг №1: Обновляем информацию по дефолтным репозитариям Ubuntu 22.04 Server

sudo rm -Rf /var/lib/apt/lists
sudo apt-get update

Шаг №2: Устанавливаем mysql-Server-8.0 и mysql-client-8.0:

sudo apt-get install -y mysql-server mysql-client

Проверка какая версия установлена в системе сейчас:

ekzorchik@srv-home:~$ sudo mysqld -Version
/usr/sbin/mysqld  Ver 8.0.35-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
ekzorchik@srv-home:~$

Шаг №3: Изменяю схему авторизации и назначаю пароль на системную учетной запись root сервиса MySQL:

ekzorchik@srv-home:~$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
default-authentication-plugin=mysql_native_password

Шаг №4: Задаем пароль на системную учетную запись Login:root сервиса MySQL:

ekzorchik@srv-home:~$ sudo mysql -u root -e "ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '712mbddr@';"

Шаг №5: Выполнить базовую безопасность:

ekzorchik@srv-home:~$ sudo mysql_secure_installation

Шаг №6: Пробуем подключиться к сервису MySQL с указанием установленного пароля на системную учетную запись Login:root и выполнить команду:

ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e "use mysql;select version()\g"
mysql: [Warning] Using a password on the command line interface can be insecure.
+-------------------------+
| version()               |
+-------------------------+
| 8.0.35-0ubuntu0.22.04.1 |
+-------------------------+
ekzorchik@srv-home:~$

Шаг №7: Смотрим какие схемы авторизации сейчас в Mysql доступны:

ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e " use mysql;SELECT user,authentication_string,plugin,host FROM mysql.user;"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
| user             | authentication_string                                                  | plugin                | host      |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
aT onN-I(6uvT+d/NHYR//54c3v894opBmnS0pZ/wvc9ZTUhOE34w6Yz0 | caching_sha2_password | localhost |
| mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED | caching_sha2_password | localhost |
| root             | *06311EC3368F51D40BE586479970CB6B5CD288D8                              | mysql_native_password | localhost |
+------------------+------------------------------------------------------------------------+-----------------------+-----------+
ekzorchik@srv-home:~$

из вывода видно, что из-под Login:root можно подключаться только как native, просто часто для всех сервисов которые я использовал только это требовалось чтобы было.

Шаг №8: Чтобы создать базу если не существует: (Лучше делать так)

sudo mysql -u root -p712mbddr@ -e "create database if not exists db_db2

Шаг №9: Чтобы создать учетную запись с указанием откуда (к примеру, из сети 192.168.1.0/24) под ней будут подключаться и каким паролем:

sudo mysql -u root -p712mbddr@ -e "create user 'us_us2'@'192.168.1.%' identified by 'Aa1234567';"
ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e "use mysql;select user,host from mysql.user"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+-------------+
| user             | host        |
+------------------+-------------+
| us_us2           | 192.168.1.% |
| debian-sys-maint | localhost   |
| mysql.infoschema | localhost   |
| mysql.session    | localhost   |
| mysql.sys        | localhost   |
| root             | localhost   |
| us_db1           | localhost   |
+------------------+-------------+
ekzorchik@srv-home:~$

Шаг №10: Чтобы создать пароль, на пользователя, который включает в себя спецсимволы, пароль нужно взять в одинарные кавычки:

sudo mysql -u root -p712mbddr@ -e "alter user 'us_db1'@'localhost' identified with mysql_native_password by '712mbddr_@_@_E';"

Шаг №11: Чтобы создать базу исключительно в определенной кодировке:

sudo mysql -u root -p712mbddr@ -e "create database db_db1 character set utf8mb4 collate utf8mb4_unicode_ci"
sudo mysql -u root -p712mbddr@ -e "create user 'us_db1'@'localhost' identified by '612mbddr@'"
sudo mysql -u root -p712mbddr@ -e "grant all on db_db1.* to 'us_db1'@'localhost';"
sudo mysql -u root -p712mbddr@ -e "flush privileges"

командами выше я создать базу с характеристиками, пользователя с паролем и назначаю полные права созданному пользователя на созданную базу. После чего данные данные

Database: db_db1

User: us_db1

Password: 612mbddr@

можно использовать при развертывании того или иного сервиса

к примеру, для Zabbix:

sudo mysql -u root -p712mbddr@ -e "create database db_zabbix character set utf8 collate utf8_bin"

к примеру, для phpbb:

sudo mysql -u root -p712mbddr@ -e "create database db_phpbb"

На заметку: или просто указываем create database db_db1 без дальнейших указаний.

Шаг №12: Чтобы к базе можно было подключиться с другой системы, я делаю следующее:

в /etc/mysql/mysql.conf.d/mysqld.cnf

#bind-address           = 127.0.0.1

bind-address = 0.0.0.0

перезапускаю mysql: sudo systemctl restart mysql

и дабы не все подряд могли подключиться настраиваю firewalld для явно с определенных IP-адресов подключение

sudo firewall-cmd --new-zone=mysqlzone --permanent
sudo firewall-cmd --permanent --zone=mysqlzone --add-source=999.999.999.999/32
sudo firewall-cmd --permanent --zone=mysqlzone --add-port=3306/tcp
sudo firewall-cmd –-reload
sudo firewall-cmd --zone=mysqlzone --list-all

после подключение с другой системы к этой системы сервиса mysql будет выглядеть вот так:

sudo mysql -u us_db1 -p612mbddr@ -h 999.999.999.999 db_db1 -e "show tables"

где указываем Login, Pass, IP&DNS удаленной системы к которой подключается с той IP адрес которой прописали в firewalld

Шаг №13: Отобразить какие учетные записи созданы в mysql:

ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e "use mysql;select user,host from mysql.user"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| debian-sys-maint | localhost |
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
| us_db1           | localhost |
+------------------+-----------+
ekzorchik@srv-home:~$

Шаг №14: Чтобы отобразить какие базы вообще есть на сервере:

ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e "show databases"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------+
| Database           |
+--------------------+
| db_db1             |
| db_db2             |
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
ekzorchik@srv-home:~$

Шаг №15: Отобразить какие права доступа у учетной записи сервиса mysql в базе:

ekzorchik@srv-home:~$ sudo mysql -u root -p712mbddr@ -e "use db_db1; show grants for 'us_db1'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------------------------------------------------+
| Grants for us_db1@localhost                                |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `us_db1`@`localhost`                 |
| GRANT ALL PRIVILEGES ON `db_db1`.* TO `us_db1`@`localhost` |
+------------------------------------------------------------+
ekzorchik@srv-home:~$

Шаг №16: Чтобы отозвать права у mysql учетной записи на базу, т.к. к примеру, дали Insert, а было Select и поэтому после вернуть на Select:

sudo mysql -u root -p712mbddr@ -e "use db_db1; grant insert on db_db1.* to 'us_db1'@'localhost';"

Отобрать все права:

sudo mysql -u root -p712mbddr@ -e "use db_db1; revoke all privileges on *.* from 'us_db1'@'localhost';"

Отобразить текущий права:

sudo mysql -u root -p712mbddr@ -e "use db_db1; show grants for 'us_db1'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+--------------------------------------------+
| Grants for us_db1@localhost                |
+--------------------------------------------+
| GRANT USAGE ON *.* TO `us_db1`@`localhost` |
+--------------------------------------------+

Дать права Select:

sudo mysql -u root -p712mbddr@ -e "use db_db1; grant select on db_db1.* to 'us_db1'@'localhost';"

Отобразить текущие права:

sudo mysql -u root -p712mbddr@ -e "use db_db1; show grants for 'us_db1'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+----------------------------------------------------+
| Grants for us_db1@localhost                        |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `us_db1`@`localhost`         |
| GRANT SELECT ON `db_db1`.* TO `us_db1`@`localhost` |
+----------------------------------------------------+

Отлично, а если нужно дополнить права, к примеру, чтобы были: Select + Insert вместе взятые:

sudo mysql -u root -p712mbddr@ -e "use db_db1; grant select,insert on db_db1.* to 'us_db1'@'localhost';"
sudo mysql -u root -p712mbddr@ -e "use db_db1; show grants for 'us_db1'@'localhost';"
mysql: [Warning] Using a password on the command line interface can be insecure.
+------------------------------------------------------------+
| Grants for us_db1@localhost                                |
+------------------------------------------------------------+
| GRANT USAGE ON *.* TO `us_db1`@`localhost`                 |
| GRANT SELECT, INSERT ON `db_db1`.* TO `us_db1`@`localhost` |
+------------------------------------------------------------+

Отлично

Шаг №17: Чтобы сделать дамп базы и сжать ее:

mysqldump -u root -p712mbddr@ production | gzip -9 > 134012122023/Alldb-production$bfile.sql.gz

На заметку: Лучше делать дам таблицы так:

mysqldump -v --insert-ignore --skip-lock-tables --single-transaction=TRUE -u root -p712mbddr@ db_tablo | /bin/gzip -9 > $FOLDER/srv-tablo_$efile.sql.gz

или так:

mysqldump --single-transaction --set-gtid-purged=OFF -uroot -p712mbddr@ db_site | gzip -9 > /etc/dbackup/db_site_$bfile.sql.gz

Шаг №18: Чтобы из определенной базы сделать дам определенной таблицы внутри нее:

sudo mysqldump -u root -712mbddr@ db_dealers29052022 order_positions > order_positions.sql

Шаг №19: если вам нужна только структура данных и атрибуты столбцов исходной таблицы, без наполнения её данными из исходной.

sudo mysql -u root -712mbddr@ db_dealers -e "create table order_positions_temp like order_positions"
sudo mysql -u root -712mbddr@ db_dealers -e "select * from order_positions_temp"

содержимого в новой таблице нет

Шаг №20: Если нужно из бекапа взять определенную таблицу и восстановить ее в другую таблицу под другим именем другой базы с которой работают разработчики:

План:

а) создаем базу (это база в которую я буду разворачивать бекап)

sudo mysql -u root -712mbddr@ -e «create database db_production»

б) восстанавливаем в созданную базу dump из бекапа

aollo@customizer:~$ sudo mkdir /backuprecovery

aollo@customizer:~$ sudo cp /backup/14-05-2023/Alldb-production140523_09_08_03.sql.gz /backuprecovery/

aollo@customizer:/backuprecovery$ sudo gzip -d Alldb-production140523_09_08_03.sql.gz

aollo@customizer:/backuprecovery$ ls

Alldb-production140523_09_08_03.sql

aollo@customizer:/backuprecovery$ sudo mysql -u root -712mbddr@ db_production < Alldb-production140523_09_08_03.sql

в) сохраняем из восстановленной базы определенную таблицу

aollo@customizer:/backuprecovery$ sudo mysql -u root -712mbddr@ db_production -e «show tables» | grep dealers_employees

mysql: [Warning] Using a password on the command line interface can be insecure.

dealers_employees

dealers_employees_permissions

dealers_employees_to_permissions

aollo@customizer:/backuprecovery$

aollo@customizer:/backuprecovery$ sudo su —

root@customizer:/backuprecovery# mysqldump -u root -712mbddr@ db_production dealers_employees > /backuprecovery/dealers_employees.sql

т.е. мне нужно таблицу dealers_employees из бекапа сохранить, как файл.

г) создаем новую базу или используем существующую

д) Клонируем в существующей базе таблицу в другое именование

е) восстанавливаем в другое именование таблицы экспортированную таблицу.

sudo mysql -u root -712mbddr@ development -e «create table dealers_employees_2 as select * from db_production.dealers_employees»

где База development — боевая тестовая база разработкиков

db_production — база в которой развернут бекап

т.е. я в базе development создаю таблицу dealers_employees_2 содержимое которой беру из бекап базы db_production таблицы dealers_employees

тем самым и не нужно сохранять таблицу в sql файл.

Шаг №21: Узнать размер SQL Базы через запрос:

Узнать размер базы Mysql-запросом

SELECT table_schema AS "<database_name>",
ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size in (MB)"
FROM information_schema.TABLES
WHERE table_schema = "<database_name"
GROUP BY table_schema;

На заметку: Насчет использования плагина проверки сложности пароля советую ознакомиться с заметкой: "Плагин validate_password в mysql-server на Ubuntu 22.04"

Итого я пока частично собрал по всем своим наработкам что мне приходилось делать с mysql, если что еще по возникающим задачам будет интересного, то все это найдет себя, как продолжение в текущей заметке. С уважением, автор блога Олло Александр aka ekzorchik.