iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >xtrabackup原理及用法详解
  • 781
分享到

xtrabackup原理及用法详解

2024-04-02 19:04:59 781人浏览 安东尼
摘要

开源的一款数据库备份工具,可以去官网下载并使用percona-backupxtra对InonoDB会进行增量备份,面对MyISAM的数据进持完全备份。1 xtrabackup只能备份innodb和xtrad

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

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


xtrabackup原理及用法详解


完全备份:

# 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    把之前残留的进程杀死,在启动


您可能感兴趣的文档:

--结束END--

本文标题: xtrabackup原理及用法详解

本文链接: https://www.lsjlt.com/news/40124.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • oracle怎么显示表的字段
    如何显示 oracle 表的字段 在 Oracle 数据库中,可以使用 DESC 命令显示表的字段。 语法: DESC table_name 参数: table_name:要显示字段的表...
    99+
    2024-05-14
    oracle
  • oracle怎么看所有的表
    在 oracle 数据库中查看所有表的步骤:连接到数据库运行查询:select table_name from user_tables; 如何使用 Oracle 查看所有表 ...
    99+
    2024-05-14
    oracle
  • oracle怎么显示行数
    如何使用 oracle 显示行数 在 Oracle 数据库中,有两种主要方法可以显示行数: 1. 使用 COUNT 函数 SELECT COUNT(*) FROM table_n...
    99+
    2024-05-14
    oracle
  • oracle怎么显示百分比
    oracle中显示百分比的方法有:使用百分号“%”;使用to_char()函数;使用format()函数(oracle 18c及更高版本);创建自定义函数。 Oracle 显...
    99+
    2024-05-14
    oracle
  • oracle怎么删除列
    oracle 中删除列的方法有两种:1)使用 alter table table_name drop column column_name 语句;2)使用 drop colum...
    99+
    2024-05-14
    oracle
  • sql怎么查看表的索引
    通过查询系统表,可以获取表的索引信息,包括索引名称、是否唯一、索引类型、索引列和行数。常用系统表有:mysql 的 information_schema.statistics、postg...
    99+
    2024-05-14
    mysql oracle
  • sql怎么查看索引
    您可以使用 sql 通过以下方法查看索引:show indexes 语句:显示表中定义的索引列表及其信息。explain 语句:显示查询计划,其中包含用于执行查询的索引。informat...
    99+
    2024-05-14
  • sql怎么查看存储过程
    如何查看 sql 存储过程的源代码:使用 show create procedure 语句直接获取创建脚本。查询 information_schema.routines 表的 routi...
    99+
    2024-05-14
  • sql怎么查看视图表
    要查看视图表,可以使用以下步骤:使用 select 语句获取视图中的数据。使用 desc 语句查看视图的架构。使用 explain 语句分析视图的执行计划。使用 dbms 提供...
    99+
    2024-05-14
    oracle python
  • sql怎么查看创建的视图
    可以通过sql查询查看已创建的视图,具体步骤包括:连接到数据库并执行查询select * from information_schema.views;查询结果将显示视图的名称、...
    99+
    2024-05-14
    mysql
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作