本篇先介绍mysql一主二从的搭建
1、配置mysql一主2从
这里我使用docker创建3个mysql容器:
1、容器A:端口3309,充当主服务器,负责写入数据;
2、容器B:端口3310,充当从服务器1,负责读取数据;
3、容器B:端口3311,充当从服务器2,负责读取数据。
使用docker创建mysql容器可以查看我之前写的博客:
这里主要介绍一主二从的mysql配置
一、准备主服务器
1、 主服务器mysql的配置
bash
[mysqld]
# 基础配置
default-authentication-plugin=mysql_native_password # 兼容旧客户端
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
default-time_zone = '+8:00' # 中国时区
lower_case_table_names=1 # 表名不区分大小写(Windows兼容)
# 服务器唯一id,默认值1
server-id=1
#设置日志格式,默认为ROW
binlog_format=STATEMENT
# 性能配置(基础版)
max_connections=1000
innodb_buffer_pool_size=256M
skip-name-resolve # 跳过域名解析,提升连接速度
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
2、在主服务器上创建一个slave用户
sql
-- 创建slave用户
CREATE USER 'slave'@'%';
-- 设置密码
ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
-- 授予复制权限
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
3、在主服务器上查询master状态
sql
show MASTER STATUS;
执行后获得binlog和position的值,类似下面这样的
file:binlog.000006 position:1083
把这两值记下来,后面会用到。
注意:执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化!!!
二、准备2个从服务器
1、配置mysql的my.cnf文件
容器B配置:
bash
[mysqld]
# 服务器唯一id,默认值1
server-id=2
容器C配置:
bash
[mysqld]
# 服务器唯一id,默认值1
server-id=3
2、在从机上配置主从关系
登录这2台从服务器,分别执行下面的命令,注意需替换为自己主服务器的信息
sql
CHANGE MASTER TO MASTER_HOST='192.168.100.201',
MASTER_USER='atguigu_slave',MASTER_PASSWORD='123456', MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000006',MASTER_LOG_POS=1083;
3、启动主从同步
执行下面的SQL,启动从机的复制功能
sql
-- 启动同步
START SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G
使用\G让查询结果一列展示,这样看起来比较直观

当Slave_IO_Running和Slave_SQL_Running状态为yes时,则说明主从配置成功!
三、建库建表
在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步
sql
CREATE DATABASE db_user;
USE db_user;
CREATE TABLE t_user (
id BIGINT AUTO_INCREMENT,
uname VARCHAR(30),
PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('Tim');
INSERT INTO t_user(uname) VALUES(@@hostname);
如果从机出现同样的库和表,则说明mysql主从配置成功!
四、主从配置的停止和重置
1、停止
需要的时候,可以使用如下SQL语句
-- 在从机上执行。
-- 功能说明:停止I/O 线程和SQL线程的操作。
sql
stop slave;
2、重置
-- 在从机上执行。
-- 功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。
sql
reset slave;
-- 在主机上执行。
-- 功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;
sql
reset master;
五、 常见问题
1、启动主从同步后,常见错误是`Slave_IO_Running: No 或者 Connecting` 的情况,此时查看下方的 `Last_IO_ERROR`错误日志,根据日志中显示的错误信息在网上搜索解决方案即可
2、典型的错误例如:`Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Client requested master to start replication from position > file size'`
解决方案:
sql
-- 在从机停止slave
SLAVE STOP;
-- 在主机查看mater状态
SHOW MASTER STATUS;
-- 在主机刷新日志
FLUSH LOGS;
-- 再次在主机查看mater状态(会发现File和Position发生了变化)
SHOW MASTER STATUS;
-- 修改从机连接主机的SQL,并重新连接即可
3、启动docker容器后提示 `WARNING: IPv4 forwarding is disabled. Networking will not work.`
此错误,虽然不影响主从同步的搭建,但是如果想从远程客户端通过以下方式连接docker中的MySQL则没法连接
解决方案:
bash
#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network
拓展:MySQL binlog的工作模式
MySQL binlog的三种工作模式:
1、Row(用到MySQL的特殊功能如存储过程、触发器、函数,又希望数据最大化一直则选择Row模式)
简介:日志中会记录每一行数据被修改的情况,然后在slave端对相同的数据进行修改。
优点:能清楚的记录每一行数据修改的细节
缺点:数据量太大
2、Statement (默认)
简介:每一条被修改数据的sql都会记录到master的bin-log中,slave在复制的时候sql进程会解析成和原来master端执行过的相同的sql再次执行。在主从同步中一般是不建议用statement模式的,因为会有些语句不支持,比如语句中包含UUID函数,以及LOAD DATA IN FILE语句等
优点:解决了 Row level下的缺点,不需要记录每一行的数据变化,减少bin-log日志量,节约磁盘IO,提高性能。
缺点:容易出现主从复制不一致
3、Mixed(混合模式) 简介:结合了Row level和Statement level的优点,同时binlog结构也更复杂。
可以简单理解为binlog是一个记录数据库更改的文件,主从复制时需要此文件。