
目录
一、本地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宝,学习最实用的数据库技术。







