使用GTID,将阿里云RDS数据库,同步到本地MySQL

目标:

       将阿里云RDS数据库,同步到本地MySQL。实现RDS为Master,本地MySQL为Slave

核心技术:

       GTID复制。

核心步骤:

       下载线上物理文件,部署到本地,设置主从关系,启动,纠错。

  1. 将阿里云RDS物理备份文件到本地MySQL Data文件夹
  2. 设置本地为Slave。My.cnf
  3. 设置Change Master;start slave;
  4. 处理1236错误,纠偏:同步数据、跳过事务。

 

参考文件:

  1. 本地安装MySQL:https://www.cnblogs.com/nickchou/p/12093763.html
  2. 物理备份恢复至本地:https://help.aliyun.com/document_detail/41817.htm?spm=a2c4g.11186623.2.6.71624d4e3sGtj1
  3. 安装XtraBackup 8.0:https://www.percona.com/doc/percona-xtrabackup/8.0/installation.html?spm=a2c4g.11186623.2.14.49d12df0gWtYFW
  4. 修改MySQL的Root密码:https://dev.mysql.com/doc/refman/8.0/en/resetting-permissions.html?spm=a2c4g.11186623.2.27.49d12df0bqzE43
  5. 配置GTID,绑定主从:https://dudashuang.com/rds-sync-to-local/
  6. 绑定主从:https://my.oschina.net/azaz/blog/3119700
  7. 处理1236:https://blog.51cto.com/hnr520/1883282
  8. 跳过事务:https://note.t4x.org/database/mysql-gtid-purged/

 

本地MySQL安装配置

一、安装配置:

1.删除mariadb

  1. # 检查mariadb
  2. rpm -qa | grep mariadb
  3. # 删除mariadb
  4. yum -y remove mariadb*

2.删除Mysql

  1. # 检查mysql
  2. rpm -qa | grep mysql
  3. # 删除mysql
  4. yum -y remove mysql*
  5. rm -rf /etc/my.cnf
  6. rm -rf /var/lib/mysql

3. 安装MySQL

  1. # 配置安装源
  2. sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
  3. # 安装MySQL
  4. sudo yum --enablerepo=mysql80-community install mysql-community-server

4. 操作MySQL服务

  1. systemctl start mysqld
  2. systemctl status mysqld
  3. systemctl stop mysqld
  4. systemctl restart mysqld
  5. # 查看端口运行情况
  6. netstat -nlpt

 

二、查看并修改密码

mysql安装后会生成一个默认密码,此密码登录后要修改密码,不能用于其他操作

  1. cat /var/log/mysqld.log

登录root账号修改初始密码,复制上面的密码登录

  1. mysql -u root -p

修改密码,注意密码要稍微复杂点(大小写+符号+数字)

  1. mysql> ALTER USER USER() IDENTIFIED BY 'Xinmima@2020';
  2. mysql> update mysql.user set host='%' where user='root';
  3. mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
  4. mysql> FLUSH PRIVILEGES;

 

可能会用到新建账号、赋权命令:

  1. create user 'test'@'%' identified by 'Xinmima@2020';
  2. grant all privileges on testdb.* to 'test'@'%';
  3. # grant select on testdb.* to 'test'@'%';
  4. # grant insert,delete,update on testdb.* to 'test'@'%';
  5. flush privileges;
  6. # 查看权限
  7. show grants for 'test'@'%';
  8. # 删除权限
  9. revoke update on testdb.* from 'test'@'%';

 

 

阿里RDS数据库-还原到本地MySQL

三、下载RDS备份

下载物理备份,步骤如下:

  1. 登录RDS管理控制台
  2. 在左侧单击实例列表,然后在上方选择实例所在地域。
  3. 找到目标实例,单击实例ID。
  4. 在左侧导航栏中单击备份恢复。
  5. 选择数据备份标签页。
  6. 选择查询的时间范围。
  7. 在数据备份列表中,找到要下载的数据备份,并单击其右侧的下载。

 

下载时要注意,链接里用来验证的参数太多,需要把文件名指定出来,否则下载会出错。下载命令:

wget -c 'http://.../hinsxxxx_data_20201123215531_xb.qp?...' -O hins_20201123215531_xb. qp

 

四、解压缩包

RDS-MySQL目前物理备份集文件有几种格式:

  1. tar 压缩包 (.tar.gz 后缀)
  2. xbstream 压缩包 (.xb.gz 后缀)
  3. xbstream 文件包(_qp.xb 后缀)
  4. xbstream qpress压缩包(_xb.qp后缀

根据不同的MySQL版本,需要用到的数据恢复工具也不一样:

  1. MySQL 5.6及之前的版本需要安装 Percona XtraBackup 2.3
  2. MySQL 5.7版本需要安装 Percona XtraBackup 2.4
  3. MySQL 8.0版本需要安装 Percona XtraBackup 8.0

我的是MySQL8.0.18,备份文件的格式是_xb.qp。其余版本,参考链接里找对应方法。

 

1.安装qpress

  1. wget "http://docs-aliyun.cn-hangzhou.oss.aliyun-inc.com/assets/attach/183466/cn_zh/1608011575185/qpress-11-linux-x64.tar"
  2. tar xvf qpress-11-linux-x64.tar
  3. chmod 775 qpress
  4. cp qpress /usr/bin

2. 安装XtraBackup:

Installing Percona XtraBackup from Percona yum repository

  1. Install the Percona yum repository by running the following command as the root user or with sudoyum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
  2. Enable the repository: percona-release enable-only tools release

If Percona XtraBackup is intented to be used in combination with the upstream MySQL Server, you only need to enable the tools repository: percona-release enable-only tools.

  1. Install Percona XtraBackup by running: yum install percona-xtrabackup-80

 

3. 解压数据备份:

qpress -do hins_20201123215531_xb.qp | xbstream -x -v -C /home/mysql/data

若解压成功:

ls -l /home/mysql/data

 

4*. 恢复解压好的备份文件,记得配归属

  1. ## MySQL 8.0
  2. xtrabackup --prepare --target-dir=/home/mysql/data
  3. xtrabackup --datadir=/var/lib/mysql --copy-back --target-dir=/home/mysql/data
# 我继续做了一步:哈哈哈哈,我决定保留这份小青涩# cp -rf /home/mysql/data/* /var/lib/mysql/

耐心等待,若系统返回如下类似结果,则说明备份文件已成功恢复到自建数据库

 

若系统返回如下报错,可以用rm -rf /var/lib/mysql命令清空文件夹内文件,然后用chown -R mysql:mysql /var/lib/mysql修改归属。

 

5*. 需修改backup-my.cnf参数

# vi /home/mysql/data/backup-my.cnf# 修改MySQL配置文件:
Vim /etc/my.cnf

添加如下参数:

lower_case_table_names=1

注释掉如下自建数据库不支持的参数:

#innodb_log_checksum_algorithm

#innodb_fast_checksum

#innodb_log_block_size

#innodb_doublewrite_file

#innodb_encrypt_algorithm

#rds_encrypt_data

#redo_log_version

#master_key_id

#server_uuid

 

 

6. 启动MySQL,修改用户密码:

# mysqld --defaults-file=/home/mysql/data/backup-my.cnf --user=mysql --datadir=/home/mysql/data &# 通过上面我自己的配置,直接启是可以成功的。但是还是保留一下,以后好查systemctl start mysqld

执行如下命令,登录MySQL数据库以验证进程启动成功。

mysql -u<RDS实例账号> -p<对应密码>

使用show databases;查看数据库,确认是否恢复成功

建议您参考官方文档重置root账户的密码。

User表里面有一个aliyun_root,那就是root账户,updateidentifiedgrantflush参见上文。

 

配GTID同步

1. 配/etc/my.cnf

我的my.cnf文件内容

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

default_authentication_plugin = 'mysql_native_password'

lower_case_table_names = 1



#GTID:

gtid_mode=on

enforce_gtid_consistency=on

server_id=87

binlog_format=row

log-slave-updates=1

2. 设置GDIT,绑定主从

reset slave;

# 若备份文件中包含了 RDS 的主从复制关系,需要把这些主从复制关系清理掉

use mysql;

truncate table  slave_relay_log_info;

truncate table  mysql.slave_master_info;

truncate table  mysql.slave_worker_info;

 

reset master;

change master to master_host = 'rdsExampleUrl.mysql.rds.aliyuncs.com', master_port = 3306, master_user = 'username', master_password='password', master_auto_position = 1;

 

# 启动

start slave;

 

# 查看状态

show slave status\G;

 

处理1236报错

报错:

Last_IO_Errno: 1236

Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

从库报错:主库清理(purge)掉了从库还没有接受的事物。(https://dudashuang.com/rds-sync-to-local/

 

解决:

mysql> stop slave;

Query OK, 0 rows affected, 1 warning (0.00 sec)

 

mysql> reset slave;

ERROR 1290 (HY000): The MySQL server is running with the --super-read-only option so it cannot execute this statement

mysql> quit

 

/etc/init.d/mysqld stop

mysql> reset slave;

mysql> reset master;

 

# 下文加粗部分到“/var/lib/mysql/xtrabackup_info”文件里找

mysql> set @@global.gtid_purged='78488ade-0dfc-11e7-ad71-00163e00dadd:1-18125360,b2723b81-468b-11e7-8636-00163e1ab1b4:1-3,78488ade-0dfc-11e7-ad71-00163e00dadd:1-18367652,b2723b81-468b-11e7-8636-00131ab1b4:1-4';

Query OK, 0 rows affected (0.00 sec)

 

找这里:

binlog_pos = filename 'mysql-bin.000206', position 195, GTID of the last change '02XXXXX-636a-11ea-ad5c-98039XXXXX:1-261417,030d8530-636a-11ea-aa21-ecXXXXXa7c34:1-1418028,83d2116b-d431-11ea-99c6-1c349XXXXXc:1-1411391,fb421df5-e902-11ea-81f2-b9XXXXX a0:1-512624'

 

start slave就成功了。如图:

 

最后,我不放心,又把数据从RDS得到到本地MySQL一次。

 

上述所有操作,始终没在RDS-MySQL里做操作,阿里已经把GTID打开了,直接配就行。

若想确认RDS是否打开GTID,可以在RDS-MySQL里执行:

show global variables like '%gtid%';

 

上文在/etc/my.cnf里设置从库server_id的时候,也要注意应和RDS的server_id不同。

RDS的Server_id查看方法,在RDS-MySQL里执行:

# show variables like '%server_id%';

 

 

后续

目前已经稳定运行7天

后续深入学习上述不放心的地方,以及:Master实例失效以后,如何查找两库数据上的差异、如何补救差异、如何切换Slave为Master对外提供服务(包括如何通知配置中心)。

程序端平时应只在Slave上执行读操作,如果MySQL Master失效相应地也需要:如何判定Master失效,如何拿到新Master。需落实:三次写入失效(还得注意幂等)+配置中心。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老陈头7

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值