service:mysql
Различия
Показаны различия между двумя версиями страницы.
Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
service:mysql [19.10.2023 17:22] – [Инкрементные копии] viacheslav | service:mysql [30.07.2024 19:21] (текущий) – внешнее изменение 127.0.0.1 | ||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== MySQL ====== | ||
+ | Основы SQL: https:// | ||
+ | |||
+ | ===== Импорт ===== | ||
+ | Скрипт Powershell для преобразования списка баз MySQL в команды для импорта сжатых баз | ||
+ | <code powershell> | ||
+ | $src = " | ||
+ | -rw-r--r-- 1 root root 1902716934 Nov 26 07:57 ccc.sql.gz | ||
+ | -rw-r--r-- 1 root root 8586406 Nov 26 07:57 sitemanager.sql.gz | ||
+ | -rw-r--r-- 1 root root | ||
+ | " | ||
+ | |||
+ | # Кроме mysql.sql.gz, | ||
+ | ($src.split().where{$_ -match ' | ||
+ | # Удалить базу | ||
+ | "mysql -e `"drop database $($_ -replace ' | ||
+ | # Создать базу | ||
+ | "mysql -e `" | ||
+ | # Импортировать их архива | ||
+ | "zcat $_ | mysql $($_ -replace ' | ||
+ | }) |Set-Clipboard | ||
+ | |||
+ | mysql -e "drop database ccc"; | ||
+ | mysql -e " | ||
+ | zcat ccc.sql.gz | mysql ccc | ||
+ | mysql -e "drop database sitemanager"; | ||
+ | mysql -e " | ||
+ | zcat sitemanager.sql.gz | mysql sitemanager | ||
+ | mysql -e "drop database testcab"; | ||
+ | mysql -e " | ||
+ | zcat testcab.sql.gz | mysql testcab | ||
+ | </ | ||
+ | |||
+ | ===== Slow queries ===== | ||
+ | <code bash> | ||
+ | # найти расположение лога | ||
+ | show global variables like ' | ||
+ | # статистика по логу | ||
+ | mysqldumpslow / | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ===== Удалить mysql ===== | ||
+ | <code bash> | ||
+ | # Use apt to uninstall and remove all MySQL packages: | ||
+ | $ sudo apt-get remove --purge mysql-server mysql-client mysql-common -y | ||
+ | $ sudo apt-get autoremove -y | ||
+ | $ sudo apt-get autoclean | ||
+ | # Remove the MySQL folder: | ||
+ | $ rm -rf /etc/mysql | ||
+ | # Delete all MySQL files on your server: | ||
+ | $ sudo find / -iname ' | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ===== Перенос баз с одного сервера на другой ===== | ||
+ | ==== Все базы ==== | ||
+ | <code bash> | ||
+ | # dump all your MySQL databases to a single file using the mysqldump command. | ||
+ | mysqldump -u [user] -p --all-databases > all_databases.sql | ||
+ | # Transfer MySQL Databases Dump File to New Server | ||
+ | scp all_databases.sql user@example.com: | ||
+ | # Import MySQL Databases Dump File to New Server | ||
+ | mysql -u [user] -p --all-databases < all_databases.sql | ||
+ | # in case it's very old server | ||
+ | mysql -u [user] -p < all_databases.sql | ||
+ | </ | ||
+ | |||
+ | ==== Одна база ==== | ||
+ | <code bash> | ||
+ | mysqldump -u [user] -p --opt one_db > / | ||
+ | scp / | ||
+ | # На новом сервере | ||
+ | mysql -u root -p | ||
+ | </ | ||
+ | <code sql> | ||
+ | -- Создать базу, пользователя и дать ему права на базу | ||
+ | CREATE DATABASE one_db; | ||
+ | CREATE USER ' | ||
+ | GRANT ALL PRIVILEGES ON one_db . * TO ' | ||
+ | FLUSH PRIVILEGES; | ||
+ | quit; | ||
+ | </ | ||
+ | <code bash> | ||
+ | mysql -u username -p one_db < / | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | ==== Перенос вообще всего - баз, пользователей, | ||
+ | <code bash> | ||
+ | # Stop server before! | ||
+ | systemctl stop mysql | ||
+ | rsync -avz / | ||
+ | # on the new server | ||
+ | chown mysql:mysql -R / | ||
+ | </ | ||
+ | https:// | ||
+ | ==== Прогресс-бар при импорте ==== | ||
+ | <code bash> | ||
+ | # mysql database < database.sql | ||
+ | pv database.sql |mysql -uxxxx -pxxxx database | ||
+ | # если уже запущено без прогресс-бара | ||
+ | pv --watchfd $(pidof mysql) # в другой консоли | ||
+ | </ | ||
+ | |||
+ | ===== MyISAM ↔ InnoDB ===== | ||
+ | <code mysql> | ||
+ | # To convert all DBNAME’s InnoDB Tables to MyISAM | ||
+ | SELECT CONCAT(' | ||
+ | FROM Information_schema.TABLES WHERE TABLE_SCHEMA = ' | ||
+ | |||
+ | # To convert all DBNAME’s MyISAM Tables to InnoDB | ||
+ | SELECT CONCAT(' | ||
+ | FROM Information_schema.TABLES WHERE TABLE_SCHEMA = ' | ||
+ | |||
+ | # To convert all InnoDB Tables to MyISAM (all databases) | ||
+ | SELECT CONCAT(' | ||
+ | FROM information_schema.TABLES WHERE ENGINE = ' | ||
+ | |||
+ | # To convert all MyISAM Tables to InnoDB (all databases) | ||
+ | SELECT CONCAT(' | ||
+ | FROM information_schema.TABLES WHERE ENGINE = ' | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | [[https:// | ||
+ | |||
+ | <code sql> | ||
+ | # info | ||
+ | SHOW TABLES FROM database_name; | ||
+ | SHOW TABLE STATUS FROM database_name WHERE Name=' | ||
+ | </ | ||
+ | ===== Полезные команды ===== | ||
+ | <code bash> | ||
+ | # Проверить и починить все таблицы во всех базах MySQL (bash): | ||
+ | mysqlcheck -u root -p --auto-repair --check --all-databases | ||
+ | </ | ||
+ | <code sql> | ||
+ | -- Список пользователей: | ||
+ | SELECT User FROM mysql.user; | ||
+ | |||
+ | -- Посмотреть права: | ||
+ | SHOW GRANTS FOR ' | ||
+ | |||
+ | -- Поменять пароль: | ||
+ | set password for ' | ||
+ | flush privileges; | ||
+ | |||
+ | -- Удалить базу, создать базу: | ||
+ | drop database database_name; | ||
+ | create database database_name; | ||
+ | |||
+ | -- Показать список баз: | ||
+ | show databases; | ||
+ | |||
+ | -- Вывести информацию о формате файлов баз | ||
+ | show variables like ' | ||
+ | +--------------------------+----------+ | ||
+ | | Variable_name | ||
+ | +--------------------------+----------+ | ||
+ | | innodb_file_format | ||
+ | | innodb_file_format_check | ON | | ||
+ | | innodb_file_format_max | ||
+ | | innodb_file_per_table | ||
+ | +--------------------------+----------+ | ||
+ | 4 rows in set (0.00 sec) | ||
+ | |||
+ | -- Размер баз | ||
+ | -- https:// | ||
+ | SELECT table_schema AS " | ||
+ | ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS "Size (MB)" | ||
+ | FROM information_schema.TABLES | ||
+ | GROUP BY table_schema; | ||
+ | +--------------------+-----------+ | ||
+ | | Database | ||
+ | +--------------------+-----------+ | ||
+ | | information_schema | 0.16 | | ||
+ | | mysql | 2.65 | | ||
+ | | performance_schema | 0.00 | | ||
+ | | sys | 0.02 | | ||
+ | | zabbix | ||
+ | +--------------------+-----------+ | ||
+ | 5 rows in set (3.80 sec) | ||
+ | |||
+ | -- Дать права пользователю username на таблицу table_name в базе database_name. | ||
+ | -- Таблицу и базу можно заменить звёздочками, | ||
+ | GRANT ALL PRIVILEGES ON database_name . table_name TO ' | ||
+ | |||
+ | -- Извлечь ФИО и дни рожденья из БД Битрикса (http:// | ||
+ | use dbname; | ||
+ | select concat(last_name, | ||
+ | |||
+ | -- Вывести выборочную информацию о таблицах в базе mydb (engine - движок MyISAM или InnoDB) | ||
+ | SELECT table_name, | ||
+ | </ | ||
+ | |||
+ | ==== Сделать пользователя и дать ему все права на базы ==== | ||
+ | <code sql> | ||
+ | # только локальный вход: | ||
+ | CREATE USER ' | ||
+ | # с подсети 192.168.1.0 | ||
+ | CREATE USER ' | ||
+ | # вход откуда угодно | ||
+ | CREATE USER ' | ||
+ | # * . * - database_name . table_name | ||
+ | GRANT ALL PRIVILEGES ON * . * TO ' | ||
+ | FLUSH PRIVILEGES; | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | На чтение: | ||
+ | <code sql> | ||
+ | GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON * . * TO ' | ||
+ | FLUSH PRIVILEGES; | ||
+ | </ | ||
+ | Чтение в таком виде можно дать только глобально, | ||
+ | <color # | ||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ==== Вернуть руту права логина без ввода пароля ==== | ||
+ | <code sql> | ||
+ | update mysql.user set authentication_string=password('' | ||
+ | flush privileges; | ||
+ | quit; | ||
+ | </ | ||
+ | |||
+ | ==== Ошибки ==== | ||
+ | <color # | ||
+ | <code bash> | ||
+ | nano / | ||
+ | # Закомментировать | ||
+ | bind-address = 127.0.0.1 | ||
+ | # Если там нет этого параметра, | ||
+ | nano / | ||
+ | # Перезапустить mysql | ||
+ | systemctl restart mysql | ||
+ | </ | ||
+ | |||
+ | <color # | ||
+ | В данном случае, | ||
+ | <code sql> | ||
+ | UPDATE mysql.user SET Host=' | ||
+ | FLUSH PRIVILEGES; | ||
+ | </ | ||
+ | |||
+ | <color # | ||
+ | <code sql> | ||
+ | SET GLOBAL innodb_lru_scan_depth=256; | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | ===== Кластер ===== | ||
+ | Лучше делать MariaDB Galera cluster, т. к. все узлы активные. | ||
+ | |||
+ | Выбор репозиториев: | ||
+ | |||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | <code bash> | ||
+ | # Поставить необходимые компоненты | ||
+ | apt install socat mariadb-backup -y | ||
+ | |||
+ | # Создать кластер: | ||
+ | galera_new_cluster | ||
+ | |||
+ | # Количество нод | ||
+ | mysql -e "show status like ' | ||
+ | # Состояние | ||
+ | mysql -e "SHOW STATUS LIKE ' | ||
+ | # Полный статус | ||
+ | mysql -e "SHOW GLOBAL STATUS LIKE ' | ||
+ | |||
+ | # Конфиг | ||
+ | nano / | ||
+ | |||
+ | [mysqld] | ||
+ | # Если запустить без этого параметра, | ||
+ | # [ERROR] WSREP: Only binlog_format = ' | ||
+ | binlog_format=ROW | ||
+ | default-storage-engine=innodb | ||
+ | innodb_autoinc_lock_mode=2 | ||
+ | bind-address=0.0.0.0 | ||
+ | |||
+ | # Galera Provider Configuration | ||
+ | wsrep_on=ON | ||
+ | wsrep_provider=/ | ||
+ | |||
+ | # Galera Cluster Configuration | ||
+ | wsrep_cluster_name=" | ||
+ | wsrep_cluster_address=" | ||
+ | |||
+ | # Galera Synchronization Configuration | ||
+ | # Неблокирующий и быстрый вариант синхронизации, | ||
+ | wsrep_sst_method=mariabackup | ||
+ | # При режиме mariabackup аутентификация обязательна (надо завести юзера и пароль на всех нодах) | ||
+ | # https:// | ||
+ | wsrep_sst_auth = mariabackup: | ||
+ | |||
+ | # Galera Node Configuration | ||
+ | wsrep_node_address=" | ||
+ | wsrep_node_name=" | ||
+ | </ | ||
+ | |||
+ | Если все узлы кластера выключены, | ||
+ | |||
+ | Как из кластера вернуться [[https:// | ||
+ | |||
+ | ===== Workbench (Docker) ===== | ||
+ | <code bash> | ||
+ | docker run --rm --name=mysql-workbench -p 3000:3000 -p 3001:3001 lscr.io/ | ||
+ | </ | ||
+ | |||
+ | ===== xtrabackup ===== | ||
+ | ==== Установка из tarball ==== | ||
+ | Если система древняя, | ||
+ | <code bash> | ||
+ | wget https:// | ||
+ | mkdir / | ||
+ | tar xf xtrabackup.tar.gz --strip=1 -C / | ||
+ | rm xtrabackup.tar.gz | ||
+ | ln -s / | ||
+ | # Т. к. mariabackup и xtrabackup имеют фактически идентичный синтаксис, | ||
+ | # можно сделать алиас, чтобы не переделывать скрипт для разных серверов | ||
+ | ln -s / | ||
+ | </ | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | ==== Бэкап ==== | ||
+ | Права на базу для бэкапа: | ||
+ | <code sql> | ||
+ | CREATE USER ' | ||
+ | GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE, PROCESS, SUPER, CREATE, ALTER, INSERT, SELECT ON *.* TO ' | ||
+ | FLUSH PRIVILEGES; | ||
+ | </ | ||
+ | https:// | ||
+ | |||
+ | <code bash> | ||
+ | # Полный бэкап | ||
+ | xtrabackup --backup --target-dir=/ | ||
+ | # " | ||
+ | xtrabackup --prepare --target-dir=/ | ||
+ | # Если полный бэкап будет основой для последующих инкрементных: | ||
+ | xtrabackup --prepare --target-dir=/ | ||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | ==== Инкрементные копии ==== | ||
+ | Базируются на log sequence number (LSN) - это версия страниц БД. Т. к. при инкрементном бэкапе не используется сравнение с предыдущим бэкапом, | ||
+ | Основой для инкрементных бэкапов может являться только полный бэкап, частичный не может. | ||
+ | |||
+ | Если после полного бэкапа посмотреть файл xtrabackup_checkpoints, | ||
+ | < | ||
+ | backup_type = full-backuped | ||
+ | from_lsn = 0 | ||
+ | to_lsn = 1626007 | ||
+ | last_lsn = 1626007 | ||
+ | compact = 0 | ||
+ | recover_binlog_info = 1 | ||
+ | </ | ||
+ | |||
+ | Сделаем инкрементную копию, указав каталог полного бэкапа как основу, | ||
+ | <code bash> | ||
+ | xtrabackup --backup --target-dir=/ | ||
+ | --incremental-basedir=/ | ||
+ | </ | ||
+ | |||
+ | Если открыть файл xtrabackup_checkpoints уже в каталоге инкрементной копии: | ||
+ | < | ||
+ | backup_type = incremental | ||
+ | from_lsn = 1626007 | ||
+ | to_lsn = 4124244 | ||
+ | last_lsn = 4124244 | ||
+ | compact = 0 | ||
+ | recover_binlog_info = 1 | ||
+ | </ | ||
+ | |||
+ | Теперь можно делать инкрементную копию уже указывая каталог предыдущей инкрементной копии: | ||
+ | <code bash> | ||
+ | xtrabackup --backup --target-dir=/ | ||
+ | --incremental-basedir=/ | ||
+ | </ | ||
+ | |||
+ | В xtrabackup_checkpoints '' | ||
+ | < | ||
+ | backup_type = incremental | ||
+ | from_lsn = 4124244 | ||
+ | to_lsn = 6938371 | ||
+ | last_lsn = 7110572 | ||
+ | compact = 0 | ||
+ | recover_binlog_info = 1 | ||
+ | </ | ||
+ | |||
+ | Подготовка инкрементных бэкапов отличатся от подготовки полных. У полных делается 2 операции для обеспечения консистентности: | ||
+ | - Зафиксированные транзакции воспроизводятся из файла журнала в сравнении с файлами данных | ||
+ | - Незафиксированные транзакции откатываются | ||
+ | У инкрементных копий откат незафиксированных транзакций проводиться не должен, | ||
+ | Если '' | ||
+ | |||
+ | Следовательно, | ||
+ | |||
+ | 1) Подготовить полный бэкап с указанием '' | ||
+ | < | ||
+ | xtrabackup --prepare --apply-log-only --target-dir=/ | ||
+ | </ | ||
+ | Если сразу восстановить такой полный бэкап - а это можно сделать - то MySQL при запуске перейдёт в режим восстановления и сам откатит незафиксированные транзакции, | ||
+ | |||
+ | 2) Применить первую инкрементную копию к полной: | ||
+ | < | ||
+ | xtrabackup --prepare --apply-log-only --target-dir=/ | ||
+ | --incremental-dir=/ | ||
+ | </ | ||
+ | Здесь дельта применяется к основным файлам и версия сдвигается вперёд по времени и будет соответствовать меткам inc1. Результат будет в каталоге base, а не в каталоге inc1. Теперь при восстановлении ''/ | ||
+ | :!: Применение одной и той же инкрементной копии на две копии бэкапа не поддерживается. Не запускайте два раза '' | ||
+ | |||
+ | 3) Применить вторую инкрементную копию по аналогии с первой: | ||
+ | < | ||
+ | xtrabackup --prepare --target-dir=/ | ||
+ | --incremental-dir=/ | ||
+ | </ | ||
+ | Так как эта копия последняя, | ||
+ | |||
+ | После применения всех инкрементных копий можно восстанавливать БД как обычно. | ||
+ | |||
+ | ==== Сжатие ==== | ||
+ | xtrabackup | ||
+ | <code bash> | ||
+ | xtrabackup --backup --parallel 2 --stream=tar | gzip - > / | ||
+ | </ | ||
+ | |||
+ | mariabackup | ||
+ | <code bash> | ||
+ | mariabackup --backup --user root --parallel 2 --stream=xbstream | gzip - > / | ||
+ | mkdir / | ||
+ | gunzip -c / | ||
+ | </ | ||
+ | |||
+ | <code bash> | ||
+ | # initial full backup | ||
+ | mariabackup --backup --stream=mbstream \ | ||
+ | --user=mariabackup --password=mypassword \ | ||
+ | --extra-lsndir=backup_base | gzip > backup_base.gz | ||
+ | |||
+ | # incremental backup | ||
+ | mariabackup --backup --stream=mbstream \ | ||
+ | --user=mariabackup --password=mypassword \ | ||
+ | --incremental-basedir=backup_base \ | ||
+ | --extra-lsndir=backup_inc1 | gzip > backup-inc1.gz | ||
+ | </ | ||
+ | '' | ||
+ | |||
+ | https:// | ||
+ | ==== Восстановление ==== | ||
+ | <code bash> | ||
+ | # Восстановление в каталог datadir сервера, | ||
+ | xtrabackup --copy-back --target-dir=/ | ||
+ | # Восстановление с удалением бэкапа | ||
+ | # xtrabackup --move-back --target-dir=/ | ||
+ | # Может потребоваться поправить разрешения в каталоге перед запуском сервера | ||
+ | chown -R mysql:mysql / | ||
+ | </ | ||
+ | |||
+ | ==== Литература ==== | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | [[https:// | ||
+ | |||
+ | [[https:// | ||
+ | [[https:// | ||
+ | [[https:// | ||