暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【DB宝16】使用PXB全量恢复+mysqlbinlog二进制日志增量恢复华为云RDS备份到本地MySQL库实现完全恢复

DB宝 2021-03-23
924
   点 击 上 方 蓝 字 “DB宝”,关 注 我 吧  

目录

    一、本地ECS上安装相关软件
    1.1 安装PXB软件(用于全量恢复,必须)
    1.2 安装qpress软件(用于解压操作,必须)
    1.3 安装mysqlbinlog软件(如果有MySQL Server环境,则不用单独安装,可选)
    二、从华为云下载RDS for MySQL的全量+binlog备份
    三、恢复数据库到最新状态
    3.1 PXB恢复全量数据
    3.2 mysqlbinlog恢复增量数据

    日常的数据备份及恢复测试,是DBA工作重中之重的事情,所以要做好备份及测试。MySQL数据库常见备份有mysqldump+binlog备份、xtrabackup+binlog备份,无论那一种,几乎都少不了对binlog的备份,说明了binlog在数据恢复中的重要性。

    本文的恢复场景为:源库为华为云RDS for MySQL 5.7数据库,需要恢复到本地自建ECS中。本文演示的是一般恢复过程,详细日志没有写出。

    恢复原理:华为云的RDS for MySQL的全备使用的是PXB进行的备份,没有增量备份,只有二进制日志的备份。

    恢复工具:首先使用PXB(Percona XtraBackup)执行完全恢复,再使用mysqlbinlog工具解析二进制日志实现增量恢复。

    注:本文的恢复过程也同样适用于普通的非RDS的MySQL恢复过程。

    一、本地ECS上安装相关软件

    1.1 安装PXB软件(用于全量恢复,必须)

     1# PXB官网下载:https://www.percona.com/downloads/
    2
    3#方法一:yum在线安装
    4yum install -y  https://repo.percona.com/yum/percona-release-latest.noarch.rpm
    5yum list | grep percona-xtrabackup
    6yum install -y  percona-xtrabackup-24
    7
    8#方法二: 二进制包安装
    9yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL numactl
    10tar -zxvf percona-xtrabackup-2.4.20-Linux-x86_64.el7.tar.gz
    11mv percona-xtrabackup-2.4.20-Linux-x86_64 /usr/local/percona-xtrabackup-2.4.20-Linux-x86_64
    12ln -s /usr/local/percona-xtrabackup-2.4.20-Linux-x86_64  /usr/local/xtrabackup-2.4.20
    13ln -s /usr/local/percona-xtrabackup-2.4.20-Linux-x86_64/bin/innobackupex  /usr/bin/innobackupex
    14ln -s /usr/local/percona-xtrabackup-2.4.20-Linux-x86_64/bin/xtrabackup  /usr/bin/xtrabackup
    15ln -s /usr/local/percona-xtrabackup-2.4.20-Linux-x86_64/bin/xbstream /usr/bin/xbstream
    16
    17
    18innobackupex --version
    19xtrabackup --version
    20xtrabackup --help

    1.2 安装qpress软件(用于解压操作,必须)

    1wget http://www.quicklz.com/qpress-11-linux-x64.tar
    2tar -xvf qpress-11-linux-x64.tar
    3mv qpress /usr/bin/qpress

    1.3 安装mysqlbinlog软件(可选)

    https://support.huaweicloud.com/usermanual-rds/rds_05_0138.html

    1、MySQL的二进制日志(binary log)是一个二进制文件,主要记录了对MySQL数据库执行更改的所有操作,并且记录了语句发生时间、执行时长、操作数据等其它额外信息,但是它不记录SELECT、SHOW等那些不修改数据的SQL语句。二进制日志(binary log)主要用于数据库恢复和主从复制,以及审计(audit)操作。
    2、mysqlbinlog工具用于解析binlog日志,包含在MySQL软件包中。您可在MySQL官网下载对应版本的MySQL软件包,解压并获取解压包中的mysqlbinlog工具(MySQL 5.6和5.7对应的mysqlbinlog版本均为3.4)。如果使用的mysqlbinlog工具版本太旧,就有可能无法正确解析MySQL binlog。软件包版本最好与当前您使用的msyqld大版本保持一致。

    3、binlog格式是二进制日志,mysql使用mysqlbinlog工具解析。

    mysqlbinlog语法格式:mysqlbinlog mysql-bin.000001 | mysql -uroot -p 数据库名

    mysqlbinlog 常用参数:

    (1)-d:指定特定数据库的binlog

    (2)-r:相当于重定向到指定文件,与>、<作用相同

    (3)--start-position和--stop-position:按照指定位置解析binlog日志(精确),如不接--stop-positiion则一直到binlog日志结尾

    (4)--start-datetime和--stop-datetime:按照指定时间解析binlog日志(模糊,不准确),如不接--stop-datetime则一直到binlog日志结尾

    (5)-D  --disable-log-bin:禁止恢复过程产生日志。指定-D时使用mysqlbinlog解析binlog时,会看到sql_log_bin=0。也可以再把binlog解析到普通SQL文件,在mysql命令行下执行SQL文件前,手工设定set sql_log_bin=0,执行恢复SQL的过程就不会产生日志,恢复后再恢复set sql_log_bin=1。sql_log_bin 是一个动态变量,修改该变量时,可以只对当前会话生效(Session)

    (6)-v :显示SQL语句

    (7)-vv:显示的SQL语句之后会加上字段属性注释

    (8)--base64-output=decode-rows:不显示BINLOG内容部分

    安装mysqlbinlog软件的步骤如下所示:

     1# 解压
    2tar -zxvf mysql-5.7.30-linux-glibc2.12-x86_64.tar.gz
    3mv mysql-5.7.30-linux-glibc2.12-x86_64 /usr/local/mysql
    4
    5# 创建用户
    6groupadd mysql
    7useradd -r -g mysql mysql
    8chown -R mysql.mysql /usr/local/mysql
    9
    10# 修改环境变量
    11echo "export PATH=$PATH:/usr/local/mysql/bin" >> /etc/bashrc ; source /etc/bashrc 

    二、从华为云下载RDS for MySQL的全量+binlog备份

    全量备份下载:https://support.huaweicloud.com/usermanual-rds/rds_09_0031.html

    Binlog备份下载:https://support.huaweicloud.com/usermanual-rds/rds_03_0100.html

    注意:当二进制日志很多时,建议“合并下载Binlog备份文件”,但是该功能不支持下载大于500MB以上的Binlog合并文件。

    三、恢复数据库到最新状态

    3.1 PXB恢复全量数据

     1mkdir -p /root/backupdir
    2xbstream  -x -p 4 < /soft/mysql-5.7.29-202007280130-rds-jspt-a682.qp -C /root/backupdir/
    3xtrabackup --parallel 4 --decompress --target-dir=/root/backupdir
    4find /root/backupdir/ -name '*.qp' | xargs rm -f
    5xtrabackup --prepare --apply-log-only --target-dir=/root/backupdir
    6xtrabackup --copy-back --target-dir=/root/backupdir --datadir=/usr/local/mysql/data
    7chown -R mysql:mysql /usr/local/mysql/data
    8
    9#配置参数文件,注意添加skip-grant-tables参数
    10cat > /etc/my.cnf <<"EOF"
    11[mysqld]
    12port=3306
    13basedir=/usr/local/mysql
    14datadir=/usr/local/mysql/data
    15skip-grant-tables
    16EOF
    17
    18# 启动数据库
    19cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
    20chmod 755 /etc/init.d/mysqld
    21chkconfig --add mysqld
    22chkconfig mysqld on
    23chkconfig --level 345 mysqld on
    24systemctl start mysqld
    25systemctl status mysqld
    26
    27#修改密码
    28mysql -uroot -p
    29flush privileges;
    30grant all privileges on *.* to root@'localhost' identified by 'lhr'  with grant option;
    31grant all privileges on *.* to root@'%' identified by 'lhr'  with grant option;
    32flush privileges;
    33select user,host from mysql.user;
    34
    35# MySQL数据库大小:
    36select a.SCHEMA_NAME, a.DEFAULT_CHARACTER_SET_NAME,a.DEFAULT_COLLATION_NAME,
    37sum(table_rows) as '记录数',
    38sum(truncate(data_length/1024/1024, 2)) as '数据容量(MB)',
    39sum(truncate(index_length/1024/1024, 2)) as '索引容量(MB)',
    40sum(truncate((data_length+index_length)/1024/1024, 2)) as '总大小(MB)',
    41sum(truncate(max_data_length/1024/1024, 2)) as '最大值(MB)',
    42sum(truncate(data_free/1024/1024, 2)) as '空闲空间(MB)'
    43from INFORMATION_SCHEMA.SCHEMATA a
    44left outer join information_schema.tables b
    45on a.SCHEMA_NAME=b.TABLE_SCHEMA
    46group by a.SCHEMA_NAME,  a.DEFAULT_CHARACTER_SET_NAME,a.DEFAULT_COLLATION_NAME
    47order by sum(data_length) desc, sum(index_length) desc;
    48
    49# 客户端访问
    50mysql -uroot -plhr -h192.168.59.220 -P33060

    3.2 mysqlbinlog恢复增量数据

     1# 解压下载下来的二进制日志包
    2tar -zxvf increment_.tar.gz
    3
    4
    5# 获取最新的日志号,根据时间+gtid确定pos位置
    6[root@pxb backupdir]# more xtrabackup_binlog_info
    7mysql-bin.003909        817427  69daae36-8788-11ea-a44c-fa163e2caad0:1-3679848,6b260292-8788-11ea-8e39-fa163e7353ba:1-272439
    8[root@pxb backupdir]# more xtrabackup_info
    9uuid = 0fc4937d-d02f-11ea-9b23-fa163e7353ba
    10name = 
    11tool_name = innobackupex
    12tool_command = --defaults-extra-file=/var/lib/uds/stream_backup_tmp/xtrabackup.conf --slave-info --no-timestamp --host=localhost --compress-threads=4 --stream=xbstream --show-size --tmpdir=/var/lib/uds/stream_backup_tmp/stream_tmp --lock-ddl-timeout=300 --get-data-size --compress /tmp
    13tool_version = 2.4.12-10
    14ibbackup_version = 2.4.12-10
    15server_version = 5.7.29-2-log
    16start_time = 2020-07-28 01:31:35
    17end_time = 2020-07-28 01:31:53
    18lock_time = 0
    19binlog_pos = filename 'mysql-bin.003909', position '817427', GTID of the last change '69daae36-8788-11ea-a44c-fa163e2caad0:1-3679848,6b260292-8788-11ea-8e39-fa163e7353ba:1-272439'
    20innodb_from_lsn = 0
    21innodb_to_lsn = 13546262100
    22partial = N
    23incremental = N
    24format = xbstream
    25compact = N
    26compressed = compressed
    27encrypted = N
    28
    29# 查看日志,确定pos位置为150412
    30mysqlbinlog mysql-bin.merged.21 -vv --base64-output=decode-row  | more
    31mysqlbinlog /soft/mysql-bin.merged.21 --start-datetime="2020-07-28 1:31:53" |  grep "69daae36-8788-11ea-a44c-fa163e2caad0:3679849" -C 6
    32
    33# 追加日志
    34# mysqlbinlog /soft/master-bin.003909 --start-position='817427' | mysql -uroot -plhr
    35# mysqlbinlog --start-datetime='2020-07-28 01:31:53' -D  /soft/mysql-bin.merged.21  | mysql -uroot -plhr
    36mysqlbinlog /soft/mysql-bin.merged.21 --start-position=150412 -D |  mysql -uroot -plhr

    注意:

    在华为云上,如果架构是主备环境,那么全备数据是来自于备实例,增备数据来自主实例,所以两边的binlog号是有差异的,不能直接拿来恢复。可以通过最后的GTID和时间范围再确定具体的binlog文件的pos位置。

    一个报错:

    [root@pxb soft]# mysqlbinlog soft/mysql-bin.merged.21 –start-datetime='2020-07-28 01:31:53' | mysql -uroot -plhr
    mysql: [Warning] Using a password on the command line interface can be insecure.
    ERROR 1781 (HY000) at line 18: @@SESSION.GTID_NEXT cannot be set to UUID:NUMBER when @@GLOBAL.GTID_MODE = OFF.

    解决:set @@GLOBAL.GTID_MODE = OFF_PERMISSIVE;

    在线修改GTID时,必须按照如下顺序 OFF <-> OFF_PERMISSIVE <-> ON_PERMISSIVE <-> ON,不能跳过其中环节,比如 gtid_mode 从off 不能直接变为on,否则MySQL会进行提示。

    • OFF:不产生GTID,Slave只接受不带GTID的事务

    • OFF_PERMISSIVE:不产生GTID,Slave即接受不带GTID的事务,也接受带GTID的事务

    • ON_PERMISSIVE:产生GTID,Slave即接受不带GTID的事务,也接受带GTID的事务

    • ON:产生GTID,Slave只能接受带GTID的事务。

         

    本文结束。


    • 微信公众号:DB宝,作者:小麦苗
    • 作者博客地址:http://blog.itpub.net/26736162/
    • 作者微信:db_bao

    • 作者QQ:646634621,QQ群:230161599、618766405
    • 提供Oracle OCP、OCM、高可用(rac+dg+ogg)和MySQL DBA培训
    • 版权所有,欢迎分享本文,转载请保留出处

    • 若有侵权请联系小麦苗删除

      ★DB宝分享的IT资料:https://mp.weixin.qq.com/s/Iwsy-zkzwgs8nYkcMz29ag
      ★DB宝笔试面试详解:https://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

      长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:DB宝,学习最实用的数据库技术。




      文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论