日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

mysql用sql语句怎么做个脚本备份_mysql备份脚本

發(fā)布時(shí)間:2024/9/3 数据库 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql用sql语句怎么做个脚本备份_mysql备份脚本 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、介紹兩種日志

1、redo log是InnoDB存儲(chǔ)引擎層的日志,又稱重做日志文件,用于記錄事務(wù)操作的變化,記錄的是數(shù)據(jù)修改之后的值,不管事務(wù)是否提交都會(huì)記錄下來。在實(shí)例和介質(zhì)失敗(media failure)時(shí),redo log文件就能派上用場(chǎng),如數(shù)據(jù)庫(kù)掉電,InnoDB存儲(chǔ)引擎會(huì)使用redo log恢復(fù)到掉電前的時(shí)刻,以此來保證數(shù)據(jù)的完整性。

在一條更新語(yǔ)句進(jìn)行執(zhí)行的時(shí)候,InnoDB引擎會(huì)把更新記錄寫到redo log日志中,然后更新內(nèi)存,此時(shí)算是語(yǔ)句執(zhí)行完了,然后在空閑的時(shí)候或者是按照設(shè)定的更新策略將redo log中的內(nèi)容更新到磁盤中,這里涉及到WAL即Write Ahead logging技術(shù),他的關(guān)鍵點(diǎn)是先寫日志,再寫磁盤。

有了redo log日志,那么在數(shù)據(jù)庫(kù)進(jìn)行異常重啟的時(shí)候,可以根據(jù)redo log日志進(jìn)行恢復(fù),也就達(dá)到了crash-safe。

redo log日志的大小是固定的,即記錄滿了以后就從頭循環(huán)寫。

2、binlog是屬于MySQL Server層面的,又稱為歸檔日志,屬于邏輯日志,是以二進(jìn)制的形式記錄的是這個(gè)語(yǔ)句的原始邏輯,依靠binlog是沒有crash-safe能力的

3、區(qū)別:

redo log是屬于innoDB層面,binlog屬于MySQL Server層面的,這樣在數(shù)據(jù)庫(kù)用別的存儲(chǔ)引擎時(shí)可以達(dá)到一致性的要求。

redo log是物理日志,記錄該數(shù)據(jù)頁(yè)更新的內(nèi)容;binlog是邏輯日志,記錄的是這個(gè)更新語(yǔ)句的原始邏輯

redo log是循環(huán)寫,日志空間大小固定;binlog是追加寫,是指一份寫到一定大小的時(shí)候會(huì)更換下一個(gè)文件,不會(huì)覆蓋。

binlog可以作為恢復(fù)數(shù)據(jù)使用,主從復(fù)制搭建,redo log作為異常宕機(jī)或者介質(zhì)故障后的數(shù)據(jù)恢復(fù)使用。

二、xtra+binlog增量備份腳本

1、特點(diǎn)

mysqldump優(yōu)點(diǎn):mysqldump的優(yōu)點(diǎn)就是邏輯備份,把數(shù)據(jù)生成SQL形式保存,在單庫(kù),單表數(shù)據(jù)遷移,備份恢復(fù)等場(chǎng)景方便,SQL形式的備份文件通用,也方便在不同數(shù)據(jù)庫(kù)之間移植。對(duì)于InnoDB表可以在線備份。

mysqldump缺點(diǎn):mysqldump是單線程,數(shù)據(jù)量大的時(shí)候,備份時(shí)間長(zhǎng),甚至有可能在備份過程中非事務(wù)表長(zhǎng)期鎖表對(duì)業(yè)務(wù)造成影響(SQL形式的備份恢復(fù)時(shí)間也比較長(zhǎng))。mysqldump備份時(shí)會(huì)查詢所有的數(shù)據(jù),這可能會(huì)把內(nèi)存中的熱點(diǎn)數(shù)據(jù)刷掉

innobackupex優(yōu)點(diǎn):物理備份可以繞過MySQL Server層,加上本身就是文件系統(tǒng)級(jí)別的備份,備份速度塊,恢復(fù)速度快,可以在線備份,支持并發(fā)備份,支持加密傳輸,支持備份限速

innobackupex缺點(diǎn):要提取部分庫(kù)表數(shù)據(jù)比較麻煩,不能按照基于時(shí)間點(diǎn)來恢復(fù)數(shù)據(jù),并且不能遠(yuǎn)程備份,只能本地備份,增量備份的恢復(fù)也比較麻煩。如果使用innobackupex的全備+binlog增量備份就可以解決基于時(shí)間點(diǎn)恢復(fù)的問題。

2、備份策略

根據(jù)需求,使用innobackupex全備份+innobackupex增量備份+binlog方式進(jìn)行備份。

在出現(xiàn)問題時(shí)使用innobackupex快速的恢復(fù)

3、環(huán)境準(zhǔn)備

開啟binlog

編輯/etc/my.cnf文件添加在[mysqld]版塊下添加如下變量,添加后重啟服務(wù)。

#開啟,并且可以將mysql-bin改為其它的日志名

log-bin=mysql-bin

#添加id號(hào),如果做主從,就不能一樣

server-id=1#超過200M將生產(chǎn)新的文件,最大和默認(rèn)值是1GB

max_binlog_size=1G

#此參數(shù)表示binlog使用最大內(nèi)存的數(shù),默認(rèn)1M。

max_binlog_cache_size=1M

#此參數(shù)表示binlog日志保留的時(shí)間,默認(rèn)單位是天。

expire_logs_days=7

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

安裝innobackupex

1.安裝依賴yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL libev-devel2.下載安裝wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

yum -y install percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm

三.添加腳本

全量備份

創(chuàng)建備份目錄mkdir -p /root/binmkdir -p /bak/mysql-xback

編寫腳本,要指定備份命令的賬號(hào)和密碼

vim/root/bin/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 "全備份已存在"exit1

fi#命令,需要設(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 "備份失敗"exit1

fi

增量備份

編寫腳本,要指定備份目錄

vim/root/bin/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 "還未全量備份"exit1

fi#命令/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 "備份失敗"exit1

fi

binlog

創(chuàng)建備份目錄mkdir -p /bak/mysql-binback

用于單點(diǎn),備份binlog,要指定備份目錄位置和其它變量

vim/root/bin/mybak-binlog.sh#!/bin/bash

#

# 注意:執(zhí)行腳本前修改腳本中的變量

# 功能:cp方式增量備份

#

# 適用:centos6+# 語(yǔ)言:中文

#

#使用:./xx.sh -uroot -p'123456',將第一次增量備份后的binlog文件名寫到/tmp/binlog-section中,若都沒有,自動(dòng)填寫mysql-bin.000001#過程:增量先刷新binlog日志,再查詢/tmp/binlog-section中記錄的上一次備份中最新的binlog日志的值

# cp中間的binlog日志,并進(jìn)行壓縮。再將備份中最新的binlog日志寫入。

#恢復(fù):先進(jìn)行全量恢復(fù),再根據(jù)全量備份附帶的time-binlog.txt中的記錄逐個(gè)恢復(fù)。當(dāng)前最新的Binlog日志要去掉有問題的語(yǔ)句,例如drop等。

#[變量]

#mysql這個(gè)命令所在絕對(duì)路徑

my_sql="/usr/local/mysql/bin/mysql"#mysqldump命令所在絕對(duì)路徑

bak_sql="/usr/local/mysql/bin/mysqldump"#binlog日志所在目錄

binlog_dir=/usr/local/mysql/data

#mysql-bin.index文件所在位置

binlog_index=${binlog_dir}/mysql-bin.index

#備份到哪個(gè)目錄

bak_dir=/bak/mysql-binback

#這個(gè)腳本的日志輸出到哪個(gè)文件

log_dir=/tmp/mybak-binlog.log

#保存的天數(shù),4周就是28天

save_day=10#[自動(dòng)變量]

#當(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:登陸命令錯(cuò)誤" >>${log_dir}/usr/bin/cat /tmp/info_error.txt #如果錯(cuò)誤則顯示錯(cuò)誤信息

exit1

fi#移動(dòng)到目錄

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}

exit1

fi#獲取開頭和結(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/null

if [[ $? -ne 0 ]];then

echo "mysql-bin.000001" > /tmp/binlog-section #不存在則默認(rèn)第一個(gè)

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é)點(diǎn)/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},${b}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}

exit1

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}

exit1

fi

done#壓縮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}

exit1

fi#刪除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}

exit1

fi#整理壓縮的日志文件for i in `ls | grep "^mybak-section.*tar.gz$"`do

echo $i | grep ${date_nian} &> /dev/null

if [[ $? -eq 0 ]];thena=`echo ${i%%.tar.gz}`

b=`echo ${a:(-16)}` #當(dāng)前日志年月日

c=`echo ${b%-*}`

d=`echo ${c%-*}`

#看是否在數(shù)組中,不在其中,并且不是當(dāng)前時(shí)間,則刪除。echo ${save_day_zu[*]} |grep -w $d &> /dev/null

if [[ $? -ne 0 ]];then[["$d" != "$bak_timetwo" ]] && rm -rf $ifi

else#不是當(dāng)月的,其他類型壓縮包,跳過

continuefi

done#結(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,要指定備份目錄位置和其它變量

vim/root/bin/mybak-binlog.sh#!/bin/bash

#

# 注意:執(zhí)行腳本前修改腳本中的變量

# 功能:cp方式增量備份

#

# 適用:centos6+# 語(yǔ)言:中文

#

#使用:./xx.sh -uroot -p'123456'#[變量]

#mysql這個(gè)命令所在絕對(duì)路徑

my_sql="/usr/local/mysql/bin/mysql"#mysqldump命令所在絕對(duì)路徑

bak_sql="/usr/local/mysql/bin/mysqldump"#binlog日志所在目錄

binlog_dir=/usr/local/mysql/data

#mysql-bin.index文件所在位置

binlog_index=${binlog_dir}/mysql-bin.index

#備份到哪個(gè)目錄

bak_dir=/bak/mysql-binback

#這個(gè)腳本的日志輸出到哪個(gè)文件

log_dir=/tmp/mybak-binlog.log

#保存的天數(shù),4周就是28天

save_day=10#[自動(dòng)變量]

#當(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:登陸命令錯(cuò)誤" >>${log_dir}/usr/bin/cat /tmp/info_error.txt #如果錯(cuò)誤則顯示錯(cuò)誤信息

exit1

fi#移動(dòng)到目錄

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}

exit1

fi

done#壓縮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}

exit1

fi#刪除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}

exit1

fi#整理壓縮的日志文件for i in `ls | grep "^mybak-section.*tar.gz$"`do

echo $i | grep ${date_nian} &> /dev/null

if [[ $? -eq 0 ]];thena=`echo ${i%%.tar.gz}`

b=`echo ${a:(-16)}` #當(dāng)前日志年月日

c=`echo ${b%-*}`

d=`echo ${c%-*}`

#看是否在數(shù)組中,不在其中,并且不是當(dāng)前時(shí)間,則刪除。echo ${save_day_zu[*]} |grep -w $d &> /dev/null

if [[ $? -ne 0 ]];then[["$d" != "$bak_timetwo" ]] && rm -rf $ifi

else#不是當(dāng)月的,其他類型壓縮包,跳過

continuefi

done#結(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}

重寫備份

創(chuàng)建備份目錄mkdir -p /bak/xback

編寫腳本,要指定備份目錄位置

vim/root/bin/mybak-rewrite.sh#!/bin/bash

#xbak備份腳本

#每周六執(zhí)行一次

#10 4 * * 6 /bin/bash /root/bin/mybak-rewrite.sh#清理并備份

[[-d /bak/xback ]] || mkdir -p /bak/xback

cd/bak/xbackrm -rf *.tar.gz

[[-d bak/mysql-xback ]] || echo "bak-dir not found"cd/bak/mysql-xbacktar -cf XtraBackup.tar.gz *

mv XtraBackup.tar.gz /bak/xbackrm -rf /bak/mysql-xback/*#全備份一次

bash /root/bin/mybak-all.sh

備份周期

添加權(quán)限chmod +x /root/bin/*先進(jìn)行一次innobackupex全量備份,后面的增量均在全量的基礎(chǔ)上備份。

bash /root/bin/mybak-all.sh

每天2點(diǎn)進(jìn)行一次innobackupex增量備份+binlog日志備份

每周4點(diǎn)將之前的innobackupex備份打包,并啟動(dòng)新的全量備份

crontab -e

30 2 * * * /bin/bash /root/bin/mybak-binlog.sh -uback -p'123456'

40 2 * * * /bin/bash /root/bin/mybak-section.sh

10 4 * * 6 /bin/bash /root/bin/mybak-rewrite.sh

四.容災(zāi)測(cè)試

寫入測(cè)試數(shù)據(jù)

創(chuàng)建腳本,腳本將創(chuàng)建一個(gè)single庫(kù),s1表,持續(xù)寫入數(shù)據(jù)。

vim/root/bin/mysql_test.sh#!/bin/bash

#混合測(cè)試數(shù)據(jù)庫(kù)腳本

#將創(chuàng)建一個(gè)single數(shù)據(jù)庫(kù),其中創(chuàng)建一個(gè)s1表

#如果數(shù)據(jù)庫(kù)存在,將會(huì)寫入數(shù)據(jù),可以在寫入部分sleep1來讓數(shù)據(jù)持續(xù)寫入

#使用方法 ./xx.sh -uroot -p'123456'#檢查

mysql $* -e "show databases;" &> /tmp/info_error.txtif [[ $? -ne 0 ]];then

echo "time:$(date +%F-%H-%M-%S) info:登陸命令錯(cuò)誤"

cat /tmp/info_error.txt #如果錯(cuò)誤則顯示錯(cuò)誤信息echo

echo "./xx.sh -uroot -p'123456'"exit1

fi#檢查庫(kù)是否存在

mysql $* -e "use single;" &> /tmp/info_error.txtif [[ $? -eq 0 ]];thenmysql $* -e "use single;select * from s1 where id=1;"

if [[ $? -ne 0 ]];thenmysql $* -e "use single;drop table s1;"mysql $* -e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"

fi

elsemysql $* -e "create database single;"mysql $* -e "use single;create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);"

fi#name隨機(jī)數(shù)

random_name() {

local zu=(q we r t y u i o p a s d f g h j k l z x c v b n m)for i in `seq 1 5`dolocal a=`echo $[RANDOM%24]`echo -n ${zu[a]}done}

#age隨機(jī)數(shù)

random_age() {

local a=`echo $[RANDOM%99]`echo$a

}

#寫入部分for i in `seq 1 1000`dob=`random_name`

c=`random_age`sleep 2mysql $* -e "use single;insert into s1(name,age) values('${b}',${c});"

done執(zhí)行腳本,持續(xù)寫入測(cè)試數(shù)據(jù)

bash/root/bin/mysql_test.sh -uroot -p'123456'

模擬備份

1.開啟另一個(gè)終端,檢查數(shù)據(jù)是否在寫入

mysql-uroot -p'123456' -e "use single;select count(*) from s1;"

2.進(jìn)行全備份,返回ok正確

cd/root/bin

bash mybak-all.sh

3.模擬第一天晚上,因?yàn)樵诔掷m(xù)寫入數(shù)據(jù),等一會(huì)再進(jìn)行增量備份,并備份binlog

bash mybak-section.shbash mybak-binlog.sh -uback -p'123456'

4.等一會(huì),模擬第二天晚上

bash mybak-section.shbash mybak-binlog.sh -uback -p'123456'

錯(cuò)誤恢復(fù)

1.模擬出現(xiàn)問題了,停止寫入

ctl+c2.查看當(dāng)前總數(shù)據(jù),為129條

mysql-uroot -p'123456' -e "use single;select count(*) from s1;"

3.模擬誤刪除數(shù)據(jù)庫(kù)

mysql-uroot -p'123456' -e "drop database single;"

4.對(duì)最新的狀態(tài)備份binlog

bash mybak-binlog.sh -uback -p'123456'

5.關(guān)閉mysql

systemctl stop mysql6.刪除數(shù)據(jù)目錄,否則無法恢復(fù)rm -fr /usr/local/mysql/data/*7.對(duì)全備份進(jìn)行封裝,返回ok正確

innobackupex --apply-log --redo-only /bak/mysql-xback/all-backup/

8.合并第一次模擬到全備份,最后一個(gè)參數(shù)是指定全備份

innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-51-26/ /bak/mysql-xback/all-backup/

9.合并第二次模擬到全備份

innobackupex --apply-log --redo-only --incremental-dir=/bak/mysql-xback/2018-12-12-14-52-47/ /bak/mysql-xback/all-backup/

10.開始恢復(fù)

innobackupex --copy-back /bak/mysql-xback/all-backup/

11.添加權(quán)限并啟動(dòng)

chown -R mysql.mysql /usr/local/mysql/data/

systemctl start mysql

12.查看數(shù)據(jù)恢復(fù)到125條,正常前是129條

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

13.查看備份時(shí)的pos點(diǎn)

cat /bak/mysql-xback/2018-12-12-14-52-47/xtrabackup_info | grep binlog_pos

顯示如下

binlog_pos = filename ‘mysql-bin.000003’, position ‘1509’

14.解壓最后2個(gè)binlog壓縮包

cd /bak/mysql-binback/

tar -xf mybak-section-2018-12-12-15-07.tar.gz

tar -xf mybak-section-2018-12-12-15-15.tar.gz

15.進(jìn)入第二個(gè)包,它是在最后一次增量備份后才執(zhí)行的binlog

cd mybak-section-2018-12-12-15-07

將1509pos點(diǎn)之前的行刪除,每個(gè)binlog文件前18行要保留

mysqlbinlog mysql-bin.000003 > 03.log

cat 03.log | grep -n 1509

恢復(fù)數(shù)據(jù)

cat 03.log | mysql -uroot -p'123456'

當(dāng)前總是為128

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

16.進(jìn)入倒數(shù)第一個(gè)包,它存放出問題之前的數(shù)據(jù)

cd mybak-section-2018-12-12-15-15

將drop這個(gè)有問題的指令之后的行刪除

mysqlbinlog mysql-bin.000004 > 04.log

cat 04.log | grep -n drop

恢復(fù)數(shù)據(jù)

cat 04.log | mysql -uroot -p'123456'

當(dāng)前總是為129

mysql -uroot -p'123456' -e "use single;select count(*) from s1;"

五.重寫測(cè)試

進(jìn)入到腳本目錄

cd/root/bin

執(zhí)行重寫腳本

bash mybak-rewrite.sh可以看到原先目錄只有一個(gè)全備份ls /bak/mysql-xback/原先的全備份和增量備份的打包ls -lh /bak/xback/

總結(jié)

以上是生活随笔為你收集整理的mysql用sql语句怎么做个脚本备份_mysql备份脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。