天天看點

容災備份mysql_mysql容災備份腳本

一,環境需求

**安裝前準備

作業系統環境:Centos 7.2

[[email protected] soft]# rpm -qa | grep mariadb

[[email protected] soft]# rpm -e --nodeps mariadb-libs-5.5.60-1.el7_5.x86_64

[roo[email protected] soft]# rpm -e --nodeps mariadb-5.5.60-1.el7_5.x86_64

[[email protected] soft]# rpm -e --nodeps mariadb-server-5.5.60-1.el7_5.x86_64

1、解決依賴包并下載下傳源碼包至/soft/目錄下

yum -y install gcc gcc-c++ ncurses ncurses-devel cmake bison

cd /soft/

wget https://sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz

tar -zxvf boost_1_59_0.tar.gz #解壓

mv boost_1_59_0 /usr/local/boost #移動至/usr/local/boost/目錄下

wget http://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.17.tar.gz

tar -zxvf mysql-5.7.17.tar.gz

2、建立MySQL使用者和使用者組,建立/data/mysql 目錄存放mysql資料

groupadd -r mysql && useradd -r -g mysql -s /sbin/nologin -M mysql

mkdir -pv /data/mysql

3、預編譯及編譯安裝

cd mysql-5.7.17

[[email protected] mysql-5.7.17]#

cmake \

-DCMAKE_INSTALL_PREFIX=/usr/local/mysql \

-DMYSQL_DATADIR=/data/mysql \

-DSYSCONFDIR=/etc \

-DWITH_MYISAM_STORAGE_ENGINE=1 \

-DWITH_INNOBASE_STORAGE_ENGINE=1 \

-DWITH_MEMORY_STORAGE_ENGINE=1 \

-DWITH_READLINE=1 \

-DMYSQL_UNIX_ADDR=/data/mysql/mysql.sock\

-DENABLED_LOCAL_INFILE=1 \

-DWITH_PARTITION_STORAGE_ENGINE=1 \

-DWITH_BOOST=/usr/local/boost \

-DMYSQL_USER=mysql \

-DEXTRA_CHARSETS=all \

-DDEFAULT_CHARSET=utf8 \

-DDEFAULT_COLLATION=utf8_general_ci

注:

DCMAKE_INSTALL_PREFIX=/usr/local/mysql:安裝路徑

DMYSQL_DATADIR=/data/mysql:資料檔案存放位置

DSYSCONFDIR=/etc:my.cnf路徑

DWITH_MYISAM_STORAGE_ENGINE=1:支援MyIASM引擎

DWITH_INNOBASE_STORAGE_ENGINE=1:支援InnoDB引擎

DMYSQL_UNIX_ADDR=/data/mysql/mysqld.sock:連接配接資料庫socket路徑

DMYSQL_TCP_PORT=3306:端口

DENABLED_LOCAL_INFILE=1:允許從本地導入資料

DWITH_PARTITION_STORAGE_ENGINE=1:安裝支援資料庫分區

DEXTRA_CHARSETS=all:安裝所有的字元集

DDEFAULT_CHARSET=utf8:預設字元

DWITH_EMBEDDED_SERVER=1:嵌入式伺服器

[[email protected] mysql-5.7.17]# make

[[email protected] mysql-5.7.17]#make install #編譯安裝

[[email protected] ~]# chown -R root.mysql /usr/local/mysql/

[[email protected] ~]# chown -R root.mysql /data/mysql/

錯誤

錯誤1:

CMake Error: your C compiler: "CMAKE_C_COMPILER-NOTFOUND" was not found. Please set CMAKE_C_COMPILER to a valid compiler path or name.

CMake Error: your CXX compiler: "CMAKE_CXX_COMPILER-NOTFOUND" was not found. Please set CMAKE_CXX_COMPILER to a valid compiler path or name.

CMake Error at cmake/os/Linux.cmake:41 (MESSAGE):

Unsupported compiler!

Call Stack (most recent call first):

CMakeLists.txt:162 (INCLUDE)

解決辦法:

# yum groupinstall -y "Development Tools" "Server Platform Development" "Desktop Platform Development"

錯誤2:

