1、主从配置需要注意的地方
1、主DB server和从DB server数据库的版本一致
2、主DB server和从DB server数据库数据一致[ 这里就会可以把主的备份在从上还原,也可以直接将主的数据目录拷贝到从的相应数据目录]
3、主DB server开启二进制日志,主DB server和从DB server的server_id都必须唯一
本次测试环境在windows8.1下,mysql版本是5.7.18
教程开始:
第一步,做基本操作
1.)在主(master)数据库上执行select
version(); 查看mysql版本号,在从(slave)数据库上执行select version(); 查看mysql版本号,看是否是一致的!
2.)在主(master)数据库上执行show
variables like 'log_%'; 查看主(master)是否开启binlog 。看log_bin 这一栏是不是ON (ON代表开启)如果没有开启就开启,开启方法如下:
找到"C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" 在my.ini的[mysqld]下添加一个binlog配置就可以了(注意一定要加在[mysqld]下,如果加在[mysqld_safe]或其他位置下是不行的)如下:
log_bin=master_mysql_3306_bin
3.)在主(master)数据库上创建一个shallowmemory数据库。在从(slave)数据库上创建一个shallowmemory数据库(这个教程就不写了,很简单)
第二步、在主(master)数据库配置:找到:"C:\ProgramData\MySQL\MySQL
Server 5.7\my.ini" 在my.ini修改如下,如果没有就添加这些配置
#开启主从复制,主库的配置
log_bin=master_mysql_3306_bin
#指定主库serverid,一般用ip末尾作为serverid
server-id=136
#指定同步的数据库,如果不指定则同步全部数据库
binlog-do-db=shallowmemory
第三步、执行SQL语句查询状态:如下图,记录Position的值,需要在从库中设置同步起始值。同时也注意看一下File下的binlog文件名,就是这个:master_mysql_3306_bin.000001
SHOW MASTER STATUS;
第四步 、在主数据库创建同步用户
#授权用户slave01使用root密码登录mysql,注意192.168.1.172指定的是从数据库的ip地址
grant replication slave on *.* to 'slave01'@'192.168.1.172'identified by 'root';
#刷新MySQL的系统权限相关表
flush privileges;
第五步、在从(slave)数据库配置,找到:"C:\ProgramData\MySQL\MySQL Server 5.7\my.ini" 在my.ini修改如下,如果没有就添加这些配置
#指定serverid,只要不重复即可,从库也只有这一个配置,其他都在SQL语句中操作
server-id=172
第六步、在从(slave)数据库执行sql:
CHANGE MASTER TO
master_host='192.168.1.136',# 这里写主master数据库的ip
master_user='slave01',# 这里写刚刚在主master数据库分配的用户名
master_password='root',# 这里写刚刚在主master数据库分配的密码
master_port=3306,# 这里写刚刚在主master数据库端口
master_log_file='master_mysql_3306_bin.000001',#
这里写 主master数据库生成的binlog文件 。位置在:C:\ProgramData\MySQL\MySQL Server 5.7\Data\下面
master_log_pos=7946;# 这里写刚刚在主master数据库中记录的Position的值
第七步、在从(slave)数据库执行sql:
#启动slave同步
START SLAVE;
#查看同步状态 如果Slave_IO_Running 和 Slave_SQL_Running都是Yes代表成功
SHOW SLAVE STATUS;
现在我们在主(master)数据库中新建一张表,从(slave)数据库中也会新建一张表,
我们在主(master)数据库新增一条记录,然后到从(slave)数据库中刷新,数据已经同步过来了。
并且主(master)数据库只要执行update、insert、delete,从(slave)数据库都会同步过来了
需要在从数据库中关闭slave;sql语句是:stop slave;#停止同步
start slave #开始同步,从日志终止的位置开始更新。
常见问题错误以及解决方法:
1、执行[SQL] CHANGE MASTER TO
master_host='192.168.1.136 ',
master_user='slave01',
master_password='root',
master_port=3306,
master_log_file='master_mysql_3306_bin.000001',
master_log_pos=10209;
[Err] 3021 - This operation cannot be performed with a running slave io thread; run STOP SLAVE IO_THREAD FOR CHANNEL '' first.
这是因为slave 正在运行
解决方式是:我们关闭掉就可以了 在从slave数据库执行sql:stop slave; 然后再次执行上面的sql就不会报错了
2、有时候配置不成功,Slave_IO_Running这里是NO ,原因多半是master_host的 ip写错或者是密码用户名写错,出现Slave_IO_Running:NO还有一个原因是slave上没有权限读master上的数据。
解决方式是:在从(slave)数据库执行sql:stop
slave;
修改正确的ip和用户名密码
CHANGE MASTER TO
master_host='192.168.1.136',# 这里写主master数据库的ip
master_user='slave01',# 这里写刚刚在主master数据库分配的用户名
master_password='root',# 这里写刚刚在主master数据库分配的密码
master_port=3306,# 这里写刚刚在主master数据库端口
master_log_file='master_mysql_3306_bin.000001',#
这里写 主master数据库生成的binlog文件 。位置在:C:\ProgramData\MySQL\MySQL Server 5.7\Data\下面
master_log_pos=7946;# 这里写刚刚在主master数据库中记录的Position的值
然后再执行sql
Slave_IO_Running就变成Yes了
但是SHOW SLAVE STATUS;再次查看状态时Slave_SQL_Running又变成NO,原因是主(master)的Position的值已经变了
解决方式是:在主(master)数据库执行sql:show
MASTER status;查看Position的值 ,再次修改从数据库中Position的值
执行就可以了
注意,这样只能在主数据库增删改数据,不能再从数据库增删改,比如以下场景:
在从数据库新增一个数据 id是1 name是张三
然后在主数据库新增一个数据id是1 name是李四。这样就会出现问题,再次在从数据库执行sql查看状态
SHOW SLAVE STATUS;
会发现Slave_SQL_Running是NO
了。建议是从库也可以同步到主数据库
实现主---主互相复制实际只是把上面的例子反过来再做一遍。我自己也测试过
也是可以的
来源:CSDN
作者:专注JavaWeb开发
链接:https://blog.csdn.net/chl191623691/article/details/78318065