Mysql8.0实现主从复制

1、什么是主从复制

数据库的主从复制(master-slave replication)是一种数据复制技术,其中一台数据库服务器(主服务器)上的数据变更会复制到另一台或多台数据库服务器(从服务器)上。这种复制可以是同步的或异步的。

在主从复制中,主服务器会将其上的数据库修改记录(DDL和DML操作)通过二进制日志(binlog)发送给从服务器。从服务器通过读取主服务器的二进制日志并重新执行其中的操作,来保持与主服务器的数据一致。

主从复制可以用于提高数据可用性、备份、恢复以及水平扩展数据库系统的性能。

从服务器重要的两个状态指示器:

  1. Slave_IO_Running:表示从服务器(slave)的I/O线程是否正在运行。I/O线程是负责从主服务器接收二进制日志(binlog)并写入本地中继日志(relay log)的线程。
  2. Slave_SQL_Running:表示从服务器(slave)的SQL线程是否正在运行。SQL线程是负责从本地中继日志(relay log)读取事件,并在从服务器上执行这些操作的线程。

在主从复制中,I/O线程和SQL线程是协同工作的。I/O线程负责从主服务器接收日志并写入本地中继日志,而SQL线程则负责从中继日志中读取事件并在从服务器上执行。因此,确保这两个线程都正常运行是实现成功的主从复制的关键。

2、使用主从复制的原因

优点:

  1. 提高数据可用性:主从复制可以实现数据的实时备份,即使主服务器发生故障,从服务器也可以继续提供服务,保证数据的可用性。
  2. 负载均衡:通过将读操作分担到多个从服务器上,可以减轻主服务器的负载,提高整个系统的性能。
  3. 数据备份和恢复:从服务器可以作为主服务器的备份,保证数据的安全性。同时,如果主服务器发生故障,可以从从服务器上快速恢复数据。
  4. 扩展性:主从复制可以实现系统的水平扩展,提高系统的处理能力和性能。
  5. 实现复杂应用场景:主从复制可以满足各种复杂的应用场景,如读写分离、数据备份、容灾等。

缺点:

  1. 延迟问题:由于数据是从主服务器复制到从服务器的,因此当主服务器上的数据发生改变时,从服务器上的数据可能会存在一定的延迟。这可能会对一些需要实时同步的应用场景造成影响。
  2. 复杂性:主从复制需要配置和维护多个服务器和数据库,这会增加系统的复杂性和管理难度。此外,如果主从服务器之间的网络通信出现故障,可能会导致数据复制的中断或延迟。
  3. 性能问题:虽然从服务器可以分担一部分读操作,但主服务器的负载仍然会因为写操作而增加。在某些情况下,如果主服务器的性能不足以处理所有的请求,可能会影响到整个系统的性能。
  4. 数据一致性问题:由于主从复制是异步的,因此可能会出现数据一致性问题。例如,当主服务器上的数据还没有完全复制到从服务器时,如果从服务器被用来写入数据,就可能会导致数据的不一致。
  5. 故障切换问题:如果主服务器出现故障,需要手动切换到从服务器,这可能会导致停机时间和数据丢失的风险。

3、Mysql主从复制的注意点

  1. Mysql的主服务器和从服务器的版本必须要一致。
  2. 主服务器和从服务器的IP一定是能ping通的。
  3. 在8.0之后的Mysql用户的密码加密方式已经改成了caching_sha2_password,当从服务器访问主服务器时,就会报错出现连接异常,此时就需要把加密方式改成mysql_native_password

以上三个条件缺一不可,很重要。

4、实现

4.1、下载Mysql

Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。

Mysql的安装和配置可以参考我以前的博客:MySQL-8.0.23--64位配置

4.2、修改my.ini文件

my.ini文件是MySQL服务器配置的核心文件,它允许你调整各种参数和选项,以适应特定的环境和需求。

4.2.1、配置主服务器的my.ini文件

yaml 复制代码
[mysqld]
port=3306
basedir=E:\MySQL\mysql-8.0.35-winx64
datadir=E:\MySQL\mysql-8.0.35-winx64\data
max_connections=100
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB

# 主要部分
server-id=1
log-bin=master-bin
binlog-do-db=mysql_test
binlog_format=MIXED

[mysql]
default-character-set=utf8mb4

[client]
port=3306

主要部分参数:

参数名称 参数描述
server-id 服务端的唯一ID(唯一),主/从服务器的server-id不能一致
log-bin 主服务器的同步二进制日志文件名称
binlog-do-db 需要同步的数据库名称
binlog_format 二进制文件的格式
binlog-ignore-db 不需要同步的数据库名称

binlog_format可以选取的参数:

