在上篇文章中我们介绍了基于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;

测试主从复制

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

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

总结

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

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

微信公众号:
来源:http://songwenjie.cnblogs.com/

声明:本文为博主学习感悟总结,水平有限,如果不当,欢迎指正。如果您认为还不错,不妨点击一下下方的【推荐】按钮,谢谢支持。转载与引用请注明出处。

MySQL主从复制——主库已有数据的解决方案的更多相关文章

  1. MySQL|一文解决主库已有数据的主从复制

    主从复制配置方案和实际的场景有很多,在之前配置了主从库都是全新的配置方案 在这一篇会配置主库存在数据,然后配置主从复制 开始之前,先分享一套MySQL教程,小白入门或者学习巩固都可以看 MySQL基础 ...

  2. mysql主从复制显示正常,数据没同步现象。

    当时在一个服务器上开启了多实例,主从复制结构图如下: 当时在192.168.10.3的服务器上用show slave status;显示的是正常的复制的,两个线程都为yes,并且读与写的pos也一直在 ...

  3. mysql表中已有数据,为表新增一个自增id。

    第一步,在navicat中,例如表test新建查询,输入以下两行代码即可搞定. alter table test add id int; alter table `test` change id id ...

  4. 重新学习Mysql数据13:Mysql主从复制,读写分离,分表分库策略与实践

    一.MySQL扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量. 关于数据库的扩展主要包括:业务拆分.主从复制.读写分离.数据库分库 ...

  5. MySQL++:Liunx - MySQL 主从复制

    目标:搭建两台MySQL服务器,一台作为主服务器,一台作为从服务器,实现主从复制 环境:虚拟机 主数据库:192.168.211.101 从数据库:192.168.211.102 MySQL 安装可参 ...

  6. mysql主从复制、redis基础、持久化和主从复制

    一.mysql(mariadb)基础 1.基础命令(centos7操作系统下) 1.启动mysql systemctl start mariadb 2.linux客户端连接自己 mysql -uroo ...

  7. mysql主从复制实现数据库同步

    mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...

  8. MySQL主从复制与读写分离[修改]

    作者:lixiuran 日期:2014年5月2日   备注[本人根据网上资源修改,参考http://www.cnblogs.com/luckcs/articles/2543607.html] 测试环境 ...

  9. mysql主从复制数据库

    mysql主从复制相信已经用得很多了,但是由于工作原因一直没怎么用过.趁着这段时间相对空闲,也就自己实现一遍.尽管互联网上已有大把类似的文章,但是自身实现的仍然值得记录. 环境: 主服务器:cento ...

随机推荐

  1. C#:WebBrowser控件的使用教程及相关问题整理

    推荐阅读: C#WebBrowser控件使用教程与技巧收集--苏飞收集 C# WebBrowser强制在本窗口打开,禁止在新窗口打开 C# WebBrowser禁止在新窗口打开,强制在本窗口打开(多种 ...

  2. Spring Cloud Eureka 实现服务注册与发现

    微服务 是一种架构模式,跟具体的语言实现无关,微服务架构将业务逻辑分散到了各个服务当中,服务间通过网络层进行通信共同协作:这样一个应用就可以划分为多个服务单独来维护发布.构建一个可靠微服务系统是需要具 ...

  3. 浅尝Vue.js组件(一)

    本篇目录: 组件名 组件注册 全局注册 基础组件的自动化全局注册 局部注册 在模块系统中局部注册 Prop 单向数据流 Prop验证 类型检查 非Prop特性 替换/合并已有的特性 禁用特性继承 自定 ...

  4. git 分支 branch 操作

    创建分支 git branch test: 基于当前commit创建test分支..git/HEAD 文件中记录了当前分支名字. 删除分支 git branch -d test:删除本地test分支 ...

  5. Spark2.1.0模型设计与基本架构(上)

    随着近十年互联网的迅猛发展,越来越多的人融入了互联网——利用搜索引擎查询词条或问题:社交圈子从现实搬到了Facebook.Twitter.微信等社交平台上:女孩子们现在少了逛街,多了在各大电商平台上的 ...

  6. 创建自己的OAuth2.0服务端(一)

    如果对OAuth2.0有任何的疑问,请先熟悉OAuth2.0基础的文章:http://www.cnblogs.com/alunchen/p/6956016.html 1. 前言 本篇文章时对 客户端的 ...

  7. ASP.NET MVC的JavaScriptResult

    前段时间,我们有学习<在ASP.NET MVC使用JavaScriptResult>http://www.cnblogs.com/insus/p/3960994.html ,今天我们来加强 ...

  8. 手机调试 --- 通过chrome测试手机网站

     移动端有时候我们要调试手机网站. Chrome怎么调试手机页面呢? 毕竟有时候手机支持的JS度跟PC不一样.最开始就遇见了.手机端浏览器不支持执行string.includes. PC端支持该函数, ...

  9. JavaScript学习总结(四)——this、原型链、javascript面向对象

    一.this 在JavaScript中this表示:谁调用当前函数this就指向谁,不知道调用者时this指向window. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是 ...

  10. WCF发布多个服务

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using WcfServi ...