使用mysqldump對mysql進行備份與恢復

說明:
主參考:
https://blog.csdn.net/fanren224/article/details/79693860

#!/bin/bash
echo "test"
echo "hello world"

mysql數據全量備份

1.開啓二進制日誌,備份指定數據庫

cat << EOF > /root/sqlfull.sh
#!/bin/bash
BACKUP_USER='root'
BACKUP_PASSWD='m4r!adbOP'
mysqldump --quick --events  --routines --triggers --hex-blob --flush-logs --single-transaction --master-data=2 -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} --databases {"test","test2"} > /root/dbbak.sql
EOF
chmod +x /root/sqlfull.sh

--flush-logs 備份開始時滾動一次二進制日誌
--routines  備份存儲過程和函數
--triggers  備份觸發器
--events    備份事件表
--single-transaction  表類型爲InnoDB時,熱備,表類型爲MyISAM時,溫備
--master-data=2  以註釋的方式記錄備份開始時二進制日誌的前綴名和位置
--master-data=1  記錄備份開始時二進制日誌的前綴名和位置,用於從庫通過備份sql還原數據,還原後能從指定位置開始同步

 

2.未開啓二進制日誌,備份指定數據庫

cat << EOF > /root/sqlfull.sh
#!/bin/bash
BACKUP_USER='root'
BACKUP_PASSWD='m4r!adbOP'
mysqldump --quick --events  --routines --triggers --hex-blob --single-transaction -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} --databases {"test","test2"} > /root/dbbak.sql
EOF
chmod +x /root/sqlfull.sh

 

mysql數據恢復


因爲恢復數據時會執行大量的insert語句,如果沒有特殊要求,還原時沒有必要將這些操作記錄到二進制日誌中,所以關閉當前會話的二進制日誌記錄。
set sql_log_bin=OFF;
所有恢復操作完成後,再將當前會話中的sql_log_bin再次開啓。
恢復命令
source /root/dbbak.sql
此命令只是恢復到了備份sql對應的時間點,還需要進行時間點還原。

進行時間點恢復時,備份時間點之後的數據則需要通過二進制日誌進行還原,首先,要從二進制日誌中提取對應的sql,提取sql的起始位置爲備份開始時那一刻二進制文件對應的position,因爲在使用mysldump備份時,我們推薦使用--master-data=2選項,所以在對應的數據庫備份sql文件中應該存在對應的position,提取sql的結束位置應該是drop語句對應的位置,因爲咱們模擬的場景是有人誤操作drop了數據庫,所以結束位置應該是drop語句的位置。注意,不要把誤操作的drop語句提取出來,否則重放對應sql時又會將對應的數據刪除,如果是那樣就前功盡棄了。

 

通過二進制日誌進行還原


主參考:
https://blog.csdn.net/liuchen1314/article/details/79628555

基於位置恢復,通過查看日誌文件信息,確認6259-6362爲誤操作點
mysqlbinlog --stop-position=6259 mysql-bin.000001 | mysql -uroot -p #從1開始至6259的事件讀,不包括6259事件
mysqlbinlog --start-position=6363 mysql-bin.000001 | mysql -uroot -p #從6259的事件開始讀
取兩事件點
mysqlbinlog --start-position=5786 --stop-position=6254 mysql-bin.000001 | mysql -uroot -p

 

 

mysql數據增量備份

cat << EOF > /root/sqladd.sh
#!/bin/bash
BACKUP_USER='root'
BACKUP_PASSWD='m4r!adbOP'
backupdir=/root/backup
datedir=`date "+%Y%m%d"`
mkdir $backupdir/$datedir
logsindexpath=/usr/local/mysqldata/binlogs/mysql-bin.index
mysqladmin -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} flush-logs
binlog_cp=`head -n -1 ${logsindexpath}`
for i in ${binlog_cp}
do
mysql -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} -e "\! cp -p ${i} ${backupdir}/${datedir}/"
done
binlog_rm=`tail -n 1 ${logsindexpath} | awk -F '/' '{print $NF}'`
mysql -u${BACKUP_USER} -h 127.0.0.1 -p${BACKUP_PASSWD} -e "purge binary logs to '${binlog_rm}'"
EOF
chmod +x /root/sqladd.sh

 

每週一次全量備份,每天一次增量備份,只保留一月以內的備份。

echo << EOF > /root/sqlclean.sh
#!/bin/bash
find /root/backup/ -type f -mtime +30 -exec rm -rf {} \;
EOF
chmod +x /root/sqlclean.sh
crontab -e
0 22 * * 6  /root/sqlfull.sh
0 3 * * *   /root/sqladd.sh
0 0 * * 7 /root/sqlclean.sh
crontab -l

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章