mysql主从配置。在如下环境测试的:
主数据库所在的操作系统:Ubuntu
主数据库的版本:16.4
主数据库的ip地址:192.168.1.2
从数据库所在的操作系统:mac
从数据的版本:10.13.3
从数据库的ip地址:192.168.1.10
1、要确保主数据库和从数据库保持一致(作者君就犯了这样错误,引以为戒)
2、在主数据库上创建同步账号。
创建用户用来访问主数据库,并赋予SLAVE权限
mysql> CREATE USER 'lpfasd'@'192.168.1.%' IDENTIFIED BY 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'lpfasd'@'192.168.1.%';
3、开发防火墙,可能要配置下端口,如下:
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --reload
4、配置主数据库
Ubuntu,mysql的配置文件是/etc/mysql/mysql.conf.d/mysql.cnf里
[mysqld]
log-bin=mysql-bin
server-id=1
#网络上还有如下配置
#binlog-do-db=lpfasd #要同步的lpfasd数据库,
#要同步多个数据库,就多加几个
#replicate-db-db=数据库名
#binlog-ignore-db=mysql //要忽略的数据库
1)要主数据库,你必须要启用二进制日志(binary logging),并且创建一个唯一的Server ID,这步骤可能要重启MySQL。
2)主服务器发送变更记录到从服务器依赖的是二进制日志,如果没启用二进制日志,复制操作不能实现(主库复制到从库)。
3)复制组中的每台服务器都要配置唯一的Server ID,取值范围是1到(232)−1,你自己决定取值。
4)配置二进制日志和Server ID,你需要关闭MySQL和编辑my.cnf或者my.ini文件,在 [mysqld] 节点下添加配置。
注意事项:
1:如果你不配置server-id或者配置值为0,那么主服务器将拒绝所有从服务器的连接。
2:在使用InnoDB的事务复制,为了尽可能持久和数据一致,你应该在my.cnf里配置innodb_flush_log_at_trx_commit=1 和 sync_binlog=1;
3:确保主服务器里的skip-networking选项未启用,如果网络被禁用,你的从服务器将不能与主服务器通信并且复制失败。
5)查看主服务状态,记录好File和Position,后面要用
mysql> show master status;
![3145530-fb909cb58b71b54a.png](https://i-blog.csdnimg.cn/blog_migrate/18b5d5306acc04cce6530117899dabff.webp?x-image-process=image/format,png)
5、配置从数据
1)从服务器,要分配一个唯一的Server ID,需要关闭MySQL,修改好后再重启,如下:
[mysqld]
server-id=2
#可以指定要复制的库
replicate-do-db = lpfasd
#在master端不指定binlog-do-db,在slave端用replication-do-db来过滤
replicate-ignore-db = mysql #忽略的库
#网上还有下面配置
#relay-log=mysqld-relay-bin
注意事项:
1:如果有多个从服务器,每个服务器的server-id不能重复,跟IP一样是唯一标识,如果你没设置server-id或者设置为0,则从服务器不会连接到主服务器。
2:一般你不需要在从服务器上启用二进制日志,如果你在从服务器上启用二进制日志,那你可用它来做数据备份和崩溃恢复,或者做更复杂的事情(比如这个从服务器用来当作其它从服务器的主服务器)。
2)配置连接主服务器的信息
mysql> stop slave;
mysql> CHANGE MASTER TO
-> MASTER_HOST='192.168.1.2',
-> MASTER_USER='lpfasd',
-> MASTER_PASSWORD='password',
-> MASTER_LOG_FILE='mysql-bin.000007',
-> MASTER_LOG_POS=522;
mysql> start slave;
3)查看从服务器状态
mysql> show slave status \G;
![3145530-1f856cecf913c94b.png](https://i-blog.csdnimg.cn/blog_migrate/9e047ea462fd5c12c177d67e364d9ebb.webp?x-image-process=image/format,png)
6、测试
通过上面的几步已经完成配置,从数据库将copy主数据库的动作。
7.总结
mysql replication 中slave机器上有两个关键的进程,死一个都不行
一个是Slave_SQL_Running,负责自己的slave mysql进程。
一个是Slave_IO_Running,负责与主机的io通信。
1)Slave_IO_Running:No问题的解决方法小结
大概有三种情况:
1、是网络有问题,连接不上
2、是有可能my.cnf有问题,配置文件怎么写就不说了
3、一个是授权的问题,replication slave和file权限是必须的。如果不怕死就all咯。
2)Slave_SQL_Running: No 问题解决办法小结
大概有两种情况:
1、是slave机器上这个表中出现了其他的写操作
2、占绝大多数可能的是slave进程重启,事务回滚造成的,这也是mysql的一种自我保护的措施,像关键时候只读一样。
解决方法:
mysql> stop slave;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave;
作者君翻了个错误也造成了Slave_SQL_Running: No ,具体问题就是主从数据库不一致,导致Slave_SQL_Running无法按照日志操作进行下去。
当作者君将数据库同步之后,再次启动slave还是报该错误
![3145530-e98e987dd74d1e95.png](https://i-blog.csdnimg.cn/blog_migrate/4a55009005324df2c32d8cc07474020b.webp?x-image-process=image/format,png)
发现 Relay_Master_Log_File依旧是 mysql-bin.000004并没有同步到最新,其原因就是我们在配置时 Relay_Master_Log_File='mysql-bin.000001', 所以slave每次都是从mysql-bin.000001开始进行同步的,当有问题出现时,依旧卡在原处。
解决办法:
mysql> stop slave;
Query OK, 0 rows affected (0.01 sec)
mysql> change master to Master_log_file='mysql-bin.000007';
Query OK, 0 rows affected, 1 warning (0.09 sec)
mysql> start slave;
Query OK, 0 rows affected (0.02 sec)