自己闲来无聊在虚拟机上搭建一个MySQL主从配置
主机:192.168.2.130
从机:192.168.2.132
开始工作:
修改主机MySQL配置文件
log-bin=master-bin #日志文件名称
server-id=1 #从机唯一标示
修改完配置文件以后登录MySQL给slave配置用户/密码
mysql>grant replication slave on *.* to '用户名'@'slave数据库的IP地址' identified by '密码';
#这个是指某个IP地址的某个用户以某个密码对当前数据库的所有库和所有表进行复制操作
mysql>flush privileges;
#刷新
mysql>show master status;
#查看主机状态
+-------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-------------------+----------+--------------+------------------+-------------------+
| master-bin.000003 | 120 | | | |
+-------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
File: 日志文件名称
Position: 日志所在位置
这个时候就不用操作主机,打开从机
修改从机配置文件
log-bin=master-bin #日志文件名称
server-id=2 #从机唯一标示
同主机配置差不多只是改了一下标示,server-id是要指定的,不然会报错,每一台指定一个唯一标识符
把从机指向主机,登陆从机MySQL
mysql> change master to
-> master_host='192.168.2.130', #master所在服务器的IP
-> master_user='root', #master授权的账号
-> master_password='123456', #master授权的密码
-> master_log_file='master-bin', #master的日志文件名
-> master_log_pos=120; #master的日志所在位置
Query OK, 0 rows affected, 2 warnings (0.01 sec)
#显示这个就是是说明已经配置好了
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State:
Master_Host: 192.168.2.130
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin
Read_Master_Log_Pos: 120
Relay_Log_File: master-relay-bin.000001
Relay_Log_Pos: 4
Relay_Master_Log_File: master-bin
Slave_IO_Running: No
Slave_SQL_Running: Yes
略过一堆,主要看Slave_IO_Running或者Slave_SQL_Running,这两个地方必须都为Yes才说明是配置成功,很明显我这里已经出问题了
注:
Slave_IO_Running: YES 表示slave的日志读取线程开启
Slave_SQL_Running: YES 表示SQL执行线程开启
解决方案:
一:
Slave_SQL_Running: No
1.程序可能在slave上进行了写操作
2.也可能是slave机器重起后,事务回滚造成的.
一般是事务回滚造成的
解决办法:
mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
二:
首先停掉Slave服务:slave stop
到主服务器上查看主机状态:
记录File和Position对应的值
进入master
mysql> show master status;
+----------------------+----------+--------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+----------------------+----------+--------------+------------------+
| master-bin.000003 | 120 | | |
+----------------------+----------+--------------+------------------+
1 row in set (0.00 sec)
然后到slave服务器上执行手动同步:
mysql> change master to
> master_host='master_ip',
> master_user='user',
> master_password='pwd',
> master_port=3306,
> master_log_file=master-bin.000003',
> master_log_pos=33622483 ;
1 row in set (0.00 sec)
mysql> start slave ;
1 row in set (0.00 sec)
mysql> show slave status\G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.2.130
Master_User: root
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: master-bin.000003
Read_Master_Log_Pos: 120
Relay_Log_File: master-relay-bin.000002
Relay_Log_Pos: 284
Relay_Master_Log_File: master-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
这个就是本人配置时的过程,大佬轻喷。有哪里不足或者缺陷之处还请各位帮忙指出纠正,在此谢谢了