在生产环境中,只有一台MySQL的环境往往是很脆弱的,一旦承载MySQL的服务器宕机损坏,或者MySQL服务本身遭到破坏,库中的数据将不复存在,这对于大部分项目来说都是灾难性的。因此在大部分项目中,使用两台或以上的MySQL实现数据库的实时备份相当重要。多台MySQL同时存储同样的数据,在单台MySQL出现问题时,仍可保障数据的完整性,确保业务稳定运行
想要使用多台MySQL对数据库进行实时备份,数据的同步就非常重要。MySQL自身就提供了这样的功能,叫做主从复制,产生数据的库定义为主库,备份数据的库定义为从库
原理
MySQL的binlog
日志记录着数据库中的所有数据变更,主从复制就是通过这个binlog日志实现。在配置了主从复制的从库中,会有两组线程,一组是IOthread,另一组线程是SQLthread。
IOthread
:通过不断读取主库中的binlog文件,将文件中的最新数据变更记录写入到自身的一个中继文件 Relay log 中SQLthread
:通过读取Realy log文件,将变更实时写入到自身的数据库表中,以实现主从复制
主库配置
刚才提到,主从复制基于主库的binlog实现,请先查询主库是否开启binlog日志(一般情况下mysql8是默认开启的),如果未开启,请先开启binlog
查看binlog是否开启
在MySQL控制台中使用如下语句:
show variables like '%log_bin%';
能够查询到如下结果:
log_bin
binlog是否开启,为ON
则表示已经开启了log_bin_basename
binlog日志的存放目录,以及文件开头log_bin_index
binlog的索引文件,里面记录了当前服务器关联的binlog文件有哪些
确认binlog
开启后,修改配置文件my.cnf
,通常情况下 /etc/my.cnf
这个位置,在文件的末尾添加下列内容
#1. mysql服务ID,需保证整个集群环境中唯一,默认为1就好了
server-id=1
#2. 是否只读,1 代表只读, 0 代表读写
read-only=0
#3. 指定需要同步的数据库,如下配置表示,要同步的库为minfinedb
binlog-do-db=minfiedb
#4. 也可以只指定不需要同步的数据库,指定后,则除了指定不需要同步的库外,其他的库将全部同步
#binlog-ignore-db=mysql
添加完成后,重启MySql服务
systemctl restart mysql
或者
systemctl restart mysqld
接下来登录MySQL控制台,查看二进制日志坐标
show master status;
字段含义
File
当前binlog记录到了哪一个日志文件(很重要,需要在下列从库配置中填写,用于记录同步的起始位置)Position
当前binlog记录到了日志文件的哪一行(很重要,需要在下列从库配置中填写,用于记录同步的起始位置)Binlog_Do_DB
需要同步的数据库Binlog_Ignore_DB
不需要同步的数据库
到这里,主库的工作就做完了
从库配置
在从库中先将需要同步的数据库创建出来,比如现在需要同步主库的minfinedb
数据库,那么从库也需要手动创建一个一样的名称为minfinedb
的数据库
create database minfinedb;
建完库后,先修改配置文件my.cnf
,通常情况在 /etc/my.cnf
这个位置,在文件的[mysqld]
部分的末尾添加下列内容:
#mysql服务ID,需保证整个集群环境中唯一,随便填一个,和主库不一样即可
server-id=2
#是否只读,1 代表只读, 0 代表读写
read-only=1
配置完成后,重启MySQL服务
systemctl restart mysqld
登录MySQL控制台,配置主库信息
CHANGE MASTER TO MASTER_HOST='192.168.135.128', MASTER_USER='root',
MASTER_PASSWORD='123456', MASTER_LOG_FILE='binlog.000007',
MASTER_LOG_POS=1955;
MASTER_HOST
主库连接地址MASTER_USER
连接主库的用户名MASTER_PASSWORD
连接主库的密码MASTER_LOG_FILE
主库的binlog日志文件名,对应主库刚才通过命令show master status;
查询出的File
字段MASTER_LOG_POS
主库的binlog日志行数,对应主库刚才通过命令show master status;
查询出的Position
字段
如果MySQL是8.0.23
或之后的版本,也可以使用如下命令:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.135.128', SOURCE_USER='root',
SOURCE_PASSWORD='123456', SOURCE_LOG_FILE='binlog.000007',
SOURCE_LOG_POS=1955;
配置完主库信息后,即可开启同步操作:
#8.0.22之前
start slave;
#8.0.22之后
start replica
至此,从库配置也已经完成,可以通过下列命令查询同步状态:
#8.0.22之前
show slave status\G;
#8.0.22之后
show replica status\G;
重要参数解析
Slave_IO_State
当前同步状态Master_Host
同步的主库地址Master_Log_File
当前同步的主库binlog日志文件名Read_Master_Log_Pos
当前同步的主库binlog日志行数Slave_IO_Running
同步IO线程是否运行Slave_SQL_Running
同步SQL任务线程是否运行
一般来说,Slave_IO_State
没有异常, Slave_IO_Running
和 Slave_SQL_Running
的值都为Yes
,则表示同步功能是正常运行的,主从复制配置完成