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

全量备份与恢复

全量备份

  1. 创建备份目录

    mkdir -p /data/backup/full
    
  2. 备份数据库

    /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               
    

恢复

恢复的过程:

​ 备份准备

​ 备份恢复

  1. 备份恢复

    一般情况下,在备份完成后,备份的数据不能直接用来恢复,因为在备份数据库过程中可能会包含尚未提交的事务或已经提交单未同步至数据文件的事务。因此,此时的数据文件处在不一致的状态。使用--apply-log 参数回滚未提交的事务和同步已经提交的事务到数据文件中,使数据处于一致状态。

    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --apply-log --user-memory=1G /data/backup/full/2018-09-26_17-01-20
    
  2. 关闭需要恢复的数据库,移除数据库原有的数据目录

    /etc/init.d/mysqld stop
    cd /data/mysql
    mv data data.old
    mkdir data
    
  3. 恢复备份数据

    /usr/bin/innobackupex --defaults-file=/etc/my.cnf --copy-back /data/backup/full/2018-09-26_17-01-20
    
  4. 修改目录权限启动数据库

    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

增量备份

  1. 第一次增量备份

    /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. 第二次备份

    在第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/
    
  3. 检查备份信息

    [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
    

恢复

  1. 在增量备份恢复时,多了一个参数"--redo-only "

    关闭数据库,将mysql的旧数据目录移除

    /etc/init.d/mysqld stop
    cd /data/mysql
    mv data data.old
    mkdir data
    
  2. 先准备(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! ,完成
    
  3. 准备第一次增量备份

    /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/
    
  4. 准备第二次增量备份,这是最后一个增量备份,所以在准备(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
    
  5. 恢复

    /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! ,表示完成
    
  6. 修改数据目录的属性,启动数据库,完成数据库恢复!

    chown mysql:mysql /data/mysql/data -R
    /etc/init.d/mysqld start