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 了。建议是从库也可以同步到主数据库
实现
主---主互相复制实际只是把上面的例子反过来再做一遍。我自己也测试过 也是可以的