单向(读写分离)
主库的数据向从库同步,可以实现读写分离的功能,写的请求都到主库,读请求可以到从库。
1.初始化数据
配置之前,从库和主库的表和数据要一致。所以有的时候需要把主库的数据先导入到从库之后,再开始配置主从复制。
2.先修改主库和从库的配置并重启
主库配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| [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
|
从库配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
| [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.000003和154和步骤3中的返回一致
5.查看是否配置成功
在从库运行命令:show slave status\G;
Slave_IO_State是Waiting for master to send event就表示配置成功了
双向
主库的数据操作会同步到从库,从库的数据操作也会同步到主库。单向的话从库的操作是不会同步到主库的。
1.初始化数据
配置之前,从库和主库的表和数据要一致。所以有的时候需要把主库的数据先导入到从库之后,再开始配置主从复制。
2.先修改主库和从库的配置并重启
主库配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| [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
|
从库配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| [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;