使用 xtrabackup 进行MySQL数据库物理备份

0. xtrabackup的功能

能实现的功能:

非阻塞备份innodb等事务引擎数据库、

备份myisam表会阻塞(需要锁)、

支持全备、增量备份、压缩备份、

快速增量备份(xtradb,原理类似于oracle:tracking 上次备份之后发生修改的page.)、

percona支持归档redo log的备份、

percona5.6+支持轻量级的backup-lock替代原来重量级的FTWRL,此时即使备份非事务引擎表也不会阻塞innodb的DML语句了、

支持加密备份、流备份(备份到远程机器)、并行本地备份、并行压缩、并行加密、并行应用备份期间产生的redo日志、并行copy-back

支持部分备份,只备份某个库,某个表

支持部分恢复

支持备份单个表分区

支持备份速度限制,指备份产生的IO速度的限制

支持point-in-time恢复

支持compat备份,也即使不备份索引数据,索引在prepare时--rebuild-indexs

支持备份buffer pool

支持单表export, import到其它库

支持 rsync 来缩短备份非事务引擎表的锁定时间

1. 物理备份需要的权限

使用innobackupex/xtrabackup进行备份,必须先配置好权限。需要的权限分为两部分:

1>系统层面的权限: 执行 innobackupex/xtrabackup 命令的Linux用户需要对mysql datadir和保存备份的目录有读写执行的权限,当然需要对这些命令要有执行权限;

2>mysqld层面的权限:innobackupex/xtrabackup --user=bkpuser 该用户bkpuser是指mysql.user表中的用户,不是系统层面的用户;需要一些基本的权限来执行备份过程:

最基本的权限:

create user ‘bkpuser‘@‘localhost‘ identified by ‘xxx‘;

grant reload,lock tables,replication client on *.* to ‘bkpuser‘@‘localhost‘;

这些权限仅仅只能完成:全备,增量备份,恢复;

一般如果需要部分备份,export表,import表,还需要:grant create tablespace on *.* to ‘bkpuser‘@‘localhost‘;

如果还需要对备份的过程中对锁进行一些优化,防止发生阻塞所有DML的情况,则还需要:

grant process,super on *.* to ‘bkpuser‘@‘localhost‘;

([email protected])[(none)]mysql>show grants for ‘bkpuser‘@‘localhost‘\G*************************** 1. row ***************************Grants for [email protected]: GRANT RELOAD, PROCESS, SUPER, LOCK TABLES, REPLICATION CLIENT, CREATE TABLESPACE ON *.* TO ‘bkpuser‘@‘localhost‘ IDENTIFIED BY PASSWORD ‘*BDC62F68AF8F0B8BFAE27FF782C5D8CE9F4BAFCB‘1 row in set (0.00 sec)

2. innobackupex 命令选项:

3. 使用 innobackupex 备份

3.1 全备

(这里系统层面使用的root用户备份,msyql层面使用的是bkpuser用户,root需要对datadir /var/lib/mysql, 备份目录/backup/xtrabackup/full有读写执行权限;bkpuser也需在mysql中有相关权限)

[[email protected] ~]# innobackupex  /backup/xtrabackup/full --user=bkpuser --password=digdeep

3.2 恢复

1> 第一步prepare(两次prepare,第一次应用备份期间产生的redo log,进行前滚和回滚:replay在redo log中已经提交的事务,rollback没有提交的事务)

注意这里的路径,必须要包括最后那个timestamp目录,不然会下面的错误:

[[email protected] ~]# innobackupex --apply-log /backup/xtrabackup/full/ --user=bkpuser --password=digdeep151106 10:41:48 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".innobackupex version 2.3.2 based on MySQL server 5.6.24 Linux (i686) (revision id: 306a2e0)
xtrabackup: cd to /backup/xtrabackup/full
xtrabackup: Error: cannot open ./xtrabackup_checkpoints
xtrabackup: error: xtrabackup_read_metadata()
xtrabackup: This target seems not to have correct metadata...2015-11-06 10:41:48 b771e6d0  InnoDB: Operating system error number 2 in a file operation.InnoDB: The error means the system cannot find the path specified.xtrabackup: Warning: cannot open ./xtrabackup_logfile. will try to find.2015-11-06 10:41:48 b771e6d0  InnoDB: Operating system error number 2 in a file operation.InnoDB: The error means the system cannot find the path specified.
  xtrabackup: Fatal error: cannot find ./xtrabackup_logfile.xtrabackup: Error: xtrabackup_init_temp_log() failed.

