一、基础环境
- 服务器:centos 7
- 数据库:mysql 8.x
二、实现效果
- 搭建数据库集群【目前就是实现2台,1台主服务器,1台从服务器】
- 实现数据库的即时同步
三、实现原理
- 复制概述
复制是指将主数据库的DDL和DML操作通过二进制日志传到从服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库的数据保持同步。
mysql支持一台主库同时向多台从库进行赋值,从库也可以作为其他从库服务器的主库,实现链状复制。 - 复制原理
四、配置主库
- 关闭防火墙
// 关闭
syetemctl stop firewalld
// 查看状态 确定是 dead
syetemctl status firewalld
- 修改 my.cnf
vi /etc/my.cnf
# mysql 服务器id ,保证整个集群环境中唯一
server-id = 1
# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin
# read-only ,1代表只读 ,0 代表 读写
read-only=0
#忽略的数据库,指不需要同步的数据库
binlog-ignore-db=mysql
#指定同步的数据库,如果不指定,就是除忽略的数据库外的其他数据库
#binlog-do-db=db01
- 保存后,重启mysql
syetemctl restart mysqld
- 创建同步数据账户,并进行授权操作
-- 使用mysql数据库
use mysql
-- 创建用户
create user myuser identified by '123456';
-- 查看用户
select user, host, authentication_string,plugin from user where user ='myuser';
-- 修改用户密码及密码加密方式
alter user 'myuser'@'%' identified with mysql_native_password by '123456';
【 默认加密机制是 caching_sha2_password,这种方式不怎么支持远程连接,所以要修改一下就可以连接了】
-- 授予myuser用户全局级全部权限:
GRANT ALL PRIVILEGES ON *.* TO 'myuser'@'%' WITH GRANT OPTION;
-- 生效(刷新权限)
FLUSH PRIVILEGES;
- 查看 master 状态
show master status;
- 主库配置结束
五、配置从库
- 关闭防火墙
// 关闭
syetemctl stop firewalld
// 查看状态 确定是 dead
syetemctl status firewalld
- 修改 my.cnf
vi /etc/my.cnf
# mysql 服务器id ,保证整个集群环境中唯一
server-id = 2
# mysql binlog 日志的存储路径和文件名
log-bin=/var/lib/mysql/mysqlbin
- 保存后,重启mysql
syetemctl restart mysqld
- 登录mysql,执行如下命令
change master to master_host='主数据库ip, master_user='myuser',master_password='123456',
master_log_file='mysqlbin.000004', master_log_pos=1149;
- 命名解释
change master to
master_host='主数据库ip -- 主数据ip地址
, master_user='myuser' -- 主数据库登录用户名
,master_password='123456' -- 主数据库登录密码
,master_log_file='mysqlbin.000004' -- 主数据库日志文件名,直接查看 主库的状态截图的file 值
, master_log_pos=1149; -- 同步主数据库日志文件起始,直接查看 主库的状态截图的postion 值
- 开启同步操作
start slave;
- 查看同步状态
show slave status;
- 从库配置结束
六、测试主从复制
- 在主库创建 数据库,插入数据
-- 创建db01 数据库
create database db01;
-- 创建 t_user表
use db01;
-- 创建表
create table t_user(
id int(11) not null auto_increment,
name varchar(50) not null,
sex varchar(1),
primary key (id)
)engine=innodb default charset=utf8;
-- 并插入数据
insert into t_user(name,sex) values('Tom','1');
- 在从库中查看结果
-- 显示数据库
show databases;
- 到此,如果显示db01 基本上已经确定复制成功了,后续可以实时操作主库的数据,进行测试复制效果。
写在最后
这一部分的原理和实现步骤,参考 传智播客风清扬老师的mysql教程,在此表达对风清扬老师的感谢和敬意,他是我转编程路上的导师(当然是我单向的,他不知道的)。我也刚开始学习,如有错误请指正,谢谢!