本人亲测,windows作为mysql主服务器,linux作为从服务器,使用两个linux配置步骤都一样,测一遍而已;区别配置文件在于windwos是my.ini。linux在/etc/my.cof

主从复制的原理是b+tree,具体的去百度;主服务器master,启用二进制日志,所有操作在这个日志中记录着,从服务器slave从主服务器中读取二进制日志,然后将所有主服务器的操作全部执行一遍,以此来实现同步内容;

主从配置:为了将mysql的数据库分不到多个系统中,最简单的实现方式就是复制了。而mysql内建有一种复制方式,即指定一台或多台服务器为主机master,另外一台或多台服务器作为从机slave。当master存在更新的时候,master将更新写入二进制文件,并维护了一个索引文件跟踪日志。当slave连接到主服务器之后,slave会通知master进行同步,master通过索引找日志文件上一次同步的位置,然后将这段时间内的更新数据发送给slave进行同步。

为了方便演示,采用单主单从的主从配置,单主多从的配置原理一样。双主配置能很好地避免主服务器的宕机情况,配置比较复杂,下次有空演示。

Windows配置
测试环境
  windows 7,mysql 5.6.42,为了避免因为版本不一致带来的麻烦,主从数据库用同一版本数据库库
  主机ip:192.168.1.109  从机ip:192.168.1.169
准备条件
(1)关闭防火墙
(2)保证两台主机的mysql远程连接开启(必须)
(3)3306端口(数据库端口号,不固定,按自己的配置去确定)是否公开
(4)在主机和从机上创建test数据库

主机配置

(1)在mysql的安装文件夹中找到mysql.ini文件,在该文件的mysqld标签下添加以下属性(还有其他很多属性可以自行了解):

#=========主从复制关键配置=====================
server_id=1 #主库和从库需要不一致,配一个唯一的ID编号,1至32。 手动设定
log-bin=D:\phpStudy\PHPTutorial\MySQL\mysql-bin #二进制文件存放路径,存放在根目录data
#binlog-do-db=test #需要复制的库,多个库用逗号隔开,如果此项不配置所有主库都参与复制
#binlog-ignore-db=mysql #不需要复制的库,和上项同理;也可以直接设置哪些数据库不同步
#=========主从复制关键配置=====================

注意:mysql binlog_do_db参数设置的坑

在配置文件中想当然地配置成binlog_do_db=test,xx,jj,以为是三个库。结果无论什么操作都没有binlog产生
原因
mysql内部将“test,xx,jj”当成一个数据库了,结果因为我们没有这个db,自然就啥binlog都没写入了。
处理方法
正确的配置方法应该是这样
binlog_do_db=test
binlog_do_db=xx
binlog_do_db=jj
两种设置方法在show master status结果显示是完全一致的,也不报错,其他的过滤参数设置方法应该差不多,这真是太坑了!

配置完成后重启mysql,这时候会在这个时候在D:\phpStudy\PHPTutorial\MySQL\下会看到mysql-bin.index和mysql-bin.00001两个文件,很明显前面的文件时索引文件,用以记录第二个文件,第二个是二进制的日志文件,该文件每次重启数据库均会产生新的日志文件,这些日志文件的索引被以文件名为索引的索引文件所维护,在索引文件中可以看到所有日志文件的坐标。

保存,重启主库

进入mysql;mysql-u root -proot

登录主服务器创建从服务器用到的账户和权限:

grant replication slave on *.* to 'username' @'192.168.1.%' identified by '123456';
flush privileges; //刷新权限

(192.168.0.%通配符(这里是写从库的ip地址),表示0-255的IP都可访问主服务器,正式环境请配置指定从服务器IP,username/pwd自己设置(设置从库的用户名username,密码是))

(解释一下:grant replication slave,reload,super on *.*  to congku@192.168.1.244  identified by '123456';
这条语句意思是给ip为192.168.1.244(从机ip)的远程服务器配置登录名是congku,密码是123456,并赋予slave,super,reload权限)

退出mysql,重启mysql: service mysqld restart

show master status; # 查出主机的file和postin在从机配置中需要使用,记住即可。

