兩套mysql備份指令碼
資料備份其重要性無需多言,再細想一步,我們至少需要兩種備份:一種邏輯備份(mysqldump生成sql檔案);一種物理備份(xtrabackup可很好完成)。邏輯備份在出問題時能提供更細粒度的恢復和對比;物理備份在整庫範圍的資料恢復或者增加從庫方面有著更高的效率。
首先看下邏輯備份指令碼,比較簡單
#!/bin/sh ###每天執行一次 ###定義使用者 密碼 備份目錄等資訊 user=mysqldump psd=mysqldump backup_base=/data/mysql_backup date=`date +%Y%m%d` old_date=`date +%Y%m%d -d -30days` ###儲存的天數 ###獲取庫名,排除不需要備份的庫 for db in `mysql -u$user -p$psd -s -N -e "show databases"|grep -v -E "(test|percona|information_schema|performance_schema)"` do ###建立備份目錄 if [ ! -d $backup_base/$db ];then mkdir $backup_base/$db fi cd $backup_base/$db chattr -i ./* rm -f $old_date.sql* &>/dev/null #刪除30天以前的 mysqldump -u$user -p$psd --events --routines $db |gzip > $date.sql.gz ###備份&壓縮 chattr +i ./* ###這裡加了個防誤刪的屬性 done
接下來看基於xtrabackup的物理(整庫)備份指令碼。相比上面的指令碼,這個就有意思點兒了(在生成備份的時候遵循了一個規則,然後在恢復指令碼里加邏輯判斷實現任意時候都能一鍵恢復)
整套功能需要 三個指令碼 innobackupex_all.sh、innobackupex_increment.sh、innobackupex_restore.sh
我們知道xtrabackup可以第一次備份全量資料,之後設定增量備份。Linux crontab以數字0-6表示"週日"-"週六"。所以,我以一週為週期:週日進行全備,存放於0目錄;週一至週六增備,存放於1-6目錄;下次週日清空目錄重新全備。
上面以0-6這樣的目錄名存放備份資料,是為了讓恢復指令碼innobackupex_restore.sh處理起來更方便。無論在周幾執行恢復指令碼,都能正確的執行xtrabackup的恢復過程。
依percona官方文件。xtrabackup備份至少需要以下許可權:GRANT RELOAD, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO 'xtrabackup'@'localhost' identified by xxxx
計劃任務設定如下
wKiom1YjllLjfwWHAABUb2Zxa3Q422.jpg
全備指令碼 innobackupex_all.sh
#!/bin/sh ###每週日凌晨4點,執行全量備份 base_dir=/ljk/data rm -rf $base_dir/* 2>> $base_dir/all.log ###清空base_dir,執行全備 ###備份並將日誌記錄於base_dir下的all.log /usr/bin/innobackupex --user=xtrabackup --password=xtrabackup $base_dir 2>> $base_dir/all.log cd $base_dir #將以'當前時間命名的全備目錄'重新命名為'0' mv 20* 0 2>> $base_dir/all.log
增備指令碼innobackupex_increment.sh
#!/bin/sh ###周1--周6凌晨4點 增量備份 base_dir=/ljk/data today=`date +%u` yesterday=`expr $today - 1` echo -e "n===================================n" >> $base_dir/increment.log ###增備日誌記錄於$base_dir/increment.log /usr/bin/innobackupex --user=xtrabackup --password=xtrabackup --incremental $base_dir --incremental-basedir=$base_dir/$yesterday 2>> $base_dir/increment.log cd $base_dir #重新命名備份檔案,以0 1 2 3 4 5 6 代表週日到 週六 mv 20* $today 2>> $base_dir/increment.log
恢復指令碼innobackupex_restore.sh
#!/bin/sh ###檢查上次命令執行是否成功的函式 function check { if [ $? -ne 0 ];then echo -e "e[1;31mn $1 exec failed,please check it !e[0m n" echo "$1 failed,please check it !" sleep 1 exit -1 fi } base_dir=/ljk/data backup_dir=`ls -l $base_dir|grep -e "^d.*"|awk '{print $NF}'` echo -e "the backup dir is: $backup_dir n" sleep 1 ###開始恢復 cd $base_dir echo -e "------ 準備階段 0 ------n" sleep 1 /usr/bin/innobackupex --apply-log --redo-only $base_dir/0 check "準備階段 0"; ###執行除去 0 和 最後一個目錄 之外的其他目錄的恢復準備 dir_num=`ls -l $base_dir|grep -e "^d.*"|wc -l` #取出有幾個備份目錄 for i in `seq 1 $(($dir_num - 2))` do echo -e "------ 準備階段 $i ------ n" sleep 1 /usr/bin/innobackupex --apply-log --redo-only $base_dir/0 --incremental-dir=$base_dir/$i check "準備階段 $i"; done ###最後一個增量備份 echo -e "------ 準備階段 $(($dir_num - 1)) ------ n" sleep 1 /usr/bin/innobackupex --apply-log $base_dir/0 --incremental-dir=$base_dir/$(($dir_num - 1)) check "準備階段 $(($dir_num - 1))"; ###以上步驟將所有增量備份中記錄的變化應用到了最初的全量備份中 echo -e "------ 應用所有變化到$base_dir/0 ------n" /usr/bin/innobackupex --apply-log $base_dir/0 check "應用所有變化到$base_dir/0"; ###將資料考回資料目錄 echo -e "------ 將處理好的資料考回至資料目錄 ------n" /usr/bin/innobackupex --copy-back $base_dir/0 check "copy-back";
物理備份目錄結構截圖
wKioL1Yl0YuS9eaIAADKyyzqV00547.jpg
©著作權歸作者所有:來自51CTO部落格作者kai404的原創作品,如需轉載,請註明出處,否則將追究法律責任
mysql備份指令碼 邏輯備份 物理備份通用指令碼
10
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2325/viewspace-2820506/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mysql備份指令碼MySql指令碼
- MySQL中binlog備份指令碼分享MySql指令碼
- Mysql定時備份資料指令碼MySql指令碼
- 【MySQL】Xtrabackup備份及恢復指令碼MySql指令碼
- MySQL:Windows下分庫備份指令碼MySqlWindows指令碼
- 備份指令碼指令碼
- MySQL資料庫備份的shell指令碼MySql資料庫指令碼
- MySQL備份指令碼,應該這麼寫MySql指令碼
- linux mysql定時備份指令碼記錄LinuxMySql指令碼
- rman 備份指令碼指令碼
- ORACLE備份指令碼Oracle指令碼
- iOS —— 兩套自動打包指令碼iOS指令碼
- Liunx備份mysql資料庫的shell指令碼MySql資料庫指令碼
- 自動備份指令碼指令碼
- windows mysqldump備份指令碼WindowsMySql指令碼
- MySQL自動備份指令碼30天自動刪除MySql指令碼
- expdp 邏輯備份指令碼指令碼
- 資料庫備份指令碼資料庫指令碼
- 自動定時備份 mysql 資料庫 的 shell 指令碼MySql資料庫指令碼
- mysql容器的定時備份指令碼,有二種方法,備份好後打包傳送到遠端備份主機MySql指令碼
- oracle自動冷備份指令碼Oracle指令碼
- 分享Oracle Rman的備份指令碼Oracle指令碼
- 使用shell 指令碼備份資料指令碼
- ORACLE常用定時備份指令碼Oracle指令碼
- 案例:通過shell指令碼實現mysql資料備份與清理指令碼MySql
- 檢查備份情況的指令碼指令碼
- windows 全量+增量備份指令碼batWindows指令碼BAT
- mysqldump壓縮備份匯出匯入(含定期備份shell指令碼)MySql指令碼
- windows 批處理備份目錄指令碼Windows指令碼
- oracle資料庫使用rman備份指令碼Oracle資料庫指令碼
- Windows環境PgSql自動備份指令碼WindowsSQL指令碼
- shell 備份檔案指令碼+自動清理指令碼
- 【BASIS】HANA備份指令碼,Catalog自動清理指令碼
- mysql備份時候兩個很有用的引數MySql
- Mysqldump備份說明及資料庫備份指令碼分享-運維筆記MySql資料庫指令碼運維筆記
- KOSQL Server2019資料庫備份與還原指令碼(批量備份)zrbSQLServer資料庫指令碼
- mysql的冷備份與熱備份MySql
- MySQL:xtrabackup備份MySql