Как автоматически резервировать ВСЕ базы данных mysql в инструкции sql?
Администратор MySQL > Проект резервного копирования. Это отличный инструмент, позволяющий вам выбирать базы данных и планировать его.
Однако моя проблема:
Сегодня появилось несколько новых сайтов (создана новая база данных)
Завтра появилось еще несколько новых веб-сайтов (созданные новые базы данных)
В этом случае я должен всегда переходить в Backup Project > Выбрать оставшуюся схему не в списке резервных копий...
Как сделать автоматическую проверку для любых новых баз данных и включить в список расписания резервного копирования?
Другими словами, как автоматизировать резервное копирование всех баз данных mysql (чтобы нам не нужно было беспокоиться о том, что каждый день создавались новые базы данных).
Любой способ сделать это?
Я использую сервер Windows 2008, который не дружелюбен.
Ответы
Ответ 1
Администратор MySQL
С администратором MySQL вам необходимо вручную добавить базы данных в резервную копию.
mysqldump и --all-databases
Если вы подходите к этому с помощью dump-command, вы можете использовать --all-databases
включить все базы данных в дамп.
Ответ 2
Проблема с тремя ответами, опубликованными до сих пор, заключается в том, что они не позволяют выборочно восстанавливать базы данных. Это может быть реальной проблемой во всем, кроме катастрофы.
В идеале вы должны иметь ежедневную резервную копию, имеющую некоторую историю. Он должен быть пуленепробиваемым (--force
), он должен быть зарегистрирован (>> ...log
), он должен быть сжат (| gzip
), он должен хранить отдельные копии каждой базы данных, и он должен автоматически собирать любые добавленные базы данных.
Рассмотрим скорее оболочку script следующим образом:
#!/bin/bash
Host=server.domain.com
BDir=/home/backup/backup/mysql
Dump="/usr/bin/mysqldump --skip-extended-insert --force"
MySQL=/usr/bin/mysql
Today=$(date "+%a")
# Get a list of all databases
Databases=$(echo "SHOW DATABASES" | $MySQL -h $Host)
for db in $Databases; do
date=`date`
file="$BDir/$Host-$db-$Today.sql.gz"
echo "Backing up '$db' from '$Host' on '$date' to: "
echo " $file"
$Dump -h $Host $db | gzip > $file
done
Предполагается, что у вас есть файл ~/.my.cnf
(chmod 600), который имеет:
[client]
user = "BACKUP"
password = "SOMEPASS8342783492"
Убедитесь, что любой пользователь, которого вы используете для BACKUP
, имеет эту инструкцию:
GRANT
SELECT, SHOW VIEW ON *.*
TO [email protected]
IDENTIFIED BY 'SOMEPASS8342783492';
Поэтому просто добавьте это к ночной cronjob, и у вас есть ежедневная резервная копия, которая вращается каждые 7 дней.
0 3 * * * backup-mysql >> backup-mysql.log 2>> backup-mysql.log
Затем резервный каталог содержит:
-rw-r--r-- 1 backup backup 2217482184 Sep 3 13:35 base.appcove.net-VOS4_0-20090903.sql.gz
-rw-rw-r-- 1 backup backup 2505876287 Dec 25 00:48 base.appcove.net-VOS4_0-Fri.sql.gz
-rw-r--r-- 1 backup backup 2500384029 Dec 21 00:48 base.appcove.net-VOS4_0-Mon.sql.gz
-rw-r--r-- 1 backup backup 2506849331 Dec 26 00:48 base.appcove.net-VOS4_0-Sat.sql.gz
-rw-r--r-- 1 backup backup 2499859469 Dec 20 00:48 base.appcove.net-VOS4_0-Sun.sql.gz
-rw-rw-r-- 1 backup backup 2505046147 Dec 24 00:48 base.appcove.net-VOS4_0-Thu.sql.gz
-rw-rw-r-- 1 backup backup 2502277743 Dec 22 00:48 base.appcove.net-VOS4_0-Tue.sql.gz
-rw-r--r-- 1 backup backup 2504169910 Dec 23 00:48 base.appcove.net-VOS4_0-Wed.sql.gz
-rw-r--r-- 1 backup backup 76983829 Dec 25 00:49 base.appcove.net-VOS4_Mail_0-Fri.sql.gz
-rw-r--r-- 1 backup backup 76983829 Dec 21 00:49 base.appcove.net-VOS4_Mail_0-Mon.sql.gz
-rw-r--r-- 1 backup backup 76983829 Dec 26 00:49 base.appcove.net-VOS4_Mail_0-Sat.sql.gz
-rw-r--r-- 1 backup backup 76983829 Dec 20 00:48 base.appcove.net-VOS4_Mail_0-Sun.sql.gz
-rw-rw-r-- 1 backup backup 76983829 Dec 24 00:49 base.appcove.net-VOS4_Mail_0-Thu.sql.gz
-rw-rw-r-- 1 backup backup 76983829 Dec 22 00:49 base.appcove.net-VOS4_Mail_0-Tue.sql.gz
-rw-r--r-- 1 backup backup 76983829 Dec 23 00:49 base.appcove.net-VOS4_Mail_0-Wed.sql.gz
-rw-r--r-- 1 backup backup 304803726 Dec 25 00:49 base.appcove.net-WeSell_0-Fri.sql.gz
-rw-r--r-- 1 backup backup 303480087 Dec 21 00:49 base.appcove.net-WeSell_0-Mon.sql.gz
-rw-r--r-- 1 backup backup 304710121 Dec 26 00:49 base.appcove.net-WeSell_0-Sat.sql.gz
-rw-r--r-- 1 backup backup 303791294 Dec 20 00:49 base.appcove.net-WeSell_0-Sun.sql.gz
-rw-rw-r-- 1 backup backup 305315415 Dec 24 00:49 base.appcove.net-WeSell_0-Thu.sql.gz
-rw-rw-r-- 1 backup backup 302516217 Dec 22 00:49 base.appcove.net-WeSell_0-Tue.sql.gz
-rw-r--r-- 1 backup backup 303314217 Dec 23 00:49 base.appcove.net-WeSell_0-Wed.sql.gz
-rw-r--r-- 1 backup backup 135301 Dec 25 00:30 dc40.appcove.net-mysql-Fri.sql.gz
-rw-r--r-- 1 backup backup 135301 Dec 21 00:30 dc40.appcove.net-mysql-Mon.sql.gz
-rw-r--r-- 1 backup backup 135301 Dec 26 00:30 dc40.appcove.net-mysql-Sat.sql.gz
-rw-r--r-- 1 backup backup 135301 Dec 20 00:30 dc40.appcove.net-mysql-Sun.sql.gz
-rw-rw-r-- 1 backup backup 135301 Dec 24 00:30 dc40.appcove.net-mysql-Thu.sql.gz
-rw-rw-r-- 1 backup backup 135301 Dec 22 00:30 dc40.appcove.net-mysql-Tue.sql.gz
-rw-r--r-- 1 backup backup 135301 Dec 23 00:30 dc40.appcove.net-mysql-Wed.sql.gz
Ответ 3
mysqldump -u <username> -p<password> --all-databases > database_backup.sql
Ответ 4
Я использую http://sourceforge.net/projects/automysqlbackup/ для резервного копирования моих баз данных MySQL уже пару лет, и это сработало для меня очень хорошо. Здесь описание со страницы sourceforge:
A script принимать ежедневно, еженедельно и ежемесячные резервные копии вашего MySQL базы данных с использованием mysqldump. Особенности - Резервное копирование баз данных - Single резервный файл или отдельный файл для каждый DB - сжатие файлов резервных копий - Резервное копирование удаленных серверов - Журналы электронной почты - Подробнее..
Вы можете установить script для резервного копирования всех баз данных, поэтому вам не нужно менять script при добавлении новых dbs. Вы также можете указать, какие dbs исключить, если у вас есть база данных или две, которые вы не хотите делать резервными копиями по какой-либо причине.
Это хорошо документировано, и есть много вариантов, которые вы можете установить, которые будут охватывать большинство базовых потребностей резервного копирования db. Поскольку это единственный bash script, его также легко изменить/настроить, если что-то не так, как вы хотите.
Ответ 5
Попробуйте использовать
mysqldump --all-databases
Ответ 6
Поздний ответ, но так же просто, как он:
- Вам нужно изменить строки 3, 4 и 5, чтобы отразить ваш
MySQL
пользователь, пароль и dir, где вы хотите сохранить дампы.
- Каждый раз, когда он запускается, itll удаляет все предыдущие резервные копии (Если вы не
хочу это, просто комментарий
#rm "$OUTPUT/*gz" > /dev/null 2>&1
)
MySqlBackup.sh
#!/bin/bash
USER="your_user"
PASSWORD="your_password"
OUTPUT="/path/to/backup/dir"
rm "$OUTPUT/*gz" > /dev/null 2>&1
databases=`mysql --user=$USER --password=$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -v Database`
for db in $databases; do
if [[ "$db" != "information_schema" ]] ; then
echo "Dumping database: $db"
mysqldump --force --opt --user=$USER --password=$PASSWORD --databases $db > $OUTPUT/`date +%Y%m%d`.$db.sql
gzip $OUTPUT/`date +%Y%m%d`.$db.sql
fi
done
Теперь вам просто нужно сделать его исполняемым и запустить:
chmod 700 MySqlBackup.sh
./MySqlBackup.sh
При необходимости добавьте его в crontab
, чтобы он работал автоматически:
crontab -e
00 02 * * * /path/to/MySqlBackup.sh
В этом случае itll запускается каждый день в 2 часа ночи. Вы можете узнать больше о crontab здесь.
src
Ответ 7
Просто мои два цента. Обновление превосходного script от @gahooa
Он добавляет сохранение сохранения. Полезно, если вы хотите сохранить разрешения и несколько улучшений и проверки значений. Также использование пользователя и пропуск, если он предоставлен.
Надеюсь, что это поможет.
UDATE: добавлены суммы sha1 для каждого файла
#!/bin/bash
#
# Script to backup database and grants from mysql
# Author: Gonzalo Aguilar Delgado <gaguilar indomain level2crm.com>
# Usage:
# backup-mysql.sh <HOST> username password <--- Yes this is insecure as this will get on history
# Based on script http://stackoverflow.com/questions/1963884/how-to-automatically-backup-all-mysql-databases-into-sql-statement
# from gahooa (http://stackoverflow.com/users/64004/gahooa)
#
if [ "$#" -lt 1 ]; then
FILENAME="$(basename $0)"
echo "Usage $FILENAME <HOST> [user] [pass]"
exit 1
fi
#http://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux
COLOR_GREEN='\e[0;32m'
COLOR_RED='\e[0;31m'
COLOR_BLACK='\e[0;30m'
COLOR_DISABLE='\e[0m'
HOST=$1
if [ ! -z "$2" ]; then
USER=$2
fi
PASS=$3
BACKUP_DIRECTORY="/home/gaguilar/mysql-backup"
if [ ! -x $BACKUP_DIRECTORY ]; then
echo "Cannot access to $BACKUP_DIRECTORY"
exit 1
fi
DUMP_COMMAND="/usr/bin/mysqldump --skip-extended-insert --force"
MYSQL_COMMAND=/usr/bin/mysql
TODAY_DATE=$(date "+%F")
COMMAND_ARGS="-h$HOST"
if [ ! -z "$USER" ]; then
COMMAND_ARGS="$COMMAND_ARGS -u$USER"
fi
if [ ! -z "$PASS" ]; then
COMMAND_ARGS="$COMMAND_ARGS -p$PASS"
fi
echo -e "Connecting to ${COLOR_BLACK}$HOST${COLOR_DISABLE} with user ${COLOR_BLACK}$USER${COLOR_DISABLE}..."
# Get a list of all databases
DB_LIST=$(echo "SHOW DATABASES" | $MYSQL_COMMAND $COMMAND_ARGS)
if [ "$?" -ne "0" ]; then
echo "Cannot connect"
exit 1
fi
echo "Starting backup"
for db in $DB_LIST; do
if [ "$db" != "information_schema" ] && [ "$db" != "mysql" ] && [ "$db" != "performance_schema" ]; then
date=`date`
file="$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2"
file_sum=$BACKUP_DIRECTORY/$HOST-$db-$TODAY_DATE.sql.bz2.sha1
echo "Backing up '$db' from '$HOST' on '$date' to: "
echo " [$file]..."
$DUMP_COMMAND $COMMAND_ARGS $db | bzip2 > $file
sha1sum $file > $file_sum
if [ "$?" -ne "0" ]; then
echo "Backup of '$db' from '$HOST' ${COLOR_RED}failed${COLOR_DISABLE}..."
fi
else
echo "Skipping $db database because mysql internal"
fi
done
echo -e "${COLOR_GREEN}Done backup databases${COLOR_DISABLE}"
echo "Backing up privileges of users"
USER_LIST=$(echo "SELECT CONCAT('\'',user,'\'@\'',host,'\'') FROM mysql.user WHERE user != 'root'" | $MYSQL_COMMAND -BN $COMMAND_ARGS)
grants_file="$BACKUP_DIRECTORY/$HOST-grants-$TODAY_DATE.sql"
echo "-- GRANTS FOR $HOST at $TODAY_DATE" > $grants_file
for username in $USER_LIST; do
echo "Backing up $username"
GRANT_LIST=$(echo "show grants for $username" | $MYSQL_COMMAND -BN $COMMAND_ARGS | sed 's/$/;/; s/\\\\/\\/g';) #
echo "" >> $grants_file
echo "-- " >> $grants_file
echo "-- BACKUP OF USERNAME [$username]" >> $grants_file
echo "-- " >> $grants_file
echo "$GRANT_LIST" >> $grants_file
done
echo -e "${COLOR_GREEN}Done backup users${COLOR_DISABLE}"
Результат файла гранта выглядит следующим образом:
-- GRANTS FOR localhost at 2014-10-15
--
-- BACKUP OF USERNAME ['java'@'%']
--
GRANT USAGE ON *.* TO 'java'@'%' IDENTIFIED BY PASSWORD 'XXX';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, TRIGGER ON `widgetdb`.* TO 'java'@'%';
--
-- BACKUP OF USERNAME ['planes2'@'%']
--
GRANT USAGE ON *.* TO 'planes2'@'%' IDENTIFIED BY PASSWORD 'XXX';
GRANT ALL PRIVILEGES ON `planes2`.* TO 'planes2'@'%';
Ответ 8
Я сделал script, который возьмет всю резервную копию базы данных, которая ожидает информацию_схемы и performance_schema.
Создает папку с датой и временем, сохранит базу данных, имя папки db wise и gunzip. Я создал его сегодня и нашел работу на 100% нормально
USER=root
PASSWORD='password'
#Place where you want to preserved backup.
OUTPUT="."
TIMESTAMP=`date +%Y-%m-%d_%H-%M-%S`;
mkdir $OUTPUT/$TIMESTAMP;
cd $OUTPUT/$TIMESTAMP;
echo "Starting MySQL Backup";
echo 'date';
databases=$(mysql -u $USER -p$PASSWORD -e "SHOW DATABASES;" | tr -d "| " | grep -Ev "(Database|information_schema|performance_schema)");
echo $databases;
for db in $databases; do
mysqldump --force --opt -u $USER -p$PASSWORD --databases $db > $OUTPUT/dbbackup-$TIMESTAMP-$db.sql
gzip $OUTPUT/dbbackup-$TIMESTAMP-$db.sql
done
echo "Finished MySQL Backup";
echo 'date';
Ответ 9
Чтобы игнорировать параметр использования ошибок --force
mysqldump -u root --force --all-databases > d:\all.sql