可以看出已经产生了二进制的日志文件信息,mysql的同步就是通过这个二进制日志文件进行同步,主数据库把    对数据库的操作的指令都记录到该日志文件下,从数据库通过读取该文件,来对从数据库中的数据进行修改,    从而达到主从同步的效果。

致此,主机配置完成。

从库配置

同样编辑/etc/my.cnf文件,把server-id修改一下

#========主从复制关键配置======================
server_id=6 #主库和从库需要不一致

#binlog-do-db=test #和主库说明一致

#binlog-ignore-db=mysql #和主库说明一致

relay_log = mysql-relay-bin

理解:relay log很多方面都跟binary log差不多,区别是:从服务器I/O线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后SQL线程会读取relay-log日志的内容并应用到从服务器。

#========主从复制关键配置======================
重启数据库

进入从库的mysql:mysql -uroot -p 执行以下命令

stop slave;

MySQL [(none)]> change master to
-> master_host='192.168.1.109',
-> master_port=3306,
-> master_user='username',
-> master_password='123456',
-> master_log_file='mysql-bin.000005',
-> master_log_pos=602;

MySQL [(none)]> start slave; //OK没问题的话,开启监听。

解释:

change master to
master_host='192.168.0.109', #主库地址
master_port=3306, #端口
master_user='username', #在上面 grant replication 设置的从库的用户名
master_password='123456', #在上面 grant replication 设置的从库的密码
master_log_file='master-bin.000005', #从主库查出来的二进制文件名 (上面主库状态,图片中的File)
master_log_pos=602; #从主库查出来的Position(上面主库状态,图片中的Position)

MySQL [(none)]> show slave status\G; //查看状态
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.1.109
Master_User: username
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000005
Read_Master_Log_Pos: 602
Relay_Log_File: mysql-relay-bin.000002
Relay_Log_Pos: 283
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running:
yes //标红的这两项是yes才算是成功
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1146

然后在主服务器做相应的Mysql增删改,同样再查看一下从服务器的数据,都发生了相应的变化~

主从配置完成;

因为主库在原来的表中进行了添加操作,结果从库没有反应,后来查看slave状态发现Slave_SQL_Running: No了;

主从复制-从机Slave_SQL_Running: No

我们可以明显的发现,我们的sql线程已经挂掉了。

导致这个问题的原因是因为由于数据的不同步,导致我们在执行主从同步的时候出现了执行不了的sql,导致从机事务回滚了,所以sql的进程就被关闭了,常见的这个问题的出现方式:

在从机上进行了写操作(非双机热备情况下)。
slave机器重启,事务回滚。
各种原因导致的数据不同步。
解决办法1:

mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
这个解决的是因为事务的原因导致的sql进程停止。

解决办法2:

停止从机服务:stop slave;

然后在主机上查看binlog文件的位置:show master status;

+----------------------+--------------+---------------+------------------+
| File                      | Position   | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+--------------+---------------+-------------------+
| XXX-bin.000004 | 33622483 |                   |                      | 
+----------------------+---------------+--------------+------------------+

然后重新手动同步:

mysql> change master to 
> master_host='master_ip',
> master_user='user', 
> master_password='pwd', 
> master_port=3306, 
> master_log_file=‘XXX-bin.000004’, 
> master_log_pos=33622483 ;

然后启动从服务:start slave;

总结

要不就查看是否和主服务器断开了binlog的同步,要不就看是否是因为事务问题导致的数据不一致。

