Содержание
Памятка по бэкапу (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
Кунг-фу в консоли
Как исключить одну таблицу из бэкапа?
С помощью опции --ignore-table
mysqldump -u [user] -p [database] --ignore-table=[database.table1] > [database].sql
Нашел на 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<password> > databases.txt
Редактируем файл databases.txt и убираем базы, которые не нужны.
Создаем дамп
# cat databases.txt | xargs mysqldump -u root -p<password> --databases > mysqldump.sql
Дамп всех баз в отдельных файлах
Вариант 1
Нашел здесь
#! /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
Еще один вариант для раздельного дампа
#! /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
Обсуждение