美文网首页
MySQL 物理备份: Innobackupex 和 xtrab

MySQL 物理备份: Innobackupex 和 xtrab

作者: 你笑的那么美丶 | 来源:发表于2019-03-09 14:59 被阅读0次

    MySQL 物理备份: Innobackupex 和 xtrabackup(热备)

    Percona XtraBackup是一款基于MySQL的热备份的开源实用程序,它可以备份5.1到5.7版本上InnoDB,XtraDB,MyISAM存储引擎的表, Xtrabackup有两个主要的工具:xtrabackup、innobackupex 。

    第一种安装方式: 使用 YUM 方式安装

    地址
    https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

    1. 确保安装 EPEL 源
    yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
    
    1. 安装 libev
      为了成功安装Percona XtraBackup libev包需要先安装。
    yum  install -y libev
    
    1. 安装Percona存储库
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    
    1. 测试存储库的可用性
    shell> yum list | grep percona
    

    应该输出如下信息

    ...
    percona-xtrabackup-20.x86_64               2.0.8-587.rhel5             percona-release-x86_64
    percona-xtrabackup-20-debuginfo.x86_64     2.0.8-587.rhel5             percona-release-x86_64
    percona-xtrabackup-20-test.x86_64          2.0.8-587.rhel5             percona-release-x86_64
    percona-xtrabackup-21.x86_64               2.1.9-746.rhel5             percona-release-x86_64
    percona-xtrabackup-21-debuginfo.x86_64     2.1.9-746.rhel5             percona-release-x86_64
    percona-xtrabackup-22.x86_64               2.2.13-1.el5                percona-release-x86_64
    percona-xtrabackup-22-debuginfo.x86_64     2.2.13-1.el5                percona-release-x86_64
    percona-xtrabackup-debuginfo.x86_64        2.3.5-1.el5                 percona-release-x86_64
    percona-xtrabackup-test.x86_64             2.3.5-1.el5                 percona-release-x86_64
    percona-xtrabackup-test-21.x86_64          2.1.9-746.rhel5             percona-release-x86_64
    percona-xtrabackup-test-22.x86_64          2.2.13-1.el5                percona-release-x86_64
    ...
    
    1. 安装软件
    shell> yum install percona-xtrabackup-24
    
    1. 验证安装
    [root@localhost ~]# rpm -qa | grep percona
    percona-xtrabackup-24-2.4.13-1.el7.x86_64
    percona-release-1.0-8.noarch
    [root@localhost ~]# rpm -ql percona-xtrabackup-24
    /usr/bin/innobackupex    
    /usr/bin/xbcloud
    /usr/bin/xbcloud_osenv
    /usr/bin/xbcrypt
    /usr/bin/xbstream
    /usr/bin/xtrabackup
    /usr/lib64/xtrabackup/plugin/keyring_file.so
    /usr/lib64/xtrabackup/plugin/keyring_vault.so
    /usr/share/doc/percona-xtrabackup-24-2.4.13
    /usr/share/doc/percona-xtrabackup-24-2.4.13/COPYING
    /usr/share/man/man1/innobackupex.1.gz
    /usr/share/man/man1/xbcrypt.1.gz
    /usr/share/man/man1/xbstream.1.gz
    /usr/share/man/man1/xtrabackup.1.gz
    

    主要/usr/bin/innobackupex

    第二种安装方式:下载对应版本的软件包,在本地安装

    点击 下载页面,选择对应版本后进行下载

    image.png
    示例:
    下载 2.4.4版本
    wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
    

    安装

    yum localinstall percona-xtrabackup-24-2.4.4-1.el7.x86_64.rpm
    

    注意:像这样手动安装软件包时,您需要确保解决所有依赖项并自行安装缺少的软件包。

    卸载

    yum remove percona-xtrabackup
    

    80版本

    注意:
    这个版本只支持 MySQL8.0的数据进行备份,不支持 MySQL8.0版本之前的数据进行备份。

    # 安装仓库文件
    yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    
    # 启用仓库
    percona-release enable-only tools release
    
    #安装软件
    yum install percona-xtrabackup-80
    

    报错解决

    来自 file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona 的无效 GPG 密钥:No key found in given key data
    

    或者

    源 "CentOS 7 - Percona" 的 GPG 密钥已安装,但是不适用于此软件包。请检查
    源的公钥 URL 是否配置正确。
    
    
     失败的软件包是:Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64
     GPG  密钥配置为:file:///etc/pki/rpm-gpg/RPM-GPG-KEY-percona
    

    修改仓库文件 percona-release.repo 不使用密钥认证

    image.png

    再次安装会看到如下报错信息

    Transaction check error:
      file /etc/my.cnf from install of Percona-Server-shared-56-5.6.43-rel84.3.el7.x86_64 conflicts with file from package mysql-community-server-5.7.25-1.el7.x86_64
    
    错误概要
    ------------------------------------------------------------------------
    

    需要安装如下软件

    yum install -y   mysql-community-libs-compat
    

    注意:
    这个软件的源是 mysql57-community

    [mysql57-community]
    name=MySQL 5.7 Community Server
    baseurl=http://repo.mysql.com/yum/mysql-5.7-community/el/7/$basearch/
    enabled=1
    gpgcheck=1
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
    

    /etc/pki/rpm-gpg/RPM-GPG-KEY-mysql 文件内容如下:
    点我传送门

    1. 再执行安装命令
    yum install percona-xtrabackup-24
    

    日常操作

    条件:

    在 MySQL 服务器本地安装 Xtrbackup 并执行相关操作。
    给执行备份到用户进行相应的授权。

    配置选项

    配置选项可以在sh命令行中直接使用,也可以在 my.cnf 文件中配置

    # my.cnf 文件的配置
    [xtrabackup]
    target_dir = /backups/mysql/   # 备份数据放置的位置
    

    假如是编译安装的mysql,需要在配置文件my.cnf 中指定 socket文件的路径。

    [xtrabackup]
    socket = /tmp/mysql.sock
    

    1. 全备

    下面的命令均假设没有在my.cnf 中配置任何关于 xtrabackup 的选项
    要执行备份需要指定 备份数据放置的位置,就是目录,假如目录不存在,则会自动创建;==注意这个目录不会被递归创建,仅仅会创建最后一级目录;==假如存在,就会直接开始备份,并且不会覆盖原来的数据。

    1. 开始备份
    shell> xtrabackup --backup --user=root --password='123'  --target-dir=/backups/full
    
    1. 查看备份文件
    [root@mysql-master ~]# ls -lh /backups/full
    总用量 13M
    -rw-r----- 1 root root  487 8月  18 09:44 backup-my.cnf
    -rw-r----- 1 root root  293 8月  18 09:44 ib_buffer_pool
    -rw-r----- 1 root root  12M 8月  18 09:44 ibdata1
    drwxr-x--- 2 root root 4.0K 8月  18 09:44 mysql
    drwxr-x--- 2 root root   88 8月  18 09:44 one_db
    drwxr-x--- 2 root root 8.0K 8月  18 09:44 performance_schema
    drwxr-x--- 2 root root   58 8月  18 09:44 shark_db
    drwxr-x--- 2 root root 8.0K 8月  18 09:44 sys
    -rw-r----- 1 root root  115 8月  18 09:44 xtrabackup_checkpoints
    -rw-r----- 1 root root  446 8月  18 09:44 xtrabackup_info
    -rw-r----- 1 root root 2.5K 8月  18 09:44 xtrabackup_logfile
    

    进入目录后,可以看到一些目录,这些目录与我们数据库的名称相同,没错,这些就是各个数据库的数据文件备份目录。
    还有一个innodb的共享表空间文件,ibdata1,注意,如果想要使用xtrabackup备份众多数据库中的某一个,那么必须保证在创建这个数据库时,已经开启了innodb_file_per_table参数,否则将无法单独备份数据库服务器中的某一个数据库。
    除了刚才描述的这些数据文件,xtrabackup还为我们生成了一些文件,我们来看看这些文件都有什么用(不同版本的xtrabackup生成的文件可能不同)。

    • backup-my.cnf
      此文件中包含了my.cnf中的一些设置信息,但是,并不是my.cnf中的所有信息都会包含在此文件中,此文件中只包含了备份时需要的信息。
    • xtrabackup_binlog_info
      需要开启二进制日志
      此文件中记录了备份开始时二进制日志文件的"位置(position)"
    • xtrabackup_checkpoints
      此文件中记录此次备份属于那种类型的备份,是全量还是增量,备份时起始的LSN号码,结束的LSN号码等信息。
    • xtrabackup_info
      本次备份的概要信息,此文件中的信息还是比较全面的。
    • xtrabackup_logfile
      记录了备份过程中的日志,在对数据进行prepare时需要通过日志将数据还原成一致的可用的数据。
    1. 准备恢复的数据

    使用 xtrabackup --backup 选项进行备份后,并不能直接使用,首先需要准备它以便还原它。
    如果您尝试使用这些数据文件启动InnoDB,它将检测损坏并自行崩溃,以防止您在损坏的数据上运行。
    因为备份出的数据是不一致的,我们需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为prepare,直译过来就是"准备"。
    xtrabackup --prepare 步骤使文件在一个时刻完全一致

    shell> xtrabackup --prepare --target-dir=/data/backups/full
    

    如果你要备份的数据量巨大,那么备份时长会变长,期间备份的事务日志容量有可能会很大。那么,我们可以使用--use-memory选项,加速准备工作的完成,在不指定内存大小的情况下,准备工作默认会占用100MB的内存,如果服务器有一定的空闲内存,那么我们可以让xtrabackup使用指定大小的内存完成准备工作,以提升准备工作完成的速度,示例语句如下。

    shell> xtrabackup --prepare --use-memory=512M --target-dir=/backups/full
    

    ==准备备份时不建议中断xtrabackup进程,因为这可能会导致数据文件损坏,备份将无法使用。如果准备过程中断,则无法保证备份有效性。==

    准备备份数据完成后,应该会看到如下信息。

    InnoDB: Starting shutdown...
    InnoDB: Shutdown completed; log sequence number 13596200
    180818 10:09:19 completed OK!
    
    恢复

    xtrabackup 在执行copyback时会读取数据库的my.cnf中的配置,但是如果my.cnf中没有配置datadir,那么--datadir选项必须存在,而且,datadir目录必须为空目录,其中不能存在数据,否则在执行上述命令时会报错,--copy-back选项对应的目录就是我们准备好的可用数据的目录。
    为了能够正常的恢复数据,我们先确定数据库服务已经停止了,而且对应的数据目录中不存在数据,然后进行数据还原工作,删除数据目录中的文件与日志。

    • 停止数据库的服务
    • 清理环境
    • 修改权限
    • 启动数据库
    shell> systemctl stop mysqld.service
    
    shell> rm -rf /var/lib/mysql/*
    
    shell> xtrabackup --copy-back --datadir=/var/lib/mysql --target-dir=/backups/full
    
    # 下面为完成后的输出结果
    180818 10:59:25 [01]        ...done
    180818 10:59:25 completed OK!
    shell> chown  mysql.mysql -R /var/lib/mysql
    

    或者使用 rsync 命令

    shell> rsync -avrP /backup/ /var/lib/mysql/
    shell> chown  mysql.mysql -R /var/lib/mysql
    

    启动数据库

    shell> systemctl start mysqld.service
    
    innobackuper 命令实现
    shell> innobackupex --defaults-file=/etc/my.cnf --host=192.168.1.146 --user=root --password=123123 /backup
    
    shell> nnobackupex --apply-log --use-memory=4G /backups/2018-08-17_15-53-11
    
    shell> systemctl stop mysqld.service
    
    shell> rm -rf /var/lib/mysql/*
    
    shell> innobackupex --datadir=/var/lib/mysql --copy-back 2018-08-17_15-53-11
    
    shell> chown  mysql.mysql -R /var/lib/mysql
    
    shell> systemctl start mysqld.service
    
    全量备份思路总结
    1. 执行备份命令
    • 指定 数据库的用户名和密码
    • 指定 备份目录,注意只可以自动创建最后一级的目录
    1. 准备备份的数据
    • 就是指: --prepare 参数, 保证数据的统一且完整性

    3.停服务,并且把 mysql 的数据目录下的所有文件和文件夹清除。

    • /var/lib/mysql/ 此目录必须是空的
    1. 恢复数据

    2. 本质上就是拷贝备份的文件到指定的 mysql 数据目录下

    3. 修改 mysql 数据目录的属主和属组为 MySQL 服务器进程启动的用户,默认是 mysql

    4. 启动服务

    2. 增量备份

    image.png

    特点:每次备份,都对自上一次备份(注意是上一次,不是第一次)到此时备份之间有变化的文件,进行备份。所 以备份体积小,备份速度快,但是恢复的时候,需要按备份时间顺序,逐个备份版本进行恢复,恢复时持续的时间长。

    无论xtrabackupinnobackupex工具支持增量备份,这意味着它们可以只复制自上次备份以来发生变化的数据。

    您可以在每个完整备份之间执行许多增量备份,因此您可以设置备份过程,例如每周一次完整备份和每天增量备份,或每天完整备份和每小时增量备份。

    增量备份有效,因为每个InnoDB页面都包含一个日志序列号或LSN。该LSN是整个数据库系统的版本号。每个页面的LSN显示它最近的更改。

    当我们做过全量备份以后会在目录下产生xtrabackup_checkpoints的文件 这里面记录了lsn和备份方式,我们可以基于这次的全量做增量的备份。

    shell> cat /backups/xtrabackup_checkpoints
    backup_type = full-prepared
    from_lsn = 0
    to_lsn = 13593159
    last_lsn = 13593168
    compact = 0
    recover_binlog_info = 0
    

    增量备份实际上并不将数据文件与先前备份的数据文件进行比较。事实上,如果你知道它的LSN,你可以使用 xtrabackup --incremental-lsn来执行增量备份,而不需要先前的备份。增量备份只是读取页面并将其LSN与最后一个备份的LSN进行比较。但是,您仍需要完整备份来恢复增量更改;如果没有完整备份作为基础,增量备份将毫无用处。

    创建增量备份

    要进行增量备份,请像往常一样以完整备份开始, 使用下面的命令创建基础的全量备份。

    shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/base
    

    现在您已拥有完整备份,以后可以根据它进行增量备份。

    向数据库中添加数据,以便于测试

    mysql> select count(id) from shark_db.student;
    +-----------+
    | count(id) |
    +-----------+
    |     99213 |
    +-----------+
    1 row in set (0.04 sec)
    
    mysql> insert into shark_db.student (name,age,phone) values('xiguatian',20,13149876789);
    Query OK, 1 row affected (0.00 sec)
    
    mysql> select count(id) from shark_db.student;
    +-----------+
    | count(id) |
    +-----------+
    |     99214 |
    +-----------+
    1 row in set (0.03 sec)
    

    使用以下命令进行增量备份:

    shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc1 --incremental-basedir=/backups/base
    

    /data/backups/inc1/目录现在应包含增量文件

    ls -lh /backups/inc1/
    总用量 116K
    -rw-r----- 1 root root  487 8月  18 11:40 backup-my.cnf
    -rw-r----- 1 root root  293 8月  18 11:40 ib_buffer_pool
    -rw-r----- 1 root root  64K 8月  18 11:40 ibdata1.delta
    -rw-r----- 1 root root   44 8月  18 11:40 ibdata1.meta
    drwxr-x--- 2 root root 4.0K 8月  18 11:40 mysql
    drwxr-x--- 2 root root  144 8月  18 11:40 one_db
    drwxr-x--- 2 root root 8.0K 8月  18 11:40 performance_schema
    drwxr-x--- 2 root root   88 8月  18 11:40 shark_db
    drwxr-x--- 2 root root 8.0K 8月  18 11:40 sys
    -rw-r----- 1 root root  120 8月  18 11:40 xtrabackup_checkpoints
    -rw-r----- 1 root root  498 8月  18 11:40 xtrabackup_info
    -rw-r----- 1 root root 2.5K 8月  18 11:40 xtrabackup_logfile
    

    这个时候去查看增量备份的xtrabackup_checkpoints,会发现同样也记录了LSN 等信息

    shell> cat /backups/inc1/xtrabackup_checkpoints
    backup_type = incremental
    from_lsn = 13596423
    to_lsn = 13596628
    last_lsn = 13596637
    compact = 0
    recover_binlog_info = 0
    // 这也意味着你可以在增量的备份上继续增量的备份。
    

    from_lsn是备份的起始LSN,对于增量,它必须与前一个/基本备份的to_lsn(如果它是最后一个检查点)相同。

    上面的情况是,to_lsn(上一个检查点LSN)和last_lsn(上次复制的LSN)之间存在差异,这意味着在备份过程中服务器上存在一些流量

    模拟增加数据

    mysql> insert into shark_db.student (name,age,phone) values('xiguatian3',21,13149876789);
    Query OK, 1 row affected (0.01 sec)
    
    mysql> select count(id) from shark_db.student;                                     +-----------+
    | count(id) |
    +-----------+
    |     99215 |
    +-----------+
    1 row in set (0.03 sec)
    

    现在可以使用此目录作为另一个增量备份的基础:

    shell> xtrabackup --backup --user=root --password=123 --target-dir=/backups/inc2 --incremental-basedir=/backups/inc1
    
    准备增量备份的数据

    增量备份的步骤与完全备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:从日志文件中针对数据文件重播已提交的事务,并回滚未提交的事务。在准备增量备份时,必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,并且很可能它们将在下一次增量备份中提交。您应该使用该 选项来阻止回滚阶段.

    xtrabackup --apply-log-only
    
    警告
    
    如果不使用该 选项来阻止回滚阶段,那么增量备份将毫无用处。回滚事务后,无法应用进一步的增量备份。
    

    要准备数据,需要从一开始就准备,现在回想一下我们都有那些备份

    /backups/base
    /backups/inc1
    /backups/inc2
    
    image.png
    1. 准备基础备份数据
    shell> xtrabackup --prepare --apply-log-only \
    --target-dir=/backups/base
    ...省略...
    xtrabackup: starting shutdown with innodb_fast_shutdown = 1
    InnoDB: Starting shutdown...
    InnoDB: Shutdown completed; log sequence number 13596441
    InnoDB: Number of pools: 1
    180818 11:56:55 completed OK!
    

    注意:
    即使已跳过回滚阶段,此备份实际上也可以按原样恢复。如果你恢复它并启动MySQL,InnoDB将检测到没有执行回滚阶段,它将在后台执行,因为它通常用于启动时的崩溃恢复。它会通知您数据库未正常关闭。

    1. 把第一次增量备份的数据合并到基础备份的数据中
    shell> xtrabackup  --prepare  --apply-log-only  --user=root --password=123  --target-dir=/backups/base  --incremental-dir=/backups/inc1
    
    1. 再把第二次增量备份的数据也合并到基础备份的数据中
    shell> xtrabackup --prepare --user=root --password=123  --target-dir=/backups/base  --incremental-dir=/backups/inc2
    

    ==注意: 最后一次操作不需要加--apply-log-only参数==

    1. 停止MySQL服务,并删除数据目录和日志
    shell> systemctl stop mysqld
    shell> rm -rf /var/lib/mysql/*
    
    1. 开始恢复合并后的全部数据的数据库
    shell> xtrabackup --copy-back  --datadir=/var/lib/mysql  --target-dir=/backups/base/
    
    1. 更改数据库目录的权限并启动数据库
    shell> chown mysql.mysql -R /var/lib/mysql
    shell> systemctl start mysqld
    

    关于加密备份、压缩备份、部分备份

    备份的扩展功能,自修
    点我上车

    相关文章

      网友评论

          本文标题:MySQL 物理备份: Innobackupex 和 xtrab

          本文链接:https://www.haomeiwen.com/subject/qvmspqtx.html