--apply-log会调用 xtrabackup --prepare两次,第一次前滚和回滚,第二次生成iblogfile[0|1]

[[email protected] ~]# innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 

3.3 恢复 --copy-back

直接将上面prepare好的所有文件,复制到mysqld的datadir目录(会读取my.cnf中的配置信息)。

--copy--back的注意事项:

1> datadir必须是空的,或者使用--force-non-empty-directories选项;

2> mysqld必须关闭,如果是--import部分恢复,则不能关闭;

3> --copy-back完成之后,需要修改datadir目录下的文件权限: chown -R mysql:mysql /var/lib/mysql

[[email protected] ~]# mysqladmin -uroot -pxxx shutdown (关闭mysqld)

[[email protected] ~]# cd /var/lib/mysql

[[email protected] mysql]# ls

aazj         ib_logfile1         mysql-bin.000003  mysql-bin.000008  mysql-bin.000013  performance_schema

auto.cnf     localhost-slow.log  mysql-bin.000004  mysql-bin.000009  mysql-bin.000014  t

general.log  mysql               mysql-bin.000005  mysql-bin.000010  mysql-bin.000015  xtrabackup_binlog_pos_innodb

ibdata1      mysql-bin.000001    mysql-bin.000006  mysql-bin.000011  mysql-bin.000016  xtrabackup_info

ib_logfile0  mysql-bin.000002    mysql-bin.000007  mysql-bin.000012  mysql-bin.index

[[email protected] mysql]# mv * /backup/xtrabackup/  (进行清空)

[[email protected] mysql]# ls

