mysql数据库的主从复制搭建


前言

主从复制概述:
将主库的DDL 和DML 操作,写入二进制日志,并通过I/O线程读取到从库服务器中,通过sql线程这些日志重新执行,从而使得从库和主库的数据保持同步。


一、服务器准备

主从复制至少需要两台及以上的服务器,确保都配置了mysql并开启。

注意:需要关闭防火墙。

本文使用到的ip地址为:

  • 主库:192.168.188.132
  • 从库:192.168.188.130

二、主库配置

2.1 修改配置文件

vim /etc/my.cnf

进入文件后,添加如下配置:

#mysql 服务ID,保证整个集群环境中唯一,取值范围:1232-1,默认为1 
server-id=1 
#是否只读,1 代表只读, 0 代表读写 
read-only=0 

在这里插入图片描述

2.2 重启mysql服务器

systemctl restart mysqld

没有报错说明配置成功,如果报错一般是刚才写的配置文件的内容有问题,仔细检查。

2.3 登录mysql,创建账号,配置权限

登录后执行下列操作:

#创建master用户,并设置密码'Root@123456'(未调整数据库权限,此处设置的复杂一些),该用户可在任意主机连接该MySQL服务 
CREATE USER 'master'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@123456' ;
#为 'master'@'%' 用户分配主从复制权限 
GRANT REPLICATION SLAVE ON *.* TO 'master'@'%';

2.4 查看binlog的文件位置

此处的master为上一步创建的用户对象。在从库中需要用该出的File、Position数据。
在这里插入图片描述

  • file : 从哪个日志文件开始推送日志文件
  • position : 从哪个位置开始推送日志
  • binlog_ignore_db : 指定不需要同步的数据库

到此,主库配置完成。


三、从库配置

3.1 修改配置文件

vim /etc/my.cnf
进入从库的配置文件。

#mysql 服务ID,保证整个集群环境中唯一,取值范围:12^32-1,和主库不一样即可 
server-id=2 
#是否只读,1 代表只读, 0 代表读写
read-only=1

3.2 重新mysql服务

systemctl restart mysqld

3.3 登录mysql,设置主库配置

根据自己的主机配置,
SOURCE_HOST:主库的ip地址。
SOURCE_USER:主库创建的用户名。
SOURCE_PASSWORD:主库创建的用户名密码。
SOURCE_LOG_FILE:主库binlog文件的位置。
SOURCE_LOG_POS:主库binlog文件中的偏移量。

CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.188.132', SOURCE_USER='master', SOURCE_PASSWORD='Root@123456', SOURCE_LOG_FILE='binlog.000026', SOURCE_LOG_POS=663;

如果mysql是 8.0.23 之前的版本,执行如下SQL:

CHANGE MASTER TO MASTER_HOST='192.168.188.132', MASTER_USER='master', MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000026', MASTER_LOG_POS=663;

执行结果如下:
在这里插入图片描述

3.4 开启同步操作

start replica ; #8.0.22之后 
start slave ; #8.0.22之前

在这里插入图片描述

3.5 查看主从同步状态

show replica status ; #8.0.22之后 
show slave status ; #8.0.22之前

在这里插入图片描述


四、测试

1 在主库 192.168.188.132上创建数据库、表,并插入数据(DML语句)。

create database db01; 
use db01; 
create table tb_user( 
	id int(11) primary key not null auto_increment, 
	name varchar(50) not null, 
	sex varchar(1) 
)engine=innodb default charset=utf8mb4;
insert into tb_user(id,name,sex) values(null,'zhangsan', '1'),(null,'lisi','0'), (null,'wangwu','1');

主库的表
在这里插入图片描述
2. 在从库 192.168.188.130 中查询数据,验证主从是否同步。
在这里插入图片描述
使用use db01进入该库中可见,数据也在其中。
在这里插入图片描述


五、出现的问题

在第一次主从复制搭建以后可能会出现以下两个问题:

5.1 Slave_SQL_Running: No

目前网页上的解决方案主要有两种:(个人成功的是方案二)
方案一:
一般是事务回滚造成的,在从库中执行以下语句:

mysql> stop slave ;
mysql> set GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
mysql> start slave ;
mysql> show replica status\G;

方案二:
执行如下语句,等于重新配置

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CHANGE MASTER TO MASTER_HOST='192.168.188.132', MASTER_PORT=3306, MASTER_USER='master', MASTER_PASSWORD='Root@123456', MASTER_LOG_FILE='binlog.000028 ', MASTER_LOG_POS=156;
Query OK, 0 rows affected, 9 warnings (0.01 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> show slave status\G;

在这里插入图片描述
出现问题: 执行后IO又成了No,往下看,有一个 Last_IO_Error日志:
Got fatal error 1236 from master when reading data from binary log: ‘Could not find first log file name in binary log index file’,使用5.2解决
在这里插入图片描述

5.2 Slave_IO_Running: No

如果是5.1结尾出现的错误,则是因为主从日志版本号不一致而导致。解决如下:
主库中执行:

mysql> Flush logs;(这时主服务器会重新创建一个binlog文件)
Query OK, 0 rows affected (0.01 sec)

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000029 |      156 |              |                  |                   |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

从库中执行的操作和5.1类似:

mysql> stop slave;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> change master to master_log_file ='binlog.000029',master_log_pos=156;
Query OK, 0 rows affected, 3 warnings (0.02 sec)

mysql> start slave;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> show slave status\G;

成功
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
好的,关于mysql8.0 主从复制搭建,您可以参考以下步骤: 1. 配置主服务器:在my.cnf配置文件中增加如下配置: [mysqld] server-id=1 log-bin=mysql-bin binlog-do-db=db1 binlog-do-db=db2 binlog-ignore-db=mysql relay-log=relay-bin relay-log-index=relay-bin.index 其中,server-id表示服务器的唯一ID,每个服务器必须不同;log-bin表示启用二进制日志文件,binlog-do-db表示需要同步的数据库名称,可以同时写入多个;binlog-ignore-db表示不需要同步的数据库;relay-log和relay-log-index为备库记录主库日志和索引文件的位置。 2. 创建复制用户:执行以下SQL语句: CREATE USER 'repl'@'%' IDENTIFIED BY 'password'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; 其中,repl为复制用户,password为密码。 3. 导出主服务器的数据:使用mysqldump将主服务器需要同步的数据库导出,并使用source命令在备库中导入。 4. 配置从服务器:在my.cnf配置文件中增加如下配置: [mysqld] server-id=2 relay-log=relay-bin relay-log-index=relay-bin.index 其中,server-id为从服务器的唯一ID。 5. 启动主从同步:在备库中执行以下SQL语句: CHANGE MASTER TO MASTER_HOST='master_host', MASTER_USER='repl', MASTER_PASSWORD='password', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=123456; 其中,master_host为主服务器的IP地址,password为复制用户的密码,MASTER_LOG_FILE和MASTER_LOG_POS表示从哪个位置开始同步数据。 6. 启动从服务器的复制线程:执行以下SQL语句: START SLAVE; 复制线程会自动从主库拉取数据并同步到备库中。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Le`soleil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值