阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MySQL主从复制——主库已有数据的解决方案

273次阅读
没有评论

共计 2039 个字符,预计需要花费 6 分钟才能阅读完成。

在上篇文章中我们介绍了基于 Docker 的 MySQL 主从搭建,一主多从的搭建过程就是重复了一主一从的从库配置过程,需要注意的是,要保证主从库 my.cnf 中 server-id 的唯一性。搭建完成后,可以在主库 show slave hosts 查看有哪些从库节点。

MySQL 主从复制——主库已有数据的解决方案

我们来简单了解一下 MySQL 主从复制的过程:

(1) master 将改变记录到二进制日志 (binary log) 中(这些记录叫做二进制日志事件,binary log events);

(2) slave 将 master 的 binary log events 拷贝到它的中继日志(relay log);

(3) slave 重放中继日志中的事件,将改变反映它自己的数据。

MySQL 主从复制——主库已有数据的解决方案

MySQL 主从复制——主库已有数据的解决方案

由单机架构切换到一主一从或一主多从,在增加从库节点前,主库可能已经运行过一段时间,这种情况在实际业务中很常见。那么如何应对开启主从复制前主库有数据的场景呢?

第一种方案是选择忽略主库之前的数据,不做处理。这种方案只适用于不重要的可有可无的数据,并且业务上能够容忍主从库数据不一致的场景。

第二种方案是对主库的数据进行备份,然后将主数据库中导出的数据导入到从数据库,然后再开启主从复制,以此来保证主从数据库数据一致。

我们来详细看一下第二种方案的处理:

查看主数据库已有的数据库

我们在主数据库准备了一个 TEST1 库,并且在其中准备一张数据表 TEST 和几条测试数据。

MySQL 主从复制——主库已有数据的解决方案

MySQL 主从复制——主库已有数据的解决方案

使用 Docker 创建从数据库

docker run -p 3346:3306 –name mysql-slave4 -e MYSQL_ROOT_PA SSWORD=123456 -d mysql:5.7

MySQL 主从复制——主库已有数据的解决方案

锁定主数据库

锁定主数据库,只允许读取不允许写入,这样做的目的是防止备份过程中或备份完成之后有新数据插入,导致备份数据和主数据数据不一致。

mysql> flush tables with read lock;

MySQL 主从复制——主库已有数据的解决方案

MySQL 主从复制——主库已有数据的解决方案

查询主数据库状态,并记下 FILE 及 Position 的值

mysql>show master status;

MySQL 主从复制——主库已有数据的解决方案

备份主数据库

退出 mysql 终端,执行 docker mysql 备份命令

docker exec [CONTAINER] /usr/bin/mysqldump -u username –password=xxx [DATABASE] > backup.sql

我们这里只需要备份 TEST1 数据库,若要备份全部数据库,[DATABASE]处使用--all-databases

MySQL 主从复制——主库已有数据的解决方案

此时报出Warning: Using a password on the command line interface can be insecure.,这是因为我们在命令行输入了密码,所以会有安全警告信息。解决方案是在 /etc/mysql/my.cnf 中加入如下配置:

[mysqldump]
user = root
password = rootpassword

修改完配置文件后, 再次执行备份命令不需要涉及用户名密码相关信息。

MySQL 主从复制——主库已有数据的解决方案

主数据库备份数据导入从数据库

cat backup.sql | docker exec -i [CONTAINER] /usr/bin/mysql -u username –password=xxx [DATABASE]

和上一步一样,我们也需要在从数据库配置用于备份的用户名和密码信息。

MySQL 主从复制——主库已有数据的解决方案

需要先在从数据库建立一个同名数据库,才能导入主数据库备份数据。切换到从数据库执行CREATE DATABASE TEST1;,然后再次导入主数据备份数据。

MySQL 主从复制——主库已有数据的解决方案

此时备份数据导入已完成,可以在从数据库进行数据验证。

MySQL 主从复制——主库已有数据的解决方案

配置从数据库

docker exec -it mysql-slave4 /bin/bash

cd /etc/mysql

MySQL 主从复制——主库已有数据的解决方案

vi my.cnf,加入以下配置,注意 server-id 要保证唯一:

MySQL 主从复制——主库已有数据的解决方案

service mysql restart 重启 mysql 服务,这会使得 mysql 服务所在的 docker 容器停止

docker start mysql-slave4 启动 docker 容器

配置主从链接

切换到从数据库,执行 change master to master_host=’172.17.0.2′, master_user=’slave’, master_password=’123456′, master_port=3306, master_log_file=’mysql-bin.000001′, master_log_pos= 4952, master_connect_retry=30;,关于这个命令在上一篇文章中有详细介绍。

启动主从复制 start slave;,此时查看从库状态 show slave status \G;,若是 SlaveIORunning 和 SlaveSQLRunning 都是 Yes,说明开启主从复制过程成功。

MySQL 主从复制——主库已有数据的解决方案

解锁主数据库

切换回主数据库的终端,进行表解锁操作。

unlock tables;

MySQL 主从复制——主库已有数据的解决方案

测试主从复制

在主数据库插入一条测试数据

MySQL 主从复制——主库已有数据的解决方案

切换到从数据库,查询测试数据,说明主从复制成功。

MySQL 主从复制——主库已有数据的解决方案

总结

应该尽可能优化流程,减少锁表时间。

尽可能减少锁表范围,只锁定相关的数据库。

正文完
星哥说事-微信公众号
post-qrcode
 
星锅
版权声明:本站原创文章,由 星锅 2022-01-22发表,共计2039字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中