1️⃣ Я обычно использую следующий набор ключей при снятии дампа с помощью mysqldump:
# mysqldump -v --add-drop-database --add-locks --create-options --disable-keys --extended-insert --single-transaction --quick --set-charset --routines --events --triggers --comments --quote-names --order-by-primary --hex-blob --databases dbname01 > dbname01.sqlНе буду их все пояснять, можно у ИИ спросить. Сделаю акцент на
--single-transaction. Этот ключ позволяет избежать блокировок при снятии дампа, в отличие от ключа --opt, который используется по умолчанию и включает в том числе --lock-tables. Пришлось от него отказаться и вручную перечислить некоторые его ключи, убрав блокировку.Если какая-то таблица из-за ошибок не бэкапится и останавливает процесс снятия дампа, её можно исключить из дампа ключом
--ignore-table=dbname01.table_01.2️⃣ В таком дампе из-за ключа
--add-drop-database в начале идёт команда на удаление базы данных: DROP DATABASE IF EXISTS `dbname01`;и создание новой: CREATE DATABASE IF NOT EXISTS `dbname01`; Я использую этот ключ, потому что удобно автоматически восстанавливать исходники и дамп базы по расписанию на каком-то тестовом сервере. Не нужно менять никакие настройки, не надо удалять старую базу и создавать новую. Берём бэкапы с прода и восстанавливаем их в неизменном виде.Но это создаёт неудобство, если нужно из бэкапа восстановить копию базы на проде. Если забыть об этом, то при восстановлении базы данных, исходная удаляется. Поэтому перед восстановлением нужно заменить в дампе имя базы данных. Это нетривиальная задача, если дамп очень большой. Нельзя просто открыть его и вручную изменить имя базы. Сделать это проще всего с помощью sed. Меняем
dbname01 на dbname01_copy, везде, где встречается:# sed -i 's/`dbname01`/`dbname01_copy`/g' dbname01.sqlПосле этого можно создавать базу данных dbname01_copy и восстанавливать в неё содержимое дампа:
# mysql> CREATE DATABASE dbname01_copy;> use dbname01_copy;> source ~/dbname01.sql;Получили рядом копию рабочей базы.
3️⃣ Проще и удобнее делать полный дамп базы, особенно если в ней очень много таблиц. Можно бэкапить потаблично, но лично я так почти никогда не делаю. Из полного дампа легко получить бэкап отдельной таблицы, если это потребуется. Поможет awk:
# cat dbname01.sql | /usr/bin/awk '/CREATE TABLE `table_01`/,/UNLOCK TABLES/' > /tmp/table_01.sqlТеперь можно восстановить отдельную таблицу.
❗️Если заметка вам полезна, не забудьте 👍 и забрать в закладки.
#mysql