CMake Error at cmake/readline.cmake:64 (MESSAGE):

Curses library not found. Please install appropriate package,

解決辦法:

[[email protected] ~]# yum install -y ncurses-devel.x86_64

後續

初始化資料庫

[[email protected] ~]#/usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

錯誤:

如果datadir目錄有檔案,則會報以下錯:

[[email protected] mysq]# /usr/local/mysql/bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

2019-02-15T05:55:08.647604Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).

2019-02-15T05:55:08.647656Z 0 [Warning] 'NO_ZERO_DATE', 'NO_ZERO_IN_DATE' and 'ERROR_FOR_DIVISION_BY_ZERO' sql modes should be used with strict mode. They will be merged with strict mode in a future release.

2019-02-15T05:55:08.647660Z 0 [Warning] 'NO_AUTO_CREATE_USER' sql mode was not set.

2019-02-15T05:55:08.649468Z 0 [ERROR] --initialize specified but the data directory has files in it. Aborting.

2019-02-15T05:55:08.649496Z 0 [ERROR] Aborting

是以要把data directory檔案删除掉再執行,如果删除目錄下的檔案還是報同樣的錯,可以試試把目錄删除掉,再建立一個,然後授權:

vim /usr/lib/systemd/system/mysql.service

[Unit]

Description=Mysql

After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]

Type=forking

PIDFile=/usr/local/mysql/data/XXX.pid

ExecStart=/usr/local/mysql/support-files/mysql.server start

ExecReload=/bin/kill -s HUP $MAINPID

ExecStop=/bin/kill -s QUIT $MAINPID

PrivateTmp=false

[Install]

WantedBy=multi-user.target

systemctl daemon-reload

報錯

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1' (2)

解決辦法

ln -s mysql.sock /ecapp/data_mysql/mysql.sock-DENABLED_LOCAL_INFILE=1

複制MySQL配置檔案

[[email protected] ~]# cd /usr/local/mysql/support-files/

[[email protected] support-files]# cp my-default.cnf /etc/my.cnf

[[email protected] support-files]# vim /etc/my.cnf

[mysqld]

...

basedir=/usr/local/mysql

datadir=/data/mysql

port=3306

server_id=121

socket=/data/mysql/mysql.sock

啟動mysql服務

[[email protected] data]# /usr/local/mysql/bin/mysqld_safe --user=mysql &

[[email protected] data]# ss -antp | grep mysqld

LISTEN 0 80 :::3306 :::* users:(("mysqld",pid=63756,fd=20))

[[email protected] data]#

修改環境變量PATH

[[email protected] data]# cat /etc/profile.d/mysql.sh

export PATH=$PATH:/usr/local/mysql/bin

[[email protected] data]# source /etc/profile.d/mysql.sh

[[email protected] data]# mysql -u root -p

mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'Www.1.com';

mysql> FLUSH PRIVILEGES;

Query OK, 0 rows affected (0.00 sec)

設定源碼mysql服務開機自啟動

# vim /etc/rc.d/rc.local

/usr/local/mysql/bin/mysqld_safe --user=mysql &

[[email protected] bin]# chmod a+x /etc/rc.d/rc.local

複制mysql服務控制腳本

[[email protected]_server_01 ~]# cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld

[[email protected]_server_01 ~]# chmod a+x /etc/init.d/mysqld

[[email protected]_server_01 ~]# chkconfig --add mysqld>>>将mysqld服務添加為系統服務

[[email protected]_server_01 ~]# chkconfig --level 2345 mysqld on>>>設定mysqld服務開機自啟動

2345:

linux啟動模式

3:字元模式

5:圖形模式

2:字元,無網絡

4:預留

編輯/etc/my.cnf檔案添加在[mysqld]版塊下添加如下變量,添加後重新開機服務。

容災備份mysql_mysql容災備份腳本
容災備份mysql_mysql容災備份腳本

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

log-bin=mysql-bin

#添加id号,如果做主從,就不能一樣

server-id=1

#超過200M将生産新的檔案,最大和預設值是1GB

max_binlog_size=1G

#此參數表示binlog使用最大記憶體的數,預設1M。

