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

我们来简单了解一下Mysql主从复制的过程:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重放中继日志中的事件,将改变反映它自己的数据。

MySQL主从复制——主库已有数据的解决方案
由单机架构切换到一主一从或一主多从,在增加从库节点前,主库可能已经运行过一段时间,这种情况在实际业务中很常见。那么如何应对开启主从复制前主库有数据的场景呢?
第一种方案是选择忽略主库之前的数据,不做处理。这种方案只适用于不重要的可有可无的数据,并且业务上能够容忍主从库数据不一致的场景。
第二种方案是对主库的数据进行备份,然后将主数据库中导出的数据导入到从数据库,然后再开启主从复制,以此来保证主从数据库数据一致。
我们来详细看一下第二种方案的处理:
查看主数据库已有的数据库
我们在主数据库准备了一个TEST1库,并且在其中准备一张数据表TEST和几条测试数据。


使用Docker创建从数据库
docker run -p 3346:3306 --name mysql-slave4 -e MYSQL_ROOT_PA SSWORD=123456 -d mysql:5.7

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


查询主数据库状态,并记下FILE及Position的值
mysql>show master status;

备份主数据库
退出mysql终端,执行docker mysql备份命令
docker exec [CONTAINER] /usr/bin/mysqldump -u username --password=xxx [DATABASE] > backup.sql
我们这里只需要备份TEST1数据库,若要备份全部数据库,[DATABASE]处使用--all-databases。

此时报出Warning: Using a password on the command line interface can be insecure.,这是因为我们在命令行输入了密码,所以会有安全警告信息。解决方案是在/etc/mysql/my.cnf中加入如下配置:
[mysqldump]
user = root
password = rootpassword
修改完配置文件后,再次执行备份命令不需要涉及用户名密码相关信息。

主数据库备份数据导入从数据库
cat backup.sql | docker exec -i [CONTAINER] /usr/bin/mysql -u username --password=xxx [DATABASE]
和上一步一样,我们也需要在从数据库配置用于备份的用户名和密码信息。

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

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

配置从数据库
docker exec -it mysql-slave4 /bin/bash
cd /etc/mysql

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

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,说明开启主从复制过程成功。

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

测试主从复制
在主数据库插入一条测试数据

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

总结
应该尽可能优化流程,减少锁表时间。
尽可能减少锁表范围,只锁定相关的数据库。

MySQL主从复制——主库已有数据的解决方案的更多相关文章
- MySQL|一文解决主库已有数据的主从复制
主从复制配置方案和实际的场景有很多,在之前配置了主从库都是全新的配置方案 在这一篇会配置主库存在数据,然后配置主从复制 开始之前,先分享一套MySQL教程,小白入门或者学习巩固都可以看 MySQL基础 ...
- mysql主从复制显示正常,数据没同步现象。
当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...
- mysql表中已有数据,为表新增一个自增id。
第一步,在navicat中,例如表test新建查询,输入以下两行代码即可搞定. alter table test add id int; alter table `test` change id id ...
- 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践
一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...
- MySQL++:Liunx - MySQL 主从复制
目标:搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制 环境:虚拟机 主数据库:192.168.211.101 从数据库:192.168.211.102 MySQL 安装可参 ...
- mysql主从复制、redis基础、持久化和主从复制
一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...
- mysql主从复制实现数据库同步
mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...
- MySQL主从复制与读写分离[修改]
作者:lixiuran 日期:2014年5月2日 备注[本人根据网上资源修改,参考http://www.cnblogs.com/luckcs/articles/2543607.html] 测试环境 ...
- mysql主从复制数据库
mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...
随机推荐
- Python多线程-Event(事件对象)
Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...
- (转)计算机原理学习(1)-- 冯诺依曼体系和CPU工作原理
原文:https://blog.csdn.net/cc_net/article/details/10419645 对于我们80后来说,最早接触计算机应该是在95年左右,那个时候最流行的一个词语是多媒体 ...
- 再谈C#委托与事件
之前写过一篇关于C#委托与事件的文章(见<C#委托和事件例析>),不过还是收到一些网友的提问.所以,今天再换另一个角度来详解一下这个问题. 一.在控制台下使用委托和事件 我们都知道,C#中 ...
- Redis笔记(1)数据结构与对象
1.前言 此系列博客记录redis设计与实现一书的笔记,提取书本中的知识点,省略相关说明,方便查阅. 2.基本数据结构 2.1 简单动态字符串SDS(simple dynamic string) 结构 ...
- ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / PING / QUIT allowed in this context
封装Redis发布订阅时,SUB时,又想探测具体Channel的状态,于是执行PUBSUB CHNNALES命令,报 ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / ...
- Window服务与Quartz.NET
Quartz.NET: http://quartznet.sourceforge.net/ (现为2.2版本) Sourceforge:http://sourceforge.net/projects/ ...
- Vue笔记:webpack项目vue启动流程
VUE启动流程 1. package.json 在执行npm run dev的时候,会在当前目录中寻找 package.json 文件, 有点类似 Maven 的 pom.xml 文件,包含项目的名称 ...
- mycat中间件--schema.xml配置文件详解
schema.xml管理着MyCat的逻辑库.表.分片规则.DataNode以及DataSource.弄懂这些配置,是正确使用MyCat的前提. <?xml version="1.0& ...
- AR介绍
AR介绍 AR全名扩增实境,是一种实时融合现实与虚拟的图像技术. AR技术的三板斧:感知(寻找目标定位位置-与环境交互),渲染(实现产品交互-与客户交互),追踪(捕捉目标运动轨迹-客户环境上下文). ...
- 面试:C++二叉树遍历(递归/非递归)
#include <vector> #include <stack> #include <queue> using namespace std; struct Tr ...