====== Памятка по бэкапу (mysqldump) ======
===== Создание дампа и восстановление из дампа =====
Создать дамп одной базы
mysqldump -u [user_name] -p [database_name] > [file_name].sql
gzip
mysqldump -u [user_name] -p [database_name] | gzip > [file_name].sql.gz
bz2
mysqldump -u [user_name] -p [database_name] | bzip2 > [file_name].sql.bz2
Создать дамп нескольких баз данных (ключ ''-B'' или ''--databases'')
mysqldump -u [user_name] -p [database_name_X] [database_name_Y] [database_name_Z] > [file_name].sql
Создать дамп всех баз данных (ключ ''-A'' или ''--all-databases'')
mysqldump -u [user_name] -p --all-databases > [file_name].sql
UPD Как добавить время создания бэкапа к имени файла
Добавить строку
$(date +%Y-%m-%d-%H.%M.%S)
mysqldump -u [user_name]> -p [database_name] | bzip2 -c > [filename]$(date +%Y-%m-%d-%H.%M.%S).sql.bz2
===== Восстановление из дампа =====
.sql
mysql -u [user_name] -p [database_name] < [file_name].sql
.gz
zcat [file_name].sql.gz | mysql -u [user_name] -p [database_name]
mysql-console
mysql> use [database_name];
mysql> source [file_name].sql
===== Кунг-фу в консоли =====
==== Как исключить одну таблицу из бэкапа? ====
С помощью опции [[http://dev.mysql.com/doc/refman/5.1/en/mysqldump.html#option_mysqldump_ignore-table|--ignore-table]]
mysqldump -u [user] -p [database] --ignore-table=[database.table1] > [database].sql
Нашел на [[http://stackoverflow.com/questions/425158/skip-certain-tables-with-mysqldump|stackoverflow]] классный bash скрипт если нужно исключить несколько таблиц
#!/bin/bash
PASSWORD=XXXXXX
HOST=XXXXXX
USER=XXXXXX
DATABASE=databasename
DB_FILE=dump.sql
EXCLUDED_TABLES=(
table1
table2
table3
table4
tableN
)
IGNORED_TABLES_STRING=''
for TABLE in "${EXCLUDED_TABLES[@]}"
do :
IGNORED_TABLES_STRING+=" --ignore-table=${DATABASE}.${TABLE}"
done
echo "Dump structure"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} --single-transaction --no-data ${DATABASE} > ${DB_FILE}
echo "Dump content"
mysqldump --host=${HOST} --user=${USER} --password=${PASSWORD} ${DATABASE} ${IGNORED_TABLES_STRING} >> ${DB_FILE}
==== Дамп всех баз кроме выбранных ====
Подсмотрел здесь: https://guillaume.moigneu.com/mysqldump-all-databases-except/
Например нужно сделать дамп всех баз, но исключить из дампа базы performance_schema и information_schema
Записываем список баз в txt файл
# echo 'show databases;' | mysql -u root -p > databases.txt
Редактируем файл databases.txt и убираем базы, которые не нужны.
Создаем дамп
# cat databases.txt | xargs mysqldump -u root -p --databases > mysqldump.sql
==== Дамп всех баз в отдельных файлах ====
=== Вариант 1 ===
Нашел [[http://dev.mensfeld.pl/2013/04/backup-mysql-dump-all-your-mysql-databases-in-separate-files|здесь]]
#! /bin/bash
TIMESTAMP=$(date +"%F")
BACKUP_DIR="/backup/$TIMESTAMP"
MYSQL_USER="backup"
MYSQL=/usr/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/usr/bin/mysqldump
mkdir -p "$BACKUP_DIR/mysql"
databases=`$MYSQL --user=$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema)"`
for db in $databases; do
$MYSQLDUMP --force --opt --user=$MYSQL_USER -p$MYSQL_PASSWORD --databases $db | gzip > "$BACKUP_DIR/mysql/$db.gz"
done
Рекомендуется создать отдельного пользователя и дать ему следующие привилегии
* SHOW DATABASES
* SELECT
* LOCK TABLES
* RELOAD
=== Вариант 2 ===
Еще один [[http://www.singlemaltsites.com/2014/07/shell-script-to-dump-all-mysql-databases-into-separate-files/|вариант]] для раздельного дампа
#! /bin/bash
TIMESTAMP=$(date +"%F-%H-%M-%S")
BACKUP_DIR="/full/path/to/directory"
MYSQL_USER="username"
MYSQL=/Applications/MAMP/Library/bin/mysql
MYSQL_PASSWORD="password"
MYSQLDUMP=/Applications/MAMP/Library/bin/mysqldump
$MYSQL -s -r -u $MYSQL_USER -p$MYSQL_PASSWORD -e 'show databases' |
while read db; do
$MYSQLDUMP -u $MYSQL_USER -p$MYSQL_PASSWORD $db > $BACKUP_DIR/$TIMESTAMP-${db}.sql;
done
=== Вариант 3 ===
https://ma.ttias.be/mysql-back-up-take-a-mysqldump-with-each-database-in-its-own-sql-file/
Делаем бэкап в отдельные файлы
# mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > "$dbname".sql; done
Чтобы записать бэкапы в определенный каталог (например /var/backup/sql).
# mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > "$dbname".sql; done
Делаем бэкап в отдельные файлы и сжимаем
# mysql -N -e 'show databases' | while read dbname; do mysqldump --complete-insert --routines --triggers --single-transaction "$dbname" > "$dbname".sql; [[ $? -eq 0 ]] && gzip "$dbname".sql; done
Восстанавливаем данные из sql файлов
# for sql in *.sql; do dbname=${sql/\.sql/}; echo -n "Now importing $dbname ... "; mysql $dbname < $sql; echo " done."; done
==== Как вытащить базу данных из общего бэкапа ====
Дамп был сделан с ключом ''--all-databases'', имя дампа alldb.sql
dbname1 - имя нужной базы\\
base1.sql - имя базы на выходе
sed -n -e '/CREATE DATABASE.*dbname1/,/CREATE DATABASE/p' alldb.sql > base1.sql