深入理解MySQL主从复制原理以及集群部署流程

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

MySQL数据库主从复制集群原理概念以及搭建流程

1.MySQL主从复制集群的核心概念

1.1.什么是主从复制集群

主从复制是指将主数据库的 DDL 和 DML 操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。

MySQL支持一台主库同时向多台从库进行复制, 从库同时也可以作为其他从服务器的主库,实现链状复制。

MySQL 复制的优点主要包含以下三个方面:

  • 主库出现问题,可以快速切换到从库提供服务。
  • 实现读写分离,降低主库的访问压力。
  • 可以在从库中执行备份,以避免备份期间影响主库服务。

1.2.主从复制集群中的专业术语

在MySQL主从复制集群中,主要分为两大部分:文件、线程。

文件:

  • 主库
  • Binlog:二进制日志。
  • 从库
  • relay-log:中继日志,主库推送过来的Binlog日志都存放在中继日志中。
  • master.info:从库复制主库的信息文件,记录着主库的地址、用户、Binlog等信息。
  • relay-log.info:中继日志的信息文件,该文件记录了上次执行relay-log的位置等信息。

线程:

  • 主库
  • binlog_dump_thread:二进制日志投递线程,主要将二进制日志发送给从库的线程。
  • 从库
  • IO_Thread:从库的IO线程,用于请求和接收主库的Binlog二进制日志。
  • SQL_Thread:从库的SQL线程,用于将主库发来的二进制日志在数据库中进行数据复制。

1.3.主从复制集群工作原理

MySQL主从复制集群的工作原理主要围绕前面提到的文件和线程。

MySQL主从复制集群的原理:

1)首先从库执行change master to将连接主库的配置信息记录到master.info文件中,此时从库上会开启两个线程:I/O线程和SQL线程。

2)从库上的I/O线程会从master.info文件中读取主库的连接信息。

3)从库I/O线程获取到主库的信息后,会与主库进行身份认证,然后建立连接。

4)当从库I/O线程成功连接到主库后,主库会立即给从库分配一个binlog_dump_thread线程,用于推送Binlog日志到从库。

5)从库I/O线程会根据master.info中记录的Binlog信息(Binlog日志文件、标识位号)与主库的binlog_dump_thread线程请求最新的Binlog日志。

6)这时主库的binlog_dump_thread线程就会去查询是否产生了新的Binlog日志,如果产生了新的Binlog日志,会截取最新的Binlog日志然后推送给从库的I/O线程。

7)从库的I/O线程接收到主库推送的Binlog日志后,会现将其存放在内存的TCP/IP缓存中,然后告知主库的binlog_dump_thread线程,Binlog日志已收到。

8)此时从库的I/O线程会去更新master.info文件中的Binlog位置点信息,记录最新的Binlog标识号。

9)然后从库的I/O线程会将主库推送的Binlog日志写入到磁盘上的relay-log文件中。

10)最后由从库的SQL线程读取relay-log.ifno文件,获取relay-log最新的位置点,然后根据的位置点去relay-log中执行最新的Binlog日志,执行完成后会再次更新relay-log.info文件中记录的relay-log位置点。

这就是完整的主从复制工作原理。

简单来说MySQL主从复制的原理就是,从库的I/O线程读取连接主库的配置信息,然后去连接主库开始主从同步,当I/O线程连接上主库后,主库会立即给I/O线程分配一个Dump线程,用于推送Binlog日志到从库,此时I/O线程会根据master.info文件中记录的Binlog信息,向主库的Dump线程请求最新的BInlog,Dump线程查询到有最新的Binlog产生,会将最新的Binlog截取,然后推送给从库的I/O线程,I/O线程收到Binlog日志后,将其存放在内存的TCP/IP缓存中,然后更新master.info文件中最新的Binlog信息,紧接着将Binlog日志写入到relay-log中,最后由从库的SQL线程从relay-log.info中读取relay-log的位置号,然后执行relay-log中最新的Binlog日志,执行完成后,再次更新relay-log.info中的relay-log位置号,以便于下次再relay-log中读取最新的Binlog日志。

relay-log日志会通过MySQL中的其他线程定期清理。

1.4.主从复制中的小细节

从上面说的主从复制原理来看,好像每次都是从库向主库去请求新数据,那么什么时候从库才应该向主库请求呢?请求的频率如何?

