定义:关系型数据库的基本结构单元,以二维表形式组织数据,每个关系对应一张表,具有唯一的表名。
别名:表(Table)、关系模式(Relation Schema)。
定义:表中的一行数据,表示一个实体或记录(Record)。
别名:元组(Tuple)、记录(Record)。
定义:表中的一列数据,表示属性或字段(Field),用于描述数据的特征。
关键特性:每个列定义数据类型(如整数、字符、日期等)和约束条件(如非空、唯一性等)。
列的取值范围称为域(Domain),例如性别字段的域为“男”或“女”。
定义:用于唯一标识表中每一行记录的字段或字段组合,值不可重复且不能为空(NULL)。
特性:一张表只能有一个主键。主键通常用于加速数据检索和维护数据实体完整性。
定义:用于确保表中某字段或字段组合的值唯一,但允许空值(NULL)。
特性:一张表可以有多个唯一键。
与主键的区别:唯一键不强制非空约束,且不用于建立表间关系。
一、核心关联类型
一对一(1:1)
定义:实体集A中的每个实体,在实体集B中至多有一个对应实体,反之亦然。
示例:
部门与经理(一个部门仅一个经理,一个经理仅管理一个部门)。
身份证与个人(一人一证,一证对应一人)。
数据表设计:
通过外键或主键关联(如将主键同时作为外键)。
一对多(1)与多对一(n:1)
定义:
一对多:实体集A中的一个实体对应实体集B中的多个实体,但B中的每个实体仅属于A中的一个实体。
多对一:一对多的反向视角,即多个实体归属于一个实体。
示例:
部门与员工(一个部门有多个员工,一个员工仅属于一个部门)。
销售单据与销售明细(一条单据对应多条明细)。
数据表设计:
在“多”方表中添加外键指向“一”方主键(如员工表中添加部门ID字段)。
多对多(m)
定义:实体集A中的一个实体对应实体集B中的多个实体,且B中的实体也可对应A中的多个实体。
示例:
学生与课程(一个学生选修多门课程,一门课程被多名学生选修)。
员工与项目(一个员工参与多个项目,一个项目包含多个员工)。
数据表设计:
需引入中间表,存储双方主键作为外键,将多对多拆分为两个一对多关系。
二、典型应用场景
一对一:强绑定关系(如用户与身份证、系统账号与详细信息)。
一对多:层级结构(如部门-员工、订单-商品)。
多对多:复杂交互场景(如用户-角色、学生-课程)。
一、MySQL主要安装方式
1、Installer安装(Windows推荐)
步骤:
下载MySQL官方Installer(.msi文件),选择“Developer Default”或“Custom”安装类型。
安装完成后进入配置向导,设置密码验证方式(建议选择“Use Legacy Authentication Method”兼容旧客户端)。
特点:图形化操作,自动配置服务与依赖库。
2、二进制安装(Linux/通用)
二进制包安装步骤:
解压官方二进制包至指定目录(如/usr/local/mysql)。
创建配置文件my.cnf,初始化数据库并启动服务。
适用场景:需自定义安装路径或版本。
源码编译安装
步骤:下载源码包,配置编译参数(如安装路径、功能模块)。
执行make && make install编译安装。
特点:灵活性高,适合定制化需求,但操作复杂。
3、YUM/RPM安装(Linux)
步骤:添加MySQL官方YUM源,安装mysql-server包。启动服务并重置root密码(默认生成临时密码)。
特点:自动化依赖管理,适合快速部署。
4、Docker安装
步骤:
拉取官方镜像:docker pull mysql:tag。
启动容器时指定配置文件、数据卷及端口映射。
适用场景:容器化环境部署。
二、MySQL安全加固措施
1、基础加固
修改默认root密码,禁止空密码登录。
限制MySQL服务仅监听内网IP(bind-address=127.0.0.1)。
禁用远程root登录,仅允许本地访问。
2、权限管理
删除匿名用户和测试数据库(DROP DATABASE test;)。
按需创建普通用户并分配最小权限(避免使用root账户)。
3、加密与审计
启用SSL加密通信(配置ssl-ca、ssl-cert等参数)。
开启慢查询日志与错误日志,定期审计异常行为。
3、MySQL配置文件(my.cnf/my.ini)核心参数
1、配置文件路径
Windows:安装目录下my.ini(如C:\Program Files\mysql-8.0\my.ini)。
Linux:/etc/my.cnf或/etc/mysql/my.cnf。
2、关键参数示例
[mysqld]
# 基础配置
port = 3306
basedir = /usr/local/mysql # 安装目录
datadir = /var/lib/mysql # 数据存储目录
# 内存与性能
max_connections = 1000 # 最大连接数
innodb_buffer_pool_size = 2G # InnoDB缓冲池大小
# 日志配置
log-error = /var/log/mysqld.log # 错误日志路径
slow_query_log = 1 # 启用慢查询日志
一、获取SQL命令帮助
1、使用HELP或\h命令
在MySQL客户端中直接输入HELP;或\h,查看所有支持的命令列表及简要说明。
输入HELP <具体命令>(如HELP CREATE DATABASE;)获取特定命令的详细语法。
2、查看服务器状态与配置
使用\s或STATUS查看当前连接状态,包括字符集和排序规则设置。
执行SHOW VARIABLES LIKE ‘char%’;查看当前字符集配置。
二、创建数据库testdb
1、创建数据库并指定字符集/排序规则
CREATE DATABASE testdb
CHARACTER SET utf8
COLLATE utf8_bin;
说明:
CHARACTER SET utf8:设置数据库默认字符集为utf8。
COLLATE utf8_bin:指定排序规则为二进制比较(区分大小写)。
2、验证数据库创建
SHOW DATABASES; -- 查看所有数据库
USE testdb; -- 切换到testdb库
SHOW VARIABLES LIKE 'character_set_database'; -- 确认字符集生效
三、创建host表
1、定义表结构与字段
CREATE TABLE host (
id INT PRIMARY KEY AUTO_INCREMENT, -- 主键自增字段
host VARCHAR(50) NOT NULL, -- 主机名(非空)
ip VARCHAR(15) NOT NULL, -- IP地址(IPv4格式)
cname VARCHAR(50) -- 别名(可选)
) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
字段说明:
id:主键,自增整型。
host、ip:必填字段,分别存储主机名和IP地址。
cname:可选的别名字段。
2、验证表结构
DESCRIBE host; -- 查看表结构
四、操作示例与验证
插入数据 INSERT INTO host (host, ip) VALUES ('web01', '192.168.1.10');添加一条记录
查询数据 SELECT * FROM host; 查看所有记录
修改表字符集(可选) ALTER TABLE host CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin; 强制更新编码
关键配置总结
字符集与排序规则一致性:
确保数据库、表、字段均使用utf8和utf8_bin,避免中文乱码或大小写敏感问题。
字段约束设计:
主键建议使用AUTO_INCREMENT简化数据插入。
必填字段需添加NOT NULL约束。
一、DDL(数据定义语言)核心用法总结
定义:用于定义和管理数据库对象(库、表、列等)的结构。
1、创建数据库
CREATE DATABASE test_db
DEFAULT CHARSET utf8mb4
COLLATE utf8mb4_general_ci;
说明:指定字符集和排序规则。
2、创建表
CREATE TABLE user (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL COMMENT '用户名',
age TINYINT UNSIGNED DEFAULT 0,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB CHARSET=utf8mb4;
说明:定义主键、默认值、注释和存储引擎。
3、修改表结构
添加列:
ALTER TABLE user ADD COLUMN email VARCHAR(100) UNIQUE;
修改列类型:
ALTER TABLE user MODIFY COLUMN age SMALLINT;
删除列:
ALTER TABLE user DROP COLUMN created_at;
说明:动态调整表结构。
4、删除表
DROP TABLE IF EXISTS user;
说明:IF EXISTS避免表不存在时报错。
二、DML(数据操作语言)核心用法总结
定义:用于对表中数据进行增删改操作。
1、插入数据
单条插入:
INSERT INTO user (name, age)
VALUES ('张三', 25);
批量插入:
INSERT INTO user (name, age)
VALUES ('李四', 30), ('王五', 28);
说明:指定列名可避免字段顺序依赖。
2、更新数据
UPDATE user
SET age = 26
WHERE name = '张三';
注意:必须添加WHERE条件,否则全表更新。
3、删除数据
按条件删除:
DELETE FROM user
WHERE age > 30;
清空表:
TRUNCATE TABLE user;
区别:TRUNCATE直接重置表,性能更高但不可回滚。
4、查询数据(DQL)
SELECT name, age
FROM user
WHERE age BETWEEN 20 AND 30
ORDER BY created_at DESC;
说明:DQL属于DML的子集,用于数据检索。
三、DDL与DML对比
关键差异:
DDL操作通常不可回滚(MySQL中部分操作依赖存储引擎)。
DML操作默认在事务中执行,可通过ROLLBACK撤销。
四、示例综合应用
场景:创建商品表并插入数据
-- DDL: 创建表
CREATE TABLE product (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) CHECK (price > 0),
stock INT DEFAULT 0
) CHARSET=utf8mb4;
-- DML: 插入数据
INSERT INTO product (name, price)
VALUES ('手机', 2999.00), ('耳机', 199.00);
场景:更新库存并删除无效数据
sql
Copy Code
-- DML: 更新库存
UPDATE product
SET stock = stock + 100
WHERE name = '手机';
-- DML: 删除零库存商品
DELETE FROM product
WHERE stock = 0;
一、MySQL架构原理总结
1、逻辑存储结构
核心组件:表空间(Tablespace)、段(Segment)、区(Extent)、页(Page)、行(Row)。
表空间:最高层逻辑结构,存储表数据、索引等,支持多表空间配置。
页:最小存储单元(默认16KB),数据按页加载到内存缓冲池。
2、内存与线程管理
缓冲池(Buffer Pool):缓存热数据和索引,减少磁盘I/O,通过Checkpoint机制异步刷新脏页到磁盘。
后台线程:
Master Thread:负责缓冲池刷新、日志写入等核心任务。
IO Thread:处理异步读写请求。
Purge Thread:清理事务提交后的undo日志。
3、事务与并发控制
支持多版本并发控制(MVCC)和行级锁,通过redo log保证事务持久性,undo log实现回滚。
二、MyISAM与InnoDB存储引擎对比
1、事务支持
InnoDB:支持ACID事务,提供提交、回滚及崩溃恢复能力,适用于需保证数据一致性的场景。
MyISAM:不支持事务,无法保证操作的原子性和持久性,仅适用于无需事务的简单查询场景。
2、锁机制
InnoDB:支持行级锁和表级锁,行级锁允许并发写操作时仅锁定受影响的行,显著提升高并发场景的性能。
MyISAM:仅支持表级锁,任何写操作(如插入、更新)都会锁定整个表,导致读写互斥,并发性能较低。
3、存储结构
InnoDB:数据与主键索引以聚簇索引形式绑定存储于.ibd文件中,主键索引的叶子节点直接包含数据记录,辅助索引需二次查询主键。
MyISAM:数据(.MYD文件)与索引(.MYI文件)分离存储,主键索引和辅助索引均为非聚簇索引,索引叶子节点仅保存数据文件的指针。
4、外键与数据完整性
InnoDB:支持外键约束,通过外键维护表间关联数据的完整性。
MyISAM:不支持外键,需在应用层实现关联逻辑。
5、适用场景
InnoDB:适合读写混合、高并发事务场景(如电商、金融系统),需频繁更新或保证数据一致性的业务。
MyISAM:适合读多写少、无需事务的场景(如日志分析、静态数据查询),查询性能较高但写入效率低。
6、崩溃恢复
InnoDB:通过redo log实现崩溃后自动恢复,确保事务的持久性。
MyISAM:无内置恢复机制,需依赖手动修复工具(如myisamchk)或备份恢复数据。
7、缓存机制
InnoDB:采用缓冲池(Buffer Pool)缓存索引和数据,减少磁盘I/O,提升读写效率。
MyISAM:仅缓存索引文件,数据依赖操作系统文件缓存,随机读性能较差。
总结:InnoDB以事务安全、高并发支持为核心优势,适合复杂业务;MyISAM以查询速度快见长,但缺乏事务和行级锁,适用于静态数据分析。
三、关键差异总结
1、事务与锁:
InnoDB通过行级锁和MVCC实现高并发事务处理,而MyISAM表锁在写操作时会阻塞读。
2、索引与性能:
MyISAM索引文件独立,适合全表扫描;InnoDB主键索引直接关联数据,范围查询更高效。
3、数据完整性:
InnoDB强制要求主键(未显式定义时自动生成隐藏主键),MyISAM允许无主键表。
一、MySQL索引核心作用
1、加速数据检索
通过B+树或哈希结构快速定位数据,避免全表扫描,显著提升查询效率。
2、优化排序与分组
对带有索引的列进行ORDER BY或GROUP BY操作时,可直接利用索引排序,减少临时表生成。
3、支持事务与锁机制
InnoDB通过索引实现行级锁,提升并发性能。
3、保证数据唯一性
唯一索引和主键索引强制字段值唯一,确保数据完整性。
二、索引失效的常见场景
1、未遵循最左匹配原则
联合索引未从最左侧字段开始查询,如联合索引为(a,b,c),但查询条件仅包含b或c。
2、隐式类型转换
查询条件中字段类型与索引列类型不一致,例如字符串字段使用数值类型查询。
3、操作符或函数导致索引失效
对索引列使用函数(如DATE()、SUBSTRING())或表达式(如a+1=5)。
4、模糊查询以通配符开头
LIKE '%abc'或LIKE '%abc%'无法利用索引,而LIKE 'abc%可以触发索引。
5、OR条件涉及无索引列
查询中OR连接的多个条件中存在未索引的列,导致全表扫描。
6、数据分布不均或高重复率
索引列重复值过多(如性别字段),优化器可能认为全表扫描更快。
7、小表查询
数据量极少的表(如几十行),全表扫描可能比索引查询更快。
8、全表扫描更优时
查询结果覆盖大部分数据(如超过30%),优化器可能跳过索引。
三、索引使用建议
1、优先为高频查询字段、排序/分组字段创建索引,避免冗余索引。
2、联合索引字段顺序需匹配查询场景,高频查询字段靠左。
3、避免对低离散度字段(如状态码)单独建索引,可结合联合索引使用。
示例:失效场景验证
-- 索引失效示例(使用函数)
SELECT * FROM user WHERE YEAR(created_at) = 2025; -- 无法使用created_at索引
-- 有效索引使用示例
SELECT * FROM user WHERE created_at >= '2025-01-01' AND created_at < '2026-01-01'; -- 范围查询触发索引
ACID事务特性
1. 原子性(Atomicity)
定义:事务作为最小执行单元,其包含的操作要么全部成功,要么全部失败回滚,不存在中间状态。
实现机制:
通过undo log(回滚日志)记录事务修改前的数据状态,若事务失败或主动回滚,则利用undo log恢复原始数据。
例如转账场景:用户A向B转账,若扣款成功但存款失败,则撤销扣款操作,保证数据整体一致性。
2. 一致性(Consistency)
定义:事务执行前后,数据库必须从一种一致状态转换到另一种一致状态,不破坏业务规则和数据完整性。
实现机制:
依赖原子性、隔离性、持久性共同保障(A、I、D是实现手段,C是最终目的)。
应用层逻辑约束(如账户总额不变)与数据库约束(唯一键、外键等)共同作用。
例如:订单支付需同时减少库存和扣款,任一操作失败均需回滚以保持数据逻辑一致性。
3. 隔离性(Isolation)
定义:并发执行的事务相互隔离,事务中间状态对其他事务不可见,避免脏读、不可重复读、幻读等问题。
实现机制:
锁机制:行级锁、表级锁、共享锁(S锁)、排他锁(X锁)等控制并发访问。
MVCC(多版本并发控制):通过版本链和Read View实现非阻塞读,提升并发性能。
隔离级别:
读未提交:允许脏读,隔离性最低。
读已提交:避免脏读,但存在不可重复读。
可重复读(MySQL默认):避免脏读和不可重复读,可能发生幻读。
串行化:强制事务串行执行,隔离性最高但性能最低。
4. 持久性(Durability)
定义:事务提交后,对数据的修改永久保存,即使系统崩溃也不丢失。
实现机制:
redo log(重做日志):事务提交前先将修改记录写入redo log,崩溃恢复时根据日志重放操作。
Double Write Buffer:确保数据页写入磁盘的完整性,防止部分写失败。
例如:用户提交订单后,即使数据库宕机,重启后仍能通过redo log恢复已提交的订单数据。
ACID特性关系
原子性是基础:事务回滚依赖undo log保证操作全成功或全失败。
隔离性是并发保障:通过锁和MVCC协调多事务执行顺序。
持久性是最终目标:redo log确保已提交事务的修改永久有效。
一致性是核心目的:其他三个特性共同服务于数据一致性。
一、事务日志工作原理总结
1、Undo Log(回滚日志)
核心作用:
保障事务的原子性,记录事务修改前的数据副本,用于回滚操作。
支持MVCC(多版本并发控制),提供数据的历史版本以实现非阻塞读。
工作原理:
事务执行写操作(如INSERT/UPDATE/DELETE)时,将修改前的数据状态(旧值)记录到Undo Log中。
回滚时,根据Undo Log将数据恢复到事务开始前的状态。
Undo Log以逻辑日志形式存储,按链表结构组织,支持逐条回滚。
事务提交后,Undo Log不会立即删除,可能被其他事务的MVCC读取需求复用。
2、Redo Log(重做日志)
核心作用:
保障事务的持久性,确保已提交事务的修改在崩溃后能恢复。
通过顺序I/O提升写入性能,避免每次事务提交都直接刷盘数据页。
工作原理:
事务执行写操作时,先将修改的物理变更记录(如数据页的修改)写入Redo Log Buffer。
事务提交时,Redo Log Buffer按策略(如每秒或事务提交时)刷盘到ib_logfile文件。
崩溃恢复时,重放Redo Log中的操作,将未刷盘的数据变更重新应用到数据页。
Redo Log采用循环写入机制,文件大小固定,通过检查点(Checkpoint)推进回收空间。
3、Undo Log与Redo Log的协作
事务提交:
Redo Log先持久化到磁盘,确保事务修改的持久性。
Undo Log保留至不再被其他事务的MVCC或回滚需求引用后,由后台线程异步清理。
事务回滚:
通过Undo Log恢复数据旧值,同时生成对应的Redo Log记录以保证回滚操作的持久性。
崩溃恢复:
先根据Redo Log重做已提交但未刷盘的修改,再根据Undo Log回滚未提交的事务。
4、事务日志类型对比
1. 日志类型
Undo Log(回滚日志)
逻辑日志:记录数据修改前的旧值(如UPDATE前的行数据),通过逻辑操作(如反向SQL)实现回滚。
支持多版本控制:为MVCC提供历史数据版本,实现事务隔离性(如可重复读)。
Redo Log(重做日志)
物理日志:记录数据页的物理变更(如页号、偏移量修改),直接恢复数据到崩溃前的状态。
顺序写入优化:通过顺序I/O提升写入性能,避免频繁随机写入数据文件。
2. 作用目标
Undo Log
事务回滚:通过旧值撤销未提交事务的修改,保证原子性。
MVCC支持:提供历史版本数据,实现非阻塞读(如SELECT不阻塞写操作)。
Redo Log
崩溃恢复:重放已提交事务的物理修改,确保持久性。
数据页保护:通过Double Write Buffer配合,防止部分写失败导致的数据损坏。
3. 存储位置
Undo Log
回滚段(Rollback Segment):存储在系统表空间中,按事务ID和版本链组织。
Redo Log
独立日志文件(ib_logfile):固定大小的循环写入文件,避免空间膨胀。
4. 生命周期
Undo Log
延迟清理:事务提交后,若存在其他事务依赖其历史版本(如MVCC读),则暂不删除,由后台线程异步清理。
Redo Log
循环覆盖:日志文件写满后,通过检查点(Checkpoint)标记已持久化的数据,复用空间覆盖旧日志。
5. 协作机制
事务提交时
Redo Log先持久化到磁盘,确保已提交事务的修改不丢失。
Undo Log保留至不再被其他事务引用后清理。
崩溃恢复时
先重做Redo Log中已提交但未落盘的修改,再回滚Undo Log中未提交的事务。
总结:Undo Log和Redo Log分别从原子性和持久性角度保障事务的ACID特性,通过协作机制(如WAL、MVCC)实现高效的事务管理与崩溃恢复。
1、事务日志(InnoDB引擎)
(1) Redo Log(重做日志)
作用:确保事务的持久性,记录数据页的物理变更,用于崩溃恢复时重做已提交事务的修改。
通过顺序写入优化性能,避免频繁刷盘数据页。
启动方式:Redo Log默认启用(InnoDB引擎强制依赖)。
配置参数:
innodb_log_file_size = 1G # 定义每个redo log文件大小
innodb_log_files_in_group = 2 # 定义日志组中的文件数量
日志文件路径默认为数据目录下的ib_logfile0和ib_logfile1。
(2) Undo Log(回滚日志)
作用:支持事务原子性,记录事务修改前的旧值,用于回滚未提交事务。
为MVCC提供多版本数据,实现非阻塞读。
启动方式:
Undo Log默认启用,存储于共享表空间(如ibdata1)或独立Undo表空间。
配置独立Undo表空间:
innodb_undo_tablespaces = 2 # 指定独立Undo表空间数量
innodb_undo_log_truncate = ON # 启用Undo Log自动清理
2、二进制日志(Binlog)
作用:记录所有更改数据的SQL语句(逻辑日志),用于主从复制、数据恢复。
支持事务的持久化(与Redo Log协作)。
启动方式:在配置文件中启用:
log_bin = /var/lib/mysql/mysql-bin # 指定Binlog路径及前缀
server_id = 1 # 主从复制需配置唯一ID
binlog_format = ROW # 推荐使用ROW格式保证一致性
3、 错误日志(Error Log)
作用:记录MySQL启动、运行或停止时的错误信息及警告。
启动方式:默认启用,路径由log_error参数指定:
log_error = /var/log/mysql/error.log # 指定错误日志文件路径
4、 通用查询日志(General Query Log)
作用:
记录所有客户端连接和执行的SQL语句(调试用,对性能影响较大)。
启动方式:
在配置文件中启用:
general_log = ON
general_log_file = /var/log/mysql/general.log # 指定日志路径
5、 慢查询日志(Slow Query Log)
作用:
记录执行时间超过阈值(默认10秒)的SQL,用于性能优化。
启动方式:
在配置文件中启用:
slow_query_log = ON
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2 # 定义慢查询阈值(单位:秒)
日志启停注意事项
1、动态启停:
部分日志(如通用查询日志、慢查询日志)可通过SQL动态启停:
SET GLOBAL general_log = ON; -- 开启通用查询日志
SET GLOBAL slow_query_log = OFF; -- 关闭慢查询日志
2、性能影响:
通用查询日志和Binlog对性能影响较大,生产环境需谨慎开启。
3、日志清理:
Binlog需定期清理(如PURGE BINARY LOGS命令)避免磁盘占满。
一、STATEMENT模式(Statement-Based Replication, SBR)
特点:直接记录执行过的SQL语句,不存储具体数据变更内容。
优点:
日志体积小,存储和传输效率高,适合批量数据变更场景。
简单查询场景下复制速度快,网络带宽占用低。
缺点:
非确定性函数(如NOW()、RAND())可能导致主从数据不一致。
不支持存储过程、触发器或临时表的精确复制。
适用场景:
简单业务逻辑且无复杂函数依赖的OLTP场景。
需快速恢复日志且数据量较小的环境。
二、ROW模式(Row-Based Replication, RBR)
特点:记录每一行数据变更前后的具体值,而非SQL语句。
优点:
数据一致性高,规避非确定性函数导致的主从差异。
支持所有类型的数据变更操作(包括存储过程、UDF等)。
便于审计和精准故障排查(可追溯具体数据变化)。
缺点:
日志体积显著增大,大表全量更新时存储和传输压力大。
无法直接从日志中直观查看执行的SQL语句。
适用场景:
对数据一致性要求严格的场景(如金融交易系统)。
涉及复杂函数、触发器或存储过程的业务逻辑。
三、MIXED模式(Mixed-Based Replication, MBR)
特点:默认使用STATEMENT模式,当检测到潜在不一致风险时自动切换为ROW模式。
优点:
结合两种模式的优点,平衡效率和一致性。
动态适应复杂业务场景,减少人工配置成本。
缺点:
仍需根据业务特性调整配置,无法完全避免日志体积问题。
适用场景:
混合型业务(部分操作简单、部分操作复杂)。
需兼顾灵活性和一致性的通用场景。
总结建议
优先选择ROW模式:适用于高一致性要求的核心业务,尤其是涉及非确定性函数或复杂逻辑的场景。
慎用STATEMENT模式:仅推荐简单且无副作用的SQL操作场景。
MIXED模式折中方案:适合多数通用业务,需根据实际数据变更类型动态优化。
MySQL备份类型总结
1、 按备份方式分类
(1)物理备份(Physical Backup)
定义:直接复制数据库的物理文件(如数据文件、日志文件、索引文件)。
特点:速度快,适合大型数据库(如TB级)、依赖存储引擎,需与存储引擎的物理结构兼容(如InnoDB的.ibd文件)。
工具:Percona XtraBackup(支持InnoDB热备)、直接文件系统复制(需停机或锁表)。
(2)逻辑备份(Logical Backup)
定义:通过SQL语句导出数据库结构和数据(如生成.sql文件)。
特点:跨平台兼容、可在不同MySQL版本或存储引擎间迁移、恢复慢,需逐行执行SQL语句重建数据。
工具:mysqldump(单线程导出)、mysqlpump(多线程导出,MySQL 5.7+)。
2、 按备份时数据库状态分类
(1)冷备份(Cold Backup)
操作:停止MySQL服务后备份文件。
优点:数据一致性高。
缺点:需停机,影响业务可用性。
(2)温备份(Warm Backup)
操作:备份时锁定表(如FLUSH TABLES WITH READ LOCK),允许读操作但禁止写。
优点:无需完全停机。
缺点:长时间锁表可能阻塞业务写入。
(3)热备份(Hot Backup)
操作:不中断数据库服务,直接备份(依赖存储引擎支持)。
适用场景:InnoDB引擎(通过XtraBackup或MySQL Enterprise Backup)、支持在线备份的云数据库(如AWS RDS)。
3、按备份内容分类
(1)全量备份(Full Backup)
定义:备份所有数据。
用途:作为增量/差异备份的基础。
缺点:占用存储空间大,耗时长。
(2)增量备份(Incremental Backup)
定义:仅备份自上次备份(全量或增量)后变更的数据。
实现方式:基于二进制日志(binlog)的增量(需开启binlog)、物理增量备份(如XtraBackup记录LSN号)。
优点:节省存储和备份时间。
缺点:恢复需按顺序合并所有增量备份。
(3)差异备份(Differential Backup)
定义:备份自上次全量备份后的所有变更。
优点:恢复时只需全量备份+最新差异备份。
缺点:数据量随全量备份时间增长而增加。
4、 按备份目标分类
(1)本地备份
存储到与MySQL服务器相同的物理设备。
风险:磁盘故障可能导致数据丢失。
(2)远程备份
存储到网络存储(如NFS)、云存储(如S3)或异地服务器。
工具:rsync、云厂商备份服务(如AWS Backup)。
5、 特殊备份类型
(1)二进制日志备份(Binlog Backup)
作用:基于时间点恢复(Point-in-Time Recovery, PITR)。
要求:需开启binlog,并定期归档日志文件。
(2)快照备份(Snapshot Backup)
实现:利用存储设备快照功能(如LVM、ECS云盘快照)。
特点:几乎瞬时完成,但依赖底层存储技术支持。
备份策略建议
(1)中小型数据库:
每日全量逻辑备份(mysqldump)+ 定期binlog归档。
(2)大型数据库:
每周全量物理备份(XtraBackup)+ 每日增量备份 + 远程存储。
(3)高可用要求场景:
实时二进制日志同步(主从复制) + 云存储快照。
关键恢复流程
逻辑备份恢复:
mysql -u root -p db_name < backup.sql
物理备份恢复:
# 使用XtraBackup恢复
innobackupex --copy-back /path/to/backup
PITR恢复:
mysqlbinlog binlog.000001 | mysql -u root -p