参数名称 参数描述
STATEMENT 将每条会修改数据的SQL语句记录到binlog中,不记录具体的数据变化。这样的好处是binlog文件较小,但是在主从复制中可能会出现数据不一致的问题。 (这是MySQL 5.7.7之前的默认格式)
ROW 将每一行数据的变化都记录到binlog中。 (这是MySQL 5.7.7及更高版本的默认值)
MIXED 是STATEMENT和ROW的混合模式,会根据执行的SQL语句的类型来决定记录到binlog中的内容,这种格式在兼容性上相对较好。 (在NDB群集中,默认值是MIXED,因为NDB群集不支持基于语句的复制)

4.2.2、配置从服务器的my.ini文件

yaml 复制代码
[mysqld]
port=3306
basedir=D:\mysql\mysql-8.0.35-winx64
datadir=D:\mysql\mysql-8.0.35-winx64\data
max_connections=100
max_connect_errors=10
character-set-server=utf8mb4
default-storage-engine=INNODB

# 主要部分
server-id=2
replicate-do-db=mysql_test

[mysql]
default-character-set=utf8mb4
[client]
port=3306
参数名称 参数描述
server-id 从服务器的唯一ID
replicate-do-db 从服务器要从主服务器复制的数据库名称

4.2.3、重启Mysql服务

无论是主服务器还是从服务器,配置好my.ini文件后一定要重启Mysql服务。

打开任务管理器中的服务,找到MySQL服务后,选择重新启动

4.3、新建用户

在完成上述的操作后,我们需要在Master端创建一个用户让Slave端来进行连接。

当然也可以使用管理员的账号root给Slave进行连接,但是需要修改mysql这个数据库中的user表中root用户的host,默认这个host指向的是localhost,只能本地来访问,其他的机器是无法访问的,所以如果想使用root用户来给Slave进行连接,就需要把host改为Slave的IP地址或者%。

但是我们还是支持一户专用的方式,所以我们在Master端新建一个账户。

1、新建用户
%表示所有IP地址。

sql 复制代码
# 语法:CREATE USER 'username'@'IP address' IDENTIFIED BY '密码';
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';

2、给用户赋权

sql 复制代码
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' WITH GRANT OPTION;

赋予的权限可以在mysql数据库中的user表中看到,主要是赋予Grant_privReple_slave_priv两个字段的权限。

3、刷新权限系统

sql 复制代码
FLUSH PRIVILEGES;

4、查看用户信息

sql 复制代码
select host,user,plugin,authentication_string from mysql.user;

4.4、主从连接

完成上述步骤后,就可以进行MySQL的主从连接了。

4.4.1、查看Master状态

sql 复制代码
show master status;

执行上述SQL命令后,会查询出以下截图中的信息,其中重要的是FilePosition两个字段。

  • File:Master端的同步日志文件。
  • Position:用于记录Slave在Master二进制日志中的位置。它用于同步主从服务器之间的数据复制过程。

4.4.2、Slave端连接Master端

1、先暂停Slave的复制信息,如果从来没开过,默认就是关闭的。

sql 复制代码
STOP SLAVE;

2、连接Master

sql 复制代码
CHANGE MASTER TO MASTER_HOST ='192.168.72.122',  # Master IP Address
MASTER_PORT=3306, # Master Mysql Port
MASTER_USER ='slave', # username
MASTER_PASSWORD ='123456', # password
MASTER_LOG_FILE ='master-bin.000003', # Master log file name
MASTER_LOG_POS = 450; # position

以上命令在满足第三点的条件后,Master信息一定要写对,否则无法进行主从复制。

3、启动Slave和查看连接状态

sql 复制代码
# 重启Slave
START SLAVE;
# 查看Slave状态
SHOW SLAVE status

查看Slave的状态主要看两个状态指示器Slave_IO_RunningSlave_SQL_Running

如果两个指示器都是yes,则表示主从复制成功。

4.5、所遇错误

1、如果Slave_IO_Running一直都是connecting状态。

  • Master端和Slave端的Mysql版本是否一致。
  • 在Slave端的可视化工具中连接Master端的Mysql,看是否可以连接,如果不能连接,则查看Slave端连接Master端的用户密码加密是不是使用的是mysql_native_password
  • Master端的用户Grant_privReple_slave_priv两个权限是否开通。

2、数据库连接报错1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client

  • 查看Mysql版本是否一致。
  • 修改用户密码的加密方式,caching_sha2_password改成mysql_native_password
相关推荐
C吴新科12 分钟前
MySQL入门操作详解
mysql
NiNg_1_23412 分钟前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
种树人2024081916 分钟前
如何在 Spring Boot 中启用定时任务
spring boot
Ai 编码助手3 小时前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
白云如幻3 小时前
MySQL排序查询
数据库·mysql
苹果醋33 小时前
Java8->Java19的初步探索
java·运维·spring boot·mysql·nginx
Wx-bishekaifayuan3 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
customer083 小时前
【开源免费】基于SpringBoot+Vue.JS周边产品销售网站(JAVA毕业设计)
java·vue.js·spring boot·后端·spring cloud·java-ee·开源
Frank牛蛙4 小时前
1.每日SQL----2024/11/7
数据库·sql