MYSQL主从双向同步

绿林寻猫
2023-03-14 / 0 评论 / 150 阅读 / 正在检测是否收录...

修改A my.cnf


# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html


[mysqld]

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'


server-id = 2          #保持唯一
binlog-do-db = db1  #需要同步的binlog
binlog-ignore-db = mysql#不需要同步的binlog
#log-slave-updates
slave-skip-errors=all
replicate-do-db = db1 #需要同步的数据库 如果有多个可添加多个此项
replicate-ignore-db = mysql #不需要同步的数据库 如果需要多个可添加多个此项
#这样A的auto_increment字段产生的数值是:1, 3, 5, 7, …等奇数ID了
auto_increment_offset = 1
auto_increment_increment = 2
#slave_net_timeout这个参数究竟设置多少,要根据自己的mysql主库数据更新的频繁程度:主库数据更新频繁的,就将这个参数值设小点,更新不频繁就设大点。一般这个参数设置5s、10s、15s、20s、30s等等。
slave-net-timeout=5
#复制完的sql语句是否立即从中继日志中清除,1表示立即清除
relay-log-purge=1
[client]
default-character-set=utf8mb4

[mysql]
#设置mysql默认字符集
default-character-set=utf8mb4

修改B my.cnf


# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html

[mysqld]

datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
init-connect = 'SET NAMES utf8mb4'


server-id = 3          #保持唯一
binlog-do-db = db1  #需要同步的binlog
binlog-ignore-db = mysql#不需要同步的binlog
#log-slave-updates
slave-skip-errors=all
replicate-do-db = db1 #需要同步的数据库 如果有多个可添加多个此项
replicate-ignore-db = mysql #不需要同步的数据库 如果需要多个可添加多个此项
auto_increment_offset = 2
auto_increment_increment = 2
slave-net-timeout=5

#复制完的sql语句是否立即从中继日志中清除,1表示立即清除
relay-log-purge=1

[client]
default-character-set=utf8mb4

[mysql]
#设置mysql默认字符集
default-character-set=utf8mb4

启动同步

A执行

# /usr/local/mysql/bin/mysql -u root -p
 
mysql> show master status;
显示(当然这个是我机器的情况,你的不可能跟我一样哈,只是个例子):
 
+------------------+----------+-------------------+------------------+
 
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 
+------------------+----------+-------------------+------------------+
 
| mysql-bin.000009 | 98 | discuz | mysql | 
 
+------------------+----------+-------------------+------------------+

在B上执行

# /usr/local/mysql/bin/mysql -u root -p
mysql> slave stop;
mysql> change master to master_host='192.168.1.123', master_user='back', master_password='back', master_log_file='mysql-bin.000009', master_log_pos=98;
mysql> slave start;
mysql> show slave status\G;
 
Slave_IO_Running: Yes
Slave_SQL_Running: Yes

如果都是yes,那代表已经在同步

设置双向同步

将上一步反着重复操作一遍

其他

#启用从库日志,这样可以进行链式复制
log-slave-updates
 
#从库是否只读,0表示可读写,1表示只读
read-only=1
 
#只复制某个表
replicate-do-table=tablename
 
#只复制某些表(可用匹配符)
replicate-wild-do-table=tablename%
 
#只复制某个库
replicate-do-db=dbname
 
#只复制某些库
replicte-wild-do-db=dbname%
 
#不复制某个表
replicate-ignore-table=tablename
 
#不复制某些表
replicate-wild-ignore-table=tablename%
 
#不复制某个库
replicate-ignore-db=dbname
 
#复制完的sql语句是否立即从中继日志中清除,1表示立即清除
relay-log-purge=1

mysql主从复制异常Slave_IO_Running: NO的出现原因以及解决

1.mysql5.6以上版本使用唯一uuid表示符,数据迁移是使用的物理备份,uuid会重复,修改uuid不一致即可

造成这个错误的主要原因是使用主服务器克隆出来的虚拟机去实现mysql的主从复制

解决办法:

在主服务器和从服务器各运行一遍下面的代码

对比server-uuid 是否一样,如果一样表示你有可能也是因为这个原因出错

 cat /var/lib/mysql/auto.cnf 

如果server-uuid一样

删除auto.cnf文件

 rm /var/lib/mysql/auto.cnf 

重启mysql服务

service mysqld restart

然后再重新进行一遍mysql主从复制的过程,因为地址可能会改变
lf75t3yb.png

问题就解决啦,如果没有解决可以尝试从头开始。当然也有可能有其他的问题,这只是我自己这个情况的一个解决办法。

  1. 确认server-id 是否唯一, mysql 有可能并没有加载my.cnf 文件中的server-id
0

评论 (0)

取消