[[email protected] mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 

[[email protected] mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep 151106 11:07:38 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 2.3.2 based on MySQL server 5.6.24 Linux (i686) (revision id: 306a2e0)151106 11:07:38 [01] Copying ib_logfile0 to /var/lib/mysql/ib_logfile0151106 11:07:40 [01]        ...done151106 11:07:40 [01] Copying ib_logfile1 to /var/lib/mysql/ib_logfile1151106 11:07:41 [01]        ...done151106 11:07:41 [01] Copying ibdata1 to /var/lib/mysql/ibdata1151106 11:07:45 [01]        ...done151106 11:07:45 [01] Copying ./xtrabackup_info to /var/lib/mysql/xtrabackup_info151106 11:07:45 [01]        ...done151106 11:07:45 [01] Copying ./mysql/slave_master_info.ibd to /var/lib/mysql/mysql/slave_master_info.ibd151106 11:07:45 [01]        ...done[... ...]151106 11:07:57 [01] Copying ./t/db.opt to /var/lib/mysql/t/db.opt151106 11:07:57 [01]        ...done151106 11:07:57 [01] Copying ./t/t.frm to /var/lib/mysql/t/t.frm151106 11:07:57 [01]        ...done151106 11:07:57 completed OK![[email protected] mysql]# pwd/var/lib/mysql[[email protected] mysql]# lsaazj  ibdata1  ib_logfile0  ib_logfile1  mysql  performance_schema  t  xtrabackup_binlog_pos_innodb  xtrabackup_info

可以看到恢复之后,没有 binlog 文件盒index文件

启动myqld之前需要修改权限:

[[email protected] mysql]# ls -ltotal 176164drwx------ 2 root  root      4096 Nov  6 11:07 aazj-rw-rw---- 1 mysql mysql      543 Nov  6 11:13 general.log-rw-r----- 1 root  root  79691776 Nov  6 11:07 ibdata1-rw-r----- 1 root  root  50331648 Nov  6 11:07 ib_logfile0-rw-r----- 1 root  root  50331648 Nov  6 11:07 ib_logfile1-rw-rw---- 1 mysql mysql      543 Nov  6 11:13 localhost-slow.logdrwx------ 2 root  root      4096 Nov  6 11:07 mysql-rw-rw---- 1 mysql mysql        0 Nov  6 11:12 mysql-bin.indexdrwx------ 2 root  root      4096 Nov  6 11:07 performance_schemadrwx------ 2 root  root      4096 Nov  6 11:07 t-rw-r----- 1 root  root        24 Nov  6 11:07 xtrabackup_binlog_pos_innodb-rw-r----- 1 root  root       487 Nov  6 11:07 xtrabackup_info[[email protected] mysql]# chown -R mysql:mysql arb/mysql[[email protected] mysql]# ls -ltotal 176164drwx------ 2 mysql mysql     4096 Nov  6 11:07 aazj-rw-rw---- 1 mysql mysql      543 Nov  6 11:13 general.log-rw-r----- 1 mysql mysql 79691776 Nov  6 11:07 ibdata1-rw-r----- 1 mysql mysql 50331648 Nov  6 11:07 ib_logfile0-rw-r----- 1 mysql mysql 50331648 Nov  6 11:07 ib_logfile1-rw-rw---- 1 mysql mysql      543 Nov  6 11:13 localhost-slow.logdrwx------ 2 mysql mysql     4096 Nov  6 11:07 mysql-rw-rw---- 1 mysql mysql        0 Nov  6 11:12 mysql-bin.indexdrwx------ 2 mysql mysql     4096 Nov  6 11:07 performance_schemadrwx------ 2 mysql mysql     4096 Nov  6 11:07 t-rw-r----- 1 mysql mysql       24 Nov  6 11:07 xtrabackup_binlog_pos_innodb-rw-r----- 1 mysql mysql      487 Nov  6 11:07 xtrabackup_info

不然启动会在error.log中报错:

2015-11-06 11:13:55 3542 [ERROR] InnoDB: ./ibdata1 can‘t be opened in read-write mode

2015-11-06 11:13:55 3542 [ERROR] InnoDB: The system tablespace must be writable!

2015-11-06 11:13:55 3542 [ERROR] Plugin ‘InnoDB‘ init function returned error.

2015-11-06 11:13:55 3542 [ERROR] Plugin ‘InnoDB‘ registration as a STORAGE ENGINE failed.

2015-11-06 11:13:55 3542 [ERROR] Unknown/unsupported storage engine: InnoDB

2015-11-06 11:13:55 3542 [ERROR] Aborting

启动成功之后,datadir目录下各种文件都产生了:

[[email protected] mysql]# pwd

/var/lib/mysql

[[email protected]localhost mysql]# ls

aazj      general.log  ib_logfile0  localhost-slow.log  mysql-bin.000001  performance_schema  xtrabackup_binlog_pos_innodb

auto.cnf  ibdata1      ib_logfile1  mysql               mysql-bin.index   t                   xtrabackup_info

3.4 innobackupex 增量备份

增量备份之前,必须建立一个全备,第一次增量备份是在全备的基础之上,第二次增量备份是在第一次增量备份的基础之上的,一次类推

全备:

[[email protected] mysql]# innobackupex --user=bkpuser --password=digdeep /backup/xtrabackup/full

第二次增量备份:

[[email protected] mysql]# innobackupex --incremental /backup/xtrabackup/incr2 --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ --user=bkpuser --password=digdeep

3.5 innobackupex 增量备份的恢复

1> 应用全备的redo log:

[[email protected] ~]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep

2> 应用第一次增量备份的redo log:

[[email protected] ~]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/ --user=bkpuser --password=digdeep

3> 应用第二次(最后一次)增量备份的redo log,并且回滚进行崩溃恢复过程(没有--redo-only选项):

[[email protected] ~]# innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr2/2015-1  1-06_11-43-22/ --user=bkpuser --password=digdeep

[[email protected] ~]#

然后 --copy-back:

先关闭mysqld: mysqladmin -uroot -pxxx shutdown

[[email protected] mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep

修改权限:

chown -R mysql:mysql /var/lib/mysql

启动:mysqld_safe --user=mysql &

最后验证还原成功。

4. 部分备份

需要启用 innodb_file_per_table,5.6默认启用。另外在还原时,prepare之后,并不能直接 --copy-back,而只能一个表一个表的import来还原。

[[email protected] xtrabackup]# innobackupex --databases t /backup/xtrabackup/ --user=bkpuser --password=digdeep

数据库 t 中只有两个表:city, t 都被备份了。

下面我们来看如何还原:

4.1 部分prepare:

[[email protected] xtrabackup]# innobackupex --apply-log --export /backup/xtrabackup/2015-11-06_15-39-34/ --user=bkpuser --password=digdeep

4.2 下面我们将其 import 到一个新的数据库中:

([email protected])[t]mysql>create database partial;

([email protected])[t]mysql>use partial;

Database changed

([email protected])[partial]mysql>create table city like t.city;

([email protected])[partial]mysql>alter table partial.city discard tablespace;

然后将 city.exp 和 city.ibd 拷贝到 /var/lib/mysql/partial/ 目录下,并修改权限:

[[email protected] t]# cp city.exp city.ibd /var/lib/mysql/partial/

[[email protected] partial]# chown -R mysql:mysql /var/lib/mysql

然后

([email protected])[aazj]mysql>alter table partial.city import tablespace;

Query OK, 0 rows affected, 1 warning (0.11 sec)

([email protected])[aazj]mysql>select count(*) from partial.city;

+----------+

| count(*) |

+----------+

|     3285 |

+----------+

1 row in set (0.01 sec)

可以看到import 成功了。部分恢复成功。

低于t表也同样操作就行了。

([email protected])[partial]mysql>select count(*) from t;

+----------+

| count(*) |

+----------+

|       11 |

+----------+

1 row in set (0.00 sec)

可以看到,这种部分备份/恢复,操作起来比较麻烦,步骤比较多,还需要一个表一个表的处理。对少数表处理还可以,如果很多表,就不方面了。

4.3 部分备份恢复之备份/恢复一个或者多个数据库:

1)备份:

[[email protected] mysql]# innobackupex --database="aazj t mysql information_schema performance_schema"/backup/xtrabackup/partial/ --user=pkpuser --password=digdeep

注意这里 --database = "aazj t mysql performance_schema" 表示指定备份的数据库;还可以增加其他数据库,但是必须使用引号。

2)恢复 prepare:

[[email protected] partial]# innobackupex --apply-log /backup/xtrabackup/partial/2015-11-11_15-22-56 --user=bkpuser --password=digdeep

然后 关闭 mysqld, 清空 datadir :

[[email protected] mysql]# pwd
/var/lib/mysql

[[email protected] mysql]# rm -rf *

3)copy-back:

[[email protected] partial]# innobackupex --copy-back /backup/xtrabackup/partial/2015-11-11_15-22-56 --user=bkpuser --password=digdeep

然后修改权限:chown -R mysql:mysql /var/lib/mysql

然后启动mysqld,发现数据库 t 被恢复出来了。这里也可以一次备份多个数据库,但是一定要带上 mysql 数据库,不然恢复出来时,没有了数据字典,select读不出数据:

Restoring Partial Backups:

Restoring should be done by restoring individual tables in the partial backup to the server.
It can also be done by copying back the prepared backup to a clean datadir (in that case, make sure to include the mysql database). System database can be created with: $ sudo mysql_install_db --user=mysql (摘自xtrabackup文档)

部分恢复一般需要 export, 然后 import. 比较麻烦,但是我们也可以在一个空的 datadir 目录直接 --copy-back,这样的话,那么在备份的时候一定要带上mysql数据库,当然最好带上所有的系统数据库,不然的话,需要使用命令:mysql_install_db --user=mysql --basedir=... 重建那些系统数据库。这就是为什么在部分备份时带上了:mysql performance_schema(information_schema是系统视图,不需要带上,当然带上也是可以的)

4)如果你不想带上 performance_schema(mysql是一定要带上的),那么就必须使用: mysql_install_db --user=mysql --basedir=/usr/local/mysql 来重新生成系统数据库mysql 和 performance_schema。那么此时在 --copy-back之前,必须先删除刚才生成的 和 我们要 --copy-back 重复的文件:

[[email protected] mysql]# rm ibdata1 ib_logfile0 ib_logfile1

[[email protected] mysql]# rm -rf mysql

另外 --copy-back 时要带上参数: --force-non-empty-directories

innobackupex --copy-back --force-non-empty-directories /backup/xtrabackup/partial/2015-11-11_16-17-11/ --user=pkpuser --password=digdeep

因为 datadir 目录非空,所以需要带上该参数:

--force-non-empty-directories
                      This option, when specified, makes --copy-back or
                      --move-back transfer files to non-empty directories. Note
                      that no existing files will be overwritten. If
                      --copy-back or --nove-back has to copy a file from the
                      backup directory which already exists in the destination
                      directory, it will still fail with an error.
即使带上了该参数,如果还存在重名的文件,还是会报错,需要先删除datadir中的重名文件。

5. point-in-time 恢复

利用全备、增量备份最多只能恢复到全备完成时的那一刻,或者增量备份完成时的那一刻的数据。备份之后产生的数据,我们需要结合binlog,来恢复。我们可以从binlog中获得innobackupex最后一次备份完成时的position,它之后的所有的sql,应用完,这些sql,就能将数据库恢复到最新的状态,或者我们想要的某个时间的状态。

1> 先来一个全备:

[[email protected] xtrabackup]# innobackupex /backup/xtrabackup/full --user=bkpuser --password=digdeep

2> 再来一个增量:

将t表数据删除一行:delete from t where i=11;

[[email protected] xtrabackup]# innobackupex --incremental /backup/xtrabackup/incr1/ --incremental-basedir=/backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep

3> 再来一个增量:

将t表数据删除一行:delete from t where i=10;

[[email protected] xtrabackup]# innobackupex --incremental /backup/xtrabackup/incr2/ --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_16-31-13/ --user=bkpuser --password=digdeep

4> 备份完成之后,我们再来操作 t 表:

([email protected])[t]mysql>delete from t where i>3;

此时的状态:

([email protected])[t]mysql>show binary logs;

+------------------+-----------+

| Log_name         | File_size |

+------------------+-----------+

| mysql-bin.000001 |       927 |

| mysql-bin.000002 |       688 |

+------------------+-----------+

2 rows in set (0.00 sec)

([email protected])[t]mysql>show master status;

+------------------+----------+--------------+------------------+-------------------+

| File                       | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

+------------------+----------+--------------+------------------+-------------------+

| mysql-bin.000002 |      688 |              |                  |                   |

+------------------+----------+--------------+------------------+-------------------+

1 row in set (0.00 sec)

假设此时数据库表数据所在的磁盘发生故障,但是 binlog 文件是好的。那么此时,我们就可以使用上面的全备、增量备份、还有binlog文件一起来将数据库恢复到磁盘发生故障那一刻的最新状态来。

5> 首先从全备、增量备份得到最后一次备份完成时的数据:

1)应用全备的redo log:

[[email protected] xtrabackup]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep

2)应用第一次增量备份的redo log:

[[email protected] xtrabackup]# innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_16-26-08 --incremental-dir=/backup/xtr  abackup/incr1/2015-11-06_16-31-13/ --user=bkpuser --password=digdeep

3)应用第二次增量备份的 redo log,并且仅限回滚(去掉 --redo-only选项):

[[email protected] xtrabackup]# innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_16-26-08 --incremental-dir=/backup/xtrabackup/incr2/2015-11-06_16-33-57/ --user=bkpuser --password=digdeep

此时已经恢复到了最后一次备份完成时的状态了。

