第十六章 Mysql主从同步

一、 MySQL主从介绍
二、 准备工作
三、 配置主
四、 配置从
五、 测试主从同步
六、 扩展

一、 MySQL主从介绍

MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主从后,在A上写数据,另外一台B也会跟着写数据,两者数据实时同步的。

MySQL主从是基于binlog的,主上须开启binlog才能进行主从。

binlog就是记录的MySQL的写入操作,主要就是创建,插入,修改,删除等等操作 ;binlog文件是一个二进制文件,无法直接cat查看。

主从过程大致有3个步骤

1)主将更改操作记录到binlog里

2)从将主的binlog事件(sql语句)同步到从本机上并记录在relaylog里,relaylog又称为中继日志

3)从根据relaylog里面的sql语句按顺序执行

主上有一个log dump线程,用来和从的I/O线程传递binlog

从上有两个线程,其中I/O线程用来同步主的binlog并生成relaylog,另外一个SQL线程用来把relaylog里面的sql语句落地.

主从复制原理图:

二、 准备工作

实现MySQL主从复制需要进行的配置:

需要准备两台虚拟机,分别都装上MySQL并且能正常运行 注意:克隆的虚拟机需要将网卡配置文件中的UUID删除掉,否则会有冲突。

此次实验的环境是两台CentOS7.3系统的虚拟机

主服务器:

是之前做LNMP实验时的系统,里面已经装好了MySQL,并且MySQL也有几个库了

主机名:Linux01

IP:192.168.239.128

MySQL版本:5.6.39

从服务器 :

克隆的主服务器,CentOS7.3系统

主机名:mysql-slave

IP:192.168.239.138

MySQL版本:5.6.39

三、 配置主

1. 编辑/etc/my.cnf配置文件

在/etc/my.cnf文件内容中【mysqld】下添加下面两行配置:

server-id=128(自定义,但要唯一,我们根据IP来设置)

log_bin=wenyang01(bin_log的前缀)

[root@Linux01 mysql]# pwd
/data/mysql
[root@Linux01 mysql]# vim /etc/my.cnf

2. 修改完配置文件后,启动或者重启mysqld服务

[root@Linux01 mysql]# /etc/init.d/mysqld restart
重启后查看 datadir 目录下的文件:

[root@Linux01 mysql]# ls -l /data/mysql

