如何有效地提高 MySQL 的备份和恢复速度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何有效地提高 MySQL 的备份和恢复速度相关的知识,希望对你有一定的参考价值。

参考技术A 你好,
  一
加速备份
  1、
加了single-transaction参数
备份时
需要先flush
table
with
read
lock
这个过程中会有一个锁表的过程,如果有事务或语句正在执行,没有结束,那么备份进程会一直等待,并且阻塞别的事务,那么也会影响业务。所以要先确认备份的时候没有大的事务在运行。具体
single-transaction的加锁可以参考
我的博客:mysqldump备份时加single-transaction会不会加锁2
、mysqldump是单进程的,没有办法并行,但现在机器的瓶颈多是出现在IO方面,可以使用更了的IO设备加快速度3
、mysqldump时如果空间够的话,不要边压缩边备份二
加速恢复
  1
关闭binlog:不写入Binlog会大大的加快数据导入的速度2
innodb_flush_log_at_trx_commit=0
  3
更好的配置
  建议:
  如果非要使用逻辑备份,可以考虑mysqldumper,
mysqlpump(5.7)这两个工具去备份,这两个在备份的时候支持并行操作,mysqldumper还可以对单表进行恢复,在只需要恢复单表的情况下,恢复速度会大大加快使用物理备份
xtrabackup
(open
source),MEB(oracle提供,收费):
他们的备份原理是基于mysql
crash
recover,
备份速度
是和逻辑备份的相差不太大。但是恢复速度却有很大的提升。
  逻辑备份
备出来的是sql语句文件,恢复时需要一条一条的执行sql,所以恢复很慢。
  而物理备份和还原的速度
相当于直接copy文件,所以恢复的时候性能有很大的提升并且这两个软件还支持并行,效果更好。
  逻辑备份最大的优点是
备份好的文件经压缩后占用空间较小,最大缺点恢复太慢物理备份可以很快的恢复,但是备份好的文件压缩后占用空间比逻辑备份要大
参考技术B mysql shell
使用默认参数zstd压缩+32M chunk并行导出,恢复时单表可以并行load data,其备份和恢复速度均优于非压缩+非分块。 测试中发现,若禁用压缩,也会禁用分块。
mysqldump
备份和恢复都是单线程执行,不压缩的备份效率更快,zstd的实时备份速度比gzip更快,恢复速度最慢。
mysqlpump
备份支持并行速度也很快,但是单线程恢复是硬伤。
mydumper
默认用gzip协议,备份速度与mysqldump基本一样,看来瓶颈在压缩上。
在非压缩非分块备份速度会更快。
恢复速度中等,单表无法并行。

综合上述测试结果,mysql shell新的备份恢复方式是最快的,得益于使用了zstd实时压缩算法,备份恢复均可以并行,对于单个大表也可以并行。

MySQL备份与恢复

二、使用xtrabackup进行MySQL数据库备份

前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了。

这时就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup

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

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

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

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

 

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

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

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

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

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

(5)还原速度快。

官方链接地址:http://www.percona.com/software/percona-xtrabackup;可以下载源码编译安装,也可以下载适合的RPM包或使用yum进行安装或者下载二进制源码包。

 

1.安装xtrabackup

1下载xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz

2)解压

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

3)进入解压目录

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

4)复制bin下的所有程序到/usr/bin

[[email protected] percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/

 

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

# rpm -vih percona-toolkit-2.2.19-1.noarch.rpm

 

安装完成xtrabackup后,就可以启动备份了。

方案一:xtrabackup完全备份+binlog增量备份

备份:

技术分享

创建备份目录full是全备份存放的目录,inc是增量备份存放的目录。

1)完全备份

技术分享

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

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

注:

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

--database指定要备份的数据库,这里指定的数据库只对MyISAM表有效,对于InnoDB 数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)

 

出现如下提示表示成功

技术分享


备份后的文件:

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

技术分享

各文件说明:

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

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

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

3xtrabackup_binlog_pos_innodb二进制日志文件及用于InnoDBXtraDB表的二进制日志文件的当前position

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

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

 

注意:备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql> create user fjc@‘localhost‘ identified by ‘123456‘;

mysql> revoke all privileges,grant option from fjc@‘localhost‘;

mysql> grant reload,lock tables,replication client, process on *.* to fjc@‘localhost‘;

mysql> flush privileges;

 

至此全备完全成功,然后向mysql某个库插入几条数据,然后进行增量备份

模拟数据库修改:

技术分享


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

技术分享

查看完全备份时binlog日志位置(position)


技术分享

增量备份二进制文件


还原:

技术分享

模拟数据库损坏这里直接使用删除数据目录文件来模拟损坏。

(1)准备(prepare)一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

在准备(prepare)过程结束后,InnoDB表数据已经前滚到整个备份结束的点,而不回滚到xtrabackup刚开始时的点。

innobakupex命令的--apply-log选项可用于实现上述功能。如下面的命令:

技术分享

注:

/opt/mysqlbackup/full/2017-03-22_02-10-57/备份文件所在目录名称

--use-memory选项来指定其可以使用的内存的大小,默认通常为100M。如果有足够的内存可用,可以多划分一些内存给prepare的过程,以提高其完成速度。

 

(2)还原数据库

innobackupex命令的--copy-back选项用于执行恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。如下面的命令:

技术分享


技术分享

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。

 

重启动MySQL,并验证还原后的数据:

技术分享


3)还原增量备份:

技术分享

为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原


技术分享

重新启动二进制日志并验证还原数据验证数据是否恢复回来


方案二xtrabackup完全备份+xtrabacup增量备份

前面我们进行增量备份时,使用的还是老方法:备份二进制日志。其实xtrabackup还支持进行增量备份。

