推荐博客:https://blog.51cto.com/lizhenliang/1290431

主从复制是一种数据备份方案,在这种数据备份方案中,会使用两个或两个以上相同的数据库,将一个数据库当做主数据库,另一个 (或其他) 数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使得二者一模一样

基本原理

MySQL 高级(5) 主从复制 - 图1

主从复制分为同步复制,异步复制和半同步复制

基本原理是 slave 会从 master 中读取二进制日志来进行数据同步,复制过程如下

  1. master 将数据变动记录到二进制日志中,这些记录被称为二进制日志事件
  2. slave 将 master 的二进制日志时间拷贝到自己的中继日志中 ( relay log )
  3. slave 重做中继日志中的事件,将数据变动应用到自己的数据库中

复制的最大问题是网络延时

复制的基本规则

每个 slave 只能有一个 master

每个 slave 只能有一个唯一的服务器 ID

每个 master 可以有多个 slave

一主一从

配置主从复制的要求

  1. MySQL 版本最好一致
  2. 主从都配置在 [mysqld] 结点下,都是小写
  3. 主从机能互相 ping 通

主机修改配置文件

这里使用 windows 作为主机,首先查出主机的 IP,我自己的为:192.168.19.100

windows 下的配置文件为 my.ini

需要添加下列配置

  1. #主服务器 id
  2. server-id = 1
  3. #启用二进制文件
  4. log-bin = 本地MySQL安装路径/[子路径/]mysqlbin
  5. #启用错误日志 (可选)
  6. log-err = 本地MySQL安装路径/[子路径/]mysqlerr
  7. #根目录 (可选)
  8. basedir = 本地MySQL安装路径
  9. #临时目录 (可选)
  10. tmpdir = 本地MySQL安装路径
  11. #数据目录 (可选)
  12. datadir = 本地MySQL安装路径/Data/
  13. #设置不要复制的数据库 (可选)
  14. binlog-ignore-db = 不需要复制的数据库名字
  15. #设置需要复制的主数据库名字 (可选),多个数据库之间不能以, 分割
  16. binlog-do-db = 需要复制的主数据库名字

修改完成后重启数据库

从机修改配置文件

从机使用 Linux ,配置文件为 my.cnf,需要配置如下

#从服务器唯一 ID
server-id = 2
#启用二进制文件 (可选)
log-bin = mysql-bin

修改完成后重启数据库

关闭防火墙

主,从机都需要关闭防火墙 ( 或者配置进出规则 )

授权 slave

在 windows 主机上建立账户,并授权给 slave

首先,执行命令

GRANT REPLICATION SLAVE
ON *.* TO 'zhangsan'@'从机IP' IDENTIFIED BY '123456';

zhangsan 为从机访问主机使用的用户名,123456 为从机访问主机使用的密码

然后刷新一下

FLUSH PRIVILEGES;

最后执行命令

show master status;

MySQL 高级(5) 主从复制 - 图2

记录下 file 和 position 的值

此步骤完成后不要再对主数据库进行任何操作,避免状态变化

tips:如果在下一步中,查看从机状态时一直连接不上,就把这一步中的从机 IP 改为 %

配置需要复制的主机

在从机上配置需要复制的主机

执行命令

change master to master_host="主机IP",
                 master_user="zhangsan",
                 master_password="123456",
                 master_log_file="上面查出来的file的值",
                 master_log_pos=上面查出来的position的值;

然后启动从数据库复制功能

start slave;

执行命令查看状态

show slave status;

MySQL 高级(5) 主从复制 - 图3

这样即是成功

测试

在主机上,创建一个数据库

create database aaaaaaaaaaaaa;

然后查看从机 data 文件夹 ( 用来存储数据库和表的 )

MySQL 高级(5) 主从复制 - 图4

可以发现同步成功

crud 的同步一样可以成功

如果想要停止主从复制,在从机数据库执行

stop slave;

即可