修改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主从复制的过程,因为地址可能会改变
问题就解决啦,如果没有解决可以尝试从头开始。当然也有可能有其他的问题,这只是我自己这个情况的一个解决办法。
- 确认server-id 是否唯一, mysql 有可能并没有加载my.cnf 文件中的server-id
评论 (0)