mysql8.0 主从复制安装及配置
原理:主库的所有变更操作(写入更新)都会视为事件,写入二进制日志文件中。从库通过读取主库的二进制日志文件,并在从库中执行这些事件,达到主从同步。
准备两台服务器,分别在两台服务器进行以下配置:
cd /etc/my.cnf.d
vim mysql-server.conf
主数据库配置核心部分
#设置同步的binary log二进制日志文件名前缀,默认为binlog
log-bin=mysql-bin
#服务器唯一id,默认为1 主数据库和从数据库的server-id不能重复
server-id=1
#需要复制的数据库
binlog-do-db=test
#过滤,也就是指定哪个数据库不用同步
binlog-ignore-db=mysql
#为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
#主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
#设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
expire_logs_days=7
#跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
#如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
重启数据库
service mysqld restart
执行mysql语句
create user 'root'@'%' identified by '123456';
grant replication slave on *.* to 'root'@'%';
flush privileges;
show master status \G
*__将File及Position复制下来,从库配置会用到上面的信息__*
cd /etc/my.cnf.d
vim mysql-server.conf
从库数据库配置核心部分
# 设置同步的binary log二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin
# 服务器唯一ID 主数据库和从数据库的server-id不能重复
server-id=2
###可选配置
# 需要主从复制的数据库
replicate-do-db=test
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# 设置二进制日志自动删除/过期的天数,避免占用磁盘空间。默认值为0,表示不自动删除。
expire_logs_days=7
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
# relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件
relay_log=replicas-mysql-relay-bin
# log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
# 防止改变数据(只读操作,除了特殊的线程)
read_only=1
重启数据库
service mysqld restart
执行mysql语句
mysql:
change master to MASTER_HOST='192.168.0.23',MASTER_PORT=3306,MASTER_USER='root',MASTER_PASSWORD='tw369.com',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=156;
flush privileges;
start slave;/stop slave;
show slave status \G
确认结果
如果 Slave_IO_Running=YES、Slave_SQL_Running=Yes、Slave_IO_State=Waiting for master to send event 则表示成功
常见问题处理
show slave status \G
检查Last_Error的信息,在Master检索日志
mysqlbinlog --no-defaults -v -v --base64-output=DECODE-ROWS mysql-bin.000001 | grep -A '10' 55154294
手工干预处理后,忽略掉错误的一致性问题,重新开启同步
stop slave;set global sql_slave_skip_counter=1;start slave;show slave status\G;
如反复出现,类似于常见BUG,则忽略掉相关的错误
vim /etc/my.cnf
slave-skip-errors = 1032,xxxx,xxxx ....
重启服务