这几天看了看MySQL的主从复制,我电脑上是MySQL8的版本,但是看到资料是5.7版本,我通过本篇博客简单整理一下MySQL8版本的主从复制
原理
开启主库的bin-log日志文件(二进制日志文件),MySQL会把所有的DDL,DML,TCL写入bin-log日志文件中,从库通过读取主库的bin-log日志文件,并在从库中执行这些操作,达到主从同步。
安装主从数据库
有个非常简单的方法就是直接把安装的MySQL直接复制一份
我直接把MySQL-8和MySQL-8-Data,直接复制了一份为XXXX-slave。
我这里自定义了MySQL的安装路径和数据存储路径,默认的话是:
安装路径:C:\Program Files\MySQL
数据存放路径:C:\ProgramData\MySQL
修改主从数据库配置文件
进入主库数据存放路径,修改my.ini文件,我的路径为:E:\Java_software\MySQL-8-Data-slave\my.ini
# 服务器id,不可重复
server-id=1
# 打开log-bin日志,MySQL8默认开启
log-bin="SURFACE-BOOK-bin"
# 要同步的库,有多少库写多少个
binlog-do-db=db1
binlog-do-db=db2
修改完成可以直接启动主库的服务
修改从库的my.ini文件
# 服务器id,不可重复,不能和主库一样
server-id=2
# 修改端口,避免冲突
port=3307
#修改安装路径,这里是我的安装路径
basedir="E:/Java_software/MySQL-8-slave/"
#修改数据存放路径,这里是我的数据存放路径
datadir=E:/Java_software/MySQL-8-Data-slave\Data
另外,去从库的数据存放路径\data 目录中把auto.cnf 文件删除,因为该文件中存在一个UUID,我们使用的是复制主库,UUID会重复导致从启动不了。
启动数据库,测试同步
然后我们还需要安装从库的服务,CMD进入到从库的安装目录下的bin目录,然后执行下面命令安装从的服务
- MysqlSlave : 是服务名
- –defaults-file :是从库配置文件地址
E:\Java_software\MySQL-8-slave\bin>mysqld.exe --install MysqlSlave --defaults-file="E:\Java_software\MySQL-8-Data-slave\my.ini"
#安装成功
Service successfully installed.
如果提示没有权限,就用管理运行cmd , 然后在任务管理器里面启动从库,如下:
然后我们就可以使用工具连接上两个数据库,因为是直接复制的所以账号密码也是一样的
从库需要连接主库进行数据同步,需要在主库创建一个用作数据复制的账号
CREATE USER '账号'@'%' IDENTIFIED BY '密码';
grant replication slave on *.* to '账号'@'%';
flush privileges;
然后可以通过 show master status; 命令查看主库的状态
- SURFACE-BOOK-bin.000024:主库的log-bin日志文件
- Position : 数据同步的位置
- Binlog-Do_DB : 同步数据的数据库
- Binlog-Ignore_DB : 忽略不同步的数据库
到这说明主库就已经准备好了,接下来配置从库, 一定要在从库去执行下面命令来建立主从同步关系。
# 先停掉slave
stop slave ;
# 建立主从关系
change master to master_host='127.0.0.1' , master_user='账号',master_password='密码',master_log_file='SURFACE-BOOK-bin.000024',master_log_pos=982;
#启动同步,如有报错执行 reset slave;
start slave;
#显示从的状态
show slave status
- master_log_file : log-bin文件名,和主库查询状态所显示的一样
- master_log_pos :日志的位置,和主库查询状态所显示的一样
- master_host : 主数据库的IP
- master_user :之前在主数据库创建的账号,专门用作数据同步
- master_password:之前在主数据库创建的密码,专门用作数据同步
从库的状态:
确保 IO 和 SQL 线程都是 Yes,代表同步正常。
Slave_IO_Running: Yes --------------负责与主机的io通信
Slave_SQL_Running: Yes -----------负责自己的slave mysql进程
如果 Slave_IO_Running = no 可以检查数据这几个点:
- 主库和从库的server-id重复了
- 两个数据目录\data\auto.cnf 中的UUID值重复了
- 在配置从库同步时因为从库访问主库没有权限导致;可以给账号重新分配权限
最后测试主从同步的数据库,在主库操作对应的数据库表,从库也会跟随变化