XtraBackup
Percona XtraBackup是一款基于MySQL的服务器的开源热备份实用程序,在备份过程中不会锁定数据库。它可以备份来自MySQL5.1,5.5,5.6和5.7服务器上的InnoDB,XtraDB和MyISAM表的数据,以及带有XtraDB的Percona服务器。
官网地址:https://www.percona.com
特点:
- 在不暂停数据库的情况下创建热的InnoDB备份
- 进行MySQL的增量备份
- 将压缩的MySQL备份传输到另一台服务器
- 在MySQL服务器之间移动表格
- 轻松创建新的MySQL复制从站
- 在不增加服务器负载的情况下备份MySQL
安装
下载安装包
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.12/binary/redhat/6/x86_64/Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar
解压,里面有三个rpm包,yum安装即可
tar xf Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar
percona-xtrabackup-test-24-2.4.12-1.el6.x86_64.rpm
percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm
percona-xtrabackup-24-debuginfo-2.4.12-1.el6.x86_64.rpm
全量备份与恢复
全量备份
-
创建备份目录
mkdir -p /data/backup/full
-
备份数据库
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 /data/backup/full # 备份过程就是一个物理拷贝,过程如下: xtrabackup: recognized server arguments: --datadir=/data/mysql/data --open_files_limit=10240 --server-id=1 --log_bin=/data/mysql/logs/binlog/mysql-bin --innodb_data_file_path=ibdata1:1024M:autoextend --innodb_file_io_threads=4 --innodb_flush_method=O_DIRECT --innodb_flush_log_at_trx_commit=0 --innodb_log_buffer_size=16M --innodb_log_file_size=512M --innodb_log_files_in_group=2 --innodb_max_dirty_pages_pct=75 --innodb_file_per_table=1 xtrabackup: recognized client arguments: --datadir=/data/mysql/data --open_files_limit=10240 --server-id=1 --log_bin=/data/mysql/logs/binlog/mysql-bin --innodb_data_file_path=ibdata1:1024M:autoextend --innodb_file_io_threads=4 --innodb_flush_method=O_DIRECT --innodb_flush_log_at_trx_commit=0 --innodb_log_buffer_size=16M --innodb_log_file_size=512M --innodb_log_files_in_group=2 --innodb_max_dirty_pages_pct=75 --innodb_file_per_table=1 180928 14:23:33 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!". # ...... # 数据文件的复制过程 # ...... 180928 14:24:00 Executing UNLOCK TABLES 180928 14:24:00 All tables unlocked 180928 14:24:00 Backup created in directory '/data/backup/full/2018-09-28_14-23-33/' MySQL binlog position: filename 'mysql-bin.000003', position '601' 180928 14:24:00 [00] Writing /data/backup/full/2018-09-28_14-23-33/backup-my.cnf 180928 14:24:00 [00] ...done 180928 14:24:00 [00] Writing /data/backup/full/2018-09-28_14-23-33/xtrabackup_info 180928 14:24:00 [00] ...done xtrabackup: Transaction log of lsn (500339148) to (500339148) was copied. 180928 14:24:01 completed OK! # 出现 completed OK! 表示备份完成。
将会在/data/backup/full目录中创建一个一日期名称的目录,数据就放在改目录中
ls /data/backup/full/2018-09-26_17-01-20/ backup-my.cnf performance_schema xtrabackup_binlog_info xtrabackup_info ibdata1 mysql
恢复
恢复的过程:
备份准备
备份恢复
-
备份恢复
一般情况下,在备份完成后,备份的数据不能直接用来恢复,因为在备份数据库过程中可能会包含尚未提交的事务或已经提交单未同步至数据文件的事务。因此,此时的数据文件处在不一致的状态。使用--apply-log 参数回滚未提交的事务和同步已经提交的事务到数据文件中,使数据处于一致状态。
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log --user-memory=1G /data/backup/full/2018-09-26_17-01-20
-
关闭需要恢复的数据库,移除数据库原有的数据目录
/etc/init.d/mysqld stop cd /data/mysql mv data data.old mkdir data
-
恢复备份数据
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2018-09-26_17-01-20
-
修改目录权限启动数据库
chown -R mysql:mysql /data/mysql/data /etc/init.d/mysqld start
增量备份与恢复
增量备份需要在全备的基础上进行
注意点:
对于增量备份的准备(prepare)阶段,有两个需要注意的地方:提交的事务需要replayed,未提交的事务需要rollback。如果在准备(prepare)阶段replay了已经提交的事务以及回滚了未提交的事务,则后续的增量备份无法添加到当前全备。因此在准备(preare)阶段全备需要使用**--redo-only参数。对于存在多次增量备份的情况,仅仅只有最后一个增量不需要使用--redo-only**参数。
全备
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 /data/backup/full
增量备份
-
第一次增量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 --incremental /data/backup/incr/ --incremental-basedir /data/backup/full/2018-09-28_14-23-33/ # 备份过程 ...... 180928 14:42:59 Executing UNLOCK TABLES 180928 14:42:59 All tables unlocked 180928 14:42:59 Backup created in directory '/data/backup/incr/2018-09-28_14-42-37/' MySQL binlog position: filename 'mysql-bin.000003', position '1002' 180928 14:42:59 [00] Writing /data/backup/incr/2018-09-28_14-42-37/backup-my.cnf 180928 14:42:59 [00] ...done 180928 14:42:59 [00] Writing /data/backup/incr/2018-09-28_14-42-37/xtrabackup_info 180928 14:42:59 [00] ...done xtrabackup: Transaction log of lsn (500344294) to (500344294) was copied. 180928 14:42:59 completed OK! # 当出现 completed OK! 表示增量备份完成。
-
第二次备份
在第2次做增量备份的时候 --incremental-basedir 指向全量备份,则第一次增量备份中的数据会被第2次包含,只需要还原一次就可以恢复;--incremental-basedir指向上一次增量备份,则需要依次恢复所有的增量备份。
/usr/bin/innobackupex --defaults-file=/etc/my.cnf -uroot -p123456 --incremental /data/backup/incr/ --incremental-basedir /data/backup/incr/2018-09-28_14-42-37/
-
检查备份信息
[root@backup]# cat /data/backup/full/2018-09-28_14-23-33/xtrabackup_checkpoints backup_type = full-backuped from_lsn = 0 to_lsn = 500339148 # 全备的to_lsn last_lsn = 500339148 compact = 0 recover_binlog_info = 0 [root@backup]# cat /data/backup/incr/2018-09-28_14-42-37/xtrabackup_checkpoints backup_type = incremental from_lsn = 500339148 # 对应全备的to_lsn to_lsn = 500344294 last_lsn = 500344294 compact = 0 recover_binlog_info = 0 [root@backup]# cat /data/backup/incr/2018-09-28_14-57-30/xtrabackup_checkpoints backup_type = incremental from_lsn = 500344294 # 对应第一次增量的to_lsn to_lsn = 500349256 last_lsn = 500349256 compact = 0 recover_binlog_info = 0
恢复
-
在增量备份恢复时,多了一个参数"--redo-only "
关闭数据库,将mysql的旧数据目录移除
/etc/init.d/mysqld stop cd /data/mysql mv data data.old mkdir data
-
先准备(prepare)全备
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --user-memory=1G /data/backup/full/2018-09-28_14-23-33/ # 准备过程 ...... xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 500339157 InnoDB: Number of pools: 1 180928 16:07:42 completed OK! # 出现 completed OK! ,完成
-
准备第一次增量备份
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --user-memory=1G /data/backup/full/2018-09-28_14-23-33/ --incremental-dir=/data/backup/incr/2018-09-28_14-42-37/
-
准备第二次增量备份,这是最后一个增量备份,所以在准备(preare)时,不需要使用**--redo-only**参数
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log --redo-only --user-memory=1G /data/backup/full/2018-09-28_14-23-33/ --incremental-dir=/data/backup/incr/2018-09-28_14-57-30/
此时查看全备的to_lsn已经指到了第二次增量备份是的to_lsn
[root@node-3 data]# cat /data/backup/full/2018-09-28_14-23-33/xtrabackup_checkpoints backup_type = log-applied from_lsn = 0 to_lsn = 500349256 # 准备完成后的to_lsn last_lsn = 500349256 compact = 0 recover_binlog_info = 0
-
恢复
/usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2018-09-28_14-23-33/ # 恢复过程 ...... 180928 16:46:26 [01] Copying ./mysql/user.frm to /data/mysql/data/mysql/user.frm 180928 16:46:26 [01] ...done 180928 16:46:26 [01] Copying ./mysql/proc.MYD to /data/mysql/data/mysql/proc.MYD 180928 16:46:26 [01] ...done 180928 16:46:26 [01] Copying ./xtrabackup_binlog_pos_innodb to /data/mysql/data/xtrabackup_binlog_pos_innodb 180928 16:46:26 [01] ...done 180928 16:46:26 completed OK! # 当出现 completed OK! ,表示完成
-
修改数据目录的属性,启动数据库,完成数据库恢复!
chown mysql:mysql /data/mysql/data -R /etc/init.d/mysqld start