MySQL 主从复制
# 90.MySQL 主从复制
接下来就是高级篇的内容了。在学习高级篇之前,请务必完成基础篇的内容,我们先从 MySQL 主从搭建开始。
由于这是高级篇的内容,默认同学们都了解过主从复制,如果不会的同学可以参考下 MyCat 教程中关于主从复制 (opens new window)搭建的博客
我们将 3307 端口用作主服务器,3308 作为从服务器。
如果是云服务器,注意开启防火墙。
# 新建主服务器实例 3307
命令:
docker run -p 3307:3306 --name mysql-master \
-v /mydata/mysql-master/log:/var/log/mysql \
-v /mydata/mysql-master/data:/var/lib/mysql \
-v /mydata/mysql-master/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
1
2
3
4
5
6
2
3
4
5
6
启动后用 ps 检查下是否正常,并且也最后进入容器内看看能否登录 MySQL。
新建 /mydata/mysql-master/conf/my.cnf
,内容如下:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=101
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能
log-bin=mall-mysql-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
重启 MySQL:
docker restart mysql-master
1
创建 MySQL 同步用户并授权:
$ docker exec -it mysql-master /bin/bash
$ mysql -uroot -proot
mysql> CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
mysql> GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'%';
1
2
3
4
5
6
7
2
3
4
5
6
7
# 新建从服务器 3308
命令:
docker run -p 3308:3306 --name mysql-slave \
-v /mydata/mysql-slave/log:/var/log/mysql \
-v /mydata/mysql-slave/data:/var/lib/mysql \
-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \
-e MYSQL_ROOT_PASSWORD=root \
-d mysql:5.7
1
2
3
4
5
6
2
3
4
5
6
同理,启动后用 ps 检查下是否正常,并且也最后进入容器内看看能否登录 MySQL。
新增配置文件 /mydata/mysql-slave/conf/my.cnf
:
[mysqld]
## 设置server_id,同一局域网中需要唯一
server_id=102
## 指定不需要同步的数据库名称
binlog-ignore-db=mysql
## 开启二进制日志功能,以备Slave作为其它数据库实例的Master时使用
log-bin=mall-mysql-slave1-bin
## 设置二进制日志使用内存大小(事务)
binlog_cache_size=1M
## 设置使用的二进制日志格式(mixed,statement,row)
binlog_format=mixed
## 二进制日志过期清理时间。默认值为0,表示不自动清理。
expire_logs_days=7
## 跳过主从复制中遇到的所有错误或指定类型的错误,避免slave端复制中断。
## 如:1062错误是指一些主键重复,1032错误是因为主从数据库数据不一致
slave_skip_errors=1062
## relay_log配置中继日志
relay_log=mall-mysql-relay-bin
## log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1
## slave设置为只读(具有super权限的用户除外)
read_only=1
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
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
修改完配置后重启 slave 实例:
docker restart mysql-slave
1
# 配置主从复制
在主数据库中查看主从同步状态(注意,每个人的结果可能都不一样,以自己的为准,后续不再重复这一点):
show master status;
+-----------------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+-----------------------+----------+--------------+------------------+-------------------+
| mall-mysql-bin.000001 | 617 | | mysql | |
+-----------------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
2
3
4
5
6
7
在从数据库配置主从复制(注意,宿主机 IP 等信息请更换为自己的):
change master to master_host='192.168.2.242', \
master_user='slave', \
master_password='123456', \
master_port=3307, \
master_log_file='mall-mysql-bin.000001', \
master_log_pos=617, \
master_connect_retry=30;
1
2
3
4
5
6
7
2
3
4
5
6
7
主从复制命令参数说明
- master_host:主数据库的 IP 地址;
- master_port:主数据库的运行端口;
- master_user:在主数据库创建的用于同步数据的用户账号;
- master_password:在主数据库创建的用于同步数据的用户密码;
- master_log_file:指定从数据库要复制数据的日志文件,通过查看主数据的状态,获取 File 参数;
- master_log_pos:指定从数据库从哪个位置开始复制数据,通过查看主数据的状态,获取 Position 参数;
- master_connect_retry:连接失败重试的时间间隔,单位为秒。
在从数据库中,开启并查看主从同步状态:
mysql> start slave;
mysql> show slave status \G;
........
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
.......
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
如果上述两个字段的值是 Yes,则说明主从复制成功
如果失败了,则观察下 Last_IO_Errot 的字段,会显示为什么主从复制失败,然后重新配置:
mysql> stop slave;
mysql> reset slave;
mysql> change master.........
1
2
3
2
3
# 主从复制测试
主机插入数据:
mysql> create database db01;
mysql> use db01;
mysql> create table t1(id int, name varchar(20));
mysql> insert into t1 values(1, 'z3');
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | z3 |
+------+------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
从机查看数据:
mysql> use db01;
mysql> select * from t1;
+------+------+
| id | name |
+------+------+
| 1 | z3 |
+------+------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
可以看到从数据库能查出数据,主从复制配置成功。
(完)。
上次更新: 2024/8/30 08:54:46
- 01
- 中国网络防火长城简史 转载10-12
- 03
- 公告:博客近期 RSS 相关问题10-02