max_binlog_cache_size=1M

#此參數表示binlog日志保留的時間,預設機關是天。

expire_logs_days=7

View Code

二,準備腳本

前戲mkdir -pv /ops/{bak,log}

1.全量腳本:mybak-all.sh,對腳本變量部分進行配置

#!/bin/bash

#使用:./xx.sh -uroot -p'123456',使用前修改腳本進行變量配置

#過程:備份并重新整理binlog,将最新的binlog檔案名記錄并整體壓縮打包

#恢複:先進行全量備份,再對根據tim-binlog.txt中的記錄,進行逐個恢複

#提示:最多每分鐘執行一次,否則會覆寫同分鐘内的檔案,可以修改腳本來改善

# 出現問題會退出,可以到指定的日志目錄檢視日志輸出

# 同年的tar包超過指定天數的會删除掉

#[變量]

begin_time=`date +%F-%H-%M-%S`

my_sql="/usr/local/mysql/bin/mysql"

bak_sql="/usr/local/mysql/bin/mysqldump"

binlog_dir=/data/mysql/

bak_dir=/ops/bak

log_dir=/ops/log/mybak-all.log

#儲存的天數,4周就是28天

save_day=28

#[自動變量]

#目前年月

date_nian=`date +%Y-`

#所有天數的數組

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.txt

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

/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陸指令錯誤" >> ${log_dir}

/usr/bin/cat /tmp/info_error.txt #如果錯誤則顯示錯誤資訊

exit 1

fi

#移動到目錄

cd ${bak_dir}

bak_time=`date +%F-%H-%M`

bak_timetwo=`date +%F`

#備份

${bak_sql} $* --all-databases --flush-privileges --single-transaction --flush-logs --triggers --routines --events --hex-blob > mybak-all-${bak_time}.sql

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

/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:備份失敗"

/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:備份失敗" >> ${log_dir}

/usr/bin/cat /tmp/bak_error.txt #如果錯誤則顯示錯誤資訊

exit 1

else

bin_dian=`tail -n 1 ${binlog_dir}/mysql-bin.index`

echo "${bin_dian}" > ${bak_time}-binlog.txt

fi

#壓縮

if [[ -f mybak-all-${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-all-${bak_time}.tar.gz ${bak_sql}-binlog.txt

fi

/usr/bin/tar -cf mybak-all-${bak_time}.tar.gz mybak-all-${bak_time}.sql ${bak_time}-binlog.txt

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

/usr/bin/echo "time:$(date +%F-%H-%M-%S) error:壓縮失敗" >> ${log_dir}

exit 1

fi

#删除sql檔案

/usr/bin/rm -irf mybak-all-${bak_time}.sql ${bak_time}-binlog.txt

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

/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:删除sql檔案失敗" >> ${log_dir}

exit 1

fi

#整理壓縮的日志檔案

for i in `ls | grep .tar.gz$`

do

echo $i | grep "^mybak-all.*tar.gz$" &> /dev/null

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

a=`echo ${i%%.tar.gz}`

b=`echo ${a:(-16)}`

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

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

#看是否在數組中,不在則删除

echo ${save_day_zu[*]} |grep -w $d &> /dev/null

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

[[ "$d" != "$bak_timetwo" ]] && rm -rf $i

fi

else

#不是當月的,其他類型壓縮包,跳過

continue

fi

done

#結束

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}

2.增量腳本:mybak-section.sh

#!/bin/bash

#使用:./xx.sh -uroot -p'123456',将第一次增量備份後的binlog檔案名寫到/tmp/binlog-section中,若都沒有,自動填寫mysql-bin.000001

#過程:增量先重新整理binlog日志,再查詢/tmp/binlog-section中記錄的上一次備份中最新的binlog日志的值

# cp中間的binlog日志,并進行壓縮。再将備份中最新的binlog日志寫入。

#恢複:先進行全量恢複,再根據全量備份附帶的time-binlog.txt中的記錄逐個恢複。目前最新的Binlog日志要去掉有問題的語句,例如drop等。

#提示:最多每分鐘執行一次,否則會覆寫同分鐘内的檔案,可以修改腳本來改善

# 出現問題會退出,可以到指定的日志目錄檢視日志輸出

# 同年的tar包超過指定天數的會删除掉

#[變量]

begin_time=`date +%F-%H-%M-%S`

my_sql="/usr/local/mysql/bin/mysql"

bak_sql="/usr/local/mysql/bin/mysqldump"

binlog_dir=/data/mysql/

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

bak_dir=/ops/bak

log_dir=/ops/log/mybak-section.log

#儲存的天數,4周就是28天

save_day=7

#[自動變量]

#目前年

date_nian=`date +%Y-`

#所有天數的數組

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.txt

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

/usr/bin/echo "time:$(date +%F-%H-%M-%S) info:登陸指令錯誤" >> ${log_dir}

/usr/bin/cat /tmp/info_error.txt #如果錯誤則顯示錯誤資訊

exit 1

fi

#移動到目錄

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 1

fi

#擷取開頭和結尾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 #不存在則預設第一個

last_bin=`cat /tmp/binlog-section`

fi

#截取需要備份的binlog行數

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

#輸出最新節點

/usr/bin/echo "${next_bin}" > /tmp/binlog-section

#建立檔案

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}

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

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.gz

fi

/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 1

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}

