MySQLdump是MySQL自帶的匯出資料工具,即mysql資料庫中備份工具,用於將MySQL伺服器中的資料庫以標準的sql語言的方式匯出,並儲存到檔案中。Mysqldump是一個客戶端邏輯備份的工作,備份的SQL檔案可以在其他MySQL伺服器上進行還原。
如需備份,則至少需要對該表的select許可權,需要備份檢視則需要改賬戶具有SHOW VIEW許可權,觸發器需要TRIGGER。如需鎖表,則不可使用--single-transaction選項。其他許可權暫未列出。
如需還原,則需要對應的執行許可權,如create表,則需要對該庫的create許可權。
Mysqldump匯出可以包括ALTER DATABASE與相關更改,其中包括匯出後設資料、更改字元編碼,在匯入對應檔案時,相應的許可權更改也會發生影響。如果在伺服器上備份的表均為MyISAM,也可以使用mysqlhotcopy來完成任務。
從效能和伸縮性考慮,mysqldump的優勢包括:在輸出之前可以很方便的檢視或編輯檔案,你還可以克隆資料庫與DBA的工作,或者將生產環境下的資料進行微小測試。這不是作為快速備份或可伸縮性很強的方案。即針對不同大小的資料需要安排合理時間,在需要還原時速度並不快,因為需要重新進行I/O、建立索引等。
對於大量資料來說,物理備份可能更為合適,因為它可以快速還原。
- 如果你的表以Innodb引擎為主,可以考慮使用MySQL的mysqlbackup命令。因為他提供了最好的Innodb備份:它也可以備份其他如MyIsAM與其他儲存引擎;提供了更多的備份引數進行選擇。詳情見手冊 25.2 “MySQL Enterprise Backup Overview”
- 如果你的表以MyISAM引擎為主,可以考慮使用mysqlhotcopy來替代,它可能比mysqldump表現更為好,詳情見mysqlhotcopy手冊。
Mysqldump可以行級匯出資料,或者也可以將整個表載入記憶體一次性匯出,如果將所有資料匯入記憶體可能會面臨記憶體緩衝區不夠的問題。如果要行級匯出資料,使用--quick選項(或者--opt,它支援--quick)。--opt選項是預設選項,所以為了保證記憶體緩衝區,使用--skip-quick。
如果使用高版本的mysqldump來備份一個低版本的MySQL伺服器中的資料,使用--skip-opt代替--opt或者-- extended-insert選項。
下面對它的使用進行總結性梳理:
查詢該命令的幫助資訊(有很多引數,具體也可以man一下) [root@Mysql-node1 ~]# mysqldump --help 常用的幾個選項 --add-drop-table:在每個建立資料庫表語句前新增刪除資料庫表的語句; --add-locks:備份資料庫表時鎖定資料庫表; --all-databases(即-A):備份MySQL伺服器上的所有資料庫; --comments:新增註釋資訊; --compact:壓縮模式,產生更少的輸出; --complete-insert:輸出完成的插入語句; --databases(即-B):指定要備份的資料庫; --default-character-set:指定預設字符集; --force(即-f):當出現錯誤時仍然繼續備份操作; --host:指定要備份資料庫的伺服器; --lock-tables:備份前,鎖定所有資料庫表; --no-create-db:禁止生成建立資料庫語句; --no-create-info:禁止生成建立資料庫庫表語句; --password:連線MySQL伺服器的密碼; --port:MySQL伺服器的埠號; --user:連線MySQL伺服器的使用者名稱。 --no-data(即-d):只匯出表結構。 --quick,(即-q):快速匯出。 --xml,(即-X):匯出為xml檔案。 --tables:覆蓋 --databases or -B選項,後面所跟引數被視作表名。 --default-character-set,字符集設定。比如--default-character-set=gb2312、--default-character-set=utf8
引數--lock-tables 表示的是一次性鎖定當前庫的所有表, 而不是鎖定當前匯出表! 例如:
# mysqldump -u root -p --default-character-set=utf8 --opt --extended-insert=false --lock-tables MyDB > db_backup_MyDB.sql
例項說明:
1)匯出、匯入所有的庫(--all-databases, -A 匯出全部資料庫)
匯出所有的庫 [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 --all-databases >/opt/all.sql Warning: Using a password on the command line interface can be insecure. 匯入所有的庫 [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/all.sql Warning: Using a password on the command line interface can be insecure. 或者 mysql> source /opt/all.sql;
2)匯出、匯入某個庫(比如kevin庫)
匯出kevin庫 [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 kevin > /opt/kevin.sql Warning: Using a password on the command line interface can be insecure. 匯入kevin庫(前提是kevin庫要存在,如果沒有,在匯入前先建立kevin空庫) [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin.sql Warning: Using a password on the command line interface can be insecure. 或者 mysql> use kevin; mysql> source /opt/all.sql;
3)匯出、匯入某幾個庫(比如kevin、grace庫)(--databases, -B 匯出部分資料庫)
匯出kevin、grace庫 [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -B kevin grace > /opt/kevin_grace.sql Warning: Using a password on the command line interface can be insecure. 匯入kevin、grace庫(多個庫的匯入、恢復資料操作,不需要要求這些庫必須存在,如沒有存在,不需要提前建立這些空庫) [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/kevin_grace.sql Warning: Using a password on the command line interface can be insecure. 或者 mysql> source /opt/kevin_grace.sql;
4)匯出、匯入某個庫的某些表資料
匯出kevin庫的haha、heihei表資料(可以在匯出時加--add-locks引數,表示匯出時鎖定資料庫表;這裡沒有新增) [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 kevin haha heihei > /opt/kevin_hahei.sql Warning: Using a password on the command line interface can be insecure. 匯入kevin庫的haha、heihei表資料(要保證kevin庫真實存在,如果沒有,需要提前建立) [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_hahei.sql Warning: Using a password on the command line interface can be insecure. 或者 mysql> use kevin; Database changed mysql> source /opt/kevin_hahei.sql;
5)只匯出資料庫結構,不匯出資料(--no-data, -d 只匯出表結構,不匯出表資料)
匯出kevin庫下所有的表結構(不匯出表資料)(去掉下面的--add-drop-table引數也可以) [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -d --add-drop-table kevin > /opt/kevin_table.sql Warning: Using a password on the command line interface can be insecure. 匯入kevin庫的表結構(前提要保證kevin庫真實存在) [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_table.sql Warning: Using a password on the command line interface can be insecure. 或者 mysql> use kevin; Database changed mysql> source /opt/kevin_table.sql; ---------------------------------------------------------------------------------------------------- 如果是匯出某個庫下的一個或幾個表結構(不包括表資料),命令如下(加不加--add-drop-table引數都可以): [root@Mysql-node1 ~]# mysqldump -uroot -hlocalhost -p123456 -d kevin haha heihei > /opt/kevin_table_2.sql Warning: Using a password on the command line interface can be insecure. 匯入上面備份的資料時,要保證kevin提前真實存在。 [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 kevin < /opt/kevin_table_2.sql Warning: Using a password on the command line interface can be insecure.
6)完整匯出時過濾掉某些庫(使用--databases,而不是--all-databases)
如下在匯出整個資料庫時,過濾掉information_schema、mysql、test、performance_schema這幾個庫 [root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database" information_schema grace kevin mysql performance_schema test [root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database|information_schema|mysql|test|performance_schema" grace kevin [root@Mysql-node1 ~]# mysql -p123456 -e "show databases"|grep -Ev "Database|information_schema|mysql|test|performance_schema"|xargs mysqldump -uroot -p123456 --databases > /opt/mysql_dump.sql 匯入上面備份的庫(這些庫不需要真實存在,恢復時如果庫不存在,會自動建立) [root@Mysql-node1 ~]# mysql -uroot -hlocalhost -p123456 < /opt/mysql_dump.sql Warning: Using a password on the command line interface can be insecure. 或者: mysql> source /opt/kevin_grace.sql;
Mysqldump日常操作語句集錦
mysqldump的幾種常用方法: 1)匯出整個資料庫(包括資料庫中的資料) mysqldump -u username -p dbname > dbname.sql 2)匯出資料庫結構(不含資料) mysqldump -u username -p -d dbname > dbname.sql 3)匯出資料庫中的某張資料表(包含資料) mysqldump -u username -p dbname tablename > tablename.sql 4)匯出資料庫中的某張資料表的表結構(不含資料) mysqldump -u username -p -d dbname tablename > tablename.sql ============================================================================= mysqldump常用引數說明(適用於mysql 5.6版本, mysql 5.7版本有的就不太適用了) --all-databases , -A 匯出全部資料庫 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql --all-tablespaces , -Y匯出全部表空間。(-y不匯出任何表空間資訊) [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --all-tablespaces --no-tablespaces > /root/db.sql [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --no-tablespaces > /root/db.sql --add-drop-database每個資料庫建立之前新增drop資料庫語句。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --add-drop-database > /root/db.sql --add-drop-table每個資料表建立之前新增drop資料表語句。(預設為開啟狀態,使用--skip-add-drop-table取消選項) [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql #預設新增drop語句 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-add-drop-table > /root/db.sql #取消drop語句 --add-locks在每個表匯出之前增加LOCK TABLES並且之後UNLOCK TABLE。(預設為開啟狀態,使用--skip-add-locks取消選項) [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql #預設新增LOCK語句 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-add-locks > /root/db.sql #取消LOCK語句 --comments附加註釋資訊。預設為開啟,可以用--skip-comments取消 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases > /root/db.sql #預設記錄註釋 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --skip-comments > /root/db.sql #取消註釋 --compact匯出更少的輸出資訊(用於除錯)。去掉註釋和頭尾等結構。 可以使用選項:--skip-add-drop-table 、--skip-add-locks、--skip-comments、--skip-disable-keys [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --compact > /root/db.sql --complete-insert, -c使用完整的insert語句(包含列名稱)。這麼做能提高插入效率,但是可能會受到max_allowed_packet引數的影響而導致插入失敗。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --complete-insert > /root/db.sql --compress, -C在客戶端和伺服器之間啟用壓縮傳遞所有資訊 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --compress > /root/db.sql --databases, -B匯出幾個資料庫。引數後面所有名字參量都被看作資料庫名。 [root@Mysql-node1 ~]# mysqldump -uroot -p --databases test mysql > /root/db.sql --debug-info輸出除錯資訊並退出 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --debug-info > /root/db.sql --default-character-set設定預設字符集,預設值為utf8 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --default-character-set=utf8 > /root/db.sql --delayed-insert採用延時插入方式(INSERT DELAYED)匯出資料 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --delayed-insert > /root/db.sql --events, -E匯出事件。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --events > /root/db.sql --flush-logs開始匯出之前重新整理日誌。請注意:假如一次匯出多個資料庫(使用選項--databases或者--all-databases),將會逐個資料庫重新整理日誌。 除使用--lock-all-tables或者--master-data外。在這種情況下,日誌將會被重新整理一次,相應的所以表同時被鎖定。因此,如果打算同時匯出和重新整理 日誌應該使用--lock-all-tables 或者--master-data 和--flush-logs。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --flush-logs > /root/db.sql --flush-privileges在匯出mysql資料庫之後,發出一條FLUSH PRIVILEGES 語句。為了正確恢復,該選項應該用於匯出mysql資料庫和依賴mysql 資料庫資料的任何時候。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --flush-privileges > /root/db.sql --force在匯出過程中忽略出現的SQL錯誤。 [root@Mysql-node1 ~]# mysqldump -uroot -p --all-databases --force > /root/db.sql --host, -h需要匯出的主機資訊 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases > /root/db.sql --ignore-table不匯出指定表。指定忽略多個表時,需要重複多次,每次一個表。每個表必須同時指定資料庫和表名。例如:--ignore-table=database.table1 --ignore-table=database.table2 …… [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --ignore-table=mysql.user > /root/db.sql --lock-all-tables, -x提交請求鎖定所有資料庫中的所有表,以保證資料的一致性。這是一個全域性讀鎖,並且自動關閉--single-transaction 和--lock-tables 選項。 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --lock-all-tables > /root/db.sql --lock-tables, -l開始匯出前,鎖定所有表。用READ LOCAL鎖定表以允許MyISAM表並行插入。對於支援事務的表例如InnoDB和BDB,--single-transaction是一個 更好的選擇,因為它根本不需要鎖定表。請注意當匯出多個資料庫時,--lock-tables分別為每個資料庫鎖定表。因此,該選項不能保證匯出檔案中的表在資料庫之間 的邏輯一致性。不同資料庫表的匯出狀態可以完全不同。 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --lock-tables > /root/db.sql --no-create-db, -n只匯出資料,而不新增CREATE DATABASE 語句。 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-create-db > /root/db.sql --no-create-info, -t只匯出資料,而不新增CREATE TABLE 語句。 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-create-info > /root/db.sql --no-data, -d不匯出任何資料,只匯出資料庫表結構。 [root@Mysql-node1 ~]# mysqldump -uroot -p --host=localhost --all-databases --no-data > /root/db.sql
備份Mysql資料庫的通常使用命令
1)備份kevin庫 (兩種方法) # mysqldump --single-transaction --master-data=2 --triggers --routines --database kevin -uroot -p123456 > /root/kevin.sql # mysqldump -uroot -p123456 -B -F -R -x --master-data=2 kevin|gzip >/opt/backup/kevin_$(date +%F).sql.gz 引數說明: -B:指定資料庫 -F:重新整理日誌 -R:備份儲存過程等 -x:鎖表 --master-data:在備份語句裡新增CHANGE MASTER語句以及binlog檔案及位置點資訊 這裡稍微注意下: mysql5.6使用mysqldump備份時,指定備份的具體庫,使用--database mysql5.7使用mysqldump備份時,指定備份的具體庫,使用--databases 2)備份整個資料庫(基於開啟GTID功能的Mysql)。下面這兩種備份方法中,不能在下面命令中新增具體的庫,比如kevin庫 # mysqldump -u root -p'123456' --lock-all-tables --master-data=2 --flush-logs --all-databases --triggers --routines --events > 205_slave.sql # mysqldump -uroot -p'123456' -B -A -F --set-gtid-purged=OFF --master-data=2 --single-transaction --events |gzip >/root/205_$(date +%F).sql.gz 以上備份的sql檔案,恢復時,直接執行"mysql -uroot -p123456 < file.sql" 或者登入資料庫執行"source file.sql" 命令進行即可恢復備份的資料!不需要提前建立要恢復的庫!
mysql資料庫相關備份策略的指令碼分享
本機mysql採用的是多庫多例項方案,即一個庫對應一個例項,有多少個庫就開啟多少個埠的mysql例項。 正常情況下都採用這種方案,一庫一例項叢集,隔離性和可辨識性會很強,效能也更強。 如果是虛擬機器,機器效能有限,可以一個例項開啟多個庫。比如一個例項對應3個庫,開啟三個例項,一臺機器總共開9個庫, 然後針對這三個例項再做叢集(比如一主兩從,即再加兩臺機器,分別針對每臺機器的三個例項做各自的一主兩從) mysql的備份指令碼: [app@kevin-mysql01 scripts]$ pwd /home/scripts [app@kevin-mysql01 scripts]$ ls dump_full.sh full_backup_mysql.sh incremental_backup_mysql.sh shibo_databackup.sh rsync.sh 1) [app@kevin-mysql01 scripts]$ cat dump_full.sh #!/bin/bash #註釋:mysql DB的全庫備份指令碼 DB_USER='mybak' DATE=`date -d"today" +%Y%m%d` TIME=`date "+%Y-%m-%d %H:%M:%S"` echo '--------------開始分庫分表備份:開始時間為 '$TIME for port in `ps -ef | grep mysql| grep socket| grep datadir| awk -F= '{print $NF}'` do BEGIN=`date "+%Y-%m-%d %H:%M:%S"` BEGIN_T=`date -d "$BEGIN" +%s` echo '備份'$port'埠號的mysql例項,開始時間為 '$BEGIN BACKUP_DIR=/data/backup/$DATE/$port; mkdir -p $BACKUP_DIR; ##避免迴圈的port和sock不匹配 sock=`ps -ef | grep mysql| grep socket| grep datadir|awk -F".pid" '{print $NF}'| grep $port` DB_PASSWORD='MySQL123.' #過濾掉MySQL自帶的DB for i in `/usr/local/mysql/bin/mysql -u$DB_USER -p$DB_PASSWORD $sock -BN -e"show databases;" |sed '/^performance_schema$/'d|sed '/^mysql/'d |sed '/^information_schema$/'d|sed '/^information_schema$/'d|sed '/^test$/'d ` do sudo /usr/local/mysql/bin/mysqldump -u$DB_USER -p$DB_PASSWORD $sock --master-data=2 -q -c --skip-add-locks -R -E -B $i > $BACKUP_DIR/$date$i.sql done END=`date "+%Y-%m-%d %H:%M:%S"` END_T=`date -d "$END" +%s` TIME_INVENTAL_M=$[($END_T-$BEGIN_T)/60] TIME_INVENTAL_S=$[($END_T-$BEGIN_T)%60] echo '備份'$port'埠號的mysql例項於' $END '備份完成,使用時間為 '$TIME_INVENTAL_M'分鐘'$TIME_INVENTAL_S'秒' #備份檔案的處理 cd $BACKUP_DIR/.. tar -zczf $port'_'$(date +%F_%H-%M).tar.gz $port #解壓 tar -zvxf $port.tar.gz rm -rf $port done TIME_END=`date "+%Y-%m-%d %H:%M:%S"` echo '--------------backup all database successfully!!!結束時間:' $TIME_END #刪除60天以前的備份 find /data/backup/ -name '*'`date +%Y`'*' -type d -mtime +60 -exec rm -rf {} \; 2) [app@kevin-mysql01 scripts]$ cat full_backup_mysql.sh #!/bin/sh ######################################################################### ## Description: Mysql全量備份指令碼 ## File Name: full-backup-mysql.sh ## Author: wangshibo ## mail: wangshibo@************ ## Created Time: 2017年9月11日 14:17:09 ########################################################################## OneMonthAgo=`date -d "2 month ago" +%Y%m%d` today=`date +%Y%m%d` datetime=`date +%Y%m%d-%H-%M-%S` config=/etc/mykedata_3326.cnf basePath=/data/backup logfilePath=$basePath/logs logfile=$logfilePath/full_$datetime.log USER=mybak PASSWD=1az2wsx3edc@sb SOCKET=/data/mysqldata/kedata/mysql.sock dataBases="huoqiu batchdb shenzheng tianjin asset bc_asset shanghai vered_dataplatform aomen" echo 'Full backup mysql in ' $path > $logfile path=$basePath/full_$datetime mkdir -p $path sudo /usr/bin/innobackupex --defaults-file=$config --user=$USER --password=$PASSWD --socket=$SOCKET --compress --compress-threads=2 --compress-chunk-size=64K --host=localhost $path --no-timestamp > $logfile 2>&1 #--safe-slave-backup sudo chown app.app $path -R ret=`tail -n 2 $logfile |grep "completed OK"|wc -l` if [ "$ret" = 1 ] ; then echo 'delete expired backup ' $basePath/$OneMonthAgo >> $logfile echo $path > $logfilePath/last_backup_sucess.log rm -rf $basePath/full_$OneMonthAgo* rm -f $logfilePath/full_$OneMonthAgo*.log else echo 'backup failure ,no delete expired backup' >> $logfile fi if [ "$ret" = 1 ] ;then status=0 else status=1 fi echo $status ts=`date +%s`; curl -X POST -d "[{\"metric\": \"backup_status\", \"endpoint\": \"bl2-mysql01.veredholdings.cn\", \"timestamp\": $ts,\"step\":86400,\"value\": $status,\"counterType\": \"GAUGE\",\"tags\": \"\"}]" http://127.0.0.1:1988/v1/push 3) [app@kevin-mysql01 scripts]$ cat incremental_backup_mysql.sh #!/bin/sh ######################################################################### ## Description: Mysql增量備份指令碼 ## File Name: incremental-backup-mysql.sh ## Author: wangshibo ## mail: wangshibo@************ ## Created Time: 2018年1月11日 14:17:09 ########################################################################## today=`date +%Y%m%d` datetime=`date +%Y%m%d-%H-%M-%S` config=/etc/mykedata_3326.cnf basePath=/data/backup logfilePath=$basePath/logs logfile=$logfilePath/incr_$datetime.log USER=mybak PASSWD=1az2wsx3edc@sb dataBases="huoqiu batchdb shenzheng tianjin shanghai asset aomen" pid=`ps -ef | grep -v "grep" |grep -i innobackupex|awk '{print $2}'|head -n 1` if [ -z $pid ] then echo " start incremental backup database " >> $logfile OneMonthAgo=`date -d "1 month ago" +%Y%m%d` path=$basePath/incr_$datetime mkdir -p $path last_backup=`cat $logfilePath/last_backup_sucess.log| head -1` echo " last backup is ===> " $last_backup >> $logfile sudo /usr/bin/innobackupex --defaults-file=$config --user=$USER --password=$PASSWD --compress --compress-threads=2 --compress-chunk-size=64K --slave-info --host=localhost --incremental $path --incremental-basedir=$last_backup --databases="${dataBases}" --no-timestamp >> $logfile 2>&1 #--safe-slave-backup sudo chown app.app $path -R ret=`tail -n 2 $logfile |grep "completed OK"|wc -l` if [ "$ret" = 1 ] ; then echo 'delete expired backup ' $basePath/incr_$OneMonthAgo* >> $logfile rm -rf $basePath/incr_$OneMonthAgo* rm -f $logfilePath/incr_$OneMonthAgo*.log echo $path > $logfilePath/last_backup_sucess.log else echo 'backup failure ,no delete expired backup' >> $logfile fi else echo "****** innobackupex in backup database ****** " >> $logfile fi 4) [app@kevin-mysql01 scripts]$ cat shibo_databackup.sh #!/bin/bash USERNAME=root PASSWORD=kevin@qwe123!@#s DATE=`date +%Y-%m-%d` OLDDATE=`date +%Y-%m-%d -d '-30 days'` MYSQL=/usr/local/mysql/bin/mysql MYSQLDUMP=/usr/local/mysql/bin/mysqldump MYSQLADMIN=/usr/local/mysql/bin/mysqladmin SOCKET=/data/mysqldata/kedata/mysql.sock BACKDIR=/data/backup/ [ -d ${BACKDIR} ] || mkdir -p ${BACKDIR} [ -d ${BACKDIR}/${DATE} ] || mkdir ${BACKDIR}/${DATE} [ ! -d ${BACKDIR}/${OLDDATE} ] || rm -rf ${BACKDIR}/${OLDDATE} for DBNAME in anhui huoqiu beijing shenzheng shanghai tianjin wangshibo aomen do ${MYSQLDUMP} --opt -u${USERNAME} -p${PASSWORD} -S${SOCKET} ${DBNAME} | gzip > ${BACKDIR}/${DATE}/${DBNAME}-backup-${DATE}.sql.gz logger "${DBNAME} has been backup successful - $DATE" /bin/sleep 5 done 5) [app@kevin-mysql01 scripts]$ cat rsync.sh #!/bin/bash datetime=`date +%Y%m%d-%H-%M-%S` logfile=/data/backup/rsync.log echo "$datetime Rsync backup mysql start " >> $logfile sudo rsync -e "ssh -p6666" -avpgolr /data/backup kevin@192.168.10.30:/data/backup_data/kevin/DB_bak/192.168.10.163/ >> $logfile 2>&1 ret=`tail -n 1 $logfile |grep "total size"|wc -l` if [ "$ret" = 1 ] ; then echo "$datetime Rsync backup mysql finish " >> $logfile else echo "$datetime Rsync backup failure ,pls sendmail" >> $logfile fi