MySQL 实践篇 —— 主从复制
1、概述
主从复制 就是 把 主服务器(Master)上的 二进制日志文件(binlog,记录了所有修改数据库的操作)复制到 从服务器(Slave)上执行一遍,保证 从服务器 上的数据 和 主服务器 上的数据 保持一致。
工作过程:
- 主服务器 把数据更改 记录到 二进制日志文件 中
- 从服务器 开启一个 I/O 线程 通过 MySQL 协议 把 主服务器 的 二进制日志文件 复制到自己的 中继日志文件(relay log)中
- 从服务器 开启一个 SQL 线程 执行 中继日志文件 中的内容
补充:I/O 线程 和 SQL 线程
- I/O 线程:负责读取 主服务器的二进制日志文件,并将其保存为 中继日志文件
- SQL 线程:执行 中继日志文件 中的内容
2、实践
1、在 E 盘 建立 master 和 slave 目录
2、找到本机的 MySQL 安装路径 将 整体文件夹 压缩打包
3、将 压缩包 分别拷贝到 master 和 slave 目录下,并完成解压
4、配置 MySQL 的系统文件 my.ini
-
master 的 my.ini 配置
用 记事本(或其它编辑器)打开 master 根目录 下的 my.ini,在 [mysqld] 下 新增
log-bin=mysql-bin server-id=3306
并 保存关闭。[mysqld] log-bin=mysql-bin # 表示要生成的二进制日志文件名称 server-id=3306
-
slave 的 my.ini 配置
用 记事本(或其它编辑器)打开 slave 根目录 下的 my.ini,将 [client] 下 的 port(端口号)从 3306 改成 3307;将 [mysqld] 下 的 port 从 3306 改成 3307,新增
log-bin=mysql-bin server-id=3307
并 保存关闭。[mysqld] log-bin=mysql-bin server-id=3307 port=3307 [client] port=3307
5、启动 master 服务器,并创建一个专门用于复制的账户
-
打开命令窗口 cmd,进入 master 的 bin 目录,输入启动服务器的命令:
mysqld --console
,启动服务器 -
打开命令窗口 cmd,进入 master 的 bin 目录,输入
mysql -u root -p
,登录到 master 服务器 -
创建 复制账号,用户名 repuser,密码 123
mysql>Create user 'repuser'@'localhost' identified by '123'; mysql>grant replication slave on *.* to 'repuser'@'localhost'; mysql>flush privileges; mysql>show master status \G # 显示 master 状态; \G 以行进行显示,后面不用加';'
6、启动 slave 服务器,完成 slave 的配置
-
打开命令窗口 cmd,进入 slave 的 bin 目录, 输入启动服务器的命令:
mysqld --console
, 启动服务器 -
打开命令窗口 cmd,进入 slave 的 bin 目录,输入
mysql -u root -p
登录到 slave 服务器 -
完成 主从复制 的相关配置
mysql>change master to master_host='localhost',master_port=3306,master='repuser',master_password='123',master_log_file='mysql-bin.000001',mastet_log_pos=0;
-
启动 slave 并 检查其状态
mysql>start slave; mysql>show slave status \G
注:检查 Slave_IO_Running 线程 和 Slave_SQL_Running 线程 是否都为 yes,如果是,表示 主从复制服务 已建立;如果否,表示 主从复制服务 未建立。
7、主从复制测试
(1)在 master 客户端,创建一个数据库 BankDB,创建成功后,在 slave 客户端 查看有没有出现 BankDB:show databases;
DROP SCHEMA IF EXISTS BankDB ;
CREATE SCHEMA IF NOT EXISTS BankDB default character set gbk;
USE BankDB;
Create table Bank(BankID int, Cname char(20), Balance decimal(10,2));
insert into Bank values (20181211,'张三', 20000);
insert into Bank values (20181212,'李四', 10000);
insert into Bank values (20181213,'王五', 20000);
master 客户端:
slave 客户端:
(2)在 master 客户端,修改 Bank 表的数据, 在 slave 客户端 查看是否更新成功
update Bank set Balance=Balance + 99;
master 客户端:
slaver 客户端:
(3)在 slave 关闭状态下(slave 客户端:stop slave
,slave 服务端:Ctrl+C), 在 master 客户端 新建一个数据库 BankDB1;重新启动 slave,在 slave 客户端 查看有没有出现新建的数据库 BankDB1
DROP SCHEMA IF EXISTS BankDB1;
CREATE SCHEMA IF NOT EXISTS BankDB1 default character set gbk;
USE BankDB1;
Create table Bank(BankID int, Cname char(20), Balance decimal(10,2));
insert into Bank values (20181211,'张三', 20000);
insert into Bank values (20181212,'李四', 10000);
insert into Bank values (20181213,'王五', 20000);
master 客户端:
slaver 客户端: