【实操笔记】MySQL主从同步功能实现
写在前边:
这两天来了个需求,配置部署两台服务器的MySQL数据同步,折腾了两天查了很多相关资料,一直连不上,后来发现其实是数据库授权的ip有问题,我们用的服务器是机房中的虚拟机加上反向代理出来的,坑的不行。看了好多博客,写的怎么说呢,写的好的是太好了太详细了;写的不好的,配置什么的都讲的不清楚,刚接触这块的时候不晓得原理,一味的复制粘贴,后来看到有个博主写的好文,瞬间醍醐灌顶,也有了自己的思路,我就简单的记录下操作步骤和一些细节的注释,原理就直接搬运了,原理图也画了份,就不献丑了,有写错的地方,还望各位大佬不吝赐教,在下感激不尽!
配置MySQL的主从同步有什么好处?
1--数据分布 (Data distribution )
2--负载平衡(load balancing)
3--数据备份(Backups) ,保证数据安全(最主要的作用)
4--高可用性和容错行(High availability and failover)
5--实现读写分离,缓解数据库压力
MySQL主从同步实现原理(参考博文点这里):
master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;salve服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件,同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
注意几点:
1--master将操作语句记录到binlog日志中,然后授予slave远程连接的权限(master一定要开启binlog二进制日志功能;通常为了数据安全考虑,slave也开启binlog功能)。
2--slave开启两个线程:IO线程和SQL线程。其中:IO线程负责读取master的binlog内容到中继日志relay log里;SQL线程负责从relay log日志里读出binlog内容,并更新到slave的数据库里,这样就能保证slave数据和master数据保持一致了。
3--Mysql复制至少需要两个Mysql的服务,当然Mysql服务可以分布在不同的服务器上,也可以在一台服务器上启动多个服务。
4--Mysql复制最好确保master和slave服务器上的Mysql版本相同(如果不能满足版本一致,那么要保证master主节点的版本低于slave从节点的版本)
5--master和slave两节点间时间需同步
Mysql复制的流程图如下:

