Как автоматически сделать резервную копию ВСЕ базы данных mysql в оператор SQL? - PullRequest
16 голосов
/ 26 декабря 2009

Администратор MySQL> Резервный проект. Это отличный инструмент, позволяющий выбирать базы данных и планировать их.

Однако моя проблема:

Сегодня появилось несколько новых сайтов (создана новая база данных) Завтра появилось еще несколько новых сайтов (созданы новые базы данных)

В этом случае мне всегда нужно перейти в Backup Project> Выбрать те оставшиеся схемы, которых нет в списке резервного копирования ...

Как сделать так, чтобы он автоматически проверял наличие любых новых баз данных и включал их в список расписания резервного копирования?

Другими словами, как автоматизировать резервное копирование всех баз данных mysql (чтобы нам не приходилось беспокоиться, когда ежедневно создаются новые базы данных).

Есть ли способ сделать это?

Я использую сервер Windows 2008, который не является дружественным.

Ответы [ 9 ]

31 голосов
/ 26 декабря 2009

Проблема с тремя опубликованными ответами состоит в том, что они не позволяют выборочно восстанавливать базы данных. Это может быть реальной проблемой во всех случаях, кроме катастрофы.

В идеале у вас должна быть ежедневная резервная копия с некоторой историей. Он должен быть пуленепробиваемым (--force), должен быть зарегистрирован (>> ...log), он должен быть сжат (| gzip), он должен хранить отдельные копии каждой базы данных, и он должен автоматически выбирать любые базы данных, которые добавлены .

Рассмотрим скорее сценарий оболочки, подобный этому:

#!/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 BACKUP@localhost 
  IDENTIFIED BY 'SOMEPASS8342783492';

Так что просто добавьте это к ночному крончобу, и у вас будет ежедневная резервная копия, которая вращается каждые 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
18 голосов
/ 26 декабря 2009

MySQL Administrator

С MySQL Administrator вам нужно вручную добавить базы данных в резервную копию.

mysqldump и --all-database

Если вы подойдете к этому с помощью команды dump , вы можете использовать опцию --all-databases для включения всех баз данных в дамп.

13 голосов
/ 26 декабря 2009
mysqldump -u <username> -p<password> --all-databases > database_backup.sql
3 голосов
/ 26 декабря 2009

Я использую http://sourceforge.net/projects/automysqlbackup/ для резервного копирования моих баз данных MySQL уже пару лет, и это очень хорошо работает для меня. Вот описание со страницы sourceforge:

Скрипт для ежедневного, еженедельного и ежемесячные резервные копии вашего MySQL базы данных, использующие mysqldump. Характеристики - Резервное копирование нескольких баз данных - Single резервный файл или отдельный файл для каждая БД - Сжатие резервных файлов - Резервное копирование удаленных серверов - Журналы электронной почты - Подробнее ..

Вы можете настроить скрипт на резервное копирование всех баз данных, чтобы вам не приходилось менять скрипт при добавлении новых БД. Вы также можете указать, какие БД следует исключить, если у вас есть база данных или две, которые вы не хотите делать по какой-либо причине.

Это хорошо документировано, и вы можете установить множество опций, которые будут покрывать самые основные потребности резервного копирования БД. Поскольку это один скрипт bash, его также легко изменить / настроить, если что-то не так, как вы хотите.

2 голосов
/ 24 мая 2016

Поздний ответ, но все так просто:

  1. Вам необходимо изменить строки 3, 4 и 5 , чтобы отразить ваши MySQL пользователь , пароль и dir , где вы хотите хранить дампы.
  2. Каждый раз, когда он запускается, он удаляет все предыдущие резервные копии (Если вы не хочу это, просто комментарий #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

В этом случае он будет работать каждый день в 2 часа ночи. Вы можете узнать больше о crontab здесь .

ЦСИ

2 голосов
/ 26 декабря 2009

Попробуйте использовать

mysqldump --all-databases
0 голосов
/ 27 июля 2016

Чтобы игнорировать ошибки, используйте параметр --force

mysqldump -u root --force --all-databases > d:\all.sql
0 голосов
/ 26 апреля 2015

Я сделал скрипт, который будет принимать все резервные копии базы данных, ожидая information_schema и 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';
0 голосов
/ 15 октября 2014

Только мои два цента. Обновление отличного сценария от @ 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 /1403968/kak-avtomaticheski-sdelat-rezervnuy-kopiy-vse-bazy-dannyh-mysql-v-operator-sql
# 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'@'%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...