MySQL灾难恢复与备份(下篇)

  xiaorenwutest.blog.51cto.commysql

 

   MySQL灾难恢复与备份(下篇)sql

前言:在上次的讲解中咱们了解了数据库经过mysqldump工具和binlog日志结合回复数据库当中的数据。可是有一个弊端。那就是mysqldump工具在回复数据量小的状况下好使,一旦数据量规模庞大的时候回复该怎么办?相信在公司当中几乎不会有DBA使用mysqldump工具恢复数据。数据库

另外一个问题是,当咱们的备份工具备了的时候那么咱们该怎么备份呢?难道要手动一次又一次的去备份吗?要是晚上备份该怎麽办呢?难道要晚上跑到公司去先备个份在回家休息。这就不太现实了。bash

今天咱们就以这两个问题为主题进行探讨,而且给出解决方案。接下来进入今天的案例。服务器

1)周期性备份方案:app

好比说公司规定让DBA周日的凌晨1点全库备份;运维

周一到周六凌晨每隔4小时增量备份一次dom

咱们能够经过crond设置任务计划进行备份方案ide

 

#crontab  -e工具

周日备份计划:

0 1 * * 0 /root/mysqlfullbackup.sh >/dev/null 2>&1

#周一到周六每隔4个小时增量备份一次

0 */4 * * 1-6 /root/mysqldailybackup.sh >/dev/null 2>&1

 

脚本的内容以及编写:

(一)首先是全库备份{也就是周日备份}

上面提到了脚本名称为:mysqlfullbackup.sh

#!/bin/bash

 

#定义数据库目录

mysqlDir=/usr/local/mysql

 

#定义用户和密码

user=root

userpwd=123456

dbname=test_db

 

#定义备份目录

databackupdir=/opt/mysqlbackup

 

#判断上条语句是否存在,若是不存在则建立

[ ! -d $databackupdir ] && mkdir $databackupdir

 

#定义邮件文件

emailfile=$databackupdir/email.txt

 

#收件地址为本机

email=root@localhost.localdomain

 

#定义备份日志文件

logfile=$databackupdir/mysqlbackup.log

 

#定义时间

DATE=$(date -I)

 

echo "" > $emailfile

echo $(date +"%y-%m-%d %H:%M:%S") >> $emailfile

cd $databackupdir

 

#定义备份文件名

dumpfile=mysql_$DATE.sql

gzdumpfile=mysql_$DATE.sql.tar.gz

 

#使用mysqldump工具有份数据库

$mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs -x $dbname > $dumpfile

 

#压缩备份文件

if [ $? -eq 0 ];then

tar zcf $gzdumpfile $dumpfile >> $emailfile 2>&1

echo "BackupFileName:$gzdumpfile" >> $emailfile

echo "DataBase Backup Success!" >> $emailfile

rm -f $dumpfile

else

echo "DataBackup Fail!" >> $emailfile

fi

 

#开始写入日志文件

echo "---------------" >> $logfile

cat $emailfile >> $logfile

 

#发送邮件通知

cat $emailfile | mail -s "Mysql Backup" $email

 

 

 

 

(二):    另外一个脚本文件

mysqldailybackup.sh{属于周一到周六每隔4小时备份}

 

#!/bin/bash

 

#定义数据库目录

mysqlDir=/usr/local/mysql

 

#定义用户和密码

user=root

userpwd=123456

dbname=test_db

 

#定义备份目录

databackupdir=/opt/mysqlbackup

 

#判断上条语句是否存在,若是不存在则建立

[ ! -d $databackupdir ] && mkdir $databackupdir

 

#定义邮件文件

emailfile=$databackupdir/email.txt

 

#收件地址为本机

email=root@localhost.localdomain

 

#定义备份日志文件

logfile=$databackupdir/mysqlbackup.log

 

#定义时间

DATE=$(date -I)

 

echo "" > $emailfile

echo $(date +"%y-%m-%d %H:%M:%S") >> $emailfile

cd $databackupdir

 

#定义备份文件名

dumpfile=mysql_$DATE.sql

gzdumpfile=mysql_$DATE.sql.tar.gz

 

#使用mysqldump工具有份数据库

$mysqlDir/bin/mysqldump -u$user -p$userpwd --flush-logs -x $dbname > $dumpfile

 

#压缩备份文件

if [ $? -eq 0 ];then

tar zcf $gzdumpfile $dumpfile >> $emailfile 2>&1

echo "BackupFileName:$gzdumpfile" >> $emailfile

echo "DataBase Backup Success!" >> $emailfile

rm -f $dumpfile

else

echo "DataBackup Fail!" >> $emailfile

fi

 

#开始写入日志文件

echo "---------------" >> $logfile

