九色国产,午夜在线视频,新黄色网址,九九色综合,天天做夜夜做久久做狠狠,天天躁夜夜躁狠狠躁2021a,久久不卡一区二区三区

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
MySQL備份之Xtrabackup

目錄

xtrabackup是percona公司專門針對mysql 數(shù)據(jù)庫開發(fā)的一款開源免費的物理備份(熱備)工具,可以對innodb和xtradb等事務(wù)引擎數(shù)據(jù)庫實現(xiàn)非阻塞(即不鎖表)方式的備份,也可以針對myisam等非事務(wù)引擎鎖表方式備份,是商業(yè)備份工具InnoDB Hotbackup的一個很好的替代品。

1、介紹

1.1、主要特點

  • 物理備份工具,拷貝數(shù)據(jù)文件
  • 備份和恢復(fù)數(shù)據(jù)的速度非???,安全可靠
  • 在備份期間執(zhí)行的事務(wù)不會間斷,備份innodb數(shù)據(jù)不影響業(yè)務(wù)
  • 備份期間不增加太多數(shù)據(jù)庫的性能壓力
  • 支持對備份的數(shù)據(jù)自動校驗
  • 運行全量,增量,壓縮備份及流備份
  • 支持在線遷移表以及快速創(chuàng)建新的從庫
  • 運行幾乎所有版本的mysqlmaridb

1.2、相關(guān)詞匯

文件擴(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_sizeinnodb_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ù)前后一致。

  • LSN
    LSN,全拼log sequence number,中文是日志序列號,是一個64位的整型數(shù)字,LSN的作用是記錄redo日志時,使用LSN唯一標(biāo)識一條變化的數(shù)據(jù)。

  • checkpoint
    用來標(biāo)識數(shù)據(jù)庫崩潰后,應(yīng)恢復(fù)的redo log的起始點

1.3、XtraBackup備份原理

  1. checkpoint,記錄LSN號碼
  2. information schema.xxx備份
  3. 拷貝innoDB文件,過程中發(fā)生的新變化redo也會被保存,保存至備份路徑
  4. Binlog只讀,FTWRL(global read lock)
  5. 拷貝Non InnoDB,拷貝完成解鎖
  6. 生成備份相關(guān)的信息文件:binlog、LSN
  7. 刷新Last LSN
  8. 完成備份

備份時經(jīng)歷的階段:

  • InnoDB表:

    • 熱備份:業(yè)務(wù)正常發(fā)生的時候,影響較小的備份方式
    • checkpoint:將已提交的數(shù)據(jù)頁刷新到磁盤,記錄一個LSN號碼
    • 拷貝InnoDB表相關(guān)的文件(ibdata1frm、ibd...)
    • 備份期間產(chǎn)生的新的數(shù)據(jù)變化redo也會備份走
  • 非InnoDB表:

    • 溫備份:鎖表備份
    • 觸發(fā)FTWRL全局鎖表
    • 拷貝非InnoDB表的數(shù)據(jù)
    • 解鎖

再次統(tǒng)計LSN號碼,寫入到專用文件xtrabackup checkpoint
記錄二進(jìn)制日志位置
所有備份文件統(tǒng)一存放在一個目錄下,備份完成

1.4、XtraBackup恢復(fù)步驟

  1. 做恢復(fù)前準(zhǔn)備
  2. 做數(shù)據(jù)合并,增量和全備份的數(shù)據(jù)合并
  3. 全備數(shù)據(jù),先把全備的redo lo文件內(nèi)容和全備數(shù)據(jù)合并,并且read only不進(jìn)行回滾
  4. 把第一次增量的redo log變化加載到第一次增量數(shù)據(jù)再與全量數(shù)據(jù)做合并
  5. 把第二次增量的redo log變化加載到第二次增量數(shù)據(jù)備份,在與全量和第一次增量的合并再進(jìn)行合并, 最后把臟數(shù)據(jù)進(jìn)行提交或回滾
  6. 恢復(fù)binlog的文件內(nèi)容

2、安裝

2.1、安裝依賴包

# 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

2.2、下載軟件并安裝

這里使用的是清華源,官方地址下載較慢。
官方最新的是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

3、全量備份和恢復(fù)

3.1、前提

  • 數(shù)據(jù)庫處于運行狀態(tài)
  • 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)程備份

3.2、全備

# innobackupex --user=root --password=123456 /backup/xbk/

在做全備時為了控制生成的目錄名稱,可以添加參數(shù)--no-timestamp并保留日期

# innobackupex --user=root --password=123456 --no-timestamp /backup/xbk/full_`date  %F`

3.3、備份結(jié)果

在備份目錄下查看備份的文件,除了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
  • xtrabackup_binlog_info
    備份時刻的binlog位置
    記錄的是備份時刻,binlog的文件名字和當(dāng)時的結(jié)束的position,可以用來作為截取binlog時的起點
# cat xtrabackup_binlog_info mysql-bin.000001        192790323
  • xtrabackup_checkpoints
    • 備份時刻,立即將已經(jīng)commit過的,內(nèi)存中的數(shù)據(jù)頁刷新到磁盤CKPT開始備份數(shù)據(jù),數(shù)據(jù)文件的LSN會停留在to_lsn位置
    • 備份時刻有可能會有其他的數(shù)據(jù)寫入,已備走的數(shù)據(jù)文件就不會再發(fā)生變化了
    • 在備份過程中,備份軟件會一直監(jiān)控著redoundo,如果一旦有變化會將日志也一并備走,并記錄LSNlast_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
  • xtrabackup_info
    備份的全局信息
# 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
  • xtrabackup_logfile
    備份過程中的redo,關(guān)聯(lián)在備份期間對InnoDB表產(chǎn)生的新變化

3.4、全備份的恢復(fù)

恢復(fù)流程:

  • xbk備份執(zhí)行的瞬間,立即觸發(fā)ckpt,已提交的數(shù)據(jù)臟頁,從內(nèi)存刷寫到磁盤,并記錄此時的LSN
  • 備份時,拷貝磁盤數(shù)據(jù)頁,并且記錄備份過程中產(chǎn)生的redoundo一起拷貝走,也就是checkpoint LSN之后的日志
  • 在恢復(fù)之前,模擬Innodb“自動故障恢復(fù)”的過程,將redo(前滾)與undo(回滾)進(jìn)行應(yīng)用
  • 恢復(fù)過程是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

4、增量備份和恢復(fù)

4.1、前提

增量必須依賴于全備
每次增量都是參照上次備份的LSN號碼(xtrabackup checkpoints),在此基礎(chǔ)上變化的數(shù)據(jù)頁進(jìn)行備份
會將備份過程中產(chǎn)生新的變化的redo一并備份走
恢復(fù)時增量備份無法單獨恢復(fù),必須基于全備進(jìn)行恢復(fù)。必須將所有的增量備份,按順序全部合并到全備中

4.2、增量備份

  • 全量備份
# innobackupex --user=root --password --no-timestamp /backup/full >&/tmp/xbk_full.log
  • 第一次模擬新數(shù)據(jù)變化
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 基目錄,增量備份使用,上一次(全備)增量備份所在目錄

  • 第二次模擬新數(shù)據(jù)變化
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
  • 第三次模擬新數(shù)據(jù)變化
db01 [cs]>create table t3 (id int);db01 [cs]>insert into t3 values(1),(2),(3);db01 [cs]>commit;db01 [cs]>drop database cs;

4.3、備份恢復(fù)

恢復(fù)流程:

  • 掛出維護(hù)頁,停止當(dāng)天的自動備份腳本
  • 檢查備份:full inc1 inc2 最新的完整二進(jìn)制日志
  • 進(jìn)行備份整理(細(xì)節(jié)),截取關(guān)鍵的二進(jìn)制日志(從備份——誤刪除之前)
  • 測試庫進(jìn)行備份恢復(fù)及日志恢復(fù)
  • 應(yīng)用進(jìn)行測試無誤,開啟業(yè)務(wù)

模擬數(shù)據(jù)庫宕機(jī),刪除數(shù)據(jù)

# pkill mysqld# rm -rf datadir=/usr/local/mysql/data/*

確認(rèn)備份完整性,對比每個備份集中的checkpoints文件

全備份的checkpoints文件內(nèi)容如下,可以發(fā)現(xiàn)to_lsnlast_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)到全備:

  • 基礎(chǔ)全備整理

--redo-only參數(shù)表示只應(yīng)用redo,不進(jìn)行undo,防止LSN號發(fā)生變化,除最后一次的備份合并外都需要加此參數(shù)

# innobackupex --apply-log --redo-only /data/backup/full
  • 合并增量到全備中
    合并完可以發(fā)現(xiàn)每個備份集中的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
  • 數(shù)據(jù)恢復(fù)并啟動數(shù)據(jù)庫
# 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ù)完成。

5、生產(chǎn)案例

5.1、生產(chǎn)場景

現(xiàn)有一個生產(chǎn)數(shù)據(jù)庫,總數(shù)據(jù)量3TB,共10個業(yè)務(wù),10個庫500張表。周三上午10點,誤DROPtaobao.1業(yè)務(wù)核心表20GB,導(dǎo)致taobao庫業(yè)務(wù)無法正常運行。
采用的備份策略是:周日full全備,周一到周五inc增量備份,binlog完整
針對此種場景,怎么快速恢復(fù)業(yè)務(wù),還不影響其他業(yè)務(wù)?

5.2、實現(xiàn)思路

遷移表空間

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)入

6、備份腳本

6.1、備份用戶創(chuàng)建

創(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';

6.2、全量備份

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

6.3、增量備份

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

6.4、binlog備份

單點,備份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
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
MySQL的備份恢復(fù)
使用innobackupex在線增量備份及恢復(fù)mysql數(shù)據(jù)庫
MySQL進(jìn)階(十七)使用xtrabackup進(jìn)行數(shù)據(jù)庫備份
XtraBackup工具詳解 Part 3 XtraBackup工作原理
Xtrabackup 熱備份與還原
Xtrabackup實現(xiàn)數(shù)據(jù)的備份與恢復(fù)
更多類似文章 >>
生活服務(wù)
熱點新聞
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服