Проницательность в создание резервных копий с mysqldump
ИМХО Создание резервных копий стало больше искусством, если вы знаете, как к нему подойти
У вас есть варианты
Вариант 1: mysqldump весь экземпляр mysql
Это самый простой, ежу понятно !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Все записано в одном файле: структуры таблиц, индексы, триггеры, хранимые процедуры, пользователи, зашифрованные пароли. Другие параметры mysqldump также могут экспортировать различные стили команд INSERT, файла журнала и координат положения из двоичных журналов, параметров создания базы данных, частичных данных (параметр --where) и т. Д.
Вариант 2: mysqldump отдельные базы данных в отдельные файлы данных
Начните с создания списка баз данных (2 метода для этого)
Техника 1
mysql -h... -u... -p... -A --skip-column-names -e"SELECT schema_name FROM information_schema.schemata WHERE schema_name NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Техника 2
mysql -h... -u... -p... -A --skip-column-names -e"SELECT DISTINCT table_schema FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfDatabases.txt
Техника 1 - самый быстрый способ. Техника 2 самая надежная и безопасная. Техника 2 лучше, потому что иногда пользователи создают папки общего назначения в / var / lib / mysql (datadir), которые не связаны с базой данных. Information_schema будет регистрировать папку в качестве базы данных в таблице information_schema.schemata. Метод 2 будет обходить папки, которые не содержат данных mysql.
После того, как вы скомпилируете список баз данных, вы можете перейти к циклу по списку и mysqldump их, даже параллельно, если это необходимо.
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
done
wait
Если за один раз слишком много баз данных, параллельный дамп их по 10 за раз:
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DB in `cat ListOfDatabases.txt`
do
mysqldump -h... -u... -p... --hex-blob --routines --triggers ${DB} | gzip > ${DB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Вариант 3: mysqldump отдельные таблицы в отдельные файлы данных
Начните с создания списка таблиц
mysql -h... -u... -p... -A --skip-column-names -e"SELECT CONCAT(table_schema,'.',table_name) FROM information_schema.tables WHERE table_schema NOT IN ('information_schema','mysql')" > ListOfTables.txt
Затем сбросьте все таблицы в группы по 10
COMMIT_COUNT=0
COMMIT_LIMIT=10
for DBTB in `cat ListOfTables.txt`
do
DB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $1}'`
TB=`echo ${DBTB} | sed 's/\./ /g' | awk '{print $2}'`
mysqldump -h... -u... -p... --hex-blob --triggers ${DB} ${TB} | gzip > ${DB}_${TB}.sql.gz &
(( COMMIT_COUNT++ ))
if [ ${COMMIT_COUNT} -eq ${COMMIT_LIMIT} ]
then
COMMIT_COUNT=0
wait
fi
done
if [ ${COMMIT_COUNT} -gt 0 ]
then
wait
fi
Вариант 4: используйте ваше воображение
Попробуйте варианты вышеупомянутых опций плюс методы для получения чистых снимков
Примеры
- Упорядочить список таблиц по размеру каждой таблицы по возрастанию или убыванию.
- Используя отдельный процесс, запустите «FLUSH TABLES WITH READ LOCK; SELECT SLEEP (86400)» перед запуском mysqldumps. Убейте этот процесс после завершения mysqldumps. Это полезно, если база данных содержит как InnoDB, так и MyISAM.
- Сохраните mysqldumps в устаревших папках и разверните старые резервные папки.
- Загрузите весь экземпляр mysqldumps на автономные серверы.
ПРЕДОСТЕРЕЖЕНИЕ
Только Вариант 1 приносит все. Недостатком является то, что mysqldumps, созданные таким образом, могут быть перезагружены только в ту же версию релиза mysql, которая была сгенерирована mysqldump. Другими словами, mysqldump из базы данных MySQL 5.0 не может быть загружен в 5.1 или 5.5. Причина ? Схема mysql полностью отличается в основных выпусках.
Варианты 2 и 3 не включают сохранение имен пользователей и паролей.
Вот общий способ выгрузки SQL-грантов для пользователей, который удобочитаем и более переносим
mysql -h... -u... -p... --skip-column-names -A -e"SELECT CONCAT('SHOW GRANTS FOR ''',user,'''@''',host,''';') FROM mysql.user WHERE user<>''" | mysql -h... -u... -p... --skip-column-names -A | sed 's/$/;/g' > MySQLGrants.sql
Вариант 3 не сохраняет хранимые процедуры, поэтому вы можете сделать следующее
mysqldump -h... -u... -p... --no-data --no-create-info --routines > MySQLStoredProcedures.sql &
Еще один момент, который следует отметить, касается InnoDB. Если у вас большой пул буферов InnoDB, имеет смысл очистить его как можно лучше перед выполнением любых резервных копий. В противном случае MySQL тратит время на очистку таблиц с оставшейся грязной страницей из пула буферов. Вот что я предлагаю:
Примерно за 1 час до выполнения резервного копирования запустите эту команду SQL
SET GLOBAL innodb_max_dirty_pages_pct = 0;
В MySQL 5.5 по умолчанию значение innodb_max_dirty_pages_pct равно 75. В MySQL 5.1 и более поздних версиях по умолчанию значение innodb_max_dirty_pages_pct равно 90. Если для параметра innodb_max_dirty_pages_pct задано значение 0, это ускорит сброс грязных страниц на диск. Это предотвратит или, по крайней мере, уменьшит влияние очистки любых неполных двухфазных фиксаций данных InnoDB перед выполнением любого mysqldump для любых таблиц InnoDB.
ЗАКЛЮЧИТЕЛЬНОЕ СЛОВО НА mysqldump
Большинство людей уклоняются от mysqldump в пользу других инструментов, и эти инструменты действительно хороши.
Такие инструменты включают
- MAATKIT (параллельные скрипты дампа / восстановления от Percona [устарело, но великолепно])
- XtraBackup (резервное копирование снимка TopNotch от Percona)
- CDP R1Soft ( опция модуля MySQL, которая делает моментальные снимки времени)
- MySQL Enterprise Backup (ранее горячее резервное копирование InnoDB [коммерческое])
Если у вас есть дух настоящего администратора баз данных MySQL, вы можете использовать mysqldump и полностью овладеть им. Пусть все ваши резервные копии будут отражать ваши навыки в качестве администратора баз данных MySQL .