cat $emailfile >> $logfile

 

#发送邮件通知

cat $emailfile | mail -s "Mysql Backup" $email

 

总结:经过以上的两个编写脚本的案例来作出对数据库的备份,并且是周期性的不用人工操做,自动执行。

优势:1)减小运维人员或DBA的工做量

      2)较少备份的失误次数

      3)效率高,速度快

 

2):刚才对数据库介绍了周期性的备份和任务计划的结合使用;那么咱们接下来对今天的第二个问题进行探讨:{备份工具}

 

Xtrabackup实现是物理备份,并且是物理热备

目前主流的有两个工具能够实现物理热备:ibbackup和xtrabackup;ibbackup是商业软件,须要受权,很是昂贵。而xtrabackup功能比ibbackup还要强大,但倒是开源的。所以咱们这里就来介绍xtrabackup的使用。

Xtrabackup提供了两种命令行工具:

xtrabackup:专用于备份InnoDBXtraDB引擎的数据;

innobackupex:这是一个perl脚本,在执行过程当中会调用xtrabackup命令,这样用该命令便可以实现备份InnoDB,也能够备份MyISAM引擎的对象。

注:你们不要弄混了: xtrabackup:用于备份innodb和xtradb

                innobackupex:用于备份innodb和myisam

 

优势:

Xtrabackup是由percona提供的mysql数据库备份工具,特色:

(1)备份过程快速、可靠;

(2)备份过程不会打断正在执行的事务;

(3)可以基于压缩等功能节约磁盘空间和流量;

(4)自动实现备份检验;

(5)还原速度快。

你们若是有兴趣能够去官方上下载:

http://www.percona.com/software/percona-xtrabackup;能够下载源码编译安装,也能够下载适合的RPM包或使用yum进行安装或者下载二进制源码包。

1)首先解压下载的软件包:

# tar zxf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz

2)进入解压目录

# cd percona-xtrabackup-2.4.4-Linux-x86_64/

3)复制bin下的全部程序到/usr/bin

[root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/

wKiom1lVBMnxhpW6AAAtv8hX5_4502.png-wh_50 

Xtrabackup中主要包含两个工具:

xtrabackup:是用于热备份innodb, xtradb表中数据的工具,支持在线热备份,能够在不加锁的状况下备份Innodb数据表,不过此工具不能操做Myisam引擎表

innobackupex:是将xtrabackup进行封装的perl脚本,能同时处理InnodbMyisam,但在处理Myisam时须要加一个读锁。

因为操做Myisam时须要加读锁,这会堵塞线上服务的写操做,而Innodb没有这样的限制,因此数据库中Innodb表类型所占的比例越大,则越有利。

4)安装相关插件

#yum install perl-DBI perl-DBD-MySQL perl-Time-HiRes perl-IO-Socket-SSL perl-TermReadKey.x86_64 perl-Digest-MD5–y

5)下载percona-toolkit并安装

#wget https://www.percona.com/downloads/percona-toolkit/2.2.19/RPM/percona-toolkit-2.2.19-1.noarch.rpm

# yum  -y  localinstall  percona-toolkit-2.2.19-1.noarch.rpm

wKioL1lVBN_QYurZAABcdqgQ52U207.png-wh_50 

 

上面属于准备工做,把须要的工具包装好,下面开始进入主题:

let's go

方案一:xtrabackup彻底备份+binlog增量备份

一、备份

建立备份目录

# mkdir -p /opt/mysqlbackup/{full,inc}

full:全备存放的目录;inc:增量备份存放的目录

wKioL1lVBPTSWYvRAAAW9lBqgTg322.png 

1)彻底备份

基本语法:# innobackupex --user=DBUSER --password=DBUSERPASS  /path/to/BACKUP-DIR/

执行下面的命令进行彻底备份:

# innobackupex --user=root --password=123456 /opt/mysqlbackup/full

注: --defaults-file=/etc/my.cnf 指定mysql的配置文件my.cfg若是指定则必须是第一个参数

/path/to/BACKUP-DIR/指定备份所存放的目标目录,备份过程会建立一个以当时备份时间命名的目录存放备份文件。

出现以下提示。表示成功

wKioL1lVBQaDKszaAABFVXN_xzk554.png-wh_50 

备份后的文件:

在备份的同时,备份数据会在备份目录下建立一个以当前日期时间为名字的目录存放备份文件:

wKiom1lVBRuDiK06AABjRyD133c999.png 

数据库你们都了解;接下来对每隔文件进行下解释;

(1)xtrabackup_checkpoints ——备份类型(如彻底或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;

每一个InnoDB页(一般为16k大小)都会包含一个日志序列号,即LSN。LSN是整个数据库系统的系统版本号,每一个页面相关的LSN可以代表此页面最近是如何发生改变的。

(2)xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置。

(3)xtrabackup_binlog_pos_innodb ——二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

(4)xtrabackup_binary ——备份中用到的xtrabackup的可执行文件;

(5)backup-my.cnf ——备份命令用到的配置选项信息;

在使用innobackupex进行备份时,还可使用--no-timestamp选项来阻止命令自动建立一个以时间命名的目录;如此一来,innobackupex命令将会建立一个BACKUP-DIR目录来存储备份数据

注意:相关选项说明:

其中,--user指定链接数据库的用户名,--password指定链接数据库的密码,--defaults-file指定数据库的配置文件,innobackupex要从其中获取datadir等信息;--database指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB 数据来讲都是全备(全部数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也同样);/opt/mysqlbackup/full是备份文件的存放位置

如今的数据库有点空,数据量不够,接下来咱们插入点数据,进行咱们的增量备份

wKioL1lVBTKwQm5QAABnVh-o4dE811.png-wh_50 

插入完成以后,让咱们来验证一下;插入的数据是否成功:

 

wKiom1lVBUPxGJhYAAAZB0sra5U655.png-wh_50 

2)增量备份二进制文件:

先进行查看二进制文件的上次备份位置

wKioL1lVBVSD3oUTAAAaWEy0doQ365.png 

#mysqlbinlog --start-position=154 /usr/local/mysql/data/mysql_bin.000001 > /opt/mysqlbackup/inc/`date +%F`.sql

wKioL1lVBWyC5FAXAAAlgGaNQJQ729.png

 

咱们来看一下,增量备份是否成功了呢?

wKioL1lVBX-Cd4OcAAAJwmcrpWs111.png-wh_50 

能够看得出来增量备份和完整备份都是以日期的形式进行备份的。

2)接下来咱们将它们还原,看看这个备份工具究竟好很差使,有没有说的那么神奇;let's go 往下看

模拟数据库损坏:{这里咱们直接将数据目录文件干掉}”

rm -rf /usr/local/mysql/data/*

wKioL1lVBZPQBEMRAAAVxawKHMY722.png-wh_50 

这里说明了,mysql的数据目录已经被咱们成功的删掉了,接下来让咱们验证一下,以前备份的内容是否能够真的回复以前被删掉的内容了呢?

wKioL1lVBaWwg9MeAACGc_y5RIQ123.png-wh_50 

在这里要插一嘴,通常在备份以后数据尚且不能用于回复数据,由于备份数据中可能会包含还没有提交的事物或已经提交但还没有同步至数据文件中的事务。所以,数据在处理的时候可能致使数据不一致。

innobakupex命令的--apply-log选项可用于实现上述功能

wKiom1lVBbfC93O9AAA77SqyY_0140.png-wh_50 

那么让咱们来看一下,数据是否真的成功回复了呢?

wKioL1lVBciQZDBnAAAN_8xsJWg388.png-wh_50 

为何尚未恢复回来了呢?

那只是一个完整备份,而不是数据的恢复,接下来还得进行还原数据库的sql语法: 加选项--copy-back

wKioL1lVBdmzhxvnAABGuknImnQ412.png-wh_50 

让咱们再一次查看下数据是否回来:

wKiom1lVBeySSXPDAAAnEQsZJvU388.png 

从现实结果能够看到数据库等文件已经恢复回来了;可是还有点缺陷,那就是如今的用户是root而不是之前的MySQL用户,因此说,咱们还要将属主:属组调整为mysql

wKioL1lVBf6TH2kOAABOHoac5fg598.png 

从新启动mysql服务

进入数据库当中能够看到以前的全备份已经成功的恢复了回来,可是后续建立的表和内容尚未恢复回来,因此换须要进行增量备份的恢复。

主:为了防止在还原的时候产生大量的二进制文件,因此暂时的能够关闭二进制文件,等恢复成功以后能够再次的开启。

mysql> set sql_log_bin=0;===========关闭二进制文件

wKiom1lVBhDAEXspAAAKjDUIKN4882.png 

还原增量文件的方式:或者经过mysqlbinlog工具

mysql> source /opt/mysqlbackup/inc/2017-06-28.sql

wKioL1lVBiLhQYUEAAAQwVrbCuo753.png-wh_50 

完成以后再次开启二进制文件

wKioL1lVBjaiHRx-AAAKXSRtWfg816.png 

让咱们再次查看一下以前的表和数据是否已经回来了呢?

wKiom1lVBkijFbvMAAAvX0mMdsI832.png-wh_50 

增量备份已经成功的恢复了以前的数据;这次备份与恢复成功!

相关文章
相关标签/搜索