1、主从复制介绍
1)基本原理
slave会从master读取bin-log来进行数据同步
MySQL复制过程分成三步:
1)master将改变记录到二进制日志(binary log)。这些记录过程叫做二进制日志事件,binary log events。
2)slave将master的binary log events拷贝到它的中继日志(relay log)。
3)slave重做中继日志中的事件,将改变应用到自己的数据库中。MySQL复制是异步且串行化的。
总结一张图(网上盗的)
2)基本原则
1、每个slave只有一个master
2、每个slave只能有一个唯一的服务器ID
3、每个master可以有多个salve
2、主从复制配置
我使用腾讯云的云数据库作为主机,自己的linux作为从机
MySQL版本一致且后台以服务运行,主从都配置在[mysqld]节点下,都是小写
1)主机修改my.ini配置文件
1、确认主机服务器唯一ID
server-id=1,这里的序号随意,不一定要是1。
查看server_id,也可能是server-id
show variables like '%server_id%';
2、启用二进制日志
查看是否已经开启
show variables like '%log_bin%';
3、read-only=0
主机,读写都可以
4、启用错误日志(可选)
log-err=自己本地的路径/mysqlerr
5、根目录(可选)
basedir=自己本地路径
6、临时目录(可选)
tmpdir=自己本地路径
7、数据目录(可选)
datadir=自己本地路径/Data
8、设置不需要复制的数据库(可选)
binlog-ignore-db=mysql
如果不开启,代表以后新创建的数据库都要复制。
9、设置需要复制的数据库(可选)
binlog-do-db=需要复制的主数据库名字
2)从机修改my.cnf配置文件
1、确认从机服务器唯一ID
2、启用二进制日志(可选)
重启主机和从机
3、建立主从关系
1)主机建立账户授权slave
grant replication slave on *.* to 'zhangsan'@'从机数据库ip' identified by '123456';
flush privileges;
从机数据库ip可以是%,意思是所有ip都可以登陆。
查询master的状态
show master status;
表示,从机要从二进制文件mysql-bin.000005的第64162055位置开始复制。
记录File和Position的值,接下来就不用管主机了。
2)从机配置需要复制的主机
从机执行
change master to
master_host = '主机ip',
master_port = 端口号,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = '之前的File',
master_log_pos = 之前的Position值;
例如
change master to
master_host = 'cdb-6lyf7c.cd.tencentcdb.com',
master_port = 3306,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = 'mysql-bin.000005',
master_log_pos = 64162055;
执行
start slave;
show slave status\G
当出现这两个参数都是Yes,则说明主从配置成功。
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
3)常见错误
如果出现这种情况Slave_IO_Running: NO
不着急,先停用slave
stop slave;
查看MySQL的日志,找到错误
vim /var/log/mysqld.log
可以看到GTID_MODE主机和从机不一致。解决方法
先查看主机
show variables like '%gtid%';
可以去查看下从机的,这里我直接通过my.cnf打开从机的这两个选项。
vim /etc/my.cnf
添加
enforce_gtid_consistency=on
gtid_mode=on
保存,重启从机MySQL。
再次执行,这里需要重新查看下主机的File和Position
change master to
master_host = 'cdb-6lyf7c.cd.tencentcdb.com',
master_port = 3306,
master_user = 'zhangsan',
master_password = '123456',
master_log_file = 'mysql-bin.000005',
master_log_pos = 64162055;
start slave;
show slave status\G
可以看到一切OK了。
如果执行change master to出现这个报错,先得把slave停用先。
4、测试
主机创建数据库和表
create database test;
use test;
create table dog(name varchar(10));
从机查看
一切OK
5、总结
最后,配置主从并不难,我这里使用的是腾讯云,不能打开my.conf这样的配置文件进行修改MySQL配置,所以都是从机修改,最后也可以达到目的。
遇到问题的时候,记得打开日志查看。