其实是这样的:当主库上产生了新的事务,更新到Binlog日之后,会给binlog_dump_thread线程发送一个“信号”,binlog_dump_thread线程会与从库的I/O线程一直建立连接,binlog_dump_thread线程就会通知从库的I/O线程有新数据产生了,这时从库的I/O线程就带着master.info中记录的最新Binlog标识位号,向binlog_dump_thread线程请求最新的Binlog,然后完成数据同步。

MySQL主从复制第一次复制时,是按照上面说到的10步完成的,第二次复制时,只需要等待主库的binlog_dump_thread线程向从库的I/O线程发送信号,然后I/O线程去请求最新的Binlog,最后由SQL线程复制数据即可。

1.5.搭建主从复制集群的前提条件

搭建MySQL主从复制集群的前提条件如下:

  • 首先需要准备多个MySQL实例,最少两个MySQL实例,能够实现一主一从的架构,可以在多个服务器中分布部署独立的MySQL节点,也可以在一台服务器中部署多个MySQL实例。
  • 每个MySQL实例都需要由单独的sever_id。
  • 身为主库角色的MySQL实例需要开启二进制日志,从库在特定场景下需要开启。
  • 主库需要授权一个专门的用户作为主从复制的用户。
  • 如果主库是一个运行很多年的数据库,突然要升级为主从复制集群,最好先将主库的数据同步一份到从库中。
  • 开启专用的复制线程。

1.6.MySQL主从复制集群的架构信息

本次主从复制的架构是一主两从的结构。

IP 主机名 端口 角色 server_id
192.168.20.11 mysql-1 3306 主库 1
192.168.20.12 mysql-2 3306 从库 2
192.168.20.12 mysql-2 3307 从库 3

2.搭建MySQL多实例环境

再搭建MySQL主从复制集群之前,首先搭建出多个MySQL实例,由于服务器有限,因此通过两台机器模拟出一主两从的环境。

主从复制集群中有一个节点开启了gtid,所有的节点都需要开启gtid,否则主从将不能同步。

2.1.在mysql-1中搭建身为主库的MySQL实例

mysql-1服务器中的3306端口的MySQL实例再前面已经搭建完成了,就是我们一直在使用的数据库实例,里面有数据,更加方便演示主从集群,下面只是提供一下搭建过程的步骤。

注意每个MySQL节点的server_id都要设置成不同的,如果你的一主两从都是单独在不同服务器中部署的,那么直接参考本小结的数据库实例安装即可,不用再看多实例的步骤了。

1.解压MySQL

[root@mysql-1 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

[root@mysql-1 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

2.设置MySQL的环境变量

[root@mysql-1 ~]# vim /etc/profile

exportMYSQL_HOME=/usr/local/mysql

exportPATH=$MYSQL_HOME/bin:$PATH

exportLD_LIBRARY_PATH=:/usr/local/mysql/lib

3.创建mysql用户

[root@mysql-1 ~]# groupadd -r mysql

[root@mysql-1 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql

4.准备数据目录

[root@mysql-1 ~]# mkdir /data/mysql

[root@mysql-1 ~]# chown -R mysql. /data/mysql

5.初始化数据库

[root@mysql-1 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql

6.准备mysql配置文件

[root@mysql-1 ~]# vim /etc/my.cnf

[mysqld]    

user=mysql                              

port=3306                              

server_id=1                        #每个MySQL数据库的server_id都设置成不同的

basedir=/usr/local/mysql                

datadir=/data/mysql

log_bin=mysql-bin

gtid-mode=on

enforce-gtid-consistency=true

socket=/tmp/mysql.sock

log_error=/data/mysql/mysql_err.log

character-set-server=utf8

[mysql]

socket=/tmp/mysql.sock

7.准备服务管理脚本

[root@mysql-1 ~]# vim /etc/systemd/system/mysqld.service

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my.cnf

LimitNOFILE =5000

8.启动数据库

[root@mysql-1 ~]# systemctl daemon-reload

[root@mysql-1 ~]# systemctl start mysqld

9.设置root密码

[root@mysql-1 ~]# mysqladmin -u root -P 3306  password '123456'

10.登陆数据库

[root@mysql-1 ~]# mysql -uroot -p123456

mysql>

2.2.在mysql-2中搭建MySQL多实例

由于服务器数量有限,在mysql-2这台服务器中分别搭建两个从库。

2.2.1.安装数据库软件

1.解压MySQL

[root@mysql-2 ~]# tar xf mysql-5.7.36-linux-glibc2.12-x86_64.tar.gz -C /usr/local/

[root@mysql-2 ~]# mv /usr/local/mysql-5.7.36-linux-glibc2.12-x86_64 /usr/local/mysql

2.设置MySQL的环境变量

[root@mysql-2 ~]# vim /etc/profile

exportMYSQL_HOME=/usr/local/mysql

exportPATH=$MYSQL_HOME/bin:$PATH

exportLD_LIBRARY_PATH=:/usr/local/mysql/lib

3.创建mysql用户

[root@mysql-2 ~]# groupadd -r mysql

[root@mysql-2 ~]# useradd -M -r -s /sbin/nologin -g mysql mysql

2.2.1.搭建第一个3306从库的MySQL实例

搭建第一个从库实例,端口号为3306,server_id为2,数据路径为/data/mysql3306。

1.创建3306从库的数据目录

[root@mysql-2 ~]# mkdir /data/mysql3306

[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3306/

2.准备3306从库的配置文件

[root@mysql-1 ~]# vim /etc/my3306.cnf

[mysqld]    

user=mysql                              

port=3306                              

server_id=2                        #每个MySQL数据库的server_id都设置成不同的

basedir=/usr/local/mysql                

datadir=/data/mysql3306

log_bin=/data/mysql3306/mysql-bin

gtid-mode=on

enforce-gtid-consistency=true

socket=/data/mysql3306/mysql.sock

log_error=/data/mysql3306/mysql_err.log

character-set-server=utf8

[mysql]

socket=/data/mysql3306/mysql.sock

3.初始化3306从库

[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3306

4.准备服务管理脚本

[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3306.service

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3306.cnf

LimitNOFILE =5000

5.启动数据库

[root@mysql-1 ~]# systemctl daemon-reload

[root@mysql-1 ~]# systemctl start mysqld3306

6.设置root密码

[root@mysql-2 ~]# mysqladmin -u root -P 3306 -S /data/mysql3306/mysql.sock password '123456'

7.登陆数据库

[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock

mysql>

2.2.2.搭建第二个3307从库的MySQL实例

搭建第一个从库实例,端口号为3306,server_id为2,数据路径为/data/mysql3306。

1.创建3307从库的数据目录

[root@mysql-2 ~]# mkdir /data/mysql3307

[root@mysql-2 ~]# chown -R mysql.mysql /data/mysql3307/

2.准备3307从库的配置文件

[root@mysql-1 ~]# vim /etc/my3307.cnf

[mysqld]    

user=mysql                              

port=3307                              

server_id=3                        #每个MySQL数据库的server_id都设置成不同的

basedir=/usr/local/mysql                

datadir=/data/mysql3307

log_bin=/data/mysql3307/mysql-bin

gtid-mode=on

enforce-gtid-consistency=true

socket=/data/mysql3307/mysql.sock

log_error=/data/mysql3307/mysql_err.log

character-set-server=utf8

[mysql]

socket=/data/mysql3307/mysql.sock

3.初始化3307从库

[root@mysql-2 ~]# mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/data/mysql3307

4.准备服务管理脚本

[root@mysql-1 ~]# vim /etc/systemd/system/mysqld3307.service

[Unit]

Description=MySQL Server

Documentation=man:mysqld(8)

Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html

After=network.target

After=syslog.target

[Install]

WantedBy=multi-user.target

[Service]

User=mysql

Group=mysql

ExecStart=/usr/local/mysql/bin/mysqld --defaults-file=/etc/my3307.cnf

LimitNOFILE =5000

5.启动数据库

[root@mysql-1 ~]# systemctl daemon-reload

[root@mysql-1 ~]# systemctl start mysqld3307

6.设置root密码

[root@mysql-2 ~]# mysqladmin -u root -P 3307 -S /data/mysql3307/mysql.sock password '123456'

7.登陆数据库

[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock

mysql>

2.3.MySQL多个节点搭建完毕

MySQL多个节点已经搭建完毕了,下面来查询每个实例的server_id。

3.配置MySQL主从复制集群

MySQL数据库的多个实例节点已经搭建完成了,下面将这些搭建的数据库实例配置成主从复制集群(一主两从)。

IP 主机名 端口 角色
192.168.20.11 mysql-1 3306 主库
192.168.20.12 mysql-2 3306 从库
192.168.20.12 mysql-2 3307 从库

配置MySQL主从复制集群的大致步骤:

  • 主库开启Binlog日志,从库复制主库数据要通过Binlog进行复制。
  • 主库创建专门用作主从复制的用户。
  • 将主库数据进行备份,再从库中恢复。
  • 配置从库连接主库的复制信息。
  • 启动主从复制集群。

3.1.在主库开启Binlog二进制日志

主库已经开启了Binlog二进制日志,我们来查一下。

mysql>showvariableslike'%log_bin%';

+---------------------------------+-----------------------------+

| Variable_name                   |Value                       |

+---------------------------------+-----------------------------+

| log_bin                         |ON                          |

| log_bin_basename                | /data/mysql/mysql-bin       |

| log_bin_index                   | /data/mysql/mysql-bin.index|

| log_bin_trust_function_creators | OFF                         |

| log_bin_use_v1_row_events       | OFF                         |

| sql_log_bin                     |ON                          |

+---------------------------------+-----------------------------+

6 rows inset(0.01 sec)

从库复制主库数据,都是通过Binlog进行传输和恢复的。

3.2.在主库上创建主从复制的用户

mysql>grant replication slaveon*.*to replicas@'192.168.20.%' identified by '123456';

3.3.将主库数据备份并在从库中进行还原

如果是运行很久的主库,要升级为主从复制集群,那么建议将主库上的数据备份还原到从库上,避免从库一次性同步很多数据,浪费性能。

[root@mysql-1 ~]# mysqldump -uroot -p123456 -A --master-data=2 -R -E --triggers --single-transaction > all_db.sql

在192.168.20.12的两个从库中还原主库的备份数据。

1.将备份上传到从库的服务器上

[root@mysql-1 ~]# scp -rp all_db.sql root@192.168.20.12:/root

2.3306从库还原主库备份数据

[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock

mysql>set sql_log_bin=0;

mysql>source /root/all_db.sql;

3.3307从库还原主库备份数据

[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock

mysql>set sql_log_bin=0;

mysql>source /root/all_db.sql;

3.4.配置从库连接主库的复制信息

接下来我们需要配置从库连接主库的信息,包括让从库知道主库的IP、端口号、复制的用户密码、Binlog相关的信息。

1)获取主库Binlog的信息

从库是通过Binlog复制主库数据的,首先要获取主库Binlog日志的一些信息,包括主库的Binlog日志使用的是哪个、要从Binlog日志中的哪一个事件标识号处开始复制数据。

从Binlog的哪一个事件标识号处开始复制数据,尤为关键,因为主库可能运行的时间长了,也有很多的数据,一定要从合适的位置处开始复制数据,要不然也会产生很大的资源浪费。

我们是用主库头一天的全库备份,然后还原到从库上的,在主库的备份文件中就记录了从库应该从哪一个Binlog事件标识位处开始复制数据。

vim all_db.sql

-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=452;

从备份文件中得知,我们应该让从库从主库Binlog事件标识位号452处,开始复制数据。

如果主库不是运行很久的,不需要备份数据还原到从库,而是直接搭建的主从复制集群,那么直接可以从主库状态信息那里,获取Binlog的标识位号,在配置主从时,一定要指对Binlog标识位号,否则主从将会失败。

mysql>showmasterstatus;

+------------------+----------+--------------+------------------+----------------------------------------+

| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                      |

+------------------+----------+--------------+------------------+----------------------------------------+

| mysql-bin.000001|      452|              |                  |4f87bad8-fc67-11ec-be7b-005056b791aa:1|

+------------------+----------+--------------+------------------+----------------------------------------+

1rowinset(0.00 sec)

2)配置从库连接主库进行复制的参数信息

配置从库连接主库进行复制的参数有很多,不过只需要记住这一条命令:help change master to即可,在MySQL交互式下执行此命令可以打印出从库连接主库的所有配置参数。

1.3306从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock

mysql>CHANGEMASTERTO

 MASTER_HOST='192.168.20.11',

 MASTER_USER='replicas',

 MASTER_PASSWORD='123456',

 MASTER_PORT=3306,

 MASTER_LOG_FILE='mysql-bin.000001',

 MASTER_LOG_POS=452,

 MASTER_CONNECT_RETRY=10;

 

1.3307从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock

mysql>CHANGEMASTERTO

 MASTER_HOST='192.168.20.11',

 MASTER_USER='replicas',

 MASTER_PASSWORD='123456',

 MASTER_PORT=3306,

 MASTER_LOG_FILE='mysql-bin.000001',

 MASTER_LOG_POS=452,

 MASTER_CONNECT_RETRY=10;  

参数解释:

参数 含义
MASTER_HOST 主库的地址
MASTER_USER 主从复制的专用用户
MASTER_PASSWORD 主从复制用户的密码
MASTER_PORT 主库的端口号
MASTER_LOG_FILE 主库的Binlog日志名
MASTER_LOG_POS 从主库BInlog日志的哪一个标识位处开始复制
MASTER_CONNECT_RETRY 主从连接失败的重试时间间隔

3.5.启动主从复制线程

1.3306从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock

mysql>startslave;

1.3307从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock

mysql>startslave;

4.查看主从复制集群状态

1.3306从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3306 -S /data/mysql3306/mysql.sock

mysql>showslavestatus\G;

1.3307从库配置

[root@mysql-2 ~]# mysql -uroot -p123456 -P3307 -S /data/mysql3307/mysql.sock

mysql>showslavestatus\G;

当每个从库的IO线程和SQL线程的状态都是Yes,就表示主从复制集群搭建完毕了。

MySQL主从配置过程中从库连接主库的配置写错了应该如何解决?

只要不执行start slave,再执行一次change master to会覆盖上一次配置。

1.停止主从复制

mysql>stop slave;

2.清空从库连接主库的信息

mysql> reset slaveall;

3.重新设置

mysql>CHANGEMASTERTO

 MASTER_HOST='192.168.20.11',

 MASTER_USER='replicas',

 MASTER_PASSWORD='123456',

 MASTER_PORT=3306,

 MASTER_LOG_FILE='mysql-bin.000001',

 MASTER_LOG_POS=452,

 MASTER_CONNECT_RETRY=10;


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
SQL 关系型数据库 MySQL
mysql主从复制概述和配置
【10月更文挑战第22天】MySQL 主从复制是一种将主服务器的数据复制到一个或多个从服务器的技术,实现读写分离,提高系统性能和可用性。主服务器记录变更日志,从服务器通过 I/O 和 SQL 线程读取并应用这些变更。适用于读写分离、数据备份和恢复、数据分析等场景。配置步骤包括修改配置文件、创建复制用户、配置从服务器连接主服务器并启动复制进程。
|
26天前
|
存储 关系型数据库 MySQL
MySQL主从复制原理和使用
本文介绍了MySQL主从复制的基本概念、原理及其实现方法,详细讲解了一主两从的架构设计,以及三种常见的复制模式(全同步、异步、半同步)的特点与适用场景。此外,文章还提供了Spring Boot环境下配置主从复制的具体代码示例,包括数据源配置、上下文切换、路由实现及切面编程等内容,帮助读者理解如何在实际项目中实现数据库的读写分离。
MySQL主从复制原理和使用
|
1月前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
52 5
Mysql(3)—数据库相关概念及工作原理
|
20天前
|
存储 SQL NoSQL
|
1月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1637 14
|
26天前
|
SQL 关系型数据库 MySQL
Mysql中搭建主从复制原理和配置
主从复制在数据库管理中广泛应用,主要优点包括提高性能、实现高可用性、数据备份及灾难恢复。通过读写分离、从服务器接管、实时备份和地理分布等机制,有效增强系统的稳定性和数据安全性。主从复制涉及I/O线程和SQL线程,前者负责日志传输,后者负责日志应用,确保数据同步。配置过程中需开启二进制日志、设置唯一服务器ID,并创建复制用户,通过CHANGE MASTER TO命令配置从服务器连接主服务器,实现数据同步。实验部分展示了如何在两台CentOS 7服务器上配置MySQL 5.7主从复制,包括关闭防火墙、配置静态IP、设置域名解析、配置主从服务器、启动复制及验证同步效果。
Mysql中搭建主从复制原理和配置
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
存储 SQL 关系型数据库
mysql中主键索引和联合索引的原理与区别
本文详细介绍了MySQL中的主键索引和联合索引原理及其区别。主键索引按主键值排序,叶节点仅存储数据区,而索引页则存储索引和指向数据域的指针。联合索引由多个字段组成,遵循最左前缀原则,可提高查询效率。文章还探讨了索引扫描原理、索引失效情况及设计原则,并对比了InnoDB与MyISAM存储引擎中聚簇索引和非聚簇索引的特点。对于优化MySQL性能具有参考价值。
|
10天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
25 1
|
12天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
28 4