exit 1

fi

#整理壓縮的日志檔案

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)}` #目前日志年月日

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

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

#看是否在數組中,不在其中,并且不是目前時間,則删除。

echo ${save_day_zu[*]} |grep -w $d &> /dev/null

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

[[ "$d" != "$bak_timetwo" ]] && rm -rf $i

fi

else

#不是當月的,其他類型壓縮包,跳過

continue

fi

done

#結束

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}

周六晚3點i分進行全量備份 周一到周六每天進行增量備份, 全量儲存4周 增量儲存近一周的每天資料

crontab -e 添加計劃任務。

1 3 * * 6 /bin/bash /shell/mybak-all.sh -uroot -p'Www.1.com'

1 2 * * * /bin/bash /shell/mybak-section.sh -uroot -p'Www.1.com'

三.容災測試

準備

按照第一步,環境需求中,将mysql開啟binlog并重新開機

vim /shell/mybak-all.sh,将全量腳本複制到其中,并 chmod+ x /shell/mybak-all.sh 添加執行權限。

vim /shell/mybak-section.sh,将增量腳本複制到其中,并 chmod +x /shell/mybak-section.sh 添加執行權限

建立測試資料庫

create database test;

切換資料庫

use test;

建立測試表

create table s1(id int AUTO_INCREMENT PRIMARY KEY,name char(20),age int);

用 vim /root/bin/testsql.sh 指令建立一個資料插入腳本,随機插入一千條資料用于測試。

#!/bin/bash

ku=one

biao=s1

zi() {

zu=(q w e 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`

do

a=`echo $[RANDOM%24]`

echo -n ${zu[a]}

done

}

for i in `seq 1 1000`

do

b=`zi`

mysql -uroot -p'Www.1.com' -e "use test;insert into s1(name,age) values('${b}',${i});"

done

執行腳本

bash /shell/testsql.sh

用如下指令檢查表的條目數是否是1000條

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

測試

第一次:

更改時間

date -s 2016-04-04

執行全量腳本

bash /shell/mybak-all.sh -uroot -p'Www.1.com'

再執行增量腳本

bash /shell/mybak-section.sh -uroot -p'Www.1.com'

檢視是否有2個tar包。可以看到tar包

ls /ops/bak

mybak-all-2016-04-04-00-00.tar.gz

mybak-section-2016-04-04-00-00.tar.gz

執行腳本插入1000條資料

bash /shell/testsql.sh

用如下指令檢查表的條目數是否是2000條

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

第二次:

更改時間

date -s 2016-04-05

執行全量腳本

bash /shell/mybak-all.sh -uroot -p'Www.1.com'

再執行增量腳本

bash /shell/mybak-section.sh -uroot -p'Www.1.com'

用檢視是否有4個tar包。可以看到如下

ls /ops/bak

mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz

mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz

執行腳本插入1000條資料

bash /shell/testsql.sh