mysql主从复制亲测,以及注意事项的更多相关文章

  1. mysql explain亲测

    mysql explain亲测 1 where后面字段加索引:数据库类型如果是字符串类型 查询where的时候必须要用 字符串 类型必须一致 否则不用索引 type还是会是all的 ps:如果wher ...

  2. 转载:MySQL:亲测备份策略实例(线上真实备份案例)

    是否为线上库的备份而烦恼过,这里提供一个完整的备份从属数据库的备份方案,亲测可用 说明: 备份从库,按周计,每周进行一次全备 每周一的早上六点进行全备,其他时间备份中继日志 在从库上启用rsync服务 ...

  3. MySQL主从复制的原理和注意事项都在这儿了!!

    写在前面 最近在写Mycat专题,由于不少小伙伴最近要出去面试,问我能不能简单写下MySQL的主从复制原理和注意事项,因为在之前的面试中被问到了这些问题.我:可以啊,安排上了!! 主从复制原理 (1) ...

  4. 【MySQL】亲测可用的教程筛选:安装与卸载

    windows版本的 安装看这篇,非常详细:https://www.cnblogs.com/winton-nfs/p/11524007.html 彻底清除:https://www.pianshen.c ...

  5. Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效)

    Navicat 12 for MySQL最新版激活(注册机)(转)(亲测有效) 一.总结 一句话总结: 1.卸载自己机器上面的Navicat,安装下载的包里面的Navicat安装包,不然可能不行 2. ...

  6. 阿里云服务器centos7,docker部署mysql+Redis+vue+springboot+Nginx+fastdfs,亲测可用

    一.购买云服务器 我是今年双十一期间在阿里云购买的服务器, 简单配置2核_4G_40G_3M,三年用了不到800块,不过当时我记得腾讯云更便宜,个人感觉,阿里的云服务器更加的稳定, 毕竟身经百战, 经 ...

  7. nginx代理https站点(亲测)

    nginx代理https站点(亲测) 首先,我相信大家已经搞定了nginx正常代理http站点的方法,下面重点介绍代理https站点的配置方法,以及注意事项,因为目前大部分站点有转换https的需要所 ...

  8. MySQL主从复制原理及配置详细过程以及主从复制集群自动化部署的实现

    一.复制概述 Mysql内建的复制功能是构建大型,高性能应用程序的基础.将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重 ...

  9. 基于Docker的Mysql主从复制

    基于Docker的Mysql主从复制搭建 为什么基于Docker搭建? 资源有限 虚拟机搭建对机器配置有要求,并且安装mysql步骤繁琐 一台机器上可以运行多个Docker容器 Docker容器之间相 ...

随机推荐

  1. JS 格林威治时间格式(GMT)格式化

    Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month & ...

  2. NPOI导出Excel及使用问题

    NPOI导出Excel及使用问题 因为最近公司质管部门提出了一个统计报表的需求:要求导出一个2016及2017年度深圳区域的所有供应商的费用成本计算--一个22列的Excel表,其中还包括多列的合并单 ...

  3. 【Java并发编程】1、ConcurrentHashMap原理分析

    集合是编程中最常用的数据结构.而谈到并发,几乎总是离不开集合这类高级数据结构的支持.比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap).这篇文章主 ...

  4. java多线程——线程池源码分析(一)

    本文首发于cdream的个人博客,点击获得更好的阅读体验! 欢迎转载,转载请注明出处. 通常应用多线程技术时,我们并不会直接创建一个线程,因为系统启动一个新线程的成本是比较高的,涉及与操作系统的交互, ...

  5. Contemplation! Algebra(矩阵快速幂,uva10655)

    Problem EContemplation! AlgebraInput: Standard Input Output: Standard Output Time Limit: 1 Second Gi ...

  6. Hadoop HDFS 的 HttpFS

    参考 Hadoop权威指南 第3章中3.4节 背景 要写一个操作HDFS的web后台(文件CRUD),虽然可以直接使用HDFS提供的FileSystem类然后通过get方法获取到一个Distribut ...

  7. div阴影

    .box-shadow{ //Firefox4.0- -moz-box-shadow:投影方式 X轴偏移量 Y轴偏移量阴影模糊半径 阴影扩展半径 阴影颜色; //Safariand Google ch ...

  8. jQuery中hover方法和toggle方法使用指南

    jQuery提供一些方法(如:toggle)将两种事件效果合并到一起,比如:mouseover.mouseout:keyup.keydown等 1.hover函数 hover(over,out)一个模 ...

  9. [基础架构]PeopleSoft Tuxedo 重要文件说明

    我们都知道PeopleSoft是由几个不同的服务组成的,他们在PeopleSoft体系结构中扮演着自己的角色.这些服务具有不同的文件结构并包含重要的可执行文件和配置文件. 以下是Peoplesoft体 ...

  10. 葡萄城报表 SP2 新特性(1)— 单元格智能合并

    中国式复杂报表的布局,因为数据的动态性和结构性,导致其布局往往是无规律,且在设计时无法预测的,如单元格合并,通常不仅希望在每一列的数据展现中,能够根据需要自动将相同的单元格合并,且每个单元格之间该属性 ...