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