簡體   English   中英

如何自動將所有mysql數據庫備份到sql語句中?

[英]How to automatically backup ALL mysql databases into sql statement?

MySQL 管理員> 備份項目。 它是一個很棒的工具,可以讓您選擇數據庫並安排它。

但是我的問題是:

今天有幾個新網站(創建了新數據庫) 明天有更多新網站(創建了新數據庫)

在這種情況下,我必須始終進入備份項目>選擇不在備份列表中的剩余模式...

如何讓它自動檢查任何新數據庫並將其包含在備份計划列表中?

換句話說,如何自動備份所有mysql數據庫(這樣我們就不必擔心每天創建新數據庫時)。

有什么辦法讓它發生嗎?

我正在使用 Windows 2008 服務器,這對 sh 不友好。

到目前為止發布的三個答案的問題是它們無法使您有選擇地還原數據庫。 除了災難之外,這可能是一個真正的問題。

理想情況下,您應該每天備份一些歷史記錄。 它應該是防彈的( --force ),它應該被記錄( >> ...log ),它應該被壓縮( | gzip ),它應該保存每個數據庫的單獨副本,它應該自動獲取任何數據庫被添加。

考慮一下這樣的shell腳本:

#!/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語句:

GRANT 
  SELECT, SHOW VIEW ON *.* 
  TO BACKUP@localhost 
  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

MySQL管理員

使用MySQL Administrator,您需要手動將數據庫添加到備份中。

mysqldump和--all-databases

如果通過dump-command進行處理 ,則可以使用--all-databases選項將所有數據庫包含到轉儲中。

mysqldump -u <username> -p<password> --all-databases > database_backup.sql

我已經使用http://sourceforge.net/projects/automysqlbackup/來備份我的MySQL數據庫幾年了,它對我來說非常好用。 這是sourceforge頁面的描述:

使用mysqldump對MySQL數據庫進行每日,每周和每月備份的腳本。 功能 - 備份多個數據庫 - 單個備份文件或每個數據庫的單獨文件 - 壓縮備份文件 - 備份遠程服務器 - 電子郵件日志 - 更多..

您可以將腳本設置為備份所有數據庫,這樣您就不必在添加新dbs時更改腳本。 如果您有一兩個數據庫因為某些原因不想備份,也可以告訴它要排除哪些數據庫。

它有很好的文檔記錄,您可以設置許多選項來滿足大多數基本的數據庫備份需求。 因為它是一個單獨的bash腳本,所以如果某些內容不是你想要的那樣,它也很容易修改/調整。

嘗試使用

mysqldump --all-databases

遲到的答案,但它很簡單:

  1. 您需要更改第3,4和5行以反映您要存儲轉儲的MySQL 用戶密碼目錄
  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的更多信息。

SRC

只是我的兩分錢。 從@gahooa升級優秀的腳本

它增加了贈款保存。 如果您想要保存權限以及一些改進和值檢查,則非常有用。 如果提供,還使用user和pass。

希望能幫助到你。

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';

要忽略錯誤,請使用--force選項

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

這是簡單的介紹,我的腳本是如何工作的。 請在執行前完整閱讀腳本。 其實那里沒有壞處,但你必須做你正在做的事情..

參考: https : //vvcares.com/blog/post/backup-all-mysql-databases-compress

將每個 mysql db 備份到一個不同的文件中,而不是像 --all-databases 那樣是一個大文件。 這將使恢復更容易。 要備份單個數據庫,只需添加數據庫名稱作為參數(或多個數據庫) mkdir -p /vv_files/backups useradd --home-dir /var/backups/mysql --gid backup --no-create-home mysql-備份記住使腳本可執行,其他人不可讀

chown -R mysql-backup:backup /var/backups/mysql
chmod u=rwx,g=rx,o= /var/backups/mysql/dump.sh
crontab entry - backup every 6 hours
sudo crontab -e [ set your desired timing. 6 hrs is safer for sysadmins]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM