http://www.cnblogs.com/YingYue/p/7677814.html

说明:两台MySQL服务器都是使用CentOS6.5系统,MySQL版本为mysql-5.7.17

MySQL一主一被实现主从复制

注意:写包括insert,delete,update 操作;读只有select其他操作由主master的二进制文件决定。

一.在192.168.42.128上安装MySQL(主库)

开启账号root的远程登录权限,过程:略

配置主服务器的my.cnf 文件 并重启(开启二进制文件等)

##------------------------------------------周建旭2017年3月6日 12:40:10添加------------------------------------## # server-id 唯一的服务辨识号,数值位于 1 到 2^32-1之间.
# # 此值在master和slave上都需要设置.
# # 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = 1 #[必须]服务器唯一ID,默认是1##------------------------------------------master上的配置开始------------------------------------------------##
#                                                                                                              #
# # log-bin 打开二进制日志功能.                                                                                #
# # 在复制(replication)配置中,作为MASTER主服务器必须打开此项                                                   #
# # 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.                                       #
log-bin = mysql-bin #[必须]启用二进制日志                                                                      #
# # 需要开启生成二进制日志记录相关配置,配置在需要被复制的服务器上,即:master                                 #
binlog-do-db = test_db #指定对名称为test_db的数据库记录二进制日志                                              #
binlog-ignore-db = mysql #指定不对名称为mysql的数据库记录二进制日志                                            #
binlog-ignore-db = information_schema #指定不对名称为information_schema的数据库记录二进制日志                  #
binlog_format = mixed #binlog日志格式,mysql默认采用,如果从服务器slave有别的slave要复制那么该slave也需要这一项#
expire_logs_days = 7 #超过7天的binlog删除###                                                                   #
#                                                                                                              #
##-------------------------------------------master上的配置开始-----------------------------------------------####-------------------------------------------slave上的配置开始------------------------------------------------##
#                                                                                                              #
# # replicate-do-db 需要做复制的数据库,如果复制多个数据库,重复设置这选项即可master上不需要此项,slave上需要   #
#replicate-do-db = test_db #复制名称为test_db的数据库                                                          #
# # replicate-ignore-db 不需要复制的数据库,如果要忽略复制多个数据库,重复设置这个选项即可                     #
#replicate-ignore-db = mysql #不需要(忽略)复制名称为mysql的数据库                                            #
#replicate-ignore-db = information_schema #不需要(忽略)复制名称为information_schema的数据库                  #
#                                                                                                              #
# 如果你在使用链式从服务器结构的复制模式 (A->B->C),                                                            #
# # 你需要在服务器B上打开此项.                                                                                 #
# # 此选项打开在从线程上重做过的更新的日志,                                                                    #
# # 并将其写入从服务器的二进制日志.                                                                            #
# # 默认值为OFF;设置log_slave_updates = 1即表示开启                                                            #
#log_slave_updates = 1                                                                                         #
#                                                                                                              #
##------------------------------------------slave上的配置结束-------------------------------------------------##skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启
default-storage-engine = InnoDB #默认存储引擎
lower_case_table_names = 1 #忽略表大小写##------------------------------------------周建旭2017年3月6日 12:40:10添加------------------------------------#

截图

注意:

binlog-do-db = 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
binlog-ignore-db = 不需要复制的数据库库名,如果复制多个数据库,重复设置这个选项即可

二.在192.168.42.129 上安装MySQL(备库)

创建用户yingyue 授权可以远程登录和本地登录,拥有该实例所有数据库的权限。过程:略

配置slave服务器的my.cnf 文件 并重启(配置slave对master的二进制文件复制)

##------------------------------------------周建旭2017年3月6日 12:40:10添加------------------------------------## # server-id 唯一的服务辨识号,数值位于 1 到 2^32-1之间.
# # 此值在master和slave上都需要设置.
# # 如果 “master-host” 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.
server-id = 2 #[必须]服务器唯一ID,默认是1##------------------------------------------master上的配置开始------------------------------------------------##
#                                                                                                              #
# # log-bin 打开二进制日志功能.                                                                                #
# # 在复制(replication)配置中,作为MASTER主服务器必须打开此项                                                   #
# # 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.                                       #
#log-bin = mysql-bin #[必须]启用二进制日志                                                                     #
# # 需要开启生成二进制日志记录相关配置,配置在需要被复制的服务器上,即:master                                 #
#binlog-do-db = test_db #指定对名称为test_db的数据库记录二进制日志                                             #
#binlog-ignore-db = mysql #指定不对名称为mysql的数据库记录二进制日志                                           #
#binlog-ignore-db = information_schema #指定不对名称为information_schema的数据库记录二进制日志                 #
#binlog_format = mixed #binlog日志格式,mysql默认采用,如果从服务器slave有别的slave要复制那么该slave也需要该项 #
#expire_logs_days = 7 #超过7天的binlog删除###                                                                  #
#                                                                                                              #
##-------------------------------------------master上的配置开始-----------------------------------------------####-------------------------------------------slave上的配置开始------------------------------------------------##
#                                                                                                              #
# # replicate-do-db 需要做复制的数据库,如果复制多个数据库,重复设置这选项即可master上不需要此项,slave上需要   #
replicate-do-db = test_db #复制名称为test_db的数据库                                                           #
# # replicate-ignore-db 不需要复制的数据库,如果要忽略复制多个数据库,重复设置这个选项即可                     #
replicate-ignore-db = mysql #不需要(忽略)复制名称为mysql的数据库                                             #
replicate-ignore-db = information_schema #不需要(忽略)复制名称为information_schema的数据库                   #
#                                                                                                              #
# 如果你在使用链式从服务器结构的复制模式 (A->B->C),                                                            #
# # 你需要在服务器B上打开此项.                                                                                 #
# # 此选项打开在从线程上重做过的更新的日志,                                                                    #
# # 并将其写入从服务器的二进制日志.                                                                            #
# # 默认值为OFF;设置log_slave_updates = 1即表示开启                                                            #
#log_slave_updates = 1                                                                                         #
#                                                                                                              #
##------------------------------------------slave上的配置结束-------------------------------------------------##skip-external-locking #MySQL选项以避免外部锁定。该选项默认开启
default-storage-engine = InnoDB #默认存储引擎
lower_case_table_names = 1 #忽略表大小写###------------------------------------------周建旭2017年3月6日 12:40:10添加------------------------------------#

截图

注意:

replicate-do-db = 需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可
replicate-ignore-db = 不需要复制的数据库名,如果复制多个数据库,重复设置这个选项即可

三.连接(我使用的是sqlyog)192.168.42.128服务器上的MySQL(主)

show master status; /*!查看主master的状态,如果没有数据,需要在my.cnf 中配置*/

注意:show master status; 只有在my.cnf中配置了log-bin开启生成数据库二进制记录才会显示数据

grant replication slave on *.* to 'yingyue'@'%'; /*!给ip地址为所有(%表示任何ip)MySQL服务器上的 盈月 授权对该master的复制权限*/

flush privileges; /*!刷新权限*/

四.连接 (我使用的是sqlyog)192.168.42.129 服务器上的MySQL(从)

show slave status; /*!查看该slave的状态,只有该slave执行命令start slave; 后才有显示记录*/

停止从服务器

stop slave;
重置从服务器
reset slave;
从服务器关联到主服务器
change master to master_user='root', master_password='a19911008', master_host='192.168.42.128',master_port=3306, master_log_file='mysql-bin.000002',master_log_pos=519;
注意:上面的关联配置的信息都是主服务器上的,但是要在slave从服务器上配置,如果master_log_file和master_log_pos不知道可以在master服务器(192。168.42.128)上使用show master status;查看

执行成功!
开启从服务器start slave;

查看从服务器连接状态show slave status\G /*!不加分号*/

Sqlyog不支持\解析不了sql可以使用命令行来查看

使用账号:yingyue 进行远程登录到192.168.42.129 上

全部信息如下:

Microsoft Windows [版本 6.1.7601]版权所有 (c) 2009 Microsoft Corporation。保留所有权利。C:\Users\Administrator>mysql -h192.168.42.129 -uyingyue -p000000Welcome to the MySQL monitor.  Commands end with ; or \g.Your MySQL connection id is 20Server version: 5.7.17-log Source distributionType 'help;' or '\h' for help. Type '\c' to clear the buffer.mysql> show slave status\G*************************** 1. row ***************************Slave_IO_State: Waiting for master to send eventMaster_Host: 192.168.42.128Master_User: rootMaster_Port: 3306Connect_Retry: 60Master_Log_File: mysql-bin.000002Read_Master_Log_Pos: 519Relay_Log_File: localhost-relay-bin.000002Relay_Log_Pos: 320Relay_Master_Log_File: mysql-bin.000002Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: test_dbReplicate_Ignore_DB:Replicate_Do_Table:Replicate_Ignore_Table:Replicate_Wild_Do_Table:Replicate_Wild_Ignore_Table:Last_Errno: 0Last_Error:Skip_Counter: 0Exec_Master_Log_Pos: 519Relay_Log_Space: 531Until_Condition: NoneUntil_Log_File:Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File:Master_SSL_CA_Path:Master_SSL_Cert:Master_SSL_Cipher:Master_SSL_Key:Seconds_Behind_Master: 0Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error:Last_SQL_Errno: 0Last_SQL_Error:Replicate_Ignore_Server_Ids:Master_Server_Id: 1Master_UUID: a70b33cb-ff4a-11e6-9fdc-000c29589bddMaster_Info_File: /usr/local/mysql-5.7.17/data/master.infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Slave has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind:Last_IO_Error_Timestamp:Last_SQL_Error_Timestamp:Master_SSL_Crl:Master_SSL_Crlpath:Retrieved_Gtid_Set:Executed_Gtid_Set:Auto_Position: 0Replicate_Rewrite_DB:Channel_Name:Master_TLS_Version:
row in set (0.00 sec)mysql>

是否成功就看

Slave_IO_Running: Yes 
Slave_SQL_Running: Yes

是否都为Yes

如果有出现以上结果,则配置成功!

Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates

表示:从服务器已经读到了所有的主服务器库的二进制日志,随时待命复制;

下面来测试一下主从复制

测试描述:

DDL语句测试

在服务器192.168.42.128 的 test_db库中新建 country表,看看从服务器192.168.42.129的test_db中是否会自动同步复制country表,如果可以,则表明主从复制成功;

执行 create table country(id int not null primary key auto_increment, name varchar(100));

看看从服务器192.168.42.129 上从库test_db是否会自动同步country表

没问题

下面来删除主192.68.42.128上主库test_db的country表

看看192.168.42.129 上的从库的情况

也是可以的,没问题,现在再重新创建表country 下面测试需要使用(在主库中创建)

DML语句测试(包括insert, delete,update)

在192.168.42.128的主库test_db上执行insert into country values(1, '南非'),(2,'瑞典'),(3,'哥斯达黎加'),(4,'新西兰'),(5,'中国'),(6,'希腊') ,(7,'意大利'),(8,'苏格兰') ,(9,'冰岛') ,(10,'委内瑞拉') ,(11,'比利时');

查看192.168.42.129的test_db从库的country表是否多了11条记录

没问题。

在192.168.42.128的主库test_db上执行update country set name='中华人民共和国' where id = 5;

查看192.168.42.129的test_db从库的country表

没问题。

在192.168.42.128的主库test_db上执行 delete from country where id = 11;

查看192.168.42.129的test_db从库的country表,最后一个 ‘比利时’应该没了

没问题。

读写分离(主库写, 从库读)

读写分离使用的中间件为mycat

安装mycat 过程略

官方参考文档:

配置mycat环境变量 略:

注意防火墙开启8066 和9066 端口

修改server.xml文件

编辑server.xml文件(读写分离这些就够了,多了碍眼)

<?xml version="1.0" encoding="UTF-8"?><!-- - - Licensed under the Apache License, Version 2.0 (the "License");- you may not use this file except in compliance with the License. - Youmay obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0- - Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, - WITHOUTWARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See theLicense for the specific language governing permissions and - limitationsunder the License. --><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://io.mycat/"><system><property name="useSqlStat">1</property>  <!-- 1为开启实时统计、0为关闭 --></system><user name="root"><property name="password">a19911008</property><property name="schemas">TESTDB</property></user><user name="yingyue"><property name="password">000000</property><property name="schemas">TESTDB</property></user></mycat:server>

配置schema.xml文件 vi conf/schema.xml

<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"><schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema><dataNode name="dn1" dataHost="localhost1" database="test_db" /><dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="192.168.42.128:3306" user="root" password="a19911008"><!-- can have multi read hosts --><readHost host="hostS2" url="192.168.42.129:3306" user="yingyue" password="000000" /></writeHost></dataHost></mycat:schema>

启动mycat 进入mycat安装怒目执行/bin/mycat start 或 /bin/mycat console

如下启动完成

使用mycat作为代理连接MySQL数据库

yingyue是192.168.42.129上的MySQL用户为什么可以连接到192.168.42.128的MySQL呢?因为在刚才的mycat的server.xml中配置了,相当于代理

参数解释

C:\Users\Administrator>mysql -h192.168.42.128 -uyingyue -p000000 -P8066 -DTESTDB

其中8066是mycat的监听端口,类似于mysql的3306端口,其中-u,-p,-h分别是用户名,密码和主机,-P是mycat端口 -D是连接的逻辑库。至于为什么是这些,这个跟mycat的server.xmlschema.xml配置文件有关。

在命令行中执行explain select * from country;

看到数据是从dn1节点查的。

插入一条数据

下面来看看mycat监控日志

从日志看到最终被插入到192.168.42.128的MySQL的test_db的country中

看一下主库是否有添加的数据

果然有,说明读写分离成功! 然后从库192.168.42.129中的test_db会复制这条数据

没问题的,读写分离也是成功的。

题外话:之前以为mycat可以实现主从库数据复制,原来是不可以的,看看下面,其实mycat就是代理实现了主从库的读写分离。总结:主从复制与读写分离无关,主从复制是MySQL的,读写分离是Mycat的。

--------------------------------------------------------------------------------------------------

高级篇

MySQL的slave断了怎么办?

如下图:

这个错是我故意弄的,因为192.168.42.128上的test_db是很早前就建的库并且里面有account表,但是192.168.42.128上的MySQL我今天重启过,每次重启二进制日志文件log-bin都不相同,在上次的文件版本上加一所以是mysql-bin.000002, 但是192.168.42.129服务器上的MySQL的是我今天重新关联的,关联的是mysql-bin.000002这个二进制日志文件,这个文件中没有记录account表的创建和插入数据记录。但是在我在主从复制正常的情况下在主服务器上将account删掉,这时删除的记录会记录到mysql-bin.000002的二进制日志文件中,然后slave服务器的MySQL会复制master的日志然后执行日志,slave上的test_db没有account表删除肯定报错;

解决方案:

mysql> stop slave;

Query OK, 0 rows affected (0.01 sec)

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

Query OK, 0 rows affected (0.00 sec)

mysql> start slave;

Query OK, 0 rows affected (0.01 sec)

解释:

set GLOBAL SQL_SLAVE_SKIP_COUNTER=1; 表示 跳过一个事物

查看从库及其日志,已经开始正常复制
说明:今天发现最后一步不用做,设置完set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;后,开启slave后,该值自动变为0了。

------------------------------------------------------------------------------------------------------

延伸:

mysql主从错误断开 怎样恢复

mysql主从同步常见异常及恢复方法

1. 一般的异常只需要跳过一步即可恢复

mysql> stop slave;

mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;

mysql> slave start;

2.断电导致主从不能同步时,通主库的最后一个bin-log日志进行恢复

在主库服务器上,mysqlbinlog mysql-bin.xxxx > binxxxx.txt

tail -n 100000  binxxxx.txt > tail-binxxxx.txt

vim tail-binxxxx.txt 打开tail-binxxxx.txt文件找到最后一个postion值

然后在从库上,change host to 相应正确的值

mysql> stop slave;

mysql> change master to master_host='ip', master_user='username', master_password='password', master_log_file='mysql-bin.xxxx', master_log_pos=xxxx;

mysql> slave start;

mysql> show slave status\G

3.主键冲突、表已存在等错误代码如1062,1032,1060等,可以在mysql主配置文件my.cnf或my.ini文件指定

略过此类异常并继续下条sql同步,这样也可以避免很多主从同步的异常中断

[mysqld]

slave-skip-errors = 1062,1032,1060

-------------------------------------

从理想角度看,主从数据库应该无故障的运转下去,可以有时候还是会出现一些莫名其妙的问题,比如说即便从未在从服务器上手动更新过数据,但还是可能遇到“Error: 1062 Duplicate entry”错误,具体原因不详,可能是MySQL本身的问题。遇到这类问题的时候,从服务器会停止复制操作,我们只能手动解决问题,具体的操作步骤如下:
mysql> stop slave;
mysql> set global sql_slave_skip_counter = 1;
mysql> start slave;

同样的操作可能需要进行多次,也可以设置自动处理此类操作,格式:slave-skip-errors = 错误代码

在从服务器的my.cnf里设置:
slave-skip-errors = 1062

标签: 数据库

转载于:https://www.cnblogs.com/kelelipeng/p/10346276.html

MySQL主从复制 + Mycat实现读写分离相关推荐

  1. mysql主从复制中间件_linux下mysql主从复制(第二篇读写分离) mycat 中间件

    linux下mysql主从复制(第二篇读写分离) mycat 中间件 接着上篇文档补全,mysql 读写分离,在上篇文章案例下准备好Mycat-server-1.4-release-201510192 ...

  2. MySQL 案例实战--MySQL 基于Mycat实现读写分离

    MySQL 基于Mycat实现读写分离 前言 一.什么是读写分离? 二.MySQL 读写分离解决方案 三.MySQL 基于Mycat实现读写分离 四.Mycat-web 管理部署 前言 本环境是基于 ...

  3. Mysql主从复制搭建 与读写分离

    Mysql主从复制搭建 准备条件 Master-Server 配置 修改配置 重启Mysql 配置主从复制账户 Slave-Server 配置 修改配置 重启Mysql 配置Master信息开启主从复 ...

  4. mysql 与 mycat集成读写分离

    1,先说下同步数据库原理,其实很简单.就是在主库做数据库操作的时候,会生成一个本地日志,日志会在my.ini当中配置看图一,读库会实时去扫描日志,如果有更新就直接在读库执行. 这个是主库my.ini配 ...

  5. 运维之道 | Mysql主从复制+mycat读写分离

    运维之道 | Mysql主从复制 + Mycat读写分离 1.什么是读写分离 读写分离,基本的原理是让主数据库处理事务性增.删.改操作(INSERT.UPDATE.DROP),而从数据库处理SELEC ...

  6. mysql双机热备 读写分离_MySQL——主从复制与读写分离

    什么是主从复制 主从复制是用来建立一个和主数据库完全一样的数据库环境,称为从数据库:主数据库一般是准实时的业务数据库. 主从复制的作用 1.做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到 ...

  7. MySQL 集群(三):MySQL + Mycat 实现读写分离,主备切换集群

    MySQL 集群(三):MySQL + Mycat 实现读写分离,主从切换集群 下载 Mycat Mycat 主要文件 端口 Mycat 命令 配置文件 server.xml schema.xml 配 ...

  8. MySql高可用搭建 + 读写分离 + 分库分表

    Mysql读写分离与分库分表 一.Mysql读写分离解决的问题 二.mysql处理请求运行流程 三.读写分离结构 四.读写分离产生场景 五.读写分离工具 5.1 MyCat 5.2 HAProxy 5 ...

  9. MySQL高可用和读写分离

    MySQL 高可用和读写分离 文章目录 MySQL 高可用和读写分离 一.从单机到集群 1.1 单机MySQL数据库到几个问题 1.2 单机MySQL到技术演进 二.MySQL的主从复制 2.1 核心 ...

  10. SpringBoot 整合 MyCat 实现读写分离

    作者:颜不喜 cnblogs.com/muycode/p/12603037.html MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量 ...

最新文章

  1. python3菜鸟教程中文-Python3 日期和时间
  2. 电脑软件:5个实用的Windows软件,大幅度提高你的工作效率!
  3. RHEL5下DNS配置详解3
  4. IPv6 解说 ,与IPv4的同异
  5. 折弯弹性计算公式_冲压模具:影响回弹因素、回弹计算公式计算,值得收藏
  6. php弱类型漏洞,php代码审计之弱类型引发的灾难
  7. 【算法】剑指 Offer 52. 两个链表的第一个公共节点
  8. 3-1-Servlet技术
  9. 手势三连拍是什么软件_超全的摆拍姿势,摆姿困难用户一定要学!
  10. war压缩命令_ubuntu/linux下打包压缩war、解压war包和jar命令
  11. 深度学习:GAN 对抗网络原理详细解析(零基础必看)
  12. 普物期末题型总结题解
  13. 蓝桥杯真题——猜年龄python讲解
  14. 基于阿里云CentOS8搭建远程服务器
  15. Altium Designer软件导出原理图和PCB图的PDF形式
  16. asp.net 获取汉字字符串的拼音首字母,含多音字
  17. 天才小毒妃 第912章 坑了一大笔
  18. 基于matlab的图像形状与分类毕业设计(含源文)
  19. Spark not serializable 异常分析及解决方案
  20. 攻防世界——xff_referer

热门文章

  1. 关于在数据库中存储层次数据的一点看法与理解
  2. samba 和 nfs 实验
  3. apt-get update出现NO_PUBKEY问题解决
  4. mac jvisualvm安装Visual GC插件
  5. mysql数据库优化语句_MySQL优化之三:SQL语句优化
  6. java8 时间类型相关类
  7. 给ApplicationContext容器中添加组件的方法(@Bean的使用)
  8. 【渝粤教育】国家开放大学2018年秋季 0690-22T化工原理及实验 参考试题
  9. 【渝粤教育】电大中专电商运营实操 (16)作业 题库
  10. 【sklearn第八讲】广义线性模型