一、單獨備份數據庫
mysqldump -uroot -poldboy oldboy >/opt/oldboy.sql 最簡單的備份
1) mysql基於myisam引擎
mysqldump -uroot -poldboy -B -x -F oldboy | gzip >/opt/oldboy.sql.gz
DBA給的備份:
mysqldump --user=root --all-databases --flush-privileges --lock-all-tables --master-data=1 --flush-logs --triggers --routines --events --hex-blob > /mybackup/alldatabase.sql
2) 5.5以後默認是innodb(推薦)
mysqldump -uroot -poldboy -B -F --single-transactio oldboy | gzip >/opt/oldboy.sql.gz
DBA給的備份:
mysqldump --user=root --all-databases --flush-privileges --single-transaction --master-data=1 --flush-logs --triggers --routines --events --hex-blob > /mybackup/alldatabase.sql
二、多實例分庫備份數據庫(用於寫shell腳本)
主要思想就是把庫列出來,一個for循環備份
mysql -uroot -poldboy -e"show databases;" | egrep -Evi "info|perfor" |sed -r 's#^([a-z].*$)#mysqldump -uroot -poldboy -B \1 |gzip >/opt/1.sql.gz #g' |bash
/bin/bash BAKPATH=/opt/mysql MYUSER=root MYPASSWD=123456 SOCKET=/data/3308/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASSWD -S $SOCKET" MYSQLDUMP=mysqldump -u$MYUSER -P$MYPASSWD -S $SOCKET -B -x -F -R [ ! -d $BAKPATH ] && mkdir -p $BAKPATH DBLIST=`$MYCMD -e "show databases; | sed 1d" |egrep -Evi "mysql|info" ` for dbname in DBLIST DO $MYSQLDUMP $dbname |gzip > /$BAKPATH/${dbname}_$(date +%F).sql.gz DONE
提示:-B是連創建庫和查詢庫的語句都備份了,所以建議加上(一般備份多個庫的時候用),-x所有數據庫中的所有表加鎖
備份表
mysqldump -uroot -poldboy 庫名 表名 >/opt/table.sql
三、多實例分表備份
主要思想就是把表列出來,兩層for循環備份
/bin/bash BAKPATH=/opt/mysql MYUSER=root MYPASSWD=123456 SOCKET=/data/3308/mysql.sock MYCMD="mysql -u$MYUSER -p$MYPASSWD -S $SOCKET" MYSQLDUMP=mysqldump -u$MYUSER -P$MYPASSWD -S $SOCKET -x -F -R [ ! -d $BAKPATH ] && mkdir -p $BAKPATH DBLIST=`$MYCMD -e "show databases; | sed 1d" |egrep -Evi "mysql|info" ` for dbname in DBLIST do TLIST=`$MYCMD -e "show tables from $dbname;" | sed 1d` for tname in $TLIST do mkdir -p $BAKPATH/$dbname $MYSQLDUMP $dbname $tname |gzip >/$BAKPATH/$dbname/${tname}_$(date +%F).sql.gz done $MYSQLDUMP $dbname |gzip > /$BAKPATH/${dbname}_$()$(date +%F).sql.gz done
注:(純手打,有問題請指出)
如果數據庫不大建議兩個都備份,有時候只要求恢復一個表
-d參數只備份表結構
-t參數只備份數據
-F刷新binlog日誌
其他參數 mysqldump --help查詢
批量恢復庫大概過程
for dbname in `ls *.sql`;do mysql -uroot -p123456 < $dbname.sql;done
四、增量備份
增量備份時一定要了解二進制的三種模式
可參考內容:http://blog.51yip.com/mysql/1042.html
http://blog.csdn.net/jesseyoung/article/details/41211841
五、數據庫恢復
恢復時最好的辦法時停庫,不讓往裏面寫
1.數據庫可能有多個,但是日誌文件記錄的是全部數據庫的變化,所以先進行將二進制文件按照數據庫進行拆分,用-d參數可以實現:
mysqlbinlog -d oldboy /var/lib/mysql/mysql-bin.000002 > /tmp/oldboy.sql(去掉誤操作的語句),先導入全備,在導入增備
2.指定時間可能會有誤差,一半用指定位置恢復,確認跳過點後進行恢復如下:
a)mysqlbinlog mysql-bin.000002 --start-position=370 --stop-position=440 | mysql -uroot -p