xtrabackup 进行 MySQL 数据库备份

前面介绍 mysqldump 备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢, 对于一个小于 50G 的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使 用 mysqldump 备份就不太适合了。 这时就需要一种好用又高效的工具,xtrabackup 就是其中一款,号称免费版的 InnoDB HotBackup。 Xtrabackup 实现是物理备份,而且是物理热备 目前主流的有两个工具可以实现物理热备:ibbackup 和 xtrabackup;ibbackup 是商业软件, 需要授权,非常昂贵。而 xtrabackup 功能比 ibbackup 还要强大,但却是开源的。因此我们 这里就来介绍 xtrabackup 的使用。

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

xtrabackup:专用于备份 InnoDB 和 XtraDB 引擎的数据;

innobackupex:这是一个 perl 脚本,在执行过程中会调用 xtrabackup 命令,

这样用该命令即 可以实现备份 InnoDB,也可以备份 MyISAM 引擎的对象。

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

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

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

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

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

(5)还原速度快。

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

安装 xtrabackup

1)下载 xtrabackup

wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/bin ary/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 [root@localhost percona-xtrabackup-2.4.4-Linux-x86_64]# cp bin/* /usr/bin/

Xtrabackup 中主要包含两个工具:

xtrabackup:是用于热备份 innodb, xtradb 表中数据的工具,支持在线热备份,

可以在不 加锁的情况下备份 Innodb 数据表,不过此工具不能操作 Myisam 引擎表;

innobackupex:是将 xtrabackup 进行封装的 perl 脚本,能同时处理 Innodb 和 Myisam,

但在处理 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

下面就可以启动备份了

1、备份 创建备份目录

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

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

1)完全备份

执行下面的命令进行完全备份:

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

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

/path/to/BACKUP-DIR/指定备份所存放的目标目录,备份过程会创建一个以当时备份时间 命名的目录存放备份文件。 出现如下提示。表示成功

备份后的文件:

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

至此全备完全成功,然后向 mysql 某个库插入几条数据,然后进行增量备份 对完全备份的后数据库更改进行二进制日志增量备份: 查看完全备份时 binlog 日志位置(position):

模拟数据库修改:

2、还原数据库:

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

# rm -fr /usr/local/mysql/data/*

还原完全备份:

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

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包 含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。

因此,此时数据文件仍 处理不一致状态。

“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事 务至数据文件也使得数据文件处于一致性状态。

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

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

如下面的命令: --apply-log 指明是将日志应用到数据文件上,完成之后将备份文件中的数据恢复到数据 库中:

# innobackupex --apply-log /opt/mysqlbackup/full/2016-09-12_11-29-55/

注:/opt/mysqlbackup/full/2016-09-12_11-29-55/备份文件所在目录名称 如果执行正确,其最后输出的几行信息通常如下:

在实现“准备”的过程中,innobackupex 通常还可以使用--use-memory 选项来指定其可 以使用的内存的大小,默认通常为 100M。

如果有足够的内存可用,可以多划分一些内 存给 prepare 的过程,以提高其完成速度。

innobackupex 命令的--copy-back 选项用于执行恢复操作,其通过复制所有数据相关的文 件至 mysql 服务器 DATADIR 目录中来执行恢复过程。innobackupex 通过 backup-my.cnf 来获取 DATADIR 目录的相关信息。

(2)还原数据库语法:

# innobackupex --copy-back /opt/mysqlbackup/full/2016-09-12_11-29-55/

这里的--copy-back 指明是进行数据恢复。数据恢复完成之后,需要修改相关文件的权 限 mysql 数据库才能正常启动。 如果执行正确,其输出信息的最后几行通常如下:

请确保如上信息的最行一行出现“completed OK!”。

修改还原后的数据目录权限:

当数据恢复至 DATADIR 目录以后,还需要确保所有数据文件的属主和属组均为正确的用 户,

如 mysql,否则,在启动 mysqld 之前还需要事先修改数据文件的属主和属组。

如: # chown -R mysql:mysql /usr/local/mysql/data/

必须重启 MySQL:

# systemctl restart mysqld (如果有错误 添加/etc/my.cnf PIDFile=/usr/local/mysql/mysqld.pid     pkill mysqld 然后重启 反复使用这条命令)

验证还原后的数据:

mysql> select * from tb1;

增量备份:

注意:相关选项说明:

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

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

mysql> create user 'bkpuser'@'localhost' identified by '123456';

mysql> revoke all privileges,grant option from 'bkpuser'@'localhost';

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

mysql> flush privileges;

模拟数据库修改:

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

#mysqlbinlog --start-position=2378 /usr/local/mysql/data/mysql-bin.000023 > /opt/mysqlbackup/inc/`date +%F`.sql

(3)还原增量备份: 为了防止还原时产生大量的二进制日志,在还原时可临时关闭二进制日志后再还原:

mysql> set sql_log_bin=0;

(以下三种都可以)

mysql>source /opt/mysqlbackup/inc/2016-09-12.sql

或者在命令行:mysql –uroot –p < /opt/mysqlbackup/inc/2016-09-12.sql

mysqlbinlog /opt/mysqlbackup/inc/2016-09-12.sql | mysql –uroot -p

重新启动二进制日志并验证还原数据:

mysql> set sql_log_bin=1;

验证数据是否恢复回来

原文地址:https://www.cnblogs.com/ljl1366136/p/9385334.html