MySQL是怎样同步的?
1--基于语句的复制: 在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。
2--基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍. 从mysql5.0开始支持
3--混合类型的复制: 默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。
实现环境:
| System | mysql | ip |
|:---- |:---- |:----
|win7 | mysql-5.6.24 | 192.168.1.129 |
|centos 6.7 | mysql-5.6.39 | 192.168.1.128 |
注:从服务器的mysql版本最好和主服务器相同,或者大于主服务器版本
MySQL主从同步的实现部分:
首先是Master(主节点)的配置:
#主Master服务器配置:
1.进入mysql的安装目录,新建一个log文件夹(这个是存储binary log的路径)
2.主服务器开启log_bin,需修改my.ini,配置如下:
#*********************master my.ini配置文件开始*****************************************
#路径均为当前服务器的实际路径
basedir = D:\\apps\\mysql-5.6.24-win32
datadir = D:\\apps\\mysql-5.6.24-win32\\data
port = 3306 #生成记录文件位置,同步必须,请勿手动删除,格式位置为 :log-bin=mysql安装路径/log/mysql-bin.log
log-bin=D:\\apps\\mysql-5.6.24-win32\\log\\mysql-bin.log
#服务ID,用于区分服务,范围1~2^32-1,需要与从服务器不同
server_id= 1
#MySQL 磁盘写入策略以及数据安全性
#每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去
innodb_flush_log_at_trx_commit=1 #当sync_binlog =N (N>0) ,MySQL 在每写 N次 二进制日志binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去。
sync_binlog 的默认值是0,像操作系统刷其他文件的机制一样,MySQL不会同步到磁盘中去而是依赖操作系统来刷新binary log。
sync_binlog= 1
#同步数据库,如果多库,就以此格式另写几行即可
binlog-do-db=test
#无需同步的数据库,以下几行基本一样,无需改动
binlog-ignore-db = cluster
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema #mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
#混合模式复制
binlog_format=MIXED
#binlog过期清理时间
expire_logs_days=7
#binlog每个日志文件大小
max_binlog_size=20M
#*********************master my.ini配置文件结束*****************************************
3.重启mysql服务,mysql命令行执行:
show master status;#记录文件名以及紧跟的当前行数数字
4.创建并授权用户,后两个slave分别是用户名和密码
grant replication slave ,replication client on *.* to slave@'192.168.1.128' identified by "slave";
flush privileges; #权限修改立即生效
flush tables with read lock; #锁定数据库为只读,确保备份数据一致性
5.退出mysql命令行,执行备份命令
#备份当前所有数据库,可以参考备份单库
mysqldump -u root -p --all-databases --master-data > dbdump.sql
6.将sql脚本在从服务器执行
7.从服务器启动slave(前提是配置好从服务器)
8.从服务器启动完毕后关闭表锁
unlock tables;
#从服务器的配置
1.停掉slave服务
service mysqld stop
2.修改配置文件:
vim /etc/my.cnf
#从数据库(Slave)配置:
#***********************************slave my.cnf配置开始******************************
#从库日志记录文件位置或名称前缀
log_bin = /var/lib/mysql/mylogbin.log
#同步日志记录的频率,1为每条都记录,安全但效率低
sync_binlog = 1
#server的id,不能与相同id的mysql主从连接
server-id=2
#从库日志忽略的数据库名称,不记录
#这里记录从库的binlog是为了安全,如果觉得没必要,可以去掉从库binlog的配置
binlog-ignore-db = cluster
binlog-ignore-db = mysql
binlog-ignore-db = performance_schema
binlog-ignore-db = information_schema
#此处添加需要同步的数据库名称,那么它会只接收这个数据库的信息,多个数据库需同步按照此格式另写几行即可
#这里同步数据有两种思路,一种是主服务器只发从库需要的,在主库指定;一种是主服务器把所有数据同步过来,从库按需过滤接收
#为了让配置更详细些,此处配置了从库过滤接收的配置
replicate-do-db=test
#忽略接收的库名
replicate-ignore-db = cluster
replicate-ignore-db = mysql
replicate-ignore-db = performance_schema
replicate-ignore-db = information_schema
#跳过所有错误继续
slave-skip-errors=all
#设置延时时间
slave-net-timeout=60 #mysql复制模式,三种:SBR(基于sql语句复制),RBR(基于行的复制),MBR(混合模式复制)
binlog_format=MIXED #混合模式复制
expire_logs_days=7 #binlog过期清理时间
max_binlog_size=20M #binlog每个日志文件大小
#***********************************slave my.cnf配置结束******************************
3.保存退出:wq
4.启动mysqld服务
service mysqld start
5.删除多余数据库,导入数据,删除部分不予演示,sql的位置请自行指定
mysqldump -u root -p < ~/dbdump.sql #这里演示就是上传到了root的根目录,具体请使用“find / -name sql脚本名” 命令查询
6.从服务器指定master
CHANGE MASTER TO
MASTER_HOST='192.168.1.129',
MASTER_USER='slave',
MASTER_PASSWORD='slave',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=;
注:最后两行是之前在主服务器show master status 所记录的数据
如果之前已经启动了一个slave进程,那么以上的命令会失效,并提示stop slave first,所以先stop slave; 然后重试
7.启动slave
start slave;
show slave status\G #注意,没有分号
输出如下,显示两个都为yes即成功,可以测试一下
mysql> show slave status; *************************** . row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.129
Master_User: replication
Master_Port:
Connect_Retry:
Master_Log_File: mysql-bin.
Read_Master_Log_Pos: 593
Relay_Log_File: mysql-relay-log.
Relay_Log_Pos:
Relay_Master_Log_File: mysql-bin.
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno:
Last_Error:
Skip_Counter:
Exec_Master_Log_Pos:
Relay_Log_Space:
Until_Condition: None
Until_Log_File:
Until_Log_Pos:
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master:
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno:
Last_IO_Error:
Last_SQL_Errno:
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id:
"""
8.去主服务器开启表只读锁
unlock tables;
--------------------------------实现部分到此结束--------------------------------------
彻底解除主从复制关系
1)stop slave;
2)reset slave; #或直接删除master.info和relay-log.info这两个文件;
3)修改my.cnf删除主从相关配置参数。
4)Delete FROM user Where User='slave' and Host='192.168.1.128';#删除主服务器配置的连接slave用户
本文参考博文列表:
Mysql主从同步(1)-主从/主主环境部署梳理
MySQL5.7 添加用户、删除用户与授权
mysql设置指定ip访问,用户权限相关操作
win7下mysql5.6与centos下mysql5.6主从复制
mysql5.6 主从复制同步详细配置(图文)
MySQL5.6 数据库主从(Master/Slave)同步安装与配置详解
centos 7下mysql5.7 主从数据库同步配置
MySql 5.7.18 数据库主从(Master/Slave)同步安装与配置详解
mysql从库Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Could not find first log file name in binary log index file'报错处理
【MySQL】Last_IO_Errno: 1593 server-uuid重复导致slave报错
【MySQL】MySQL5.6数据库基于binlog主从(Master/Slave)同步安装与配置详解
Window 下mysql binlog开启及查看,mysqlbinlog
mysql主从复制-CHANGE MASTER TO 语法详解
[trouble] error connecting to master 'repl@192.168.1.107:3306' - retry-time: 60 retries: 86400
【实操笔记】MySQL主从同步功能实现的更多相关文章
- MySQL主从同步、读写分离配置步骤、问题解决笔记
MySQL主从同步.读写分离配置步骤.问题解决笔记 根据要求配置MySQL主从备份.读写分离,结合网上的文档,对搭建的步骤和出现的问题以及解决的过程做了如下笔记: 现在使用的两台服务器已经 ...
- MySql主从同步笔记
1.MySql主从同步是基于二进制日志实现的,二进制日志记录了主服务器数据库的所有变动,从服务器通过读取和执行该日志文件保持和主数据库的数据一致: 2.配置主服务器 a.开启二进制日志,找到MySql ...
- Mysql主从同步(复制)
目录: mysql主从同步定义 主从同步机制 配置主从同步 配置主服务器 配置从服务器 使用主从同步来备份 使用mysqldump来备份 备份原始文件 ...
- mysql主从同步+mycat读写分离+.NET程序连接mycat代理
背景 最近新项目需要用到mysql数据库,并且由于数据量大的原因,故打算采用1主1从(主数据库负责增.删.改操作:从数据库负责查操作)的数据库架构,在实现主从之后还要实现读写分离的代理,在网上搜寻了很 ...
- Mysql主从同步(复制)(转)
文章转自:https://www.cnblogs.com/kylinlin/p/5258719.html 目录: mysql主从同步定义 主从同步机制 配置主从同步 配置主服务器 配置从服务器 使用主 ...
- windows 系统本地做mysql 主从同步,最后面解决主从同步库名不一致,表结构一致
原文:windows 系统本地做mysql 主从同步,最后面解决主从同步库名不一致,表结构一致 mysql主从同步的好处以及原理 之前看到很多新闻说某某的服务器奔溃,磁盘碎了,导致数据丢失 ...
- mysql主从同步(3)-percona-toolkit工具(数据一致性监测、延迟监控)使用梳理
转自:http://www.cnblogs.com/kevingrace/p/6261091.html 在mysql工作中接触最多的就是mysql replication mysql在复制方面还是会有 ...
- 监控mysql主从同步状态
在高并发网站架构中,MySQL数据库主从同步是不可或缺的,不过经常会发生由于网络原因或者操作错误,MySQL主从经常会出现不同步的情况,那么如何监控MySQL主从同步,也变成网站正常运行的重要环节. ...
- mysql主从同步(2)-问题梳理
之前详细介绍了Mysql主从复制的原理和部署过程,在mysql同步过程中会出现很多问题,导致数据同步异常.以下梳理了几种主从同步中可能存在的问题:1)slave运行过慢不能与master同步,也就是M ...
随机推荐
- VMWare之——宿主机与虚拟机互相ping通,宿主机ping通另一台机器的虚拟机
版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处:http://blog.csdn.NET/l1028386804/article/details/52267554 今天给大家带来 ...
- 【硬件】- 英特尔CPU命名中的产品线后缀
产品线后缀是CPU命名体系里最复杂最难懂的,在英特尔冗长的产品线中,CPU的后缀也是千变万化.不带后缀的CPU一般就是最普通的桌面级处理器,不管是性能还是价格都比较中庸,比如当前性价比较高的Core ...
- net user 修改密码的坑
不多说 直接上图 自己偷懒修改 admin的密码.. 结果没注意 这个地方 能够输入全角字符. 造成密码 实质上是全角的 标点符号 ... 以后一定注意一些. 里面的坑..说多了 都是浪费时间 另外 ...
- 在Google Chrome中快速解除网页屏蔽鼠标右键、复制等限制
第一步,将书签栏设置为显示状态! 第二步,添加新书签——>在标签栏点击右键,选择“添加网页”. 第三步,设置新书签的内容. 1.起名.这个凭个人爱好吧 2.网址栏输入: javascript ...
- 错误“AxImp.exe”已退出,代码为 -1163019603【转载及个人看法】
http://blog.csdn.net/duguduchong/article/details/17166123 最近使用vs2010 在重新生成解决方案的时候出现 “AxImp.exe”已退出, ...
- SpringMVC 之 mvc:exclude-mapping 不拦截某个请求
在使用 SpringMVC 是,配置了一个 Session 拦截器,用于拦截用户是否登录,但是用户访问登录页面和注册页面时就不需要拦截了,这时就需要用到这个标签了 <mvc:execlude-m ...
- 程序集里包含多个版本dll引用 ,强制低版本到制定版本dll引用
在 config 的 <configuration> 节点内加入以下 类似信息 以下是以Newtonsoft.Json 为例子 <runtime> <assemblyBi ...
- how to show video in website
how to show video in website old version browsers https://www.computerhope.com/issues/ch000591.htm h ...
- 卸载Visual Studio最佳方法难道真的是重装系统?
卸载Visual Studio最佳方法难道真的是重装系统? 卸载Visual Studio最佳方法难道真的是重装系统? 使用TotalUninstaller貌似也没有效果,默认卸载的,程序列表里面还是 ...
- UVALive3713_Astronauts
有n个宇航员,根据年龄限制,所有宇航员只能从事A或B中的一种任务,所有人都可以从事C的任务.有的宇航员之间相互讨厌,不能分在一组,求出一种满足条件的分配方案. 2sat.mark[]中i+i和i+i+ ...