MySQL 主从复制是一种常见的数据库复制技术,用于将一个 MySQL 数据库服务器(称为主服务器)的数据同步到一个或多个其他 MySQL 数据库服务器(称为从服务器)。主从复制通常用于提高数据库的性能、可用性和数据备份的安全性。
主数据库在处理完 insert/delete/update 操作后,会往“二进制日志文件”里写入日志,然后从数据库的“I/O模块”会读取主数据库的“二进制日志文件”,读取到的内容放入到自己的“中继日志”,最后从服务器从“中继日志”里读取数据写入到库中。
一定是从数据库去主数据里抓取二进制日志文件。
创建一个需要作为主库的数据库,这里新建 test 数据库
create database test;
修改配置文件
# vi 是一个强大的文本编辑器,用于在 Unix 和类 Unix 系统中编辑文本文件。通过执行 vi /etc/my.cnf 命令,系统将会使用 Vi 编辑器打开 /etc/my.cnf 文件,用户可以在其中添加、修改或删除 MySQL 服务器的配置参数,以满足特定的需求或要求。
# 编辑完成后,用户可以使用 Vi 编辑器的保存和退出命令(通常是按下 Esc 键,然后输入 :wq 并按下 Enter 键)保存所做的修改并退出编辑器。
vi /etc/my.cnf
在配置文件的 [mysqld] 中增加配置
[mysqld]
# master and slave
# 开启二进制日志,'mysql-bin-master' 是日志名称
log-bin=mysql-bin-master
# 给主库设置唯一的服务 id
server-id=1
# 如果不写 binlog-do-db,则表示同步主服务器上的所有库。当然如果不想同步所有库,想指定多个同步的库,也可以多写几个 binlog-do-db# 设置 test 数据库可被从库复制
binlog-do-db=test
# 设置 test2 数据库可被从库复制
binlog-do-db=test2
# 设置 test3 数据库可被从库复制
binlog-do-db=test3
# 设置 mysql 数据库不可被从库复制
binlog-ignore-db=mysql
增加完后成保存配置,并重启数据库
service mysql restart
登录到 test 数据库,增加一个账号 slave,可以让从库通过这个账号连接到主库 test
./mysql -u root -p
授予 47.100.195.244 地址中的 slave 用户 replication slave 权限,replication slave 是一个必须而基本的权限,它直接授予从服务器以该账户连接 master 后可以执行 replicate 操作的权利。
# grant replication slave 授权用户进行复制操作,即从服务器可以连接到主服务器并获取主服务器上的日志信息进行复制。
# on *.* 表示授权的范围是所有数据库的所有表。
# to slave@47.100.195.244 指定授权的用户名为 slave,并且限定只能从 IP 地址为 47.100.195.244 的从机连接。
# identified by '123456':指定用户的密码为 123456,以确保只有知道密码的用户才能进行连接和复制操作。
grant replication slave on *.* to slave@47.100.195.244 identified by '123456';
刷新权限
flush privileges;
查询给 47.100.195.244 中的 slave 用户授予的权限是否成功
select * from mysql.user where user='slave'\G;
可以看到已经成功授予权限,并且只有 Repl_slave_priv 权限。
查看一下主库的状态信息
show master status;
可以看到主库中设置主从同步的信息,依次是:主库中二进制文件的名称、二进制文件的位置、执行主从备份的数据库名称,不执行主从备份的数据库名称。(这里的二进制文件名和二进制文件位置,接下来会在从库中设置同步信息时用到)
如果主库中没有指定同步哪个数据库的话,Binlog_Do_DB里不会有信息,表示同步主库中的所有数据库。
进入到从库所在的服务器,设置从库的配置文件
vi /etc/my.cnf
在 [mysqld] 中写入以下信息
# master and slave
# 给从库设置唯一的服务 id
server-id=2
# 如果有多个从库,想要指定每个从库从主库中同步不同的数据库,可以通过下面的代码指定
# 指定同步的库
replicate_do_db=test1
# 指定不同步的库
replicate_ignore_db=test2
重启一下数据库
service mysql restart;
用主库中的 salve 用户访问主库,测试是否可以访问,可以访问的话就继续下面的步骤
./mysql -h 47.101.203.108 -u slave -p
查询一下数据库:show databases; 如果只能看到一个库,那就是对的,因为从库只有复制权限。
接下来在从库中进行同步配置,先退出上面访问到的主库,然后用 root 账号登录从库
./mysql -u root -p
先在从库中创建 test 数据库
create database test;
在从库中停止同步
stop slave;
在从库中设置同步信息:指定主库地址,主库端口,同步所用的账号,账号密码,主库二进制文件名,主库二进制文件位置
change master to master_host='47.101.203.108',master_port=3306,master_user='slave',master_password='123456',master_log_file='mysql-bin-master.000001',master_log_pos=595;
在从库中开启同步
start slave;
在从库中查看一下主从同步是否已经设置成功
show slave status \G
只要看到这两个线程是 Yes 状态,就说明主从同步已经设置成功了
在主库中的 test 数据库中,创建 emp 表,测试主从同步是否成功
create table emp(id int primary key auto_increment comment 'id',
code varchar(15) unique not null comment '用户代码',
name varchar(55) comment '姓名',
age int comment '年龄',
sex char(1) comment '性别');
在从库的 test 数据库中查看是否生成了 emp 表
show tables;
发现从库的 test 数据库中已经生成了 emp 表,至此主从同步设置成功
如果主从同步发生了错误,则从库不会继续进行同步,而会停止同步,所以需要在从库中进行以下操作。
# 先停止同步
stop slave;
# 用 set 跳过这条报错的事务
set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
# 再开启同步
start slave;
# 查看以下两个同步线程是否已经恢复到 Yes 状态,如果没有恢复到 Yes 状态,则重复执行上面的三行代码,直到两个同步的线程恢复到了 Yes 状态
show slave status \G