前言
该文章展示的只是基本实现的操作,实际项目方案有追求速度的Replication,追求数据强一致性的PXC方案以及其他容灾处理。
注意
1、 最好主从机的Mysql版本一致,最起码大版本一致。实在不一致的话,从机版本必须高于主机。
操作
1.修改主机和从机的配置文件my.ini(linux)/my.cnf(windows)
1、主机设置
[mysqld]
server-id=1 ### 一般一主情况下,习惯配置主机为1
log-bin=mysql-bin ### 配置了datadir的话这里设置相对datadir的路径就行,否则就绝对路径。一般集成环境这里都是配好的不用动。
2、从机设置
[mysqld]
server-id=2 ### 从机依次23456......,不要重复就好。
replicate-do-db = 监听的库名 ### 多个库使用英式逗号分隔。
改完记得重启mysql或重载配置。
防火墙设置一下或者关了。
2.主机授权从机登陆权限
grant replication slave on *.* to ‘可以登陆本机(主机)数据库的用户名’@’从机ip’ identified by ‘密码’;
允许ip为xxx的机器使用xxx账户作为从机登陆本数据库。
记得用flush privileges刷新缓冲区
3.获取主机数据库最新执行语句记录位置
show master status;
mysql主从复制本质就是获取主机的执行语句记录,复制到自己到机器上再执行一遍。就像redis的AOF。
而这里的数据就是一会儿配置给从机,告诉从机我现在最新的执行语句记录在这,你就在这里开始监听,前面的你直接把整个库复制过去(就像redis的RDB,不过这个要自己手动),别再按执行记录重新执行一遍了。
4 . 从机设置监听主机
change master to master_host='主机ip',master_user='主机刚给你授权的用户名',master_password='密码',master_log_file='主机目最新执行语句所在文件名(第三步的File)',master_log_pos=主机目最新执行语句所在文件中的位置(第三步的Position);
5 . 从机开启监听
start slave;
6 . 确认从机监听状态
show slave status\G;
这两个同时yes就是ok了。
有可能你是线下状态或者用户量比较少,刚刚开启监听,主机那边没数据变化,所以都事yes。
所以还要自己在主机加条数据测试下,有可能一加sql那个就不yes了。
主机增加删除修改数据,查看从机都一致就没有问题,完成了。
遇到问题
1、1146错误,数据表不存在
首先这个1146就是数据表不存在的意思。
那为什么不会复制过来呢?上面讲了,从机是根据你配置的主机最新执行语句记录处开始重新执行的,那新建这个表的语句肯定就在你配置的文件前面,所以根本执行不到这个建表的语句,监听到主机对这个库某个表执行了一条语句,自己这里都没这表自然报错。
所以,要先把当前主机库表导出来,导入从机去。
注意,有可能会在你配置从机和导出主机库表之间的时间,数据库被操作了,开启从机监听后会执行重复的语句。所以要么把主机停了咋滴还是咋滴。
当然,你可以把从机监听位置设置成第一个文件首位置,自己线下瞎搞可以,线上环境搞大概率会挨揍。
还有记得设置从机的replicate-do-db,监听哪个库,不然就把你要用的库导了过来,其他没导,监听却监听了全部,主机其他库有记录变动,从机执行对应相同语句,那就又找不到表了。
还有主机从机库名也要一样,不然还是找不到这表。
关于1146错误网上查到很多原因和解决方法。以上是我自己遇到的。
撒花。
参考:
https://www.jianshu.com/p/faf0127f1cb2
https://blog.youkuaiyun.com/z69183787/article/details/70183284
https://blog.youkuaiyun.com/sj349781478/article/details/77731344
https://www.cnblogs.com/baishuchao/p/9150023.html