千家信息网

xtrabackup原理及用法详解

发表于:2024-11-24 作者:千家信息网编辑
千家信息网最后更新 2024年11月24日,开源的一款数据库备份工具,可以去官网下载并使用percona-backupxtra对InonoDB会进行增量备份,面对MyISAM的数据进持完全备份。1 xtrabackup只能备份innodb和xt
千家信息网最后更新 2024年11月24日xtrabackup原理及用法详解

开源的一款数据库备份工具,可以去官网下载并使用

percona-backupxtra对InonoDB会进行增量备份,面对MyISAM的数据进持完全备份。

1 xtrabackup只能备份innodb和xtradb两种引擎的表,而不能备份myisam引擎的表;

2 innobackupex是一个封装了xtrabackup的Perl脚本,支持同时备份innodb和myisam,但在对myisam备份时需要加一个全局的读锁。还有就是myisam不支持增量备份。

3 另外2个工具相对小众些,xbcrypt 是加解密用的;xbstream 类似于tar,是 Percona 自己实现的一种支持并发写的流文件格式。两都在备份和解压时都会用到(如果备份用了加密和并发)。

mysql:表是MyISAM引擎,读多写少,性能好。

实现方式:说实话,看这个不如看备份产生的信息,产生的信息中每一步都显示出来,能更好带你了解innobackupex 是如何备份的。

1 首先会启动一个xtrabackup_log后台检测的进程,实时检测mysql redo的变化,一旦发现redo有新的日志写入,立刻将日志写入到日志文件xtrabackup_log中


2 复制innodb的数据文件和系统表空间文件idbdata1到对应的以默认时间戳为备份目录的地方


3 复制结束后,执行flush table with read lock操作


4 复制.frm .myd .myi文件


5 并且在这一时刻获得binary log 的位置


6 将表进行解锁unlock tables


7 停止xtrabackup_log进程



完全备份:

# innobackupex --user=root --password=mysql /PATH/TO/BACKUP-DIR/

如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户

> CREATE USER 'bkpuser'@'localhost' IDENRIFIED BY 'PASSWORD';

> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'bkpuser';

> GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost';

> FLUSH PRIVILEGES;

The RELOAD privilege enables use of the FLUSH statement. It also enables mysqladmin commands that are equivalent to FLUSH operations: flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, and reload.

The REPLICATION CLIENT privilege enables the use of the SHOW MASTER STATUS, SHOW SLAVE STATUS, and SHOW BINARY LOGS statements.

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)心及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件。这些文件会被保存至一个以时间命令的目录中。

在备份的同时,innobackupex还会备份目录中创建如下文件:

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

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

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

3)xtrabackup_info备份的信息集合

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

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

(6)xtrabackup_checkpoints

backup_type = full-backuped

from_lsn = 0 从哪个数据块开始备份

to_lsn = 1637454备份到哪里

last_lsn = 1637454最后的数据块

会维护每个数据块的日志序列号,如果数据发生改变,日志序列号就会往前走一次的,所以它可以根据这个号码来进行增量备份。发生改变就备份,没有改变就不用备份了。

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

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


3、从一个完全备份中恢复数据

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

# innobackupex --copy-back /PATH/TO/BACKUP-DIR/ //--copy-back 或 --force-non-empty-directories

datadir必须是为空的,innobackupex -copy-back不会覆盖已存在的文件

还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir。

如果执行正确,其输出信息的最后几行通常如下:

innobackupex: Starting to copy InnoDB log file

...

innobackupex: Finished copying back files.

innobackupex: completed OK!

请确保如上信息的最后一行出现"completed OK!"

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

chown -R mysql.msyql /data/


4、使用innobackupex进行增量备份

每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的甚而,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。

要实现第一次增量备份,可以使用下面的命令进行:

# innobackupex --incremental /backup --incremental-dir=BASEDIR

ex:

innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-32-56/ --incremental /backup/

下一个增量备份要以之前的增量备份上做备份,也就是说--incremental-basedir=上一个新增的目录,而不是全备的。

其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-dir应该指向上一次完全备份所在的目录。

需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份其实进行的是完全备份,

"prepare"增量备份与整理完全备份有着一些不同,尤其要注意的是:

(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行"重放","重放"之后,所有的备份数据将合并到完全备份上。

(2)基于所有的备份将未提交的事务进行"回滚"。

于是,操作就变成了:

#innobackupex --apply-log --redo-only BACKUP-DIR\//每一次的BACKUP-DIR都是全量备份文件的位置

接着执行:

# innobackupex --apply-log --redo-only BACKUP-DIR --incremental-dir=INCREMENTAL-DIR-1

而后是第二个增量:

# innobackupex --apply-log --redo-only BACKUP-DIR(这里的目录不是完全备份的目录,面是上一次增量备份的目录,因为是在上一次增量备份的基础上还原的) --incremental-dir=INCREMENTAL-DIR-2

其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1 指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,第一次都要执行如上操作;


首先准备文件

我的数据库数据在/data/下用LVM做的,我在这还要强调一下,二进制日志必须与数据不在同一个磁盘上,这一点怎么提醒都不为过,最好日志能放到raid1有镜像的地方上去。

mkdir /backup/

1、# innobackupex --user=root --password=mysql /backup///进行完全备份

2、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_13-49-52/ --incremental /backup/进行第一次增量备份

3、# innobackupex --user=root --password=mysql --incremental-basedir=/backup/2017-03-29_12-49-52/ --incremental /backup/进行第二次增量备份

4、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56///第一次全量恢复,但是数据没有回/data目录下

5、# nnobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-49-52/ //恢复第一次增量备份

6、# innobackupex --apply-log --redo-only /backup/2017-03-29_12-32-56/ --incremental-dir=/backup/2017-03-29_13-53-57///恢复第二次增量备份

7、# innobackupex --copy-back /backup/2017-03-29_12-32-56///进行回滚操作,因为之前做过perpare操作,所以直接回滚就可以了,数据就回来了

8、# chown -R mysql.mysql /data/*

9、# service mysqld start//如果这时候出现Starting MySQL.. ERROR! The server quit without updating PID file (/var/mysql/data/localhost.localdomain.pid).

你就可以killall mysqld 把之前残留的进程杀死,在启动


0