数据库的主从复制(master-slave replication)是一种数据复制技术,其中一台数据库服务器(主服务器)上的数据变更会复制到另一台或多台数据库服务器(从服务器)上。这种复制可以是同步的或异步的。
在主从复制中,主服务器会将其上的数据库修改记录(DDL和DML操作)通过二进制日志(binlog)发送给从服务器。从服务器通过读取主服务器的二进制日志并重新执行其中的操作,来保持与主服务器的数据一致。
主从复制可以用于提高数据可用性、备份、恢复以及水平扩展数据库系统的性能。
从服务器重要的两个状态指示器:
在主从复制中,I/O线程和SQL线程是协同工作的。I/O线程负责从主服务器接收日志并写入本地中继日志,而SQL线程则负责从中继日志中读取事件并在从服务器上执行。因此,确保这两个线程都正常运行是实现成功的主从复制的关键。
优点:
缺点:
ping
通的。caching_sha2_password
,当从服务器访问主服务器时,就会报错出现连接异常,此时就需要把加密方式改成mysql_native_password
。以上三个条件缺一不可,很重要。
Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。
Mysql主从服务器的版本一定要一致。
Mysql的安装和配置可以参考我以前的博客:MySQL-8.0.23–64位配置
my.ini文件是MySQL服务器配置的核心文件,它允许你调整各种参数和选项,以适应特定的环境和需求。
[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群集不支持基于语句的复制) |
[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 | 从服务器要从主服务器复制的数据库名称 |
无论是主服务器还是从服务器,配置好my.ini
文件后一定要重启Mysql服务。
打开任务管理器
中的服务
,找到MySQL
服务后,选择重新启动
。
在完成上述的操作后,我们需要在Master
端创建一个用户让Slave
端来进行连接。
当然也可以使用管理员的账号root
给Slave进行连接,但是需要修改mysql
这个数据库中的user
表中root
用户的host
,默认这个host
指向的是localhost
,只能本地来访问,其他的机器是无法访问的,所以如果想使用root
用户来给Slave进行连接,就需要把host
改为Slave的IP地址或者%。
但是我们还是支持一户专用的方式,所以我们在Master端新建一个账户。
1、新建用户
%
表示所有IP地址。
# 语法:CREATE USER 'username'@'IP address' IDENTIFIED BY '密码';
CREATE USER 'slave'@'%' IDENTIFIED BY '123456';
2、给用户赋权
GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%' WITH GRANT OPTION;
赋予的权限可以在mysql
数据库中的user
表中看到,主要是赋予Grant_priv
和Reple_slave_priv
两个字段的权限。
3、刷新权限系统
FLUSH PRIVILEGES;
4、查看用户信息
select host,user,plugin,authentication_string from mysql.user;
完成上述步骤后,就可以进行MySQL的主从连接了。
show master status;
执行上述SQL命令后,会查询出以下截图中的信息,其中重要的是File
和Position
两个字段。
1、先暂停Slave的复制信息,如果从来没开过,默认就是关闭的。
STOP SLAVE;
2、连接Master
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和查看连接状态
# 重启Slave
START SLAVE;
# 查看Slave状态
SHOW SLAVE status
查看Slave的状态主要看两个状态指示器Slave_IO_Running
和Slave_SQL_Running
。
如果两个指示器都是yes,则表示主从复制成功。
1、如果Slave_IO_Running
一直都是connecting
状态。
mysql_native_password
。Grant_priv
和Reple_slave_priv
两个权限是否开通。2、数据库连接报错1251: Client does not support authentication protocol requested by server; consider upgrading MySQL client
。
caching_sha2_password
改成mysql_native_password
。