主从同步的定义:  是存储数据的一种结构模式。

主:被客户端访问的数据库服务器就是主库服务器master

从:连接主库服务器,自动同步主库的所有数据到本机slave


1、什么是mysql主从同步?

    当master(主)库的数据发生变化的时候,变化会实时的同步到slave(从)库。


2、主从同步有什么好处?

    水平扩展数据库的负载能力。

    容错,高可用。Failover(失败切换)/High Availability

    数据备份。


3.主从同步的具体内容和目的

    不管是delete、update、insert,还是创建函数、存储过程,所有的操作都在master上。当master有操作的时候,slave会快速的接收到这些操作,从而做同步。


4.基本结构:

    单向复制:主 --> 从

    扩展应用

     链式复制:主 --> 从 --> 从

    双向复制:主 <--> 从

    放射式复制:从 <-- 主 --> 从

                                        |

                                        从


5.实现原理

    在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改,就实现了主从同步!


6.主从同步事件有3种模式:  

      statement、row、mixed

    statement:会将对数据库操作的sql语句写入到binlog中。

    row:会将每一条数据的变化写入到binlog中。

    mixed:statement与row的混合。Mysql决定什么时候写statement格式的,什么时候写row格式的binlog。

实现:


7.目的

    当master上的数据发生改变的时候,该事件(insert、update、delete)变化会按照顺序写入到binlog中。

                   

                                                                    Mysql主从同步的搭建步骤:

主要分为【主库配置】和【从库配置】

例机IP及分配:master 192.168.4.52

                           slave 192.168.4.53


主库的配置步骤:

1.启用数据库binlog日志

    # vim /etc/my.cnf

    [mysqld]

     server_id=52                           //数据库的 id【主库与从库不可相同】

     log-bin=master                        //启用binlog日志并设置路径

     binlog-format="mixed"            //指定binlog使用模式


 2.授权用户

    mysql> grant replication slave on *.*

    -> to

    -> tom@"192.168.4.53"

    -> identified by "123456";

     更新数据库权限

    mysql>flush privileges;


3.查看master的状态

    # show master status;


从库配置步骤(slave):


1.查看是否可以登陆数据库

    mysql -h192.168.4.52  -u tom -p123456

     show grants;  //查看权限

 2.指定数据库ID号(server_id)

    vim /etc/my.cnf

     [mysql]

     server_id=53

     systemctl restar mysqld


3.管理员指定数据库服务器的信息

     mysql> change master to

     -> master_host="192.168.4.52",           //指定主库的ip地址

     -> master_user="tom",                          //指定授权的用户名

     -> master_password="123456",

     -> master_log_file="master.000001",      //指定主日志时可去主库查看填写

     -> master_log_pos=447;


4.启用slave进程

    mysql> start slave;                        //开启slave进程

     mysql> show slave status\G;         //查看slave进程

     Slave_IO_Running: yes                  //查看线程是否运行

     Slave_SQL_Running: Yes

  • I/O线程。该线程连接到master机器,master机器上的binlog dump线程会将binlog的内容发送给该I/O线程。该I/O线程接收到binlog内容后,再将内容写入到本地的relay log。

  • SQL线程。该线程读取I/O线程写入的relay log。并且根据relay log的内容对slave数据库做相应的操作。

    注:Slave_IO_Running及Slave_SQL_Running进程必须正常运行,即YES状态,否则说明同步失败。可用这两项判断主从同步是否成功


5.测试

    mysql>create database ceshi;      //master主库创建测试库

    mysql>show  databases;             //slave从库上查看是否自动更新

   

 常见问题排查:

    若进程启用时,线程未yes状态,可查看下方报错信息进行排错

    常见原因:

    一:数据库UUID相同导致冲突

    解决方法:vim /var/lib/mysql/auto.cnf    修改UUID使其不相同

    重启数据库

    重启slave进程

    【若还无法同步则需重新指定数据库信息并重启slave进程即可】

   二:数据库ID冲突,重新设置ID并重启服务即可

    三: 查看命令是否写错

四:删除binlog日志的影响

如果有一个将要进行同步的slave从属服务器,该服务器需读取您正在删除的日志之一,则该同步不会执行,并产生错误;如果slave从属服务器是关闭的(或master-slave主从关系关闭),若清理了将要读取的日志之一,则slave从属服务器启动后不能同步;当从属服务器正在复制时,删除binlog日志无影响,切无需停止主从服务