Mysql本身支持多个数据库之间的Master-slave
架构,具体步骤是:
1. 配置master
的my.cnf
在[mysqld]
下增加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 在一个主从架构中,server_id要唯一
server_id=100
# 设置需要同步的数据库。多个数据库用“,”隔开。
binlog-do-db=dbname1, dbname2
# 设置不需要同步的数据库
# 若两个都不设置,默认同步所有
# binlog-ignore-db=mysql
# 开启二进制日志记录,并指定日志名称。
# 数据库任何的变化都会记录到该日志文件中。
# 主从就是通过bin log实现的。
log-bin=master-mysql-bin
# bin log日志格式,有三种:mixed, statement, row
binlog_format=mixed
# 跳过主从复制中遇到的错误类型
# 如1062: 主键重复, 1032: 主从数据库不一致
slave_skip_errors=1062
2. 配置slave
的my.cnf
在[mysqld]
下增加:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server_id=101
log-bin=slave-mysql-bin
# 设置需要被同步的数据库
replicate-do-db=dbname1
# 设置不需要同步的数据库
replicate-ignore-db=dbname2
# 设置需要被同步的表。如:dbname1数据库中的userinfo表。
replicate-do-table=dbname1.userinfo
# 设置不需要被同步的表
# replicate-ignore-table=dbname1.userinfo
# 与上面两个的功能一样,支持通配符功能。
#replicate-wild-do-table
#replicate-wild-ignore-table
binlog_format=mixed
slave_skip_errors=1062
# 中继日志。需要开启,否则start slave会失败。
# 在主从复制中,slave会读master bin log到relay log,
# 然后SQL线程会读取slave log日志内容到从数据库。
relay_log=slave-mysql-relay-bin
# slave将复制事件写入自己的二进制日志
log_slave_updates=1
# 防止改变数据。该设置对于超级用户不生效。
read_only=1
3. 查看master
状态
连接到主数据库,查看master
状态:
1
2
3
mysql -uroot -p
show master status;
正常情况下,会打印当前的bin log名以及位置position信息。
4. 查看slave
状态
连接到从数据库,查看slave
状态:
1
2
3
mysql -uroot -p
show slave status;
一开始没有配置slave
信息的话,会显示:
1
Empty set(0.00 sec)
这时,需要设置从数据库的slave
信息:
1
2
3
4
5
6
7
change master to
master_host='master-host',
master_port='3306',
master_user='root',
master_password='123456',
master_log_file='${上一步中master的bin log name}',
master_log_pos='${上一步中master的position}';
重启slave
服务:
1
2
stop slave;
start slave;
若start slave
报错,可以先进行reset
:
1
reset slave;
最后,在一次检查slave
状态:
1
2
# \G让输出内容格式化显示
show slave status\G;
5. 测试检查
在主数据库中更新数据,检查从数据库,若同步更新,则配置成功。
6. 注意
千万不能去修改从数据库中需要被同步的信息,否则主从同步会失败。
若信息不同步,可通过删除从数据库中同步信息来重新同步。
因为read_only
配置对超级用户不生效,要如何避免修改从数据库:使用普通用户,并分配各个表的增删改查权限。超级用户只能本地登录,且避免直接操作数据库。
7. docker-compose file
使用docker-compose
起主从数据库的例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: "3"
services:
mysql-master:
image: mysql:latest
container_name: test-mysql-master
environment:
- MYSQL_ROOT_ASSWORD=123456
- MYSQL_DATABASE=testdb
networks:
- test_network
ports:
- 18306:3306
restart: always
volumes:
- ./master-mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- ./master-data:/var/lib/mysql
mysql-slave:
image: mysql:latest
container_name: test-mysql-slave
environment:
- MYSQL_ROOT_ASSWORD=123456
- MYSQL_DATABASE=testdb
networks:
- test_network
ports:
- 18406:3306
restart: always
volumes:
- ./slave-mysqld.cnf:/etc/mysql/mysql.conf.d/mysqld.cnf
- ./slave-data:/var/lib/mysql
networks:
test_network: