MySQL是一种开源的关系型数据库管理系统,MySQL 8.0是MySQL的最新版本,于2018年4月发布。以下是MySQL主从复制的相关内容:

基于二进制日志文件的方法

配置主数据库的 my.cnf 配置文件

###主从数据库配置核心部分
[mysqld]
# 设置同步的binary log二进制日志文件名前缀,默认为binlog;在MySQL 8.0中,无论是否指定--log bin选项,默认情况下都会启用二进制日志记录,并将log_bin系统变量设置为ON。
log-bin=mysql-bin
# 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的server-id不能重复
server-id=1          

###可选配置
# 需要主从复制的数据库,如多个则重复配置
binlog-do-db=test
# 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步),如多个则重复配置
binlog-ignore-db=mysql
# 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M
# 主从复制的格式(mixed,statement,row,默认格式是statement。建议是设置为row,主从复制时数据更加能够统一)
binlog_format=row
# 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds=2592000
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062

启动主数据库,创建一个同步复制用户(非必需,也可以用root用户,但不建议),接着给创建的用户授权同步复制权限:

CREATE USER 'repl'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS;

关闭应用程序,导出数据

mysqldump -u root -p test > test.sql

配置从数据库的my.cnf配置文件

###主从数据库配置核心部分
[mysqld]
# 设置同步的binary log二进制日志文件名前缀,默认是binlog
log-bin=mysql-bin
# 服务器唯一id,默认为1,值范围为1~2^32−1. ;主数据库和从数据库的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
# 配置二进制日志自动删除/过期时间,单位秒,默认值为2592000,即30天;8.0.3版本之前使用expire_logs_days,单位天数,默认值为0,表示不自动删除。
binlog_expire_logs_seconds=2592000
# 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断,默认OFF关闭,可选值有OFF、all、ddl_exist_errors以及错误码列表。8.0.26版本之前使用slave_skip_errors
# 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
replica_skip_errors=1062
# relay_log配置中继日志,默认采用 主机名-relay-bin 的方式保存日志文件 
relay_log=replicas-mysql-relay-bin  
# log_replica_updates表示slave是否将复制事件写进自己的二进制日志,默认值ON开启;8.0.26版本之前使用log_slave_updates
log_replica_updates=ON
# 防止改变数据(只读操作,除了特殊的线程)
read_only=ON

启动从数据库,导入数据

#如果没有test数据库,则要先创建数据库
mysql -u root -p test < test.sql

执行以下命令设置与主数据库的联系

#低于8.0.23版本的语法:
CHANGE MASTER TO MASTER_HOST='192.168.34.120',MASTER_PORT=3306,MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000004',MASTER_LOG_POS=157;
#自8.0.23版本后的语法:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.34.120',SOURCE_PORT=3306,SOURCE_USER='repl',SOURCE_PASSWORD='123456',SOURCE_LOG_FILE='mysql-bin.000004',SOURCE_LOG_POS=157;

说明: MASTER_HOST/SOURCE_HOST:主数据库的主机ip MASTER_PORT/SOURCE_PORT:主数据库的端口,不设置则默认是3306 MASTER_USER/SOURCE_USER:主数据库被授予同步复制权限的用户名 MASTER_PASSWORD/SOURCE_PASSWORD:对应的用户密码 MASTER_LOG_FILE/SOURCE_LOG_FILE:在主数据库执行命令show master status 查询到的二进制日志文件名称 MASTER_LOG_POS/SOURCE_LOG_POS:在主数据库执行命令show master status 查询到的位置 Position的值 最后开启主从复制工作:

#低于8.0.22版本的语法:
START SLAVE;
#自8.0.22版本后的语法:
START REPLICA;

可执行命令查看详细信息以及状态:

#低于8.0.22版本的语法:
SHOW SLAVE STATUS;
#自8.0.22版本后的语法:
SHOW REPLICA STATUS;

假如显示 Slave_IO_Running/Replica_IO_RunningSlave_SQL_Running/Replica_SQL_Running 为 Yes ,以及Slave_IO_State/Replica_IO_StateWaiting for master to send event/Waiting for source to send event,则证明主从复制成功! 假如需要停止主从复制工作,则执行以下命令:

#低于8.0.22版本的语法:
STOP SLAVE;
#自8.0.22版本后的语法:
STOP REPLICA;

假如需要重启主从复制工作,则执行以下命令:

#低于8.0.22版本的语法:
RESTART SLAVE;
#自8.0.22版本后的语法:
RESTART REPLICA;