先介绍下xtrabackup的备份原理:

InnoDB内部会维护一个redo日志文件,我们也可以叫做事务日志文件(transaction log,事务日志)。事务日志会存储每一个InnoDB表数据的记录修改。当InnoDB启动时,InnoDB会检查数据文件和事务日志,并执行两个步骤:它应用已经提交的事务日志到数据文件,并将修改过但没有提交的数据进行回滚操作。

xtrabackup在启动时会记住log sequence numberLSN),并且复制所有的数据文件。复制过程需要一些时间,所以这期间如果数据文件有改动,那么将会使数据库处于一个不同的时间点。这时,xtrabackup会运行一个后台进程,用于监视事务日志,并从事务日志复制最新的修改。xtrabackup必须持续的做这个操作,是因为事务日志是会轮转重复的写入,并且事务日志可以被重用。所以xtrabackup自启动开始,就不停的将事务日志中每个数据文件的修改都记录下来这就是xtrabackup的备份过程

所以每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础。

xtraBackup基于InnoDBcrash-recovery功能。它会复制innodbdata file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。

InnoDB启动的时候,它会先去检查data filetransaction log,并且会做二步操作:

1.It applies committed transaction log entries to the data files

2.it performs an undo operation on any transactions that modified data but did not commit.

所以在prepare过程中,XtraBackup使用复制到的transactions log对备份出来的innodb data file进行crash recovery

 

备份:

这里还针对之前测试环境进行备份和还原。

1)完全备份

技术分享

-defaults-file指定数据库的配置文件,如果使用该参数必须做为第一个参数;

--user指定连接数据库的用户名;--password指定连接数据库的密码;

--port指定连接数据库的端口号;

--backup 实施备份到target-dir;

 --target-dir=name 备份文件的存放目录路径

--database指定要备份的数据库,指定的数据库只对MyISAM表和InnoDB表的表结构有效,对于InnoDB 数据来说都是全备(所有数据库中的InnoDB数据都进行了备份,不是只备份指定的数据库,恢复时也一样)

/opt/mysqlbackup/full/是备份文件的存放位置。


技术分享

备份完成后部分信息如上。


技术分享

查看完全备份文件

 

(2)增量备份

第一次增量备份

技术分享

录入一行数据


技术分享

执行备份命令

--incremental-basedir指定上次完整备份或者增量备份文件的位置(即如果是第一次增量备份则指向完全备份所在目录,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录)


技术分享

查看增量备份文件

注:

这里的增量备份其实只针对的是InnoDB,对于MyISAM来说,还是完整备份。


第二次增量备份

技术分享

录入一行数据


技术分享

执行备份命令

注:第二次增量备份--incremental-basedir指向上一次增量备份文件的位置


技术分享

查看增量备份文件

 

恢复

技术分享

这里直接删除了tb1

1)完整备份恢复

技术分享

注意:在进行恢复前,如果完整备份在远程主机上,首先将完整备份复制到本地主机上,如果是tar包,则需要先解包,解包命令为:tar izxf xxx.tar,这里必须使用-i参数(忽略存档中的 0 字节块(通常意味着文件结束))


2)恢复到第一次增量的时刻

技术分享

    增量备份恢复的步骤和完整备份恢复的步骤基本一致,只是应用日志的过程稍有不同。增量备份恢复时,是先将所有的增量备份挨个应用到完整备份的数据文件中,然后再将完整备份中的数据恢复到数据库中。


3)恢复到第二次增量备份前面

技术分享


4)恢复整个库

技术分享


5)善后工作

技术分享

关闭数据库

开始rsync数据文件


技术分享

当数据恢复至DATADIR目录以后,还需要确保所有数据文件的属主和属组均为正确的用户,如mysql,否则,在启动mysqld之前还需要事先修改数据文件的属主和属组。


验证

技术分享


方案三:innobackupex全库备份+innobackupex增量备份

备份

1)完全备份

技术分享

执行以上命令,之后查看完全备份文件:

技术分享


2)第一次增量备份

技术分享

录入一行数据


技术分享

执行备份命令,之后查看备份文件:

技术分享


3)第二次增量备份

技术分享

插入一行数据


技术分享

执行备份命令,之后查看备份文件:

技术分享


恢复

技术分享

这里同样删除了tb1

1)恢复全备份

技术分享

--redo-only 用于准备增量备份内容把数据合并到全备份目录,配合incremental-dir 增量备份目录使用


2)基于全备份进行第一次增量备份的恢复

技术分享


3)基于全备份和第一次增量备份,恢复第二次增量备份

技术分享


4)善后工作

技术分享

停止数据库

空数据目录下所有文件


技术分享

将恢复好的数据按照配置文件的需求拷贝到相应目录


技术分享

修改数据文件的属性

启动mysql服务,并验证,发现数据都回来了。

 

附:Xtrabackup的“流”及“备份压缩”功能

Xtrabackup对备份的数据文件支持“流”功能,即可以将备份的数据通过STDOUT传输给tar程序进行归档,而不是默认的直接保存至某备份目录中。要使用此功能,仅需要使用--stream选项即可。如:

innobackupex --user=root --password="123456" --stream=tar /opt/mysqlbackup/full/ | gzip > /opt/mysqlbackup/full/full_`date +%F_%H%M%S`.tar.gz



本文出自 “网络技术” 博客,请务必保留此出处http://fjc365.blog.51cto.com/11891287/1909838

以上是关于如何有效地提高 MySQL 的备份和恢复速度的主要内容,如果未能解决你的问题,请参考以下文章

sql server 备份恢复效率

MySQL数据库的备份和恢复

MySQL系列——MySQL备份和恢复

MySQL备份与恢复

十MySQL数据备份与恢复

MySQL之备份与恢复