目标:

将阿里云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 sudo: yum 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账户,update、identified、grant、flush参见上文。

配GTID同步

1. 配/etc/my.cnf

我的my.cnf文件内容

datadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.socklog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.piddefault_authentication_plugin = 'mysql_native_password'lower_case_table_names = 1#GTID:gtid_mode=onenforce_gtid_consistency=onserver_id=87binlog_format=rowlog-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。需落实:三次写入失效(还得注意幂等)+配置中心。

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

  1. 问题:阿里云RDS数据库Binlog日志一直增大,撑爆磁盘

    问题:阿里云RDS数据库Binlog日志一直增大,撑爆磁盘 最后结果,是因为MySQL语句问题,没有where的条件下,导致更新操作 没有开启安全模式,需要开启sql更改安全模式,禁止没有where的 ...

  2. java rds 数据库_JDBC(java数据库连接)和阿里云RDS数据库

    这两天挖洞的时候,拿到了一个配置生产环境的源码,看一下就能看出来是配置 首先给大家看下源码: 因为我暂时还没有学过java,所以刚看到这个,就没有这个概念,只以为是配置个 首先我们来了解下JDBC:J ...

  3. 【数据库取证篇】阿里云RDS数据库简介

    [数据库取证篇]阿里云RDS数据库简介 ​ 初识RDS基本信息,知其然,再知其所以然-[suy] 文章目录 [数据库取证篇]阿里云RDS数据库简介 (一)云数据库RDS简介 1.各版本功能 (二)RD ...

  4. SpringBoot 中连接阿里云rds数据库

    今天首次碰到在SpringBoot中使用阿里云rds数据库,搜索一了一番资料,最后成功实现.然后在这里做下自我总结.(个人用到是SSH方式进行连接) 1.在pom文件中添加jar包依赖 <dep ...

  5. python连接阿里云数据库_记一次python备份阿里云RDS数据库

    阿里云是目前国内公有云排名靠前的一家企业,安全性较高,但在保证安全的前提下也存在着业务上云后如何进行备份,下面的实例是一个现实的项目案例,主要是数据库上云后如何将数据备份到本地存储设备中,下面是以py ...

  6. 云产品学习之路(阿里云01)阿里云rds数据库导出

    参考文档:阿里云rds数据库导出到windows本地数据库中 1.进入阿里云rds控制台,选择实例列表进入rds实例 2.进入备份恢复,选择全量备份下载

  7. 阿里云RDS数据库如何远程访问

    阿里云RDS数据库如何远程访问 1.找到对应的数据库实例, 点击管理,进入管理页面 点击数据安全性 选择添加白名单 将本地IP地址加进去,如果不知道可百度"IP". 3.添加安全组 ...

  8. 使用sqlyog连接阿里云rds数据库

    使用sqlyog连接阿里云rds数据库 查看rds云数据库的外网地址 查看本机ip地址 配置白名单 填写上本机的ip然后点击确认 设置数据库的账号和密码 建议设置成普通账号 普通账号记得配置权限 使用 ...

  9. 阿里云RDS数据库外网连接和内网连接有什么不同?

    内网就是云上环境访问 速度快 没有费用 公网就是可以飞云上环境访问 速度不一定 有费用 通过外网和内网均可访问阿里云 RDS 数据库.使用外网时,阿里云 RDS 数据库的连接带宽会受到限制.建议还是通 ...

最新文章

  1. 【电子基础】模拟电路问答
  2. 和6岁孩子的函数式编程对话
  3. 任务 进程 线程区别
  4. [旧博客]Python 第一次
  5. vue表单的基本使用
  6. Web框架——Flask系列之宏、继承、包含(十八)
  7. 香草 jboss 工具_使用Tensorflow创建香草神经网络
  8. 互联网日报 | 1月27日 星期三 | 支付宝集五福活动2月1日开启;华为否认“出售手机业务”传闻;中国联通自有手机品牌发布...
  9. EF(EntityFramework) 的 CodeFirst 使用指南二(基本使用)
  10. 【Active Learning - 09】主动学习策略研究及其在图像分类中的应用:研究背景与研究意义
  11. 不同网段实现全网互通
  12. 视频字幕 硬字幕 软字幕 外挂字幕 简介
  13. 公众号openid能做用户识别_做公众号能不能转载别人文章?我的建议是...
  14. 蜂云软件开发微信crm系统的功能点
  15. TBS1072B数字示波器波形截图流程
  16. 使用pydicom读取dicom文件,并对文件做一些简单操作
  17. 宽带计费认证系统的PPPoE认证技术
  18. 去除Opera与迅雷的关联
  19. 阿里Java面试必问:java多线程实例
  20. WPF 仿安卓手势解锁 图案解锁

热门文章

  1. QGraphicsView创建悬浮按钮
  2. git 切换仓库地址
  3. 福建省获得央行颁发的非金融机构支付业务许可牌照的公司(至2012-08-01)
  4. google maps api
  5. 计算机游戏攻略 185,少儿编程游戏CodeMonkey通关攻略:第180-185关
  6. Ios精品源码,tableview下载视频直播源播放器图片位置3D立体旋转相册屏风动画
  7. MAC苹果电脑关闭系统完整性保护SIP
  8. 【Spark】基于Spark的大型电商网站交互式行为分析系统项目实战
  9. BPMN 2.0 快速使用文档
  10. 基于51单片机的汇编程序:六位8段数码管(共阴极)动态显示“123456”