目录
2.1:下载Mysql压缩包解压三份分别命名为Master_3307、Slave_3308、Slave_3309
2.2:修改主节点配置my-default.ini修改为my.ini。内容参考如下
2.3:修改从节点配置my-default.ini修改为my.ini。内容参考如下
4.7:一主两从下,模拟Mysql_Slave2从节点挂掉后数据同步情况
1:前言
1.1:原文链接:(侵删)
1.2:Mysql下载地址
https://downloads.mysql.com/archives/community/
1.3:实现效果
从节点(slave,slave2)指定需同步的主节点(master)数据库,从节点重主节点中同步数
据,即主节点表数据发生变化时从节点自动同步变化的数据。
1.4:模拟资源
一台电脑上安装两个Mysql服务来模拟主从复制(一主两从)。
1.5:主从复制步骤:
1.5.1:将Master的binary-log日志文件打开,mysql会把所有的DDL,DML,TCL写入
BinaryLog日志文件中。
1.5.2:Master会生成一个 log dump 线程,用来给从库的 i/o线程传binlog。
1.5.3:从库的i/o线程去请求主库的binlog,并将得到的binlog日志写到中继日志
(relaylog)中。
1.5.4:从库的sql线程,会读取relaylog文件中的日志,并解析成具体操作,通过主从的
操作一致,而达到最终数据一致。
1.5.5:读写分离架构
2:环境搭建
2.1:下载Mysql压缩包解压三份分别命名为Master_3307、Slave_3308、Slave_3309
2.2:修改主节点配置my-default.ini修改为my.ini。内容参考如下
[mysqld]
# 解决Mysql版本高低语法问题,参考:https://blog.csdn.net/lalala_dxf/article/details/125503160
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 指定主节点端口
port=3307
# 指定主节点安装目录
basedir=D:\MYSQL\demo\master_3307
# 指定mysql数据库的数据的存放目录
datadir=D:\MYSQL\demo\master_3307\data
# 服务器id ,不可重复(因为电脑上以前还装了一台Mysql服务器所以此处的id我是重2开始的)
server-id=2
# 打开log-bin日志
log-bin=mysql-bin
# 要给从机同步的库,如果是多个库可以写多条命令(此处只同步student数据库)
binlog-do-db=student
# 不给从机同步的库(多个写多行)
binlog-ignore-db=mysql
binlog-ignore-db=information_schema
binlog-ignore-db=performance_schema
binlog-ignore-db=sys
#自动清理 7 天前的log文件,可根据需要修改
expire_logs_days=7
2.3:修改从节点配置my-default.ini修改为my.ini。内容参考如下
[mysqld]
# 解决Mysql版本高低语法问题,参考:https://blog.csdn.net/lalala_dxf/article/details/125503160
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
# 不可以与主数据库的ID相同
server-id = 3
# 跳过出现的错误,继续执行复制(slave_skip_errors的值需要重主节点查询出来)
slave_skip_errors = 1146,2003
# 从节点端口号
port=3308
# 从节点安装目录
basedir=D:/MYSQL/demo/slave_3308
# 从节点数据目录
datadir=D:/MYSQL/demo/slave_3308/data
2.4:初始化主节点
2.4.1: 管理员身份运行命令提示符,进入主节点bin目录,执行“mysqld --initialize --console”命令完成主节点的初始化,初始化完成后会生成一个临时登录密码
2.4.2:安装主节点服务执行“mysqld --install 服务名”
2.4.3:启动主节点服务执行“net start 服务名”
2.4.4:登录主节点执行“ mysql -u root -P3307 -p”
2.4.5:修改主节点root用户登录密码
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码';
2.5:初始化从节点Slave_3308
步骤同 2.4.1 ~ 2.4.5
需修改部分:
2.4.2 ~ 2.4.3 的服务名改为从节点的服务名(从节点服务名:Mysql_Slave)。
2.4.4 端口应改为从节点端口3308
2.6:初始化从节点Slave_3309
步骤同 2.4.1 ~ 2.4.5
需修改部分:
2.4.2 ~ 2.4.3 的服务名改为从节点的服务名(从节点服务名:Mysql_Slave2)。
2.4.4 端口应改为从节点端口3309
2.7:重启从节点
2.8:特别说明
从节点data目录下有一个auto.cnf文件,该文件中会有一个UUID,因为从库采用的是复制主库,一定要保证主节点data目录下的auto.cnf与从节点data目录下的auto.cnf文件中的UUID不同,如果相同会导致从节点启动失败。
3:主从复制
主节点:
3.1:主节点和从节点分别新建student数据库(演示将主节点student库中的表数据复制到从节点中)
3.2:在主节点新建一个用户并授权用于主从节点数据同步
GRANT REPLICATION SLAVE ON *.* TO 'slaveuser'@'%' IDENTIFIED BY '密码';
FLUSH PRIVILEGES;
若执行命令响应如下错误信息可参考:
[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains nonaggregated column 'information_schema.PROFILING.SEQ' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
解决链接:
3.3:查看主节点状态
show master status
说明:
File:Master的log-bin日志文件
Position:数据同步的位置
Binlog_Do_DB:指定要同步的数据库
Binlog_Ignore_DB:指定忽略的数据库
主节点至此所有的配置工作完成。
分别在从节点Mysql_Slave和Mysql_Slave2中与主节点建立链路:
步骤3.4 ~ 3.7在从节点下的Mysql面板中执行
3.4:停止链路
stop slave
3.5:建立主从关系
change master to master_host='127.0.0.1',master_port=3307,master_user='slaveuser',master_password='123456',master_log_file='mysql-bin.000004',master_log_pos=8064;
-- 参数解释:
-- master_host:主节点IP
-- master_port:主节点端口
-- master_user:主节点下新建用户专用于数据同步
-- master_password:新建用户密码
-- master_log_file:主节点log-bin日志文件(通过查询主节点show master status查询得来)
-- master_log_pos:主节点数据同步的位置(通过查询主节点show master status查询得来)
3.6:启动链路
start slave
3.7:查看从节点状态
show slave status
从节点Mysql_Slave:
从节点Mysql_Slave2:
说明:
Slave_IO_Running: YES(负责与主机的IO通信)
Slave_SQL_Running: YES(负责自己的slave mysql进程)
Slave_IO_Running: NO的解决参考:
4:测试
4.1:建表测试
主节点下新建表stu:
create table stu(
id int(4),
name varchar(20)
);
从节点已自动同步stu表:
4.2:插入数据测试
主节点下新增一条数据:
INSERT INTO stu(id,name)
VALUES(1,'ZS')
从节点已自动同步新增该数据:
4.3:修改数据测试
主节点修改数据:
UPDATE stu SET name = 'ZS2' WHERE id = 1
从节点已自动同步更新该数据:
4.4:新增约束测试
主节点新增主键:
ALTER TABLE stu ADD PRIMARY KEY (id)
从节点已自动同步该约束
4.5:删除数据测试
主节点删除数据:
DELETE FROM stu WHERE id = 1
从节点已自动同步删除该数据
4.6:删表测试
主节点删除stu表
drop table stu
从节点已自动同步删除该表
4.7:一主两从下,模拟Mysql_Slave2从节点挂掉后数据同步情况
4.7.1:主节点新增一条记录
4.7.2:两个从节点都已完全同步了此条新增记录
4.7.3:关闭从节点Mysql_Slave2服务(net stop Mysql_Slave2 模拟故障)
4.7.4:主节点再次新增一条数据
4.7.5:从节点Mysql_Slave同步了此条新入数据
4.7.6:重启从节点Mysql_Slave2服务(模拟故障恢复)
4.7.7:主节点新增的第二条数据也同步到了从节点Mysql_Slave2
其它补充:
卸载Windows服务命令:
1:以管理员身份打开命令行
2:sc delete 服务名