3. 创建测试库及数据,做实验用(主从参考对象

[root@Linux01 mysql]# mysql -uroot -p12345 -e "create database mysql_test"   //创建表

[root@Linux01 mysql]# mysql -uroot -p123456        //登录数据库
mysql> use mysql_test;    //切换库
mysql> create table tb1(`id` int(4),`name` char(40));  //创建表
mysql> insert into tb1 values(1,'dong');                      //表里插入数据
mysql> insert into tb1 values(2,'wen');
mysql> insert into tb1 values(3,'yang');
mysql> select * from mysql_test.tb1;                        //查看表里数据信息

[root@Linux01 mysql]# mysqldump -uroot -p123456 mysql_test >/tmp/mysql_test.sql    //备份新建数据库

查看目录下是不是多了一个数据库及数据库大小:(而且我们可以看到,log_bin文件大小增加了,是因为它记录了数据库里的操作过程)

4. 创建用作主从同步数据帐户

[root@Linux01 mysql]# mysql -uroot -p123456

mysql> use mysql_test

mysql> grant replication slave on *.* to 'mysql_testuser'@'192.168.239.138' identified by '123456';
创建用户,并赋予replication和slave权限,指定从服务器IP

5. 锁表,备份新建数据库

[root@Linux01 mysql]# mysql -uroot -p123456

mysql> use mysql_test

mysql> flush tables with read lock;        //锁表,禁止写入。是为了备份数据库,同步到从服务器

[root@Linux01 mysql]# mysqldump -uroot -p123456 mysql_test >/tmp/mysql_test.sql

6. 查看主服务器的状态

mysql> show master status;

这里需要记住两个地方,在从服务器上会用到 # File: wenyang01.000001 ;Position:2514

四、 配置从

1. 编辑/etc/my.cnf配置文件

在/etc/my.cnf文件内容中【mysqld】下添加下面配置:

server-id=138(自定义,但要唯一,要求不和主服务器的一样,我们根据IP来设置)

[root@mysql-slave mysql]# pwd
/data/mysql
[root@mysql-slave mysql]# vim  /etc/my.cnf

2. 修改完配置文件后,启动或者重启mysqld服务

[root@mysql-slave mysql]#  /etc/init.d/mysqld restart
3. 将主上备份的测试数据库复制到从服务器上的库并恢复(这里可以用scp命令,或者FTP等工具来拷贝文件)

[root@mysql-slave mysql]# scp 192.168.239.128:/tmp/*.sql /tmp/

4. 在从服务器数据库中创建对应的数据库,恢复数据

mysql> create database mysql_test;                                                                                           //创建对应数据库
[root@mysql-slave mysql]# mysql -uroot -p123456 mysql_test < /tmp/mysql_test.sql      //恢复数据

有数据,说明已经恢复成功了

5. 配置从服务器参数

[root@mysql-slave mysql]# mysql -uroot -p123456      //进入mysql操作界面

mysql> stop slave;                                                        //关闭 slave
mysql> change master to master_host='192.168.239.128', master_user='mysql_testuser', master_password='1234556', master_log_file='wenyang01.000001', master_log_pos=2514;       //配置slave参数

参数解释:
change master to   固定命令
master_host=       定义主服务器的ip;也可以是 ip:port,默认是3306
master_user=       定义主服务器上用于同步的用户
master_password=   定义同步用户的密码
master_log_file=   定义主服务器上 show master status 查看到的 File
master_log_pos=    定义主服务器上 show master status 查看到的 Position,不要加双引号或单引号


mysql> start slave;                                                      //然后开启 slave

mysql> show slave status\G                                       //查看从服务器同步状态

注:如果Slave_IO_Running为 Connecting 
需要检查主服务器防火墙是否放行msyql的端口
或者查看slave参数的ip、user、password等参数是否定义正确

还需关注:
Seconds_Behind_Master: 0  # 为主从延迟的时间
Last_IO_Errno: 0          # IO线程错误代码
Last_IO_Error:            # IO线程错误信息
Last_SQL_Errno: 0         # SQL线程错误代码
Last_SQL_Error:           # SQL线程错误信息

6. 解除主服务器的锁表状态了(在主服务器上执行

[root@Linux01 mysql]# mysql -uroot -p123456 -e 'unlock tables'

五、 测试主从同步

1. 先查看主服务器和从服务器的库是否相同

[root@Linux01 mysql]# mysql -uroot -p123456 -e 'show databases'
[root@mysql-slave mysql]# mysql -uroot -p123456 -e 'show databases'

2. 在主服务器上创建一个库 test001

查看从服务器是否自动创建这个库

主上:

[root@Linux01 mysql]# mysql -uroot -p123456 -e 'create database test001'
[root@Linux01 mysql]# mysql -uroot -p123456 -e 'show databases'
从上:

[root@mysql-slave mysql]# mysql -uroot -p123456 -e 'show databases'

3. 在主服务器上的test001库里创建一个test111表,并插入一条数据。查看是否同步

主上:

[root@Linux01 mysql]# mysql -uroot -p123456

mysql> use test001
mysql> create table test111(`id` int(4), `name` char(40));

mysql> insert into test111 values(1,'dddd');

mysql> show tables;

mysql> select * from test111;

从上:

[root@mysql-slave mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'

4. 在主服务器上删除test001库里的test111表。使用truncate,删除表里的内容,表结构还在

主上:

mysql> truncate table test111;
mysql> select * from test111;
Empty set (0.00 sec)

mysql>  desc test001.test111;
从上:

[root@mysql-slave mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'

5. 在主服务器上删除test001库里的test111表。使用drop,表不在了

主上:

mysql> drop table test111;

mysql> select * from test111;
ERROR 1146 (42S02): Table 'test001.test111' doesn't exist
mysql>  desc test001.test111;
ERROR 1146 (42S02): Table 'test001.test111' doesn't exist

从上:

[root@mysql-slave mysql]# mysql -uroot -p123456 -e 'select * from test001.test111'
Warning: Using a password on the command line interface can be insecure.
ERROR 1146 (42S02) at line 1: Table 'test001.test111' doesn't exist

注意:千万不要在从服务器上做任何有关写入的操作, 
在从服务器做写入操作会导致主从数据不一致,严重的需要重新做主从。
(因为在从上做操作,会导致数据不一致,主从断开;可以尝试重启slave测试是否能重新建立主从,不行的话只能重新做主从。重新做主从,只需要在从上关闭
slave,change....设置slave参数,开启slave,就可以了

几个参数:

• 主服务器上

• binlog-do-db=      //仅同步指定的库

• binlog-ignore-db= //忽略指定库

• 从服务器上

• replicate_do_db=

• replicate_ignore_db=

• replicate_do_table=

• replicate_ignore_table=

• replicate_wild_do_table=   //如wenyang.%, 支持通配符%(写库名.%,同步库里的所有表

• replicate_wild_ignore_table=

最下面两个常用,最安全稳定。默认是同步所有库。

六、 扩展

有遇到主从不能正常同步,提示uuid相同的错误。这是因为克隆机器导致:
https://www.2cto.com/database/201412/364479.html
不停库不锁表在线主从配置:
http://seanlook.com/2015/12/14/mysql-replicas/
主从不同步:
http://www.rfyy.net/archives/2309.html
http://blog.51cto.com/storysky/259280

主主
关于 auto_increment https://blog.csdn.net/leshami/article/details/39779509
http://www.cnblogs.com/ygqygq2/p/6045279.html
mysql-proxy 实现读写分离 
http://blog.51cto.com/zzclinux/1980487
mysql-proxy类似的产品有:
mycat 基于阿里的开源软件cobar,官网 www.mycat.io 
https://my.oschina.net/ruoli/blog/1789370
mycat实现分库分表 
https://www.cnblogs.com/joylee/p/7513038.html
atlas 出自于360,不维护不更新了 https://blog.csdn.net/AnPHPer/article/details/80566385

mysql环形主从
http://ask.apelearn.com/question/11437
mysql架构演变 http://www.aminglinux.com/bbs/thread-8025-1-1.html
MHA架构 
http://blog.51cto.com/xiaoshuaigege/2060768
比较复杂的mysql集群架构 http://ask.apelearn.com/question/17026

猜你喜欢

转载自blog.csdn.net/dwy2018/article/details/85330978