RTFM.WIKI

Ordnung muß sein. Ordnung über alles (18+)

Инструменты пользователя

Инструменты сайта


linux:mysql:mysqldump

Памятка по бэкапу (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

Обсуждение

Ваш комментарий. Вики-синтаксис разрешён:
 
linux/mysql/mysqldump.txt · Последнее изменение: 2017/09/13 01:15 — 127.0.0.1