我们看一下最后一次增量备份时的 xtrabackup_binlog_info 文件信息:

[[email protected] xtrabackup]# cat incr2/2015-11-06_16-33-57/xtrabackup_binlog_info

mysql-bin.000002        482

可以看到对应的binlog postion为:mysql-bin.000002        482

而崩溃那一刻的binlog postion为: mysql-bin.000002      688

所以我们需要应用 mysql-bin.000002 文件的 482 到 688之间的sql:

4)先 --copy-back

[[email protected] mysql]# innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_16-26-08 --user=bkpuser --password=digdeep

修改权限:

[[email protected] ~]# chown -R mysql:mysql /var/lib/mysql

启动msyqld:  mysqld_safe --user=mysql &

然后验证,t 表的数据,应该有i<10 & i>3 的数据:

([email protected])[t]mysql>select * from t;

+------+

| i    |

+------+

|    1 |

|    2 |

|    3 |

|    4 |

|    5 |

|    6 |

|    7 |

|    8 |

|    9 |

+------+

9 rows in set (0.00 sec)

如我们所期待的结果一样。说明到此时,前面的操作完全是正确的。

5)应用 mysql-bin.000002 文件的 482 到 688之间的sql

[[email protected] mysql]#  mysqlbinlog /backup/xtrabackup/mysql-bin.000002 --start-position=482 > bin.sql

([email protected])[(none)]mysql>source /var/lib/mysql/bin.sql

然后在查看 t 表数据:

([email protected])[t]mysql>select * from t;

+------+

| i    |

+------+

|    1 |

|    2 |

|    3 |

+------+

3 rows in set (0.00 sec)

一切完美完成,数据库被我们回复到了最新的状态。

备份原理:

1)innobackupex 是perl写的脚本,它调用xtrabackup来备份innodb数据库。而xtrabackup是C语言写的程序,它调用了innodb的函数库和mysql客户端的函数库。innodb函数库提供了向数据文件应用的redo log的功能,而mysql客户端函数库提供了解析命令行参数的功能。innobackupex备份innodb数据库的功能,都是通过调用 xtrabackup --backup和xtrabackup --prepare来完成的。我们没有必要直接使用xtrabackup来备份,通过innobackupex更方便。xtrabakup 通过跳转到datadir目录,然后通过两个线程来完成备份过程:

1> log-copy thread: 备份开始时,该后台线程一直监控redo log(每秒check一次redo log),将redo log的修改复制到备份之后的文件 xtrabackup_logfile 中。如果redo log生成极快时,有可能log-copy线程跟不上redo log的产生速度,那么在redo log文件切换进行覆盖时,xtrabakcup会报错。

2> data-file-copy thread: 前后有一个复制data file的线程,注意这里并不是简单的复制,而是调用了innodb函数库,像innodb数据库那样打开数据文件,进行读取,然后每次复制一个page,然后对page进行验证,如果验证错误,会最多重复十次。

当数据文件复制完成时,xtrabackup 停止log-copy 线程,并建立一个文件 xtrabackup_checkpoints记录备份的类型,开始时的lsn和结束时的lsn等信息。

而备份生成的 xtrabackup_binlog_info 文件则含义备份完成时对应的binlog的position信息,类似于:mysql-bin.000002        120

在备份开始时记录下LSN,然后一个线程复制数据文件,一个线程监控redo log,复制在备份过程中新产生的redo log。虽然我们的到的数据文件显然不是一致性的,但是利用innodb的crash-recovery功能,应用备份过程中产生的redo log文件,就能得到备份完成时那一刻对应的一致性的数据。

注意复制数据文件分成了两个过程:

一个是复制innodb事务引擎的数据文件,是不需要持有锁的;另一个是复制非事务引擎的数据文件和table的定义文件.frm,复制这些文件时,是需要先通过FTWRL,然后在进行复制的,所以会导致整个数据库被阻塞。

增量备份时,是通过对表进行全扫描,比较LSN,如果该page的LSN大于上一次别分时的LSN,那么就将该page复制到table_name.ibd.delta文件中。回复时.delta会和redo log应用到全备是的数据文件中。

