xtrabackup2.0.0使用总结&使用innobackupex进行增量备份
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
软件安装:
安装依赖:
yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL
wget ftp://rpmfind.net/linux/atrpms/el6-x86_64/atrpms/stable/libev-4.04-2.el6.x86_64.rpm
rpm -ivh libev-4.04-2.el6.x86_64.rpm
下载地址: https://www.percona.com/software/mysql-database/percona-xtrabackup
说明: 备份mysql5.1 请使用 Percona XtraBackup 2.0, 2.0+的版本不支持备份mysql5.1
另如果需要主从数据同步:
用过 xtrabackup 工具的 innobackupex 脚本备份数据的人可能会注意到, –apply-log 处理过的备份数据里有两个文件说明该备份数据对应的 binlog 的文件名和位置。但有时这俩文件说明的位置可能会不同。 经过实验和询问 Percona 公司,结论如下: 1 对于纯 InnoDB 操作,备份出来的数据中上述两个文件的内容是一致的 2 对于 InnoDB 和非事务存储引擎混合操作,xtrabackup_binlog_info 中所示的 position 应该会比 xtrabackup_pos_innodb 所示的数值大。此时应以 xtrabackup_binlog_info 为准;而后者和 apply-log 时 InnoDB recovery log 中显示的内容是一致的, 只针对 InnoDB 这部分数据
主从命令:
change master to master_host='10.0.x.x',master_user='xxx',master_password='xxx',master_log_file='mysql-bin.000001',master_log_pos=99;
shell :
backup_full.sh # 全量备份时
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ];then echo '请输备份文件的存放路径' exit fi innobackupex --user=root --defaults-file=/etc/my.cnf $1
preparing_full.sh # 全量还原时准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '请输入全量文件夹' exit fi innobackupex --apply-log $1
backup_incremental.sh # 增量备份
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '第一个参数,请输入增量文件存放的文件夹' exit fi if [ -z $2 ]; then echo '第二个参数,请输入基于哪个备份为起始进行增量备份' exit fi innobackupex --user=root --defaults-file=/etc/my.cnf --incremental $1 --incremental-basedir=$2
backup_incremental_full.sh # 增量备份还原对全量的基础数据的准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '请输入全量文件夹' exit fi innobackupex --apply-log --redo-only $1
preparing_incremental.sh # 对增量备份还原的准备工作
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ]; then echo '第一个参数,基于哪个全量备份的文件夹' exit fi if [ -z $2 ]; then echo '第二个参数,请输入对哪个文件夹进行增量还原准备' exit fi innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only $1 --incremental-dir=$2
rstore.sh # 数据还原, 适用于全量和增量
#!/bin/bash #basedir="/srv/backup_db" if [ -z $1 ];then echo '第一个参数,请输还原文件的存放路径' exit fi if [ -z $2 ];then echo '第二个参数,请输入原mysql的数据存放路径' exit fi innobackupex --copy-back $1 chown mysql.mysql $2 -R
--------------------------------------------------------------------
定时任务进行备份或还原
crontab_backup_full.sh : 每天凌晨进行全量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir if [ ! -d $current_date_dir ];then mkdir $current_date_dir fi data_dir=$backup_dir/$current_date_dir ./shell/backup_full.sh $data_dir/full 2>$data_dir/${current_date_dir}.log 1>$data_dir/${current_date_dir}.err.log history_del=$(date -d"6 days ago" +%Y-%m-%d) rm -rf $backup_dir/$history_del
crontab_backup_incremental_1.sh : 每天12:30 进行增量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir data_dir=$backup_dir/$current_date_dir ./shell/backup_cremental.sh $data_dir/1230 $data_dir/full 2>$data_dir/${current_date_dir}1230.log 1>$data_dir/${current_date_dir}1230.err.log
crontab_backup_incremental_2.sh : 每天19:30 进行增量备份
#!/bin/bash backup_dir=/srv/backup current_date_dir=$(date +%F) cd $backup_dir data_dir=$backup_dir/$current_date_dir ./shell/backup_cremental.sh $data_dir/1930 $data_dir/1230 2>$data_dir/${current_date_dir}1930.log 1>$data_dir/${current_date_dir}1930.err.log
restore_incremental.sh : 完整增量还原时的处理方式
#!/bin/bash backup_dir=/srv/backup full_dir=$backup_dir/$1/full full_first=$backup_dir/$1/$2 full_second=$backup_dir/$1/$3 if [ -z $1 ];then echo '请输入全量文件夹的名称: 如:2018-01-01' exit fi if [ -z $2 ];then echo '请输入第一个增量还原文件夹, 如:1230' exit fi if [ -z $3 ];then echo '请输入第二个增量还原文件夹, 如:1930' exit fi echo $full_dir ./shell/preparing_incremental_full.sh $full_dir ./shell/preparing_incremental.sh $full_dir $full_first ./shell/preparing_incremental.sh $full_dir $full_second echo '数据已准备完成,请使restore.sh 进行还原'
--------------------------------------------------------------------
相关命令参考:
完整备份: innobackupex --user=root --defaults-file=/etc/my.cnf /srv/backup_db
完整备份还原:
准备数据: innobackupex --apply-log /srv/backup_db/2018-04-15_10-34-39
开始还原: innobackupex --copy-back /srv/backup_db/2018-04-15_10-34-39
还原完毕一定要对数据目录修正权限, 比如: chown mysql.mysql /srv/db/data -R
增量备份:
a. 先进行一次完整备份
b. 进行增量备份: innobackupex --user=root --defaults-file=/etc/my.cnf --incremental /srv/backup_db/incremental --incremental-basedir=/srv/backup_db/2018-04-15_10-34-39
增量备份还原:准备工作 preparing, 先准备完整备份, 再依次准备增量备份
a. 准备完整: innobackupex --apply-log --redo-only /srv/backup_db/2018-04-15_10-34-39 # 注意这里使用的 redo-only 即重放, 而不是undo 回滚, 如果使用了undo, 可能导致增量备中的commit失败
b. 准备第一次增量: innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only /srv/backup_db/2018-04-15_10-34-39 --incremental-dir=/srv/backup_db/incremental/2018-04-15_12-02-24
c. 准备第二次增量:
innobackupex --user=root --defaults-file=/etc/my.cnf --apply-log --redo-only /srv/backup_db/2018-04-15_10-34-39 --incremental-dir=/srv/backup_db/incremental/2018-04-15_12-13-17
注: 如果跳过第一次增量直接进行第二次增量, 则会报错, 如图:
开始还原:
innobackupex --copy-back /srv/backup_db/2018-04-15_10-34-39
注意:
a. 第一次增量备份, 使用的是最近的一次全备, 而紧接(第二次增量,第N次增量)着的增量备份的基础数据是来自 N-1 的增量备份结果
b. 有增量备份时, 准备(preparing)数据阶段, 使用 --redo-only
c. 每一次还原之后,必须再次全量备份, 因为增量备份还原之后的备份文件不能再使用 ,切记每次还原后,一定要马上再做一次全备
会报如下错:
xtrabackup_51 version 2.0.0 for MySQL server 5.1.59 unknown-linux-gnu (x86_64) (revision id: 417)
incremental backup from 0:2613398079 is enabled.
xtrabackup: cd to /srv/backup_db/2018-04-15_10-34-39
xtrabackup: This target seems to be already prepared.
xtrabackup: error: This incremental backup seems not to be proper for the target.
xtrabackup: Check 'to_lsn' of the target and 'from_lsn' of the incremental.
innobackupex: Error:
innobackupex: ibbackup failed at /usr/bin/innobackupex line 371.
因为:
一旦被还原, 你也可以在使用还原前先备份相关文件:
原有备份文件就被更改了:
D. 注意: 还原之后, 原有的binlog 将不存在, binlog 被初始化, 不过以此来做从库初始化时, 相当方便, 不至于出现热备时的报错
其它:
1. flush logs; # 刷新binlog
set sql_Log_bin = 0; # 暂时关闭binlog 记录, sql 还原时无需记录binlog
set sql_Log_bin = 1; # 开启binlog 记录
2. myisam 的存储引擎无法进行增量备份, 每一次都是完全备份, (myisam 适用于读多写少的数据库, 性能好)
----------------------------------------------------------------------------
innobackupex在后台线程不断追踪InnoDB的日志文件,然后复制InnoDB的数据文件。数据文件复制完成之后,日志的复制线程也会结束。这样就得到了不在同一时间点的数据副本和开始备份以后的事务日志。完成上面的步骤之后,就可以使用InnoDB崩溃恢复代码执行事务日志(redo log),以达到数据的一致性。
备份主要分为两个过程:
1. backup,备份阶段,追踪事务日志和复制数据文件(物理备份)。
2. preparing,重放事务日志,使所有的数据处于同一个时间点,达到一致性状态。提交已提交的数据, 回滚那些未提交的数据
逻辑备份:mysqldump
优点:
1、恢复简单,可以使用管道将他们输入到mysql
2、与存储引擎无关,因为是从MySQL服务器中提取数据而生成的,所以消除了底层数据存储的不同
3、有助于避免数据损坏。若磁盘驱动器有故障而要复制原始文件时,此时将得到一个损坏的备份
缺点:
1、 必须有数据库服务器完成逻辑工作,需要更多地cpu周期
2、 逻辑备份还原速度慢:需要MySQL加载和解释语句、转化存储格式、重建引擎
物理备份:xtrabackup
优点:
1. 基于文件的物理备份
2. 容易跨平台、跨操作系统和MySQL版本
3. 恢复起来会更快(不需要执行任何的mysql语句,不需要构建索引,innoDB表无需完全缓存到内存)
缺点:
1. 文件大
2. 不总是可以跨平台、操作系统和MySQL版本
3. 没有很好的备份指定数据库的情况, (该选项对innodb引擎表无效,还是会备份的)
----------------------------------------------------------------------
测试学习时遇到的问题及解决方法:
➜ /srv innobackupex -uroot /srv/backup_db
180415 09:37:27 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!".
180415 09:37:28 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/tmp/mysql.sock' as 'root' (using password: NO).
180415 09:37:28 version_check Connected to MySQL server
180415 09:37:28 version_check Executing a version check against the server...
180415 09:37:28 version_check Done.
180415 09:37:28 Connecting to MySQL server host: localhost, user: root, password: not set, port: 3306, socket: /tmp/mysql.sock
Error: Built-in InnoDB in MySQL 5.1 is not supported in this release. You can either use Percona XtraBackup 2.0, or upgrade to InnoDB plugin.
解决办法: 下载 Percona XtraBackup 2.0
-------------------
InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy
and Percona Inc 2009-2012. All Rights Reserved.
This software is published under
the GNU GENERAL PUBLIC LICENSE Version 2, June 1991.
180415 10:27:21 innobackupex: Starting mysql with options: --defaults-file='/etc/my.cnf' --user='root' --unbuffered --
180415 10:27:21 innobackupex: Connected to database with mysql child process (pid=88286)
180415 10:27:27 innobackupex: Connection to database server closed
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
innobackupex: Using mysql Ver 14.14 Distrib 5.1.73, for unknown-linux-gnu (x86_64) using readline 5.1
innobackupex: Using mysql server version Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
xtrabackup: Error: Please set parameter 'datadir'
innobackupex: fatal error: no 'mysqld' group in MySQL options
innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options
解决办法:
在my.cnf 里指定 datadir=/xx/xxx, 原因是文件找不到对应的数据存放目录
---------------------------------------------------------------------
以下 from: https://segmentfault.com/a/1190000005668516使用innobackupex进行增量备份
每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。
要实现第一次增量备份,可以使用下面的命令进行:
innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。
“准备”(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行“重放”。“重放”之后,所有的备份数据将合并到完全备份上。
(2)基于所有的备份将未提交的事务进行“回滚”。
于是,操作就变成了:
innobackupex --apply-log --redo-only BASE-DIR
接着执行:
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二个增量:
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;
备份过程:完全备份
mysql> create database week1;Query OK, 1 row affected (0.00 sec) mysql> use week1;Database changed mysql> create table test(name char(10) not null);Query OK, 0 rows affected (0.06 sec) mysql> insert into test (name) values ("kk01");Query OK, 1 row affected (0.01 sec) [root@bogon ~]# innobackupex --user=shiina --password=shiina /backup/ ... ... xtrabackup: The latest check point (for incremental): '2496292' xtrabackup: Stopping log copying thread. .160530 19:06:15 >> log scanned up to (2496301) 160530 19:06:15 Executing UNLOCK BINLOG160530 19:06:15 Executing UNLOCK TABLES160530 19:06:15 All tables unlocked160530 19:06:15 [00] Copying ib_buffer_pool to /backup/2016-05-30_19-06-10/ib_buffer_pool160530 19:06:15 [00] ...done160530 19:06:15 Backup created in directory '/backup/2016-05-30_19-06-10'160530 19:06:15 [00] Writing backup-my.cnf160530 19:06:15 [00] ...done160530 19:06:15 [00] Writing xtrabackup_info160530 19:06:15 [00] ...done xtrabackup: Transaction log of lsn (2496292) to (2496301) was copied.160530 19:06:15 completed OK!
第一次增量备份
mysql> insert into test (name) values ("kk02"); Query OK, 1 row affected (0.02 sec) [root@bogon ~]# innobackupex --user=shiina --password=shiina --incremental /backup/ --incremental-basedir=/backup/2016-05-30_07-04-31/... ... xtrabackup: Transaction log of lsn (2499531) to (2499540) was copied.160530 19:08:27 completed OK!
第二次增量备份
mysql> insert into test (name) values ("kk03"); Query OK, 1 row affected (0.02 sec) [root@bogon ~]# innobackupex --user=shiina --password=shiina --incremental /backup/ --incremental-basedir=/backup/2016-05-30_07-05-32/... ... xtrabackup: Transaction log of lsn (2499709) to (2499718) was copied.160530 19:09:40 completed OK!
查看增量备份记录文件:
[root@bogon backup]# cat 2016-05-30_19-06-10/xtrabackup_checkpointsbackup_type = full-preparedfrom_lsn = 0 #完全备份的起始为0to_lsn = 2496292last_lsn = 2496301compact = 0recover_binlog_info = 0[root@bogon backup]# cat 2016-05-30_19-08-21/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 2496292to_lsn = 2499531last_lsn = 2499540compact = 0recover_binlog_info = 0[root@bogon backup]# cat 2016-05-30_19-09-35/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 2499531to_lsn = 2499709last_lsn = 2499718compact = 0recover_binlog_info = 0
准备合并:
[root@bogon ~]# innobackupex --apply-log --redo-only /backup/2016-05-30_19-06-10/ ... xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 2496310 InnoDB: Number of pools: 1 160530 19:10:49 completed OK! [root@bogon ~]# innobackupex --apply-log --redo-only --incremental /backup/2016-05-30_19-06-10/ --incremental-dir=/backup/2016-05-30_19-08-21/ ... 160530 19:35:54 completed OK! [root@bogon ~]# innobackupex --apply-log --redo-only --incremental /backup/2016-05-30_19-06-10/ --incremental-dir=/backup/2016-05-30_19-09-35/ ... 160530 19:36:38 completed OK!
Percona XtraBackup 执行类似以下命令准备(prepare)备份时, 报以下错误
[root@bogon ~]# innobackupex --apply-log --redo-only --incremental /backup/2016-05-30_19-06-10/ --incremental-dir=/backup/2016-05-30_19-08-21/ ... ... InnoDB: File (unknown): 'read' returned OS error 114. Cannot continue operation InnoDB: Cannot continue operation.
停止mysql服务或重启服务器, 即可解决
再次查看备份记录文件:
[root@bogon backup]# cat 2016-05-30_19-06-10/xtrabackup_checkpointsbackup_type = log-appliedfrom_lsn = 0to_lsn = 2499709last_lsn = 2499718 #注意此时完全备份的 last_lsn 与第二次增量备份的 last_lsn 值相等, 说明增量备份的数据已经合并到了完全备份中compact = 0recover_binlog_info = 0[root@bogon backup]# cat 2016-05-30_19-08-21/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 2496292to_lsn = 2499531last_lsn = 2499540compact = 0recover_binlog_info = 0[root@bogon backup]# cat 2016-05-30_19-09-35/xtrabackup_checkpointsbackup_type = incrementalfrom_lsn = 2499531to_lsn = 2499709last_lsn = 2499718compact = 0recover_binlog_info = 0
恢复数据:
[root@bogon backup]# service mysqld stopShutting down MySQL (Percona Server).. SUCCESS! [root@bogon backup]# rm -rf /data/mysql/*[root@bogon backup]# innobackupex --copy-back /backup/2016-05-30_19-06-10/...160530 19:42:31 completed OK [root@bogon ~]# chown -R mysql:mysql /data/mysql/*[root@bogon ~]# service mysqld startStarting MySQL (Percona Server). SUCCESS!
测试数据完整:
[root@bogon ~]# mysql -h127.0.0.1 -pEnter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 3Server version: 5.7.11-4 Percona Server (GPL), Release 4, Revision 5c940e1 Copyright (c) 2009-2016 Percona LLC and/or its affiliates Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or itsaffiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> use week1; 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> select * from test; +------+| name | +------+| kk01 | | kk02 | | kk03 | +------+3 rows in set (0.00 sec)
补充: innobackup 常用参数说明(转载)
--defaults-file
同xtrabackup的--defaults-file参数
--apply-log
对xtrabackup的--prepare参数的封装
--copy-back
做数据恢复时将备份数据文件拷贝到MySQL服务器的datadir ;
--remote-host=HOSTNAME
通过ssh将备份数据存储到远程服务器上;
--stream=[tar]
备份文件输出格式, tar时使用tar4ibd , 该文件可在XtarBackup binary文件中获得.如果备份时有指定--stream=tar, 则tar4ibd文件所处目录一定要在$PATH中(因为使用的是tar4ibd去压缩, 在XtraBackup的binary包中可获得该文件)。
在 使用参数stream=tar备份的时候,你的xtrabackup_logfile可能会临时放在/tmp目录下,如果你备份的时候并发写入较大的话 xtrabackup_logfile可能会很大(5G+),很可能会撑满你的/tmp目录,可以通过参数--tmpdir指定目录来解决这个问题。
--tmpdir=DIRECTORY
当有指定--remote-host or --stream时, 事务日志临时存储的目录, 默认采用MySQL配置文件中所指定的临时目录tmpdir
--redo-only --apply-log组,
强制备份日志时只redo ,跳过rollback。这在做增量备份时非常必要。
--use-memory=#
该参数在prepare的时候使用,控制prepare时innodb实例使用的内存量
--throttle=IOS
同xtrabackup的--throttle参数
--sleep=是给ibbackup使用的,指定每备份1M数据,过程停止拷贝多少毫秒,也是为了在备份时尽量减小对正常业务的影响,具体可以查看ibbackup的手册 ;
--compress[=LEVEL]
对备份数据迚行压缩,仅支持ibbackup,xtrabackup还没有实现;
--include=REGEXP
对 xtrabackup参数--tables的封装,也支持ibbackup。备份包含的库表,例如:--include="test.",意思是要备份 test库中所有的表。如果需要全备份,则省略这个参数;如果需要备份test库下的2个表:test1和test2,则写 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test"。
--databases=LIST
列出需要备份的databases,如果没有指定该参数,所有包含MyISAM和InnoDB表的database都会被备份;
--uncompress
解压备份的数据文件,支持ibbackup,xtrabackup还没有实现该功能;
--slave-info,
备 份从库, 加上--slave-info备份目录下会多生成一个xtrabackup_slave_info 文件, 这里会保存主日志文件以及偏移, 文件内容类似于:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0
--socket=SOCKET
指定mysql.sock所在位置,以便备份进程登录mysql.
20190426记:
当你使用的是mysql5.7时,请不要使用xtrabackup2.0.0 进行备份, xtrabackup2.0.0不支持mysql5.7的, 但只是报错会误导人:
innobackupex: fatal error: no 'mysqld' group in MySQL options innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options
解决办法下载更新版本: https://www.percona.com/software/mysql-database/percona-xtrabackup
貌似mysql5.7 只有 xtrabackup2.4才支持: https://www.percona.com/doc/percona-xtrabackup/2.4/index.html
下载: https://www.percona.com/doc/percona-xtrabackup/2.4/installation/yum_repo.html
安装:
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm yum install percona-xtrabackup-24.x86_64