用如下指令檢查表的條目數是否是3000條

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

第三次

更改時間

date -s 2016-04-06

執行全量腳本

bash /shell/mybak-all.sh -uroot -p'Www.1.com'

再執行增量腳本

bash /shell/mybak-section.sh -uroot -p'Www.1.com'

用檢視是否有4個tar包。可以看到如下

ls /ops/bak

mybak-all-2016-04-04-00-00.tar.gz / mybak-section-2016-04-04-00-00.tar.gz

mybak-all-2016-04-05-00-00.tar.gz / mybak-section-2016-04-05-00-00.tar.gz

mybak-all-2016-04-06-00-00.tar.gz / mybak-section-2016-04-06-00-00.tar.gz

執行腳本插入1000條資料

bash /shell/testsql.sh

用如下指令檢查表的條目數是否是4000條

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

誤删除

删除:

登陸mysql伺服器

mysql -uroot -p’Www.1.com’

删除test資料庫,用來模拟誤操作

drop database test;

恢複第一步:準備

移動到備份所在的目錄

cd /ops/bak

解開最近時間點的全量備份包,最近時間是2016-04-06

tar -xf mybak-all-2016-04-06-00-00.tar.gz

解壓後可以看到 mybak-all-2016-04-06-00-00.sql 和 2016-04-06-00-00-binlog.txt

其中mybak-all-2016-04-06-00-00.sql 是sql語句,用于恢複某個時間點的全部内容,如果隻誤操作某個庫,可以單獨恢複某個庫。2016-04-06-00-00-binlog.txt中記錄了全備過程中重新整理的Binlog檔案名。

解壓增量備份的檔案夾 ,因為這2個腳本是先後執行的,是以不需要解壓6号前的,隻解壓6号及以後的。

tar -xf mybak-section-2016-04-06-00-00.tar.gz

解壓後可以看到 mysql-bin.000008 和 mysql-bin.000009 2個binlog日志

恢複第二步:全備份恢複

導入資料進去

mysql -uroot -p'Www.1.com' < mybak-all-2016-04-06-00-00.sql

用如下指令檢查表的條目數是否是3000條,6号備份完成後,才添加的最後1000條。

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

恢複第三步:增量恢複

檢視應該從哪個binlog檔案恢複。目前獲得 ./mysql-bin.000014

cat 2016-04-06-00-00-binlog.txt

将 mybak-section-2016-04-06-00-00 檔案夾中的 mysql-bin.000014 恢複,因為操作有問題的binlog日志在15中,14日志可以直接用于恢複

mysqlbinlog mybak-section-2016-04-06-00-00/ysql-bin.000014 | mysql -uroot -p'Www.1.com'

檢查表的條目數是否是3000條,因為在寫入3000條後,mysqldmp全備重新整理了一下binlog,這個最新的是14,而還沒有寫入任何東西時便執行增量備份了,重新整理了一下binlog,最新的是15,這時候才導入了最新的1000條。如果是持續的在寫入,恢複14後會有資料變化。

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

在mysql資料目錄/ops/server/mysql/data/下找到mysql-bin.000015

找出binlog日志中有删除資料庫語句的行數,目前為728

mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | grep -n "drop database "

容災備份mysql_mysql容災備份腳本

找出728前後幾行的内容,可以看到出現問題的pos點為5519,恢複到5519之前的資料即可。

mysql -uroot -p'Www.1.com' -e "show binlog events in 'mysql-bin.000015'\G" | sed -n '715,730p'

容災備份mysql_mysql容災備份腳本

進行恢複,stop-position是指定恢複截止的pos點。

mysqlbinlog --stop-position=5519 mysql-bin.000015 | mysql -uroot -p'Www.1.com'

檢查表的條目數是否是4000條

mysql -uroot -p'Www.1.com' -e "use test;select count(*) from s1;"

報錯:

[[email protected] mysql]# mysql -u root -p

Enter password:

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/data/mysql/mysqld.sock-DENABLED_LOCAL_INFILE=1' (2)

解決方法:

[[email protected] mysql]# mv mysqld.sock mysqld.sock-DENABLED_LOCAL_INFILE=1