web-dev-qa-db-ja.com

すべてのmysqlデータベースをsqlステートメントに自動的にバックアップする方法は?

MySQL管理者>バックアッププロジェクト。これは、データベースを選択してスケジュールできる優れたツールです。

しかし私の問題は:

今日はいくつかの新しいウェブサイトを取得しました(新しいデータベースが作成されました)明日はさらにいくつかの新しいウェブサイトを取得しました(新しいデータベースが作成されました)

この場合、私は常にバックアッププロジェクトに移動する必要があります>バックアップリストにない残りのスキーマを選択します...

新しいデータベースを自動チェックしてバックアップスケジュールリストに含めるにはどうすればよいですか?

言い換えれば、すべてのmysqlデータベースのバックアップを自動化する方法(毎日新しいデータベースが作成されるときに心配する必要がないようにするため)。

それを実現する方法はありますか?

私はWindows2008サーバーを使用していますが、これはshフレンドリーではありません。

16
i need help

MySQL管理者

MySQL Administratorでは、データベースをバックアップに手動で追加する必要があります。

mysqldumpおよび--all-databases

dump-command を介してこれにアプローチする場合は、 --all-databases すべてのデータベースをダンプに含めるオプション。

18
Sampson

これまでに投稿された3つの回答の問題は、データベースを選択的に復元できないことです。これは、大惨事を除いてすべてにおいて本当の問題になる可能性があります。

理想的には、いくつかの履歴を含む毎日のバックアップが必要です。防弾(--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';

したがって、これを夜間のcronジョブに追加するだけで、週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
31
gahooa
mysqldump -u <username> -p<password> --all-databases > database_backup.sql
13
Dan Loewenherz

私は http://sourceforge.net/projects/automysqlbackup/ を使用してMySQLデータベースを数年間バックアップしてきましたが、非常にうまく機能しています。 sourceforgeページの説明は次のとおりです。

Mysqldumpを使用してMySQLデータベースの日次、週次、および月次のバックアップを作成するスクリプト。機能-複数のデータベースをバックアップします-単一のバックアップファイルまたはDBごとに個別のファイルにバックアップします-バックアップファイルを圧縮します-リモートサーバーをバックアップします-電子メールログ-その他。

すべてのデータベースをバックアップするようにスクリプトを設定できるため、新しいデータベースが追加されたときにスクリプトを変更する必要はありません。何らかの理由でバックアップしたくないデータベースが1つか2つある場合は、どのデータベースを除外するかを指定することもできます。

それは十分に文書化されており、最も基本的なデータベースバックアップのニーズをカバーするように設定できるオプションがたくさんあります。これは単一のbashスクリプトであるため、何かが思いどおりになっていない場合でも、簡単に変更/微調整できます。

3
bradym

遅い答えですが、それが得るのと同じくらい簡単です:

  1. MySQLuser、/を反映するには、3、4、5行目を変更する必要がありますpasswordおよびdirダンプを保存する場所。
  2. 実行するたびに、以前のすべてのバックアップを削除します(これが不要な場合は、comment#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の詳細については ここ をご覧ください。

src

2
Pedro Lobito

使ってみてください

mysqldump --all-databases
2
shylent

ちょうど私の2セント。 @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'@'%';

私はスクリプトを作成しました。このスクリプトは、information_schemaとperformance_schemaを期待してすべてのデータベースバックアップを取得します。

日付と時刻に関するフォルダを作成し、データベースにそのdbフォルダ名と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
Kernelv5

エラーを無視するには、-forceオプションを使用します

mysqldump -u root --force --all-databases > d:\all.sql
0
Maximus