ПОВЕРНІТЬСЯ, ЩО РОБИТИ РЕКЛАМИ З mysqldump
Резервне копіювання IMHO Doing стало більшою мірою мистецтвом, якщо ви просто знаєте, як до нього підійти
У вас є варіанти
Варіант 1: mysqldump цілий екземпляр mysql
Це найпростіший, безмозковий !!!
mysqldump -h... -u... -p... --hex-blob --routines --triggers --all-databases | gzip > MySQLData.sql.gz
Все, що написано в одному файлі: структури таблиць, індекси, тригери, збережені процедури, користувачі, зашифровані паролі. Інші параметри mysqldump також можуть експортувати різні стилі команд INSERT, файли журналу та координати позицій з двійкових журналів, параметрів створення бази даних, часткових даних (опція - Wherewhere) тощо.
Варіант 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), які не пов'язані з базою даних. Інформація_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: ВИКОРИСТОВУЙТЕ ВАШ ІМІГІНАЦІЮ
Спробуйте варіанти вищезгаданих параметрів плюс методики для чистих знімків
Приклади
- Упорядкуйте список таблиць за розміром кожної таблиці, що збільшується чи спадає.
- Використовуючи окремий процес, перед запуском mysqldumps запустіть "ПРОМИСЛУВАННЯ ТАБЛИЦІ З ЧИТАННЯМ ЧИТАННЯ; ВИБІРТЕ СЛОП (86400)". Вбийте цей процес після завершення mysqldumps. Це корисно, якщо база даних містить і InnoDB, і MyISAM
- Збережіть mysqldumps у датованих папках та оберніть старі резервні папки.
- Завантажте весь екземпляр mysqldumps на автономні сервери.
КАВАТИ
Тільки варіант 1 приносить усе. Недолік полягає в тому, що створені таким чином mysqldumps можуть бути перезавантажені лише в ту саму версію випущеного майоту, що й mysql, що і генерується mysqldump. Іншими словами, mysqldump з бази даних MySQL 5.0 не може бути завантажений у 5.1 або 5.5. Причина ? Схема mysql суттєво відрізняється серед основних версій.
Варіанти 2 і 3 не включають збереження імен користувачів та паролів.
Ось загальний спосіб скидання SQL Grants для користувачів, який читається та є більш портативним
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 витрачає час на промивання таблиць із залишкою брудної сторінки з буферного пулу. Ось що я пропоную:
Приблизно за годину до виконання резервного копіювання запустіть цю команду 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 (раніше гарячі резервні копії InnoDB [комерційний])
Якщо у вас є дух справжньої DBA MySQL, ви можете прийняти mysqldump і отримати повне майстерність над цим, яке можна досягти. Нехай усі ваші резервні копії будуть відображенням ваших навичок роботи з MySQL DBA .