一、Xtrabackup是什么?
官方文档:https://www.percona.com/doc/percona-xtrabackup/2.4/intro.html
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
1、xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
2、innobackupex是参考了InnoDB Hotbackup的innoback脚本修改而来的.innobackupex是一个perl脚本封装,封装了xtrabackup。主要是为了方便的 同时备份InnoDB和MyISAM引擎的表,但在处理myisam时需要加一个读锁。并且加入了一些使用的选项。如slave-info可以记录备份恢 复后,作为slave需要的一些信息,根据这些信息,可以很方便的利用备份来重做slave。
二、Xtrabackup可以做什么?
1、在线(热)备份整个库的InnoDB、 XtraDB表
2、在xtrabackup的上一次整库备份基础上做增量备份(innodb only)以流的形式产生备份,可以直接保存到远程机器上(本机硬盘空间不足时很有用)
3、MySQL数据库本身提供的工具并不支持真正的增量备份,二进制日志恢复是point-in-time(时间点)的恢复而不是增量备份。
4、Xtrabackup工具支持对InnoDB存储引擎的增量备份。
三、Xtrabackup版本及下载地址
最新版本:2.4.12
版本之间的区别:
2.4专针对5.7开发,兼容5.6,5.5
2.3针对5.6开发,兼容5.5
2.2针对5.5开发
官网地址:https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
四、Percona XtraBackup工作流程
官网地址:https://www.percona.com/doc/percona-xtrabackup/2.4/how_xtrabackup_works.html
五、Xtrabackup 使用说明文档
Xtrabackup下载与安装:
https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
Xtrabackup增量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/incremental_backup.html
Xtrabackup全量备份与恢复:
https://www.percona.com/doc/percona-xtrabackup/2.4/backup_scenarios/full_backup.html
Xtrabackup参数选项及使用说明:
https://www.percona.com/doc/percona-xtrabackup/LATEST/xtrabackup_bin/xbk_option_reference.html
六、Xtrabackup 安装与使用
6.1、安装Xtrabackup
安装页面官网地址:https://www.percona.com/doc/percona-xtrabackup/LATEST/installation/yum_repo.html
方式1、通过安装Percona存储库,安装Xtrabackup
- yum install http://www.percona.com/downloads/percona- release/redhat/ /percona- release noarch.rpm
- #为了成功安装Percona XtraBackup libev包需要先安装。libev包可以从EPEL存储库安装 。
- yum install https://dl.fedoraproject.org/pub/epel/epel- release-latest noarch.rpm
- yum install percona-xtrabackup
- #安装完毕后检测
- innobackupex --help
方式2、使用下载的rpm软件包,安装XtraBackup
- 、从下载页面下载适用于您的体系结构的所需系列的软件包,下载页面: https:/ /www.percona.com/downloads /XtraBackup/
- wget https:/ /www.percona.com/downloads /XtraBackup/Percona-XtraBackup- . /binary/redhat/ /x86_64/percona-xtrabackup- - . - .el6.x86_64.rpm
- #为了成功安装Percona XtraBackup libev包需要先安装。libev包可以从EPEL存储库安装 。
- yum install https:/ /dl.fedoraproject.org/pub /epel/epel-release-latest- .noarch.rpm
- yum localinstall percona-xtrabackup- - . - .el6.x86_64.rpm
- #安装完毕后检测
- innobackupex --help
6.2、安装完毕后开始使用
innobackupex详细参数: https://www.percona.com/doc/percona-xtrabackup/LATEST/innobackupex/innobackupex_option_reference.html
使用前对 innobackupex一些关键参数做介绍:
- --defaults-file #指定MySQL配置文件 ,如果不指定–defaults-file,默认值为/etc/my.cnf
- --user=root #备份操作用户名,一般都是root用户
- /mnt/backup/ #备份路径
- --socket=/tmp/mysql.sock #指定mysql.sock登录(可通过innobackupex --help查看)
- --parallel= --throttle= #并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
- >/mnt/backup/bak.log #备份日志,将备份过程中的输出信息重定向到bak.log
- --apply-log #在备份目录下生成一个xtrabackup_logfile事务日志文件, 此外,创建新的事务日志。 InnoDB配置从文件“backup-my.cnf”中读取。
- --redo-only #全备数据后对DB有增量更改,则必须执行此操作,在准备基本完全备份和合并除最后一个之外的所有增量备份时,应使用此选项
6.3、XtraBackup备份原理
XtraBackup基于InnoDB的crash-recovery功能。它会复制innodb 的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-recovery,使得数据恢复一致。
InnoDB维护了一个redo log,又称为 transaction log,事务日志,它包含了innodb数据的所有改动情况。当InnoDB启动的时候,它会先去检查data file和transaction 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.
XtraBackup在备份的时候, 一页一页地复制innodb的数据,而且不锁定表,与此同时,XtraBackup还有另外一个线程监视着transactions log,一旦log发生变化,就把变化过的log pages复制走。为什么要急着复制走呢? 前几章的时候就提过这个问题,因为transactions log文件大小有限,写满之后,就会从头再开始写,所以新数据可能会覆盖到旧的数据。
在prepare过程中,XtraBackup使用复制到的transactions log 对备份出来的innodb data file 进行crash recovery。
6.3、使用XtraBackup备份数据时,关于文件权限的说明
xtrabackup以read-write模式打开innodb的数据文件,然后对其进行复制。其实它不会修改此文件。也就是说,运行xtrabackup的用户,必须对innodb的数据文件具有读写权限。
为什么要用rw模式呢?直接read模式不好么?因为xtrabackup采用了其内置的innodb库来打开文件,而innodb库打开文件的时候就是rw的。
七、Xtrabackup 全量备份与全量恢复
备份单个或者多个库 --databases 用于指定要备份的数据库, 备份多个库使用方法: --databases="db_zone_9033 db_zone_9034" 用空格分开。
- innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --databases= "db_zone_9033 db_zone_9034" --parallel= --throttle= /data/tmp/ --socket=/tmp/mysql.sock
- # 查看备份后的数据
- [[email protected] /data/tmp]$ ll _23
- total
- -rw-r-----. root root Oct : backup-my.cnf
- drwxr-x---. root root Oct : db_zone_9033
- drwxr-x---. root root Oct : db_zone_9034
- -rw-r-----. root root Oct : ibdata1
- -rw-r-----. root root Oct : xtrabackup_binlog_info
- -rw-r-----. root root Oct : xtrabackup_checkpoints
- -rw-r-----. root root Oct : xtrabackup_info
- -rw-r-----. root root Oct : xtrabackup_logfile
排除多个个库 --databases-exclude 根据名称排除数据库 ,使用方法:--databases-exclude="db_zone_battlereport_9037 db_zone_battlereport_9038" 用空格分开。
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --databases-exclude="db_zone_battlereport_9037 db_zone_battlereport_9038 db_zone_battlereport_9039 db_zone_battlereport_9040" --parallel= --throttle= /data/tmp/ --socket=/tmp/mysql.sock
7.1、全量备份
1.创建用于备份恢复的用户 mulong 并赋予权限
- mysql> create user mulong@' localhost' identified by '123456';
- mysql> grant reload, process, lock tables, replication client on *.* to mulong@ localhost;
2.创建数据存放目录
mkdir -p /data/db_backup/
3.进行数据全备
- [[email protected] ~] # /usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel=2 --throttle=200 /data/db_backup/xtrabackup --socket=/tmp/mysql.sock
- #执行命令后输出:
- xtrabackup: recognized server arguments:
- xtrabackup: recognized client arguments:
- 180726 15:00:18 innobackupex: Starting the backup operation
- IMPORTANT: Please check that the backup run completes successfully.
- At the end of a successful backup run innobackupex
- prints "completed OK!".
- 180726 15:00:28 All tables unlocked
- 180726 15:00:28 Backup created in directory '/data/db_backup/xtrabackup/2018-03-28_17-33-41/'
- MySQL binlog position: filename 'master-bin.000008', position '191', GTID of the last change '5be531c0-3252-11e8-a5a9-000c2923f205:1-1079'
- 180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/backup-my.cnf
- 180726 15:00:28 [00] ... done
- 180726 15:00:28 [00] Writing /mnt/backup/2018-07-26_15-00-18/xtrabackup_info
- 180726 15:00:28 [00] ... done
- xtrabackup: Transaction log of lsn (1090604498) to (1090604498) was copied.
- 180726 15:00:29 completed OK!
- 以上可以看到整个备份过程,说明备份成功!
4.查看全备后生成的文件 /data/db_backup/xtrabackup/2018-03-28_17-33-41/
- [[email protected] 2018-03-28_17-33-41]# ll /data/db_backup/xtrabackup/2018-03-28_17-33-41/
- total 131112
- -rw-r-----. 1 root root 481 Mar 28 17:33 backup-my.cnf
- -rw-r-----. 1 root root 12582912 Mar 28 17:38 ibdata1
- -rw-r-----. 1 root root 50331648 Mar 28 17:38 ib_logfile0
- -rw-r-----. 1 root root 50331648 Mar 28 17:38 ib_logfile1
- -rw-r-----. 1 root root 12582912 Mar 28 17:38 ibtmp1
- drwxr-x---. 2 root root 4096 Mar 28 17:38 incre1
- drwxr-x---. 2 root root 4096 Mar 28 17:38 mysql
- drwxr-x---. 2 root root 4096 Mar 28 17:38 performance_schema
- drwxr-x---. 2 root root 4096 Mar 28 17:38 test
- -rw-r-----. 1 root root 64 Mar 28 17:38 xtrabackup_binlog_info
- -rw-r--r--. 1 root root 23 Mar 28 17:38 xtrabackup_binlog_pos_innodb
- -rw-r-----. 1 root root 113 Mar 28 17:38 xtrabackup_checkpoints
- -rw-r-----. 1 root root 724 Mar 28 17:38 xtrabackup_info
- -rw-r-----. 1 root root 8388608 Mar 28 17:38 xtrabackup_logfile
- -rw-r--r--. 1 root root 1 Mar 28 17:38 xtrabackup_master_key_id
- 配置文件注释:
- (1) backup-my.cnf —— 备份命令用到的配置选项信息;
- (2) ibdata1 —— 备份的表空间文件;
- (3) xtrabackup_binary —— 备份中用到的xtrabackup的可执行文件;
- (4) xtrabackup_binlog_info —— mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置;
- (5) xtrabackup_logfile —— 备份的重做日志文件。
- (6) xtrabackup_checkpoints —— 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息;
xtrabackup_checkpoints 备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:
- [[email protected] - - - - ] # cat xtrabackup_checkpoints
- backup_type = full-prepared #可以看出是全备份
- from_lsn = #记录了LSN,日志偏移量
- to_lsn =
- last_lsn = # LSN号
- compact =
- recover_binlog_info =
backup-my.cnf 备份命令用到的配置选项信息:
- [ [email protected] 2018-03-28_17-33-41] # cat backup-my.cnf
- # This MySQL options file was generated by innobackupex.
- # The MySQL server
- [ mysqld]
- innodb_checksum_algorithm=innodb
- innodb_log_checksum_algorithm=innodb
- innodb_data_file_path=ibdata1: M:autoextend
- innodb_log_files_in_group=
- innodb_log_file_size=
- innodb_fast_checksum= false
- innodb_page_size=
- innodb_log_block_size=
- innodb_undo_directory=.
- innodb_undo_tablespaces=
- server_id=
- redo_log_version=
- server_uuid= abf -a639 c2923f205
- master_key_id=
xtrabackup_binlog_info,mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置:
- [[email protected] 2018-03-28_17-33-41]# cat xtrabackup_binlog_info
- master-bin .000001 2481 6 e843abf-3268-11e8-a639-000c2923f205 :1-6
xtrabackup_info,记录备份的基本信息,uuid、备份命令、备份时间、binlog、LSN、以及其他加密压缩等信息:
- [[email protected] - - - - ] # cat xtrabackup_info
- uuid = a102096b- b- e8-a639- c2923f205
- name =
- tool_name = innobackupex
- tool_command = --defaults-file= /usr/local /mysql/my.cnf --user=root -- socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ - - - - / --parallel= --throttle=
- tool_version = .
- ibbackup_version = .
- server_version = . - log
- start_time = - - : :
- end_time = - - : :
- lock_time =
- binlog_pos = filename 'master-bin.000001', position '2481', GTID of the last change '6e843abf-3268-11e8-a639-000c2923f205:1-6'
- innodb_from_lsn =
- innodb_to_lsn =
- partial = N
- incremental = Y
- format = file
- compact = N
- compressed = N
- encrypted = N
7.2、全量备份后,执行全量恢复
1.关闭数据库并移除数据文件,创建新的数据库目录
- [[email protected] - - - - ] # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
- [[email protected] - - - - ] # mv /data/mysql/ /data/mysql_bak/
- [[email protected] - - - - ] # mkdir -p /data/mysql/
2.在全备目录上重放已提交的事务:
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root -- socket= /tmp/mysql.sock --apply- log -- redo-only /data/db_backup/xtrabackup/ - - - - /
- 事务提交后:查看backup_type是否为 "log-applied"
- cat /data/db_backup/xtrabackup/ - - - - /
- backup_type = log-applied
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
3.用全备的数据文件 [/data/db_backup/xtrabackup/2018-03-28_17-33-41/] 来恢复数据 [若全备数据之后,数据有新的增删改查修改,那么就需要使用增量备份的方式去恢复数据,详见文章:7.3-7.4]
- [ [email protected]szq db_backup]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/ data/mysql --copy-back / data/db_backup/xtrabackup/ _17 /
- xtrabackup: recognized server arguments: --datadir=/ data/mysql
- xtrabackup: recognized client arguments: --datadir=/ data/mysql
- : : innobackupex: Starting the copy-back operation
- IMPORTANT: Please check that the copy-back run completes successfully.
- At the end of a successful copy-back run innobackupex
- prints "completed OK!".
- innobackupex version based on MySQL server Linux (x86_64) (revision id: eb8c)
- : : [ ] Copying ib_logfile0 to / data/mysql/ib_logfile0
- : : [ ] ...done
- : : [ ] Copying ib_logfile1 to / data/mysql/ib_logfile1
- : : [ ] ...done
- : : [ ] Copying ibdata1 to / data/mysql/ibdata1
- : : [ ] ...done
- : : [ ] Copying ./mysql/time_zone.frm to / data/mysql/mysql/time_zone.frm
- : : [ ] ...done
- : : [ ] Copying ./mysql/general_log.frm to / data/mysql/mysql/general_log.frm
- : : [ ] ...done
- : : [ ] Copying ./mysql/time_zone_name.frm to / data/mysql/mysql/time_zone_name.frm
- : : [ ] ...done
- : : [ ] Copying ./mysql/help_topic.MYI to / data/mysql/mysql/help_topic.MYI
- : : [ ] ...done
- : : [ ] Copying ./performance_schema/events_statements_current.frm to / data/mysql/performance_schema/events_statements_current.frm
- : : [ ] ...done
- : : [ ] Copying ./performance_schema/events_statements_summary_by_host_by_event_name.frm to / data/mysql/performance_schema/events_statements_summary_by_host_by_event_name.frm
- : : [ ] ...done
- : : [ ] Copying ./performance_schema/setup_actors.frm to / data/mysql/performance_schema/setup_actors.frm
- : : [ ] ...done
- : : [ ] Copying ./performance_schema/socket_summary_by_event_name.frm to / data/mysql/performance_schema/socket_summary_by_event_name.frm
- : : [ ] ...done
- : : [ ] Copying ./performance_schema/events_statements_summary_by_account_by_event_name.frm to / data/mysql/performance_schema/events_statements_summary_by_account_by_event_name.frm
- : : [ ] ...done
- : : [ ] Copying ./test/db.opt to / data/mysql/test/db.opt
- : : [ ] ...done
- : : [ ] Copying ./xtrabackup_master_key_id to / data/mysql/xtrabackup_master_key_id
- : : [ ] ...done
- : : [ ] Copying ./ibtmp1 to / data/mysql/ibtmp1
- : : [ ] ...done
- : : completed OK!
- # 这里看出是一个copy数据的过程!
4.全备数据恢复后,授权数据库文件,并启动MySQL
- [[email protected] db_backup] # chown -R mysql.mysql /data/mysql
- [[email protected] db_backup] # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1
5.可以看到数据库和表均已恢复:
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | incre1 |
- | mysql |
- | performance_schema |
- | test |
- +--------------------+
- rows in set ( . sec)
7.3、增量备份 7.3和7.4是一个整体
增量备份与恢复,官网地址:https://www.percona.com/doc/percona-xtrabackup/2.4/howtos/recipes_ibkx_inc.html
我们以之前做的全备文件为基准,在全备文件的基础上做增量备份: 全备文件 /data/db_backup/xtrabackup/2018-03-28_17-33-41
增量备份1、新建一张表t_3party_server,不插入数据,作为增量备份1的标记
- mysql> use incre1;
- Database changed
- mysql> show tables;
- Empty set ( sec)
- mysql> create table t_3party_server(
- -> app varchar( ) NOT NULL,
- -> server varchar( ) NOT NULL,
- -> division varchar( ) NOT NULL,
- -> node varchar( ) NOT NULL,
- -> port varchar( ) NOT NULL,
- -> status int( ) unsigned NOT NULL,
- -> PRIMARY KEY (app, server,division,node,port)
- -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
- Query OK, rows affected ( sec)
- mysql> show tables;
- +------------------+
- | Tables_in_incre1 |
- +------------------+
- | t_3party_server |
- +------------------+
- row in set ( sec)
- mysql> select * from t_3party_server;
- rows in set ( sec)
开始执行增量备份1的命令:
- 一、以全备目录为基础做增量备份
- --incremental 指定增量备份 的目录
- --incremental-basedir=指定全量备份的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ - - - - / --parallel= --throttle=
- backup_type = incrementa
增量备份2、在表t_3party_server内插入三条数据,作为增量备份2的标记
- mysql> use incre1;
- Database changed
- mysql> show tables;
- +------------------+
- | Tables_in_incre1 |
- +------------------+
- | t_3party_server |
- +------------------+
- row in set ( . sec)
- mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-login', '10.117.16.242', '30021', '0');
- Query OK, row affected ( . sec)
- mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-match', '10.117.16.242', '30032', '0');
- Query OK, row affected ( . sec)
- mysql> insert into t_3party_server(app,server,division,node,port,status) values( 'MOBA', 'haproxy', 'haproxy-test', '10.117.16.242', '30035', '0');
- Query OK, row affected ( . sec)
- mysql> select * from t_3party_server;
- +------+---------+---------------+---------------+-------+--------+
- | app | server | division | node | port | status |
- +------+---------+---------------+---------------+-------+--------+
- | MOBA | haproxy | haproxy-login | 10.117.16.242 | | 0 |
- | MOBA | haproxy | haproxy-match | . | 30032 | |
- | MOBA | haproxy | haproxy-test | 10.117.16.242 | | 0 |
- +------+---------+---------------+---------------+-------+--------+
- rows in set ( . sec)
开始执行增量备份2的命令:
- 二、增量备份 次之后,再次增量备份 的话,需要在增量备份 目录的基础上做增量备份
- --incremental 指定增量备份 的目录 (增量备份 和增量备份 的目录在同一父目录下)
- --incremental-basedir=指定增量备份 的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ - - - - / --parallel= --throttle=
7.4、增量备份恢复
增量备份的恢复需要有3个步骤
- 准备全备数据 [增量备份的数据是已全备数据为基础的]。
- 恢复增量备份到完全备份 [增量备份数据与全备数据合并,合并到全备目录]。
- 对整体的完全备份进行恢复,回滚未提交的数据 [增量数据和全备数据合并后,在恢复数据]。
- 增量备份恢复全过程:
- 一、准备全备数据:
- /usr/bin/innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --parallel= --throttle= /data/db_backup/xtrabackup --socket= /tmp/mysql.sock
- 二、准备增量备份 :在全备文件的基础上做增量备份,以全备文件为基础做增备 :
- --incremental 指定增量备份 的目录
- --incremental-basedir=指定全备文件的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ - - - - / --parallel= --throttle=
- backup_type = incrementa
- ######################################################################
- 小知识:增量备份 次之后,再次增量备份 的话,有两种方法:[方法二 见 ]
- 方法一:在在增量备份 目录的基础上做增量备份 (那么数据恢复的时候,就需要先合并增量备份 然后在合并增量备份 )
- --incremental 指定增量备份 的目录
- --incremental-basedir=指定增量备份 的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/incremental/ - - - - / --parallel= --throttle=
- 以增备 为基础做增备 ,数据如何恢复?
- 先全量备份数据+增量备份 数据合并,然后全量备份数据+增量备份 数据合并,数据最终合并到全量备份目录内:
- --incremental-dir= 先指定增量备份 的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ - - - - / --incremental-dir= /data/db_backup/incremental/ - - - - /
- --incremental-dir= 先指定增量备份 的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ - - - - / --incremental-dir= /data/db_backup/incremental/ - - - - /
- ######################################################################
- 、准备增量备份 :在全备的基础上增备,已全备目录为基础做增备 :
- 备注:每次的增量备份,都可以以全量备份为基础做增量备份 、 、 、 ~~~~
- --incremental 指定增量备份 的目录
- --incremental-basedir=指定全备的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --incremental /data/db_backup/incremental --incremental-basedir= /data/db_backup/xtrabackup/ - - - - / --parallel= --throttle=
- backup_type = incrementa
- 备份完毕后,可以通过检查文件的LSN号,来确认增量备份文件的一致性:
- 全备文件的LSN: -
- [[email protected] . ]$ cat full/全量备份文件/xtrabackup_checkpoints
- backup_type = full-prepared
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
- 增量备份 文件的LSN: - #[以全备为基础做增量备份1,可以看到LSN为:1702237-1716671]
- [[email protected] . ]$ cat incre/增量备份文件 /xtrabackup_checkpoints
- backup_type = incremental
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
- 增量备份 文件的LSN: - #[以全备为基础做增量备份2,可以看到LSN为:1702237-1732070]
- [[email protected] . ]$ cat incre/增量备份文件 /xtrabackup_checkpoints
- backup_type = incremental
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
- 优点:数据恢复的时候,直接全备数据+最后一次增量备份n做数据合并,而不是[全量备份数据+增量备份 数据+增量备份 数据合并]
- 三、在全备目录上重放已提交的事务:
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ - - - - /
- 四、全量备份数据+增量备份 数据合并,数据最终合并到全量备份目录内:
- --incremental-dir= 指定增量备份 的目录
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log -- redo-only /data/db_backup/xtrabackup/ - - - - / --incremental-dir= /data/db_backup/incremental/ - - - - /
- 五、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/ - - - - /
- #####################################################################################
- #注释:此行可不看
- 最终数据将位于全备备份目录中,而不是增量目录中。
- 您可以在每个目录中检查文件xtrabackup_checkpoints。
- 它们应该如下所示:
- 在全备备份中
- backup_type = full - backuped
- from_lsn =
- to_lsn =
- 在增量备份中:
- backup_type = incremental
- from_lsn =
- to_lsn =
- 事务提交后:查看backup_type是否为 "log-applied"
- cat /data/tmp/ . /xtrabackup_checkpoints
- backup_type = log-applied
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
- #####################################################################################
- 六、恢复全备数据(全备+增备合并后的数据)
- #关闭数据库
- /usr/local/mysql/bin/mysqld_multi --defaults-file= /usr/local /mysql/my.cnf stop
- #移除数据目录
- mv /data/mysql/ /data/mysql_bak/
- #重新创建MySQL数据目录
- mkdir -p /data/mysql/
- #将全备数据(全备+增备)恢复到MySQL
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --datadir= /data/mysql --copy-back /data/db_backup/xtrabackup/ - - - - /
- #授权
- chown -R mysql.mysql /data/mysql
- #启动MySQL
- /usr/local/mysql/bin/mysqld_multi --defaults-file= /usr/local /mysql/my.cnf start
- 七、检查数据库内的数据:
- 、第一次增量备份:新建了一张数据表:t_3party_server。
- 、第二次增量备份:在数据表t_3party_server内插入了 条数据。
- #在数据库内存在数据表t_3party_server,且3条数据也同样存在。
- mysql> show databases;
- +--------------------+
- | Database |
- +--------------------+
- | information_schema |
- | incre1 |
- | mysql |
- | performance_schema |
- | test |
- +--------------------+
- rows in set ( . sec)
- mysql> use incre1;
- Reading table information for completion of table and column names
- You can turn off this feature to get a quicker startup with -A
- Database changed
- mysql> show tables;
- +------------------+
- | Tables_in_incre1 |
- +------------------+
- | t_3party_server |
- +------------------+
- row in set ( . sec)
- mysql> select * from t_3party_server;
- +------+---------+---------------+---------------+-------+--------+
- | app | server | division | node | port | status |
- +------+---------+---------------+---------------+-------+--------+
- | MOBA | haproxy | haproxy-login | 10.117.16.242 | | 0 |
- | MOBA | haproxy | haproxy-match | . | 30032 | |
- | MOBA | haproxy | haproxy-test | 10.117.16.242 | | 0 |
- +------+---------+---------------+---------------+-------+--------+
- rows in set ( . sec)
疑问?
MySQL挂掉后能不能进行全备和增备?若果不能的话,数据如何恢复?会丢失多少数据?
MySQL挂掉后,不能进行增量备份,以及全量备份。此时恢复数据的步骤如下:
1、在全备目录上重放已提交的事务:
2、增量备份数据与全量备份数据合并,数据最终合并到全量备份目录内:
3、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
4、恢复全备数据(全备+增备合并后的数据)
5、丢失的数据:最后一次成功增量备份时间点~~MySQL挂掉的那个时间点,中间的数据全部丢失。
增量备份n+1次的话,为何要以上一次的增量备份n为基础,每次增量备份都以全量备份为基础可以吗?
本人亲测,增量备份2次,第二次增量备份2,无论是以全量备份为基础,还是以增量备份1为基础,数据都可以恢复!不过官方建议以增量备份1为基础做增量备份2。
7.5、使用Xtrabackup快速搭建MySQL主从复制
1、全备主库数据
/usr/bin/innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --parallel= --throttle= /opt/ --socket=/tmp/mysql.sock
2、把主库的全备数据拷贝到从库
3、停掉从库的MySQL实例,并移除数据库目录,然后创建新的数据库目录
- /usr/ local/mysql/bin/mysqld_multi --defaults- file=/usr/ local/mysql/my.cnf stop
- mv /data/mysql /data/mysql_bak
- mkdir -p /data/mysql
4、在从库上,把主库copy过来的全备文件上重放已提交的事务。[或者在主库上全备文件之后做此操作,然后拷贝到从库] (2选1)
- innobackupex --defaults-file= /usr/local /mysql/my.cnf --user=root --socket= /tmp/mysql.sock --datadir= /data/mysql / --apply-log --redo-only /data /tmp/ . /
- --datadir #从库的MySQL数据目录
- /data/tmp/ . / #主库拷贝过来的全备文件
- 事务提交后:查看backup_type是否为 "log-applied"
- cat /data/tmp/ . /xtrabackup_checkpoints
- backup_type = log-applied
- from_lsn =
- to_lsn =
- last_lsn =
- compact =
- recover_binlog_info =
5、事务提交后,把全备文件内的数据恢复到从库的MySQL数据目录,即/data/mysql
innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql/ --copy-back /data/tmp/./
6、授权从库的/data/mysql/目录,并启动从库MySQL实例
- chown -R mysql.mysql /data/mysql
- /usr/ local/mysql/bin/mysqld_multi --defaults- file=/usr/ local/mysql/my.cnf start
7、通过全备目录内的xtrabackup_binlog_info文件,可以找到主从位置点:
- cat / data/tmp/ _3306/xtrabackup_binlog_info
- master-bin cc8e1365 ce0 cc47a06f43e:
8、从库通过执行CHANGE MASTER TO 创建主从关系,并检查主从复制状态是否已经完成。
- mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"
- mysql -u root --socket= /tmp/mysql.sock -e "change master to master_host='10.116.207.17',master_user='replicate',master_password='moba2016',master_log_file='master-bin.002837',master_log_pos=284721255;"
- mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"
- mysql -u root --socket= /tmp/mysql.sock -e "start slave;"
- mysql -u root --socket= /tmp/mysql.sock -e "show slave status\G;"
7.6、线上MySQL使用Xtrabackup备份数据脚本
- #!/bin/bash
- # XtraBackup Use
- # MySQL Server Backup
- # sudada
- # 2018/08/07
- #每次增量备份都是基于全备目录,数据恢复:全备数据+最后一次增备数据合并
- USER=root #备份使用的用户
- INSTALL_DIR=/data/tmp #Xtrabackup安装路径
- SOCKET_FILE=/tmp/mysql.sock2 #MySQL sock文件
- XTRABACKUP_BIN=/usr/bin/innobackupex #innobackupex绝对路径
- DEFAULTS_FILE=/usr/ local/mysql/my.cnf #MySQL配置文件
- BACK_DATA=/data/db_xtrabackup/`date +%F` #DB备份的主目录
- BACK_DATA_FULLBACKUP= ${BACK_DATA}/full #全量备份的目录
- BACK_DATA_INCREBACKUP= ${BACK_DATA}/incre #增量备份的目录
- BACK_LOG= ${BACK_DATA}/agent_mysql_xtrabackup.log #记录DB备份过程日志文件
- XTRABACKUP_LOG= ${BACK_DATA}/record_xtrabackup_status.log #记录xtrabackup备份过程的输出信息
- FULLBACKUP_INTERVAL=86400 #全库备份的间隔周期,单位:秒
- BACKUP_TIME=7 #数据备份时间(单位:天)
- LOCKFILE= '.xtrabackup.pid' #加锁
- # 安装Xtrabackup服务
- function Install_XtraBackup(){
- if [ ! -d ${INSTALL_DIR} ]; then
- mkdir -p ${INSTALL_DIR}
- fi
- if [ ! -f ${XTRABACKUP_BIN} ]; then
- echo " Install Percona Repository! " >>/dev/null 2>&1
- cd ${INSTALL_DIR}
- yum install -y http://www.percona.com/downloads/percona-release/redhat/0.1-6/percona-release-0.1-6.noarch.rpm >>/dev/null 2>&1
- yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-6.noarch.rpm >>/dev/null 2>&1
- yum install -y percona-xtrabackup-24 >>/dev/null 2>&1
- innobackupex -- help >>/dev/null 2>&1
- Check=$?
- if [ $Check -ne 0 ]; then
- echo "Install Xtrabackup Failed !"
- exit 0
- fi
- fi
- }
- # DB全备
- function Back_All(){
- if [ ! -e "${SOCKET_FILE}" ]; then
- exit 0
- fi
- if [ ! -d ${BACK_DATA_FULLBACKUP} ]; then
- mkdir -p ${BACK_DATA_FULLBACKUP}
- fi
- if [ ! -d ${BACK_DATA_INCREBACKUP} ]; then
- mkdir -p ${BACK_DATA_INCREBACKUP}
- fi
- #函数开始运行的时间点,用来与全备文件做时间对比
- START_TIME=`date +%s`
- #查找最新的完全备份
- LATEST_FULL_BACKUP=`/bin/find ${BACK_DATA_FULLBACKUP} -mindepth 1 -maxdepth 1 - type d - printf "%P\n" | sort -nr | head -1`
- #查找最新全备文件的创建时间
- LATEST_FULL_BACKUP_CREATED_TIME=` stat -c %Y ${BACK_DATA_FULLBACKUP}/ ${LATEST_FULL_BACKUP}`
- #最新全备文件的创建时间与当前的时间差
- FULL_TIME_DIFF=$(( ${START_TIME}- ${LATEST_FULL_BACKUP_CREATED_TIME}))
- #如果间隔小于86400秒,那么就基于全量备份做增量备份
- if [ ${LATEST_FULL_BACKUP} ] && [ ${FULL_TIME_DIFF} -lt ${FULLBACKUP_INTERVAL} ]; then
- echo " " >> ${BACK_LOG}
- echo " `date +%Y/%m/%d-%H:%M`" >> ${BACK_LOG}
- echo " 基于全备目录:${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP},做增量备份 !" >> ${BACK_LOG}
- #调试使用1
- #echo "增量备份--incremental ${BACK_DATA_INCREBACKUP}/${LATEST_INCRE_BACKUP}"
- #echo "全备目录--incremental-basedir= ${BACK_DATA_FULLBACKUP}/${LATEST_FULL_BACKUP}"
- ${XTRABACKUP_BIN} --defaults-file= ${DEFAULTS_FILE} --user= ${USER} --socket= ${SOCKET_FILE} --incremental ${BACK_DATA_INCREBACKUP} --incremental-basedir= ${BACK_DATA_FULLBACKUP}/ ${LATEST_FULL_BACKUP} --parallel=2 --throttle=200 2> ${XTRABACKUP_LOG} ;sleep 1
- SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`
- LOG_LATEST_INCRE_BACKUP=`/bin/find ${BACK_DATA_INCREBACKUP} -mindepth 1 -maxdepth 1 - type d - printf "%P\n" | sort -nr | head -1`
- #查看备份日志,判断备份是否成功
- if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ]; then
- #`grep 'incremental' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
- echo " 增量备份1成功,目录地址:${BACK_DATA_INCREBACKUP}/${LOG_LATEST_INCRE_BACKUP}" >> ${BACK_LOG}
- else
- echo " innobackupex 增量备份命令执行失败! " >> ${BACK_LOG}
- echo " -------------错误日志------------- " >> ${BACK_LOG}
- tail -10 ${XTRABACKUP_LOG} >> ${BACK_LOG}
- echo " ---------------------------------- " >> ${BACK_LOG}
- exit 1
- fi
- fi
- #如果全备目录不存在,那么就重新全备一个文件
- if [ ! ${LATEST_FULL_BACKUP} ] || [ ${FULL_TIME_DIFF} -gt ${FULLBACKUP_INTERVAL} ]; then
- echo " " >> ${BACK_LOG}
- echo " `date +%Y/%m/%d-%H:%M` " >> ${BACK_LOG}
- echo " 正在执行全新的完全备份 ========>> " >> ${BACK_LOG}
- ${XTRABACKUP_BIN} --defaults-file= ${DEFAULTS_FILE} --user= ${USER} --parallel=2 --throttle=200 ${BACK_DATA_FULLBACKUP} --socket= ${SOCKET_FILE} 2> ${XTRABACKUP_LOG} ;sleep 1
- SUCESS_BACKUP=`/bin/awk -- "/Backup created in directory/ { split( \\\$0, p, \"'\" ) ; print p[2] }" ${XTRABACKUP_LOG}`
- #查看备份日志,判断备份是否成功
- if [ `/usr/bin/tail -1 ${XTRABACKUP_LOG} | grep 'completed OK!' | wc -l` -eq 1 ]; then
- #`grep 'full-backuped' ${LATEST_FULL_BACKUP}/xtrabackup_checkpoints | wc -l` -eq 1
- echo " 数据成功备份到:${SUCESS_BACKUP} " >> ${BACK_LOG}
- else
- echo " innobackupex 全备命令执行失败! " >> ${BACK_LOG}
- echo " -------------错误日志------------- " >> ${BACK_LOG}
- tail -10 ${XTRABACKUP_LOG} >> ${BACK_LOG}
- echo " ---------------------------------- " >> ${BACK_LOG}
- exit 1
- fi
- fi
- }
- #删除过期的备份文件[暂定10天]
- function Delete_File(){
- EXPIRED_FILE=`/bin/find /data/db_xtrabackup/ -maxdepth 1 - type d -mtime + ${BACKUP_TIME} -name "20*"`
- echo " `date +%Y/%m/%d-%H:%M`" >> ${BACK_LOG}
- echo " 检查是否有过期的文件:" >> ${BACK_LOG}
- if [ ${EXPIRED_FILE} ]; then
- echo " 找到了过期文件:${EXPIRED_FILE} " >> ${BACK_LOG}
- /bin/find /data/db_xtrabackup/ -maxdepth 1 - type d -mtime + ${BACKUP_TIME} -name "20*" | xargs -I '{}' rm -fr {}
- echo " `date +%Y/%m/%d_%H:%M`, 过期文件:${EXPIRED_FILE} 已被删除!" >> ${BACK_LOG}
- else
- echo " 不存在过期的文件! " >> ${BACK_LOG}
- fi
- }
- function Main(){
- touch ${LOCKFILE}
- exec 57<> ${LOCKFILE}
- flock -xn 57
- if [[ $? -eq 1 ]]; then
- echo "$0 is Running, please wait"
- exit 3
- fi
- Install_XtraBackup
- Back_All
- Delete_File
- exec 57>&-
- }
- Main
- ###############################################################################################################################################################
- #数据恢复流程:
- #1、在备份目录/data/db_backup/xtrabackup/下,找到需要恢复的文件
- # 1.1、/data/db_backup/xtrabackup/2018-07-26/full #全备文件目录
- # 1.2、/data/db_backup/xtrabackup/2018-07-26/incre #增量备份文件目录
- #
- #2、拷贝文件到主库机器,并检查数据的完整性
- # 2.1、检查全备及增备目录下的xtrabackup_checkpoints文件
- # backup_type = full-backuped
- # from_lsn = 0
- # to_lsn = 1639857
- # last_lsn = 1639857
- # compact = 0
- # recover_binlog_info = 0
- #
- # 2.2、检查备份日志是否报错:
- # cat agent_mysql_xtrabackup.log
- #
- #3、开始合并数据
- # 3.1、全备目录上重放已提交的事务:
- # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/ #这里写全备文件
- # 3.2、增量备份数据与全量备份数据合并,数据最终合并到全量备份目录内:
- # # --redo-onl 后是全备文件
- # # --incremental-dir= 指定增量备份2的目录(如果增量备份多次,那就指向最后一次增量备份的目录,这里指向的是增量备份2的目录)
- # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log --redo-only /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/ --incremental-dir=/data/db_backup/xtrabackup/2018-07-26/incre/2018-03-28_17-37-25/
- #
- # 3.3、在全备目录(增量数据+全备数据合并) 开始回滚未提交的事务:
- # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --apply-log /data/db_backup/xtrabackup/2018-07-26/full/2018-03-28_17-33-41/
- #
- #4、开始恢复数据:
- # 4.1、关闭数据库
- # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf stop 1
- # 4.2、移除数据目录
- # mv /data/mysql/ /data/mysql_bak/
- # 4.3、重新创建MySQL数据目录
- # mkdir -p /data/mysql/
- # 4.4、将全备数据(全备+增备)恢复到MySQL
- # innobackupex --defaults-file=/usr/local/mysql/my.cnf --user=root --socket=/tmp/mysql.sock --datadir=/data/mysql --copy-back /data/db_backup/xtrabackup/2018-03-28_17-33-41/
- # 4.5、授权
- # chown -R mysql.mysql /data/mysql
- # 4.6、启动MySQL
- # /usr/local/mysql/bin/mysqld_multi --defaults-file=/usr/local/mysql/my.cnf start 1
- #
- #5、检查
- ###############################################################################################################################################################
八、Mysqldump 与 Xtrabackup 线上数据备份对比测试
环境描述及结果展示:使用线上3台分区机器测试
MySQL版本:5.6.17
Xtrabackup版本:xtrabackup version 2.4
主机内存:32GB CPU:8核 Innodb buffer pool:128M 数据文件总大小:14GB
参数 | xtrabackup | xtrabackup压缩备份 | mysqldump压缩备份 | ||||||
CPU | 11.82% | 7.59% | 7.33% | 26.09% | 17.43% | 18.64% | 16.57% | 12.61% | 12.82% |
CPU IO wait | 28.74% | 31.79% | 36.50% | 21.19% | 26.13% | 30.10% | 22.40% | 17.24% | 18.62% |
Memory | 50M | 30M | 30M | 310M | 290M | 270M | 70M | 50M | 40M |
Main processes | xtrabackup | xtrabackup&tar&gzip | mysqldump&mysqld&gzip | ||||||
Backup file size | 14.5 G | 13 G | 13 G | 14.5 G | 13 G | 13 G | 14.5 G | 13 G | 13 G |
Time | 8分钟 | 8分钟 | 7分钟 | 22分钟 | 20分钟 | 20分钟 | 37分钟 | 30分钟 | 28分钟 |
数据恢复(导入)时间 | 5分钟 | 4分钟 | 4分钟 | 5分钟 | 4分钟 | 4分钟 | 84分钟 | 78分钟 | 73分钟 |
结论:
Xtrabackup备份:占用的CPU与内存较低,消耗的IO较大,备份文件效率很高,数据恢复(导入)非常快。
Xtrabackup压缩备份:占用的CPU与内存较高,消耗的IO相对较大,备份文件效率较高,数据恢复(导入)非常快。
Mysqldump压缩备份时:占用的CPU与内存较少,消耗的IO较少,备份文件效率较低,数据恢复(导入)非常慢。
一、Xtrabackup是什么?