增量备份在恢复时,除了最后一次增量备份文件之外,其它的增量备份在应用时,只能前滚,不能执行回滚操作,因为没有提交的事务,可能在下一个增量备份中进行了提交,如果你在上一个增量备份时回滚了,那么下一个增量备份应用时,显然就报错了,因为他无法提交事务,该事务以及被回滚了。

 总结:

1)权限:

备份需要两个层面的权限,Linux层面的权限,mysql层面的权限。

2)全备和恢复

全备:innobackupex  /backup/xtrabackup/full --user=bkpuser --password=digdeep

应用日志进行prepare: innobackupex --apply-log /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep

关闭mysqld:

copy-back: innobackupex --copy-back /backup/xtrabackup/full/2015-11-05_22-38-55/ --user=bkpuser --password=digdeep

修改权限:chown -R mysql:mysql /var/lib/mysql

3)增量备份和恢复:

全备:

innobackupex --user=bkpuser --password=digdeep /backup/xtrabackup/full

第一次增量备份:

innobackupex --incremental /backup/xtrabackup/incr1/ --incremental-basedir=/backup/xtrabackup/full/2015-11-06_11-29-51/

--user=bkpuser --password=digdeep

第二次增量备份:

innobackupex --incremental /backup/xtrabackup/incr2 --incremental-basedir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/

--user=bkpuser --password=digdeep

恢复:

应用全备redo log:

innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep

应用第一次增量备份的redo log:

innobackupex --apply-log --redo-only /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr1/2015-11-06_11-33-16/

--user=bkpuser --password=digdeep

应用第二次(最后一次)增量备份的redo log:

innobackupex --apply-log /backup/xtrabackup/full/2015-11-06_11-29-51/ --incremental-dir=/backup/xtrabackup/incr2/2015-11-06_11-43-22/

--user=bkpuser --password=digdeep

关闭mysqld,

innobackupex --copy-back /backup/xtrabackup/full/2015-11-06_11-29-51/ --user=bkpuser --password=digdeep

4)部分备份

innobackupex --databases t /backup/xtrabackup/ --user=bkpuser --password=digdeep

innobackupex --apply-log --export /backup/xtrabackup/2015-11-06_15-39-34/ --user=bkpuser --password=digdeep

新建表结构:create table city like t.city;

alter table partial.city discard tablespace;

然后将 city.exp 和 city.ibd 拷贝到 /var/lib/mysql/partial/ 目录下,并修改权限:chown -R mysql:mysql /var/lib/mysql

alter table partial.city import tablespace;

5)point-in-time 恢复

在--copy-back之后,引用binlog文件

mysqlbinlog /backup/xtrabackup/mysql-bin.000002 --start-position=482 > bin.sql

([email protected])[(none)]mysql>source bin.sql

6) innobackupex 选项优化/最佳实践

--ftwrl-wait-timeout=60 防止发生阻塞

--rsync 减少FTWRL时间 缩短备份非事务引擎表的锁定时间

--parallel=4  开并行

--use-memory=4G crash recovery 期间使用的内存

时间: 2024-11-08 19:29:50

使用 xtrabackup 进行MySQL数据库物理备份的相关文章

利用Xtrabackup进行mysql数据库的备份

利用Xtrabackup来实现数据库的备份 Xtrabackup是有percona公司开发的一款开源备份工具,它与ibbackup这个备份工具不同的是.ibbackup是一个收费的备份工具,而且在其备份性能上,ibbackup不如Xtrabackup.ibbackup和Xtrabackup都对Innodb存储引擎支持在线物理完全备份和在线物理增量备份,对MyISAM存储引擎来说,只支持温备份而已.更对关于两者的特性比较,请参考http://www.percona.com/software/per

xtrabackup进行MySQL数据库备份/还原

http://hongge.blog.51cto.com/ 使用xtrabackup进行MySQL数据库备份 前面介绍mysqldump备份方式是采用逻辑备份,其最大的缺陷就是备份和恢复速度都慢,对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了. 这时就需要一种好用又高效的工具,xtrabackup就是其中一款,号称免费版的InnoDB HotBackup. Xtrabackup实现是物理备份,而且是物理热备 目前主流的有两个工

使用xtrabackup进行MySQL数据库备份

使用xtrabackup进行MySQL数据库备份 一.简介 MySQL自带的mysqldump备份方式是采用逻辑备份,但是它最大的缺陷就是备份和恢复速度慢对于一个小于50G的数据库而言,这个速度还是能接受的,但如果数据库非常大,那再使用mysqldump备份就不太适合了. 目前主流的有两个工具可以实现物理热备:ibbackup和xtrabackup:ibbackup是商业软件,需要授权,非常昂贵.而xtrabackup功能比ibbackup还要强大,但却是开源的.号称免费版的InnoDB Hot

脚本-每3天对数据库目录/var/lib/mysql做物理备份 把数据备份到系统/opt/dbbak目录

每3天对数据库目录/var/lib/mysql做物理备份 把数据备份到系统/opt/dbbak目录 #!/bin/bash DAY=`date+%Y-%m-%d` SIZE=`du-sh /var/lib/mysql` cd/opt/dbbak  2> /dev/null  || mkdir /opt/dbbak echo"Date: $DAY" > /opt/dbbak/dbinfo.txt echo"Total Database Size: $SIZE&quo

MySQL逻辑物理备份测试

MySQL逻辑物理备份测试 目录 逻辑备份mysqldump普通备份mysqlpump并行备份mysqlpump压缩并行备份mydumper并行备份mydumper并行压缩备份小结物理备份xtrabackup压缩备份xtrabackup并行压缩备份innobackupex并行压缩备份innobackupex xbstream流式备份innobackupex xbstream流式压缩并行备份innobackupex tar流式备份innobackupex tar流式压缩备份innobackupex

MySQL数据库-完全备份及恢复

MySQL数据库-完全备份及恢复 数据库备份的分类 物理角度: 冷备份:也称脱机备份,特点:关掉数据库再备份 热备份:也称联机备份,特点:开启数据库再备份 温备份:数据库只有可读权限的状态下备份 逻辑角度: 对数据库的对象的备份,例如数据表,及数据表中的一些sql语句等 备份策略角度: 完全备份:每次对数据进行整体的备份 差异备份:在第一次完整备份a数据后,以后的每次的备份是a+b,b就是针对于a数据发生变化的数据,称之为'差异数据'.缺点:b的数据内存会越来越大b+=b,导致数据恢复缓慢.恢复

Windows Server服务器端MySQL数据库自动备份

1.给root账户授权所有sql权限 grant all privileges on *.* to [email protected]"%" identified by "."; flush privileges; 2.建立bat批处理文件 @echo off set path=%path%;D:\Program Files\MySQL\MySQL Server 5.5\bin set y=%date:~0,4% set m=%date:~5,2% set d=%d

mysqldump常用于MySQL数据库逻辑备份

mysqldump常用于MySQL数据库逻辑备份. 1.各种用法说明 A. 最简单的用法: mysqldump -uroot -pPassword [database name] > [dump file] 上述命令将指定数据库备份到某dump文件(转储文件)中,比如: mysqldump -uroot -p123 test > test.dump 生成的test.dump文件中包含建表语句(生成数据库结构哦)和插入数据的insert语句. B. --opt 如果加上--opt参数则生成的du

[知了堂学习笔记]_Java代码实现MySQL数据库的备份与还原

通常在MySQL数据库的备份和恢复的时候,多是采用在cmd中执行mysql命令来实现. 例如: mysqldump -h127.0.0.1 -uroot -ppass test > d:/test.sql ---备份test数据库到 D 盘 mysql -h127.0.0.1 -uroot -ppass test< test.sql ---将D备份的数据库脚本,恢复到数据库中 更多命令参看:http://www.cnblogs.com/xcxc/archive/2013/01/30/28828