目錄
xtrabackup是percona公司專門針對mysql 數(shù)據(jù)庫開發(fā)的一款開源免費的物理備份(熱備)工具,可以對innodb和xtradb等事務(wù)引擎數(shù)據(jù)庫實現(xiàn)非阻塞(即不鎖表)方式的備份,也可以針對myisam等非事務(wù)引擎鎖表方式備份,是商業(yè)備份工具InnoDB Hotbackup的一個很好的替代品。
innodb
數(shù)據(jù)不影響業(yè)務(wù)mysql
和maridb
文件擴(kuò)展名
文件擴(kuò)展名 | 文件作用說明 |
---|---|
.idb文件 | 以獨立表空間存儲的InnoDB引擎類型的數(shù)據(jù)文件擴(kuò)展名 |
.ibdata文件 | 以共享表空間存儲的InnoDB引擎類型的數(shù)據(jù)文件擴(kuò)展名 |
.frm文件 | 存放于表相關(guān)的元數(shù)據(jù)(meta)信息及表結(jié)構(gòu)的定義信息 |
.MYD文件 | 存放MyISAM引擎表的數(shù)據(jù)文件擴(kuò)展名 |
.MYI文件 | 存放MyISAM引擎表的索引信息文件擴(kuò)展名 |
名詞
redo日志redo
日志,也稱事務(wù)日志,是innodb
引擎的重要組成部分,作用是記錄innodb
引擎中每一個數(shù)據(jù)發(fā)生的變化信息。主要用于保證innodb
數(shù)據(jù)的完整性,以及丟數(shù)據(jù)后的恢復(fù),同時可以有效提升數(shù)據(jù)庫的io
等性能。redo
日志對應(yīng)的配置參數(shù)為innodb_log_file_size
和innodb_log_files_in_group
Undo日志Undo
是記錄事務(wù)的逆向邏輯操作或者向物理操作對應(yīng)的數(shù)據(jù)變化的內(nèi)容,undo
日志默認(rèn)存放在共享表空間里面的ibdata*
文件,和redo
日志功能不同undo
日志主要用于回滾數(shù)據(jù)庫崩潰前未完整提交的事務(wù)數(shù)據(jù),確保數(shù)據(jù)恢復(fù)前后一致。
LSNLSN
,全拼log sequence number
,中文是日志序列號,是一個64
位的整型數(shù)字,LSN
的作用是記錄redo
日志時,使用LSN
唯一標(biāo)識一條變化的數(shù)據(jù)。
checkpoint
用來標(biāo)識數(shù)據(jù)庫崩潰后,應(yīng)恢復(fù)的redo log
的起始點
checkpoint
,記錄LSN
號碼information schema.xxx
備份innoDB
文件,過程中發(fā)生的新變化redo
也會被保存,保存至備份路徑Binlog
只讀,FTWRL
(global read lock)Non InnoDB
,拷貝完成解鎖binlog
、LSN
Last LSN
備份時經(jīng)歷的階段:
InnoDB表:
checkpoint
:將已提交的數(shù)據(jù)頁刷新到磁盤,記錄一個LSN
號碼InnoDB
表相關(guān)的文件(ibdata1
、frm
、ibd
...)redo
也會備份走非InnoDB表:
FTWRL
全局鎖表InnoDB
表的數(shù)據(jù)再次統(tǒng)計LSN
號碼,寫入到專用文件xtrabackup checkpoint
記錄二進(jìn)制日志位置
所有備份文件統(tǒng)一存放在一個目錄下,備份完成
redo lo
文件內(nèi)容和全備數(shù)據(jù)合并,并且read only
不進(jìn)行回滾redo log
變化加載到第一次增量數(shù)據(jù)再與全量數(shù)據(jù)做合并redo log
變化加載到第二次增量數(shù)據(jù)備份,在與全量和第一次增量的合并再進(jìn)行合并, 最后把臟數(shù)據(jù)進(jìn)行提交或回滾binlog
的文件內(nèi)容# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev
這里使用的是清華源,官方地址下載較慢。
官方最新的是8.0
版本,此版本只適用于mysql8.0
版本的數(shù)據(jù)庫,所以這里下載支持mysql5.6
的版本
# wget -c https://mirrors.tuna.tsinghua.edu.cn/percona/centos/7/os/x86_64/percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm# yum localinstall -y percona-xtrabackup-24-2.4.18-1.el7.x86_64.rpm
xtrabackup
能連接上數(shù)據(jù)庫:在mysql
配置文件client
下指定socket
位置標(biāo)簽或者在使用時指定[client]socket=/tmp/mysql.sock
mysqld
下的datadir
參數(shù)[mysqld]datadir=/usr/local/mysql/data
binlog
log-bin = /data/mysql/mysql-binbinlog_format="ROW"expire_logs_days=3
xtrabackup
是服務(wù)器端工具,不能遠(yuǎn)程備份# innobackupex --user=root --password=123456 /backup/xbk/
在做全備時為了控制生成的目錄名稱,可以添加參數(shù)--no-timestamp
并保留日期
# innobackupex --user=root --password=123456 --no-timestamp /backup/xbk/full_`date %F`
在備份目錄下查看備份的文件,除了mysql
自身的數(shù)據(jù)文件外,還有這樣幾個文件
# pwd/backup/xbk/2020-03-25_10-26-16# ll...-rw-r-----. 1 root root 27 Mar 25 10:53 xtrabackup_binlog_info-rw-r-----. 1 root root 147 Mar 25 10:53 xtrabackup_checkpoints-rw-r-----. 1 root root 480 Mar 25 10:53 xtrabackup_info-rw-r-----. 1 root root 31987200 Mar 25 10:53 xtrabackup_logfile
binlog
位置binlog
的文件名字和當(dāng)時的結(jié)束的position
,可以用來作為截取binlog
時的起點# cat xtrabackup_binlog_info mysql-bin.000001 192790323
commit
過的,內(nèi)存中的數(shù)據(jù)頁刷新到磁盤CKPT
開始備份數(shù)據(jù),數(shù)據(jù)文件的LSN
會停留在to_lsn
位置redo
的undo
,如果一旦有變化會將日志也一并備走,并記錄LSN
到last_lsn
,從to_lsn
——>last_lsn
就是,備份過程中產(chǎn)生的數(shù)據(jù)變化# cat xtrabackup_checkpoints backup_type = full-backupedfrom_lsn = 0 # 上次所到達(dá)的LSN號(對于全備就是從0開始,對于增量有別的顯示方法)to_lsn = 14194921406 # 備份開始時間(ckpt)點數(shù)據(jù)頁的LSNlast_lsn = 14200504300 # 備份結(jié)束后,redo日志最終的LSNcompact = 0recover_binlog_info = 0flushed_lsn = 14177446392
# cat xtrabackup_info uuid = c04f3d33-6e43-11ea-9224-005056ac7d7cname = tool_name = innobackupextool_command = --user=root --password=... /backup/xbk/tool_version = 2.4.18ibbackup_version = 2.4.18server_version = 5.6.46-logstart_time = 2020-03-25 10:26:16end_time = 2020-03-25 10:53:05lock_time = 0binlog_pos = filename 'mysql-bin.000001', position '192790323'innodb_from_lsn = 0innodb_to_lsn = 14194921406partial = Nincremental = Nformat = filecompact = Ncompressed = Nencrypted = N
redo
,關(guān)聯(lián)在備份期間對InnoDB
表產(chǎn)生的新變化恢復(fù)流程:
ckpt
,已提交的數(shù)據(jù)臟頁,從內(nèi)存刷寫到磁盤,并記錄此時的LSN
號redo
和undo
一起拷貝走,也就是checkpoint LSN
之后的日志Innodb
“自動故障恢復(fù)”的過程,將redo
(前滾)與undo
(回滾)進(jìn)行應(yīng)用cp
備份到原來數(shù)據(jù)目錄下模擬數(shù)據(jù)庫宕機(jī),刪除數(shù)據(jù)
# pkill mysqld# rm -rf datadir=/usr/local/mysql/data/*
prepare
預(yù)處理備份文件,將redo
進(jìn)行重做,已提交的寫到數(shù)據(jù)文件,未提交的使用undo
回滾掉。模擬了CSR
的過程
# innobackupex --apply-log /backup/xbk/2020-03-25_10-26-16
數(shù)據(jù)恢復(fù)并啟動數(shù)據(jù)庫
# cp -a /backup/xbk/2020-03-25_10-26-16/* /usr/local/mysql/data/# chown -R mysql.mysql /usr/local/mysql/data/# /etc/init.d/mysqld start
增量必須依賴于全備
每次增量都是參照上次備份的LSN
號碼(xtrabackup checkpoints),在此基礎(chǔ)上變化的數(shù)據(jù)頁進(jìn)行備份
會將備份過程中產(chǎn)生新的變化的redo
一并備份走
恢復(fù)時增量備份無法單獨恢復(fù),必須基于全備進(jìn)行恢復(fù)。必須將所有的增量備份,按順序全部合并到全備中
# innobackupex --user=root --password --no-timestamp /backup/full >&/tmp/xbk_full.log
db01 [(none)]>create database cs charset utf8;db01 [(none)]>use csdb01 [cs]>create table t1 (id int);db01 [cs]>insert into t1 values(1),(2),(3);db01 [cs]>commit;
# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/full /backup/inc1 &>/tmp/inc1.log
參數(shù):
--incremental 增量備份,后面跟要增量備份的路徑
--incremental-basedir=DIRECTORY 基目錄,增量備份使用,上一次(全備)增量備份所在目錄
db01 [cs]>create table t2 (id int);db01 [cs]>insert into t2 values(1),(2),(3);db01 [cs]>commit;
# innobackupex --user=root --password=123 --no-timestamp --incremental --incremental-basedir=/backup/inc1 /backup/inc2 &>/tmp/inc2.log
db01 [cs]>create table t3 (id int);db01 [cs]>insert into t3 values(1),(2),(3);db01 [cs]>commit;db01 [cs]>drop database cs;
恢復(fù)流程:
模擬數(shù)據(jù)庫宕機(jī),刪除數(shù)據(jù)
# pkill mysqld# rm -rf datadir=/usr/local/mysql/data/*
確認(rèn)備份完整性,對比每個備份集中的checkpoints
文件
全備份的checkpoints
文件內(nèi)容如下,可以發(fā)現(xiàn)to_lsn
和last_lsn
中間相差9
。這個數(shù)字差在5.7
版本前為0
,兩者相等,在5.7
版本后開啟GTID
后有了這個差值,作為內(nèi)部使用。所以如果是滿足這個條件,那么可以認(rèn)為備份期間并沒有新的數(shù)據(jù)修改。同樣的,在增量備份的備份集下的文件也是如此,且增量備份from_lsn
號與相鄰的上一個備份的last_lsn
減去9
是一致的。
# cat full/xtrabackup_checkpointsbackup_type = full-backupedfrom_lsn = 0to_lsn = 337979814last_lsn = 337979823compact = 0recover_binlog_info = 0# cat inc1/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 337979814to_lsn = 337985758last_lsn = 337985767compact = 0recover_binlog_info = 0# cat inc2/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 337985758to_lsn = 337991702last_lsn = 337991711compact = 0recover_binlog_info = 0
合并整理所有(apply-log)備份(full inc1 inc2)到全備:
--redo-only
參數(shù)表示只應(yīng)用redo
,不進(jìn)行undo
,防止LSN
號發(fā)生變化,除最后一次的備份合并外都需要加此參數(shù)
# innobackupex --apply-log --redo-only /data/backup/full
check_points
文件的last_lsn
相同,說明合并成功# 合并inc1到full中# innobackupex --apply-log --redo-only --incremental-dir=/data/backup/inc1 /data/backup/full# 合并inc2到full中(最后一次增量)# innobackupex --apply-log --incremental-dir=/data/backup/inc2 /data/backup/full
# innobackupex --apply-log /data/backup/full
# cp -a /backup/full/* /usr/local/mysql/data/# chown -R mysql.mysql /usr/local/mysql/data/# /etc/init.d/mysqld start
drop
之前的 binlog
查看最后一次增量備份中的文件內(nèi)容
# cat /data/backup/inc2/xtrabackup_binlog_infomysql-bin.000020 1629 9b8e7056-4d4c-11ea-a231-000c298e182d:1-19. df04d325-5946-11ea-000c298e182d:1-7# mysqlbinlog --skip-gtids --start-position=1629 /data/binlog/mysql-bin.000020 >/data/backup/binlog.sql或# mysqlbinlog --skip-gtids --include-gtids='9b8e7056-4d4c-11ea-a231-000c298e182d:1-19' /data/binlog/mysql-bin.000020 >/data/backup/binlog.sql
登錄mysql
,恢復(fù)最后的sql
Master [(none)]>set sql_log_bin=0;Master [(none)]>source /data/backup/binlog.sqlMaster [(none)]>set sql_log_bin=1;
恢復(fù)完成。
現(xiàn)有一個生產(chǎn)數(shù)據(jù)庫,總數(shù)據(jù)量3TB
,共10
個業(yè)務(wù),10
個庫500
張表。周三上午10
點,誤DROP
了taobao.1
業(yè)務(wù)核心表20GB
,導(dǎo)致taobao
庫業(yè)務(wù)無法正常運行。
采用的備份策略是:周日full
全備,周一到周五inc
增量備份,binlog
完整
針對此種場景,怎么快速恢復(fù)業(yè)務(wù),還不影響其他業(yè)務(wù)?
遷移表空間
create table t1;alter table taobao.t1 discard tablespace;alter table taobao.t1 import tablespace;
1、要想恢復(fù)單表,需要表結(jié)構(gòu)和數(shù)據(jù)
首先合并備份到最新的備份
如何獲取表結(jié)構(gòu)?借助工具mysqlfrm
yum install -y mysql-utilities
2、獲取建表語句
# mysqlfrm —diagnostic t2.frmcreate table `t2` (`id` int(11) default null) engine=InnoDB;
3、進(jìn)入數(shù)據(jù)庫中創(chuàng)建表
create table `t2` (`id` int(11) default null) engine=InnoDB;
4、丟棄新建的表空間
alter table t2 discard tablespace;
5、將表中的數(shù)據(jù)cp
回數(shù)據(jù)庫數(shù)據(jù)目錄
cp t2.ibd /data/23306/xbk/chown mysql:mysql /data/3306/xbk/t2.ibd
6、導(dǎo)入表空間
alter table t2 import tablespace;
7、切割二進(jìn)制日志到刪庫前生成sql
并導(dǎo)入
創(chuàng)建一個專用于備份的授權(quán)用戶
create user 'back'@'localhost' identified by '123456';grant reload,lock tables,replication client,create tablespace,process,super on *.* to 'back'@'localhost' ;grant create,insert,select on percona_schema.* to 'back'@'localhost';
mybak-all.sh
#!/bin/bash#全量備份,只備份一次#指定備份目錄backup_dir="/bak/mysql-xback"#檢查[[ -d ${backup_dir} ]] || mkdir -p ${backup_dir}if [[ -d ${backup_dir}/all-backup ]];then echo "全備份已存在" exit 1fi#命令,需要設(shè)置innobackupex --defaults-file=/etc/my.cnf --user=back --password='123456' --no-timestamp ${backup_dir}/all-backup &> /tmp/mysql-backup.logtail -n 1 /tmp/mysql-backup.log | grep 'completed OK!'if [[ $? -eq 0 ]];then echo "all-backup" > /tmp/mysql-backup.txtelse echo "備份失敗" exit 1fi
mybak-section.sh
#!/bin/bash#增量備份#備份目錄backup_dir="/bak/mysql-xback"#新舊備份old_dir=`cat /tmp/mysql-backup.txt`new_dir=`date %F-%H-%M-%S`#檢查if [[ ! -d ${backup_dir}/all-backup ]];then echo "還未全量備份" exit 1fi#命令/usr/bin/innobackupex --user=back --password='123456' --no-timestamp --incremental --incremental-basedir=${backup_dir}/${old_dir} ${backup_dir}/${new_dir} &> /tmp/mysql-backup.logtail -n 1 /tmp/mysql-backup.log | grep 'completed OK!'if [[ $? -eq 0 ]];then echo "${new_dir}" > /tmp/mysql-backup.txtelse echo "備份失敗" exit 1fi
單點,備份binlog
,要指定備份目錄位置和其它變量
#!/bin/bash## 注意:執(zhí)行腳本前修改腳本中的變量# 功能:cp方式增量備份## 適用:centos6 # 語言:中文##使用:./xx.sh -uroot -p'123456',將第一次增量備份后的binlog文件名寫到/tmp/binlog-section中,若都沒有,自動填寫mysql-bin.000001#過程:增量先刷新binlog日志,再查詢/tmp/binlog-section中記錄的上一次備份中最新的binlog日志的值# cp中間的binlog日志,并進(jìn)行壓縮。再將備份中最新的binlog日志寫入。#恢復(fù):先進(jìn)行全量恢復(fù),再根據(jù)全量備份附帶的time-binlog.txt中的記錄逐個恢復(fù)。當(dāng)前最新的Binlog日志要去掉有問題的語句,例如drop等。#[變量]#mysql這個命令所在絕對路徑my_sql="/usr/local/mysql/bin/mysql"#mysqldump命令所在絕對路徑bak_sql="/usr/local/mysql/bin/mysqldump"#binlog日志所在目錄binlog_dir=/usr/local/mysql/data#mysql-bin.index文件所在位置binlog_index=${binlog_dir}/mysql-bin.index#備份到哪個目錄bak_dir=/bak/mysql-binback#這個腳本的日志輸出到哪個文件log_dir=/tmp/mybak-binlog.log#保存的天數(shù),4周就是28天save_day=10#[自動變量]#當(dāng)前年date_nian=`date %Y-`begin_time=`date %F-%H-%M-%S`#所有天數(shù)的數(shù)組save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days " %F";done))#開始/usr/bin/echo >> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:開始增量備份" >> ${log_dir}#檢查${my_sql} $* -e "show databases;" &> /tmp/info_error.txtif [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陸命令錯誤" >> ${log_dir} /usr/bin/cat /tmp/info_error.txt #如果錯誤則顯示錯誤信息 exit 1fi#移動到目錄cd ${bak_dir}bak_time=`date %F-%H-%M`bak_timetwo=`date %F`#刷新${my_sql} $* -e "flush logs"if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:刷新binlog失敗" >> ${log_dir} exit 1fi#獲取開頭和結(jié)尾binlog名字last_bin=`cat /tmp/binlog-section`next_bin=`tail -n 1 ${binlog_dir}/mysql-bin.index`echo ${last_bin} |grep 'mysql-bin' &> /dev/nullif [[ $? -ne 0 ]];then echo "mysql-bin.000001" > /tmp/binlog-section #不存在則默認(rèn)第一個 last_bin=`cat /tmp/binlog-section`fi#截取需要備份的binlog行數(shù)a=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${last_bin} | awk -F':' '{print $1}'`b=`/usr/bin/sort ${binlog_dir}/mysql-bin.index | uniq | grep -n ${next_bin} | awk -F':' '{print $1}'`let b--#輸出最新節(jié)點/usr/bin/echo "${next_bin}" > /tmp/binlog-section#創(chuàng)建文件rm -rf mybak-section-${bak_time}/usr/bin/mkdir mybak-section-${bak_time}for i in `sed -n "${a},$p" ${binlog_dir}/mysql-bin.index | awk -F'./' '{print $2}'`do if [[ ! -f ${binlog_dir}/${i} ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 不存在" >> ${log_dir} exit 1 fi cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/ if [[ ! -f mybak-section-${bak_time}/${i} ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 備份失敗" >> ${log_dir} exit 1 fidone#壓縮if [[ -f mybak-section-${bak_time}.tar.gz ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:壓縮包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir} /usr/bin/rm -irf mybak-section-${bak_time}.tar.gzfi/usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:壓縮失敗" >> ${log_dir} exit 1fi#刪除binlog文件夾/usr/bin/rm -irf mybak-section-${bak_time}if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:刪除sql文件失敗" >> ${log_dir} exit 1fi#整理壓縮的日志文件for i in `ls | grep "^mybak-section.*tar.gz$"` do echo $i | grep ${date_nian} &> /dev/null if [[ $? -eq 0 ]];then a=`echo ${i%%.tar.gz}` b=`echo ${a:(-16)}` #當(dāng)前日志年月日 c=`echo ${b%-*}` d=`echo ${c%-*}` #看是否在數(shù)組中,不在其中,并且不是當(dāng)前時間,則刪除。 echo ${save_day_zu[*]} |grep -w $d &> /dev/null if [[ $? -ne 0 ]];then [[ "$d" != "$bak_timetwo" ]] && rm -rf $i fi else #不是當(dāng)月的,其他類型壓縮包,跳過 continue fidone#結(jié)束last_time=`date %F-%H-%M-%S`/usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:增量備份完成" >> ${log_dir}/usr/bin/echo >> ${log_dir}
主從,備份relay-bin
,要指定備份目錄位置和其它變量
#!/bin/bash## 注意:執(zhí)行腳本前修改腳本中的變量# 功能:cp方式增量備份## 適用:centos6 # 語言:中文##使用:./xx.sh -uroot -p'123456'#[變量]#mysql這個命令所在絕對路徑my_sql="/usr/local/mysql/bin/mysql"#mysqldump命令所在絕對路徑bak_sql="/usr/local/mysql/bin/mysqldump"#binlog日志所在目錄binlog_dir=/usr/local/mysql/data#mysql-bin.index文件所在位置binlog_index=${binlog_dir}/mysql-bin.index#備份到哪個目錄bak_dir=/bak/mysql-binback#這個腳本的日志輸出到哪個文件log_dir=/tmp/mybak-binlog.log#保存的天數(shù),4周就是28天save_day=10#[自動變量]#當(dāng)前年date_nian=`date %Y-`begin_time=`date %F-%H-%M-%S`#所有天數(shù)的數(shù)組save_day_zu=($(for i in `seq 1 ${save_day}`;do date -d -${i}days " %F";done))#開始/usr/bin/echo >> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:開始增量備份" >> ${log_dir}#檢查${my_sql} $* -e "show databases;" &> /tmp/info_error.txtif [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:登陸命令錯誤" >> ${log_dir} /usr/bin/cat /tmp/info_error.txt #如果錯誤則顯示錯誤信息 exit 1fi#移動到目錄cd ${bak_dir}bak_time=`date %F-%H-%M`bak_timetwo=`date %F`#創(chuàng)建文件rm -rf mybak-section-${bak_time}/usr/bin/mkdir mybak-section-${bak_time}for i in `ls ${binlog_dir}| grep relay-bin`do cp -rf ${binlog_dir}/${i} mybak-section-${bak_time}/ if [[ ! -f mybak-section-${bak_time}/${i} ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:binlog文件${i} 備份失敗" >> ${log_dir} exit 1 fidone#壓縮if [[ -f mybak-section-${bak_time}.tar.gz ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:壓縮包mybak-section-${bak_time}.tar.gz 已存在" >> ${log_dir} /usr/bin/rm -irf mybak-section-${bak_time}.tar.gzfi/usr/bin/tar -cf mybak-section-${bak_time}.tar.gz mybak-section-${bak_time}if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) error:壓縮失敗" >> ${log_dir} exit 1fi#刪除binlog文件夾/usr/bin/rm -irf mybak-section-${bak_time}if [[ $? -ne 0 ]];then /usr/bin/echo "time:$(date %F-%H-%M-%S) info:刪除sql文件失敗" >> ${log_dir} exit 1fi#整理壓縮的日志文件for i in `ls | grep "^mybak-section.*tar.gz$"` do echo $i | grep ${date_nian} &> /dev/null if [[ $? -eq 0 ]];then a=`echo ${i%%.tar.gz}` b=`echo ${a:(-16)}` #當(dāng)前日志年月日 c=`echo ${b%-*}` d=`echo ${c%-*}` #看是否在數(shù)組中,不在其中,并且不是當(dāng)前時間,則刪除。 echo ${save_day_zu[*]} |grep -w $d &> /dev/null if [[ $? -ne 0 ]];then [[ "$d" != "$bak_timetwo" ]] && rm -rf $i fi else #不是當(dāng)月的,其他類型壓縮包,跳過 continue fidone#結(jié)束last_time=`date %F-%H-%M-%S`/usr/bin/echo "begin_time:${begin_time} last_time:${last_time}" >> ${log_dir}/usr/bin/echo "time:$(date %F-%H-%M-%S) info:增量備份完成" >> ${log_dir}/usr/bin/echo >> ${log_dir}
來源:https://www.icode9.com/content-2-668101.html
聯(lián)系客服