单向(读写分离)

主库的数据向从库同步,可以实现读写分离的功能,写的请求都到主库,读请求可以到从库。

1.初始化数据

配置之前,从库和主库的表和数据要一致。所以有的时候需要把主库的数据先导入到从库之后,再开始配置主从复制。

2.先修改主库和从库的配置并重启

主库配置:

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=100 
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql 
## 开启二进制日志功能,可以随便取,最好有含义(关键就是这里了)
log-bin=replicas-mysql-bin 
## 为每个session分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M 
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed 
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7 
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062

从库配置:

[mysqld]
## 设置server_id,一般设置为IP,注意要唯一
server_id=101 
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql 
## 开启二进制日志功能,以备Slave作为其它Slave的Master时使用
log-bin=replicas-mysql-slave1-bin 
## 为每个session 分配的内存,在事务过程中用来存储二进制日志的缓存
binlog_cache_size=1M 
## 主从复制的格式(mixed,statement,row,默认格式是statement)
binlog_format=mixed 
## 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days=7 
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062 
## relay_log配置中继日志
relay_log=replicas-mysql-relay-bin 
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1 
## 防止改变数据(除了特殊的线程)
read_only=1 

3.查看主库状态

命令:show master status; 查看主库状态

4.配置从库并重启

命令:CHANGE MASTER TO MASTER_HOST='mysql-master', MASTER_USER='root', MASTER_PASSWORD='root', MASTER_LOG_FILE='replicas-mysql-bin.000003', MASTER_LOG_POS=154;
replicas-mysql-bin.000003154和步骤3中的返回一致

5.查看是否配置成功

在从库运行命令:show slave status\G;
Slave_IO_State是Waiting for master to send event就表示配置成功了

双向

主库的数据操作会同步到从库,从库的数据操作也会同步到主库。单向的话从库的操作是不会同步到主库的。

1.初始化数据

配置之前,从库和主库的表和数据要一致。所以有的时候需要把主库的数据先导入到从库之后,再开始配置主从复制。

2.先修改主库和从库的配置并重启

主库配置:

[mysqld]
# 设置server_id,主从服务器配置不同的值
server-id = 100
# 开启二进制日志功能,最好是绝对路径
log_bin = mysql-bin.log
# 中继日志路径
relay_log = mysql-relay-bin.log
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql 
# 允许从库将其重放的事件也记录到自身的二进制日志中
log_slave_updates = 1
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 7
# slave重放的事件时忽略的错误,all是忽略所有错误
# ddl_exist_errors:1007,1008,1050,1051,1054,1060,1061,1068,1094,1146
slave-skip-errors = ddl_exist_errors

从库配置:

[mysqld]
# 设置server_id,主从服务器配置不同的值
server-id = 101
# 开启二进制日志功能,最好是绝对路径
log_bin = mysql-bin.log
# 中继日志路径
relay_log = mysql-relay-bin.log
## 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql 
# 允许从库将其重放的事件也记录到自身的二进制日志中
log_slave_updates = 1
# 二进制日志自动删除/过期的天数。默认值为0,表示不自动删除。
expire_logs_days = 7
# slave重放的事件时忽略的错误,all是忽略所有错误
# ddl_exist_errors:1007,1008,1050,1051,1054,1060,1061,1068,1094,1146
slave-skip-errors = ddl_exist_errors

3.各自查看自己的主库状态

命令:SHOW MASTER STATUS;

4.各自配置自己的从库配置

命令:CHANGE MASTER TO MASTER_HOST='192.168.245.130', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;,和单向的一样

5.各自启动slave

命令:START SLAVE;

6.各自查看从库状态

命令:SHOW SLAVE STATUS\G; Slave_IO_Running为Yes,Slave_SQL_Running为Yes就表示配置成功了

常见问题

1.启动slave时报错Slave failed to initialize relay log info structure from the repository

  • 1.reset slave;
  • 2.重新配置master:CHANGE MASTER TO MASTER_HOST='192.168.245.130', MASTER_USER='repl', MASTER_PASSWORD='123456', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=154;
  • 3.start slave;