Mysql8.0主从同步,主从复制详解(超详细)
一:准备事项
1 两台服务器,mysql版本一致,不然会出现问题 如果不会的可以参看我的另外一篇文章
172.16.21.238 主服务器
172.16.21.237从服务器
注意:在进行主从同步之前先确保要备份的数据库和表在同库存在,主从复制不会创建库和表,如果没有会出现不能同步的错误,可以自己通过mysqldump进行数据导出,然后再用source进行数据恢复到从库中去。
二:主服务器配置
- 在 /etc/my.cnf 的[mysqld]节点内,新加以下内容
注意:MySQL 5.1.7版本之后,已经不支持把master配置属性写入my.cnf配置文件中了,只需要把同步的数据库和要忽略的数据库写入即可。
[mysqld]
#主从配置
server-id=66 #服务器 id ,主从机器在同一局域网内必须全局唯一,不能相同
log-bin=mysql-bin #二进制文件存放路径,非必须,mysql8后默认存放/var/lib/mysql这里
binlog-do-db=palan-dev #待同步的数据库,如果有多个以空格隔开db1 db2 db3 ....
binlog-ignore-db=mysql #不同步的数据 如果有多个以空格隔开db1 db2 db3 ....
- 查看主服务器是否开启binlog日志如果没有开启则开启,
show variables like 'log_bin';
- 重启mysql
service mysqld restart
- 给从库授权账号,让从库可以复制,也可以用原有root账号,有关授权账号可以参看 用户授权
4.1 mysql -u root -p密码
4.2 CREATE USER 'rootslave'@'从服务器ip地址' IDENTIFIED WITH mysql_native_password BY '1qaz#WSX';
4.3grant replication slave on *.* to 'rootslave'@'从服务器IP地址';
4.4 FLUSH PRIVILEGES;
备注:rootslave就是为从库进行复制配置的账号,1qaz#WSX为密码,从服务器ip即就是172.16.21.237
- 5重启mysql
service mysqld restart
- 查看主库状态,记住执行下面之后显示的File和Position,下面会用到
show variables like 'log_bin%';
三:配置从数据库
- 配置文件my.cnf添加
server-id=67 #这里的id一定不要和主库id相同
- 重启数据库
service mysqld restart
-
启动主从同步
- 登陆mysql
mysql -uroot -p密码
3.2登录之后,执行下面,ip地址是主库的ip(自己修改),rootslave是上面配置的账号,1qaz#WSX是密码,master_log_file是主库第5步查看的文件名字(自己修改),master_log_pos也是第5步查看的位置(自己修改)
-
- change master to master_host='172.16.21.238',master_user='rootslave',master_password='1qaz#WSX',master_log_file='binlog.000018',master_log_pos=155;
- start slave;
4 查看主库状态
show slave status\G;
确认以上两个线程为yes,如果有一个为no都不会进行主从同步
mysql replication 中slave机器上有两个关键的进程,死一个都不行,一个是slave_sql_running,一个是Slave_IO_Running,一个负责与主机的io通信,一个负责自己的slave mysql进程。
四:自己遇到的常见问题
1 Slave_SQL_Running: No
Last_Error:会有提示原因
出现上述情况说明数据主从发生故障。 问题原因 https://blog.****.net/heng_ji/article/details/51013710
1、可能是主库的表,在从库中没有找到
解决方法:跳过这次错误继续进行
1、先停止同步:mysql>stop slave;
2、使用命令:mysql>set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
3、开启同步:mysql>start slave;
4、使用命令:mysql>show slave status\G,查看Slave_SQL_Running的值,如果不为Yes,则重复上述3步,直到为Yes
2.slave_io_running:no
解决办法如下
查看主服务器状态
show master status\G
查看从服务器状态
show slave status\G
问题所在:发现Master_Log_File没有对应。
出现Slave_IO_Running: No的机器上操作,即从库上进行操作
3.1停止主从复制 slave stop;
3.2 CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000026', MASTER_LOG_POS=0;
3.3 slave start;
3.4 show slave status\G
至此问题解决