文章目录
- MySQL
-
- 1.数据库
-
- [1.1 数据库的概念及其发展](#1.1 数据库的概念及其发展)
-
- [1.1.1 数据库概念](#1.1.1 数据库概念)
- [1.2 数据库的发展历史](#1.2 数据库的发展历史)
-
- [1.2.3 数据库系统阶段](#1.2.3 数据库系统阶段)
- [1.3 数据的分类](#1.3 数据的分类)
-
- [1.3.1 结构化数据](#1.3.1 结构化数据)
- [1.3.2 半结构化数据](#1.3.2 半结构化数据)
- [1.3.3 非结构化数据](#1.3.3 非结构化数据)
- [2.1 SQL 语言分类及核心内容](#2.1 SQL 语言分类及核心内容)
-
- [2.2 DDL:数据定义语言](#2.2 DDL:数据定义语言)
- [2.3 DML:数据操作语言](#2.3 DML:数据操作语言)
-
- [2.3.1 插入数据(INSERT)](#2.3.1 插入数据(INSERT))
- [2.3.2 更新数据(UPDATE)](#2.3.2 更新数据(UPDATE))
- [2.3.3 删除数据(DELETE)](#2.3.3 删除数据(DELETE))
- [2.4 DQL:数据查询语言](#2.4 DQL:数据查询语言)
-
- [2.4.1 查询基础语法](#2.4.1 查询基础语法)
- [2.4.2 查询限制条件(WHERE)](#2.4.2 查询限制条件(WHERE))
- [2.4.3 查询排序(ORDER BY)](#2.4.3 查询排序(ORDER BY))
- [2.4.4 查询去重(DISTINCT)](#2.4.4 查询去重(DISTINCT))
- [2.4.5 查询聚合函数](#2.4.5 查询聚合函数)
- [2.5 用户管理与权限控制](#2.5 用户管理与权限控制)
-
- [2.5.1 创建用户(CREATE USER)](#2.5.1 创建用户(CREATE USER))
- [2.5.2 授权用户(GRANT)](#2.5.2 授权用户(GRANT))
- [2.5.3 查看当前用户权限(SHOW GRANTS)](#2.5.3 查看当前用户权限(SHOW GRANTS))
- [2.5.4 回收权限(REVOKE)](#2.5.4 回收权限(REVOKE))
- [2.5.5 修改用户密码(ALTER USER 和 SET PASSWORD)](#2.5.5 修改用户密码(ALTER USER 和 SET PASSWORD))
- [2.6 权限、用户与安全控制](#2.6 权限、用户与安全控制)
-
- [2.6.1 MySQL 授权系统核心概念](#2.6.1 MySQL 授权系统核心概念)
- [2.7 DCL 语句的应用场景](#2.7 DCL 语句的应用场景)
- [2.8 权限管理示例:添加用户并授权](#2.8 权限管理示例:添加用户并授权)
- [2.9 权限按主机限制](#2.9 权限按主机限制)
- [2.11 权限安全管理(RBAC)](#2.11 权限安全管理(RBAC))
- [MySQL 的备份与恢复技术](#MySQL 的备份与恢复技术)
-
- [3.1 备份与恢复的重要性](#3.1 备份与恢复的重要性)
- [3.2 冷备份(物理备份)](#3.2 冷备份(物理备份))
- [3.3 逻辑备份(mysqldump)](#3.3 逻辑备份(mysqldump))
- [3.4 增量备份(基于 binlog)](#3.4 增量备份(基于 binlog))
- [3.5 恢复必须考虑的事项](#3.5 恢复必须考虑的事项)
MySQL
1.数据库
1.1 数据库的概念及其发展
1.1.1 数据库概念
数据库(Database)是按一定逻辑结构和组织方式存储、检索和维护数据的系统。它可以看作是能够长期存储,由计算机主导,统一管理的数据集合。
不同于系统运行时的临时存储、内存中的缓存等,数据库是一个具有持久性、一致性、安全性、完整性的系统。
Database 在英文中是数据仓库的意思,中文中我们也同样称呼它为"数据库"。
1.2 数据库的发展历史
我们在学习数据库历史时,需要关注以下三个基本阶段的发展:
1.2.1 人工数据管理阶段 (ALM: Artificial Logistics Management)
- 时间:20世纪50年代之前的数据库管理系统均处于人工管理阶段。
- 特点 :
- 数据类型多样,包括数字、文本、图表等。
- 数据存储依赖大量的存储设备(如纸带、磁带)。
- 数据使用批处理方式。
- 缺乏统一标准和整合方式。
- 局限性 :
- 数据存储方式不统一,搜索和查询效率低。
- 数据更新和更改需要手工操作,缺乏自动化。
- 主要内容 :
- 数据:存储介质中的物理文件。
- 逻辑结构:文件夹、文件。
1.2.2 文件系统管理阶段 (FMS: File Management System)
- 时间:20世纪50年代后期至60年代中期。
- 代表系统:IBM 的 System/360 采用了文件系统管理。
- 特点 :
- 数据以文件的形式组织,有了结构化的表示方式。
- 有统一的工具来操作数据,开始引入命令行方式。
- 可支持同时读写,但数据安全性较低。
- 代表性文件System :
- 磁盘文件结构的数据库系统。
- 同时支持批式操作和实时操作。
- 基本特点 :
- 数据以文件夹和文件等方式保存;
- 可以跨多个系统进行多平台集成;
- 需要程序员定义模型和结构;
- 数据变更管理需要人工干预或手动操作;
- 数据更新操作在形式上仍然依赖 LOCK。.
- 数据库存储管理依赖外部管理员运行程序,如
backup、restore、delete命令。
1.2.3 数据库系统阶段
- 时间:20世纪70年代至今。20世纪70年代后数据库技术进入蓬勃发展阶段。
1.2.3.1 关系型数据库系统 (RDBMS)
关系型数据库的出现标志着数据管理范式的一种转变。关系数据库采用关系模型进行数据存储和处理,数据以二维表格的形式存储和检索。
关系数据库的特点:
- 数据以表的形式存储,有行和列的表示;
- 有清晰的逻辑结构,允许结构化查询;
- 可支持多对多的数据关系。例如,学生和课程表之间关系可以用外键或者 JOIN ƒ表达。
- 人机交互通过 SQL 来实现。
今日最大跃迁:
- MySQL、PostgreSQL、Oracle、SQL Server 等依托关系模型发展起来。
- 来自 Oracle 的关系模型设计给予了数据库管理的范式转变。
- 范式如第一范式、第二范式等,优化数据存储结构。
1.2.3.2 易用性、可扩展性和灵活性
- 数据以表格形式管理,很容易与应用开发进行连接;
- 数据库可支持同时操作多个数据表;
- 内容管理更加简洁,如 JSON、XML 等;
- 云服务和分布式也增加了数据库的扩展能力和网络适应性。
1.3 数据的分类
1.3.1 结构化数据
1.3.1.1 定义
结构化数据是指可以被二维表结构 所表达的数据类型,它有固定列和行结构。
1.3.1.2 典型例子
在学校管理数据库系统中,学生表就是一个典型的结构化数据。
| stid | name | age |
|------|-------|-----|
| 1 | 唐三 | 123 |
| 2 | 叶凡 | 456 |
1.3.1.3 数据特点
- 每个字段数据类型明确;
- 支持查询、修改、删除投射不同的操作;
- 可对数据进行一致性和原子性的保护;
- 容易与应用层对接,管理算法优雅。
- 每个字段具有固定的长度,存储开销较小。
1.3.1.4 优势和局限
- 优点 :
- 数据一致性高;
- 结构清晰,易于设计;
- 支持多种数据类型,包括数字、文本、日期等。
- 局限 :
- 当数据结构比较复杂时,可能需要更多的维护和配置;
- 大数据量的存储和查询效率会下降。
1.3.2 半结构化数据
1.3.2.1 定义
半结构化数据无法被二维表形式表达,但它提供了结构标签 集成到数据中,可以表示层次式结构。
- JSON、XML、HTML、CSV、XML 也属于半结构化数据。
- 如此类数据缺乏统一结构,有不同的存储方式。
- 它的结构和内容混合在一起,也被称为"自描述结构"数据。
1.3.2.2 典型例子
json
[
{
"id": 1,
"name": "唐三",
"gene": "male"
},
{
"id": 2,
"name": "叶凡",
"gene": "female"
}
]
- 结构形式:JSON 结构;
- 内容形式:字段描述与值之间的映射。
1.3.2.3 优势和局限
- 优点 :
- 易于查询和更新:JSON 可通过 SQL 原生支持解析;
- 扩展性强:方便以后添加新字段;
- 模型独立:数据库可以不持久化中间结构,又可应用于多样化的场景。
- 局限 :
- 查询效率低;
- 多数据分布需要设计高速结构;
- 没有统一的语言标准,某种 JSON 可能不支持 SQL 查询。
1.3.3 非结构化数据
1.3.3.1 定义
非结构化数据不是用二维表存储的,它通常以整体文件形式存放,如 PDF、视频、音频、图像及二进制文件。
1.3.3.2 特点
- 数据缺乏预定义的格式;
- 存储方式采用文件夹或文件的形式;
- 查询和操作需要特定的框架或工具(如 NoSQL)。
1.3.3.3 典型例子
- 附件文件(如 PDF、JPG)
- 音视频文件(如 MP4、MPEG)
- 零散的文件(如在一个系统里,多个用户上传资源)
2.1 SQL 语言分类及核心内容
SQL(Structured Query Language)是操作和管理关系型数据库的重要语言,按功能分为以下几类:
| SQL 类型 | 作用 | 示例 |
|---|---|---|
| DDL | 数据库与表的结构管理 | CREATE DATABASE, CREATE TABLE |
| DML | 对数据库中数据的操作 | INSERT, UPDATE, DELETE |
| DQL | 查询操作 | SELECT |
| DCL | 用户权限管理 | GRANT, REVOKE |
| TCL | 事务控制 | COMMIT, ROLLBACK, BEGIN |
2.2 DDL:数据定义语言
DDL 用于定义和操作数据库、表、索引等结构。
2.2.1 创建数据库
sql
CREATE DATABASE school;
该语句会创建一个名为
school的数据库。
2.2.2 使用数据库
sql
USE school;
依次进入
school数据库,后续操作针对该库。
2.2.3 查看数据库列表
sql
SHOW DATABASES;
显示系统中所有的数据库。
2.2.4 查看创建数据库的语句
sql
SHOW CREATE DATABASE school;
显示创建
school数据库时使用的 SQL 语句。
2.2.5 创建表(常见的 DDL 语句)
sql
CREATE TABLE students (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) NOT NULL,
age TINYINT,
gender ENUM('Male', 'Female'),
address VARCHAR(50)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
创建一个名为
students的表,使用 InnoDB 引擎和 UTF8MB4 字符集。
2.2.6 修改表结构
- 修改字段类型:
sql
ALTER TABLE students MODIFY age SMALLINT;
- 添加字段:
sql
ALTER TABLE students ADD COLUMN email VARCHAR(255) AFTER name;
- 删除字段:
sql
ALTER TABLE students DROP COLUMN email;
2.2.7 查看表结构
sql
DESC students; -- 显示表的结构和字段信息
SHOW CREATE TABLE students; -- 显示创建表的完整 SQL 语句
DESC语句提供更简化的结构视图,SHOW CREATE TABLE则用于查看定义。
2.3 DML:数据操作语言
DML 用于数据的增删改操作,是数据库核心内容之一。
2.3.1 插入数据(INSERT)
插入单条数据
sql
INSERT INTO students (name, age, gender, address)
VALUES ('唐三', 12, 'Male', '海淀区123号');
插入多条数据
sql
INSERT INTO students (name, age, gender, address)
VALUES
('叶凡', 18, 'Male', '朝阳区456号'),
('林动', 20, 'Male', '西城区789号');
插入整表数据(从另一个表复制)
sql
INSERT INTO students SELECT * FROM other_students;
插入数据与文件导入
bash
# 从 CSV 文件导入数据
LOAD DATA INFILE '/data/students.csv'
INTO TABLE students
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
2.3.2 更新数据(UPDATE)
sql
UPDATE students SET age = 25 WHERE id = 1;
将
id=1的学生年龄修改为 25。
sql
UPDATE students SET address = '北京西城区', gender = 'Female' WHERE name LIKE '林%';
更新所有名字为"林"的学生的地址与性别为"Female"。
2.3.3 删除数据(DELETE)
sql
DELETE FROM students WHERE id = 3;
删除
id=3的记录。
sql
DELETE FROM students WHERE age < 18;
删除所有小于 18 岁的学生。
✅ 注意:删除数据前应该先备份,避免误删。
2.4 DQL:数据查询语言
DQL 主要用于从数据库中提取数据,是 SQL 的核心内容之一。
2.4.1 查询基础语法
sql
SELECT * FROM students;
查询表中的所有内容。
sql
SELECT name, age FROM students WHERE gender = 'Male';
查询男性学生的姓名和年龄。
2.4.2 查询限制条件(WHERE)
sql
SELECT * FROM students WHERE age > 20 AND gender = 'Male';
sql
SELECT * FROM students WHERE name LIKE '林%';
使用通配符进行模糊匹配。
2.4.3 查询排序(ORDER BY)
sql
SELECT name, age FROM students ORDER BY age DESC;
按年龄从高位到低位排序。
2.4.4 查询去重(DISTINCT)
sql
SELECT DISTINCT gender FROM students;
查询中不同性别。
2.4.5 查询聚合函数
常见函数包括:
COUNT(*):统计记录总数。AVG(age):统计平均年龄。MAX(age):最大年龄。SUM(age):年龄总和。GROUP BY:按字段分组统计。JOIN:连接多个表进行复杂查询。
sql
SELECT s.name, c.name
FROM students AS s
JOIN classes AS c ON s.class_id = c.id;
查询学生姓名及其所属班级。
2.5 用户管理与权限控制
2.5.1 创建用户(CREATE USER)
sql
CREATE USER 'student'@'localhost' IDENTIFIED BY 'student_pwd';
创建一个本地用户
student,密码为student_pwd。
2.5.2 授权用户(GRANT)
GRANT 用于给用户授予数据库对象的访问权限,示例:
sql
GRANT SELECT, INSERT, UPDATE ON school.students TO 'student'@'localhost';
授权用户
student@localhost对school.students表进行查询、插入和更新操作。
sql
GRANT ALL PRIVILEGES ON school.* TO 'admin'@'%';
授权用户
admin@%对school数据库中的所有表具有所有权限。
sql
GRANT USAGE ON *.* TO 'readonly'@'%' IDENTIFIED BY 'r_pwd';
创建一个只读用户
readonly@%,密码为r_pwd。
✅ 权限说明:
SELECT: 只读操作INSERT: 插入数据UPDATE: 更新数据DELETE: 删除数据ALL: 全部权限(包括查询、增删改查等)
2.5.3 查看当前用户权限(SHOW GRANTS)
sql
SHOW GRANTS FOR 'student'@'localhost';
查看用户
student@localhost的权限。
2.5.4 回收权限(REVOKE)
sql
REVOKE DELETE ON school.students FROM 'student'@'localhost';
回收用户对
students表的删除权限。
2.5.5 修改用户密码(ALTER USER 和 SET PASSWORD)
sql
ALTER USER 'student'@'localhost' IDENTIFIED BY 'new_pwd';
SET PASSWORD FOR 'student'@'localhost' = 'new_pwd';
2.6 权限、用户与安全控制
2.6.1 MySQL 授权系统核心概念
在 MySQL 中,权限控制不仅是数据访问的判断点,还涉及如下:
- 主机(host): 用户权限受限于其连接方式。
- 权限(privilege): 基于数据库、表、列或全局的访问权限。
- 角色(role) : MySQL 有
mysql_native_password和caching_sha2_password等方式。
MySQL 的用户额外权限有:
| 权限 | 说明 |
|---|---|
| SELECT | 查询所有数据 |
| INSERT | 插入数据 |
| UPDATE | 更新数据 |
| DELETE | 删除数据 |
| CREATE | 创建数据库或表 |
| DROP | 删除数据库或表 |
| ALTER | 修改表结构 |
| RELOAD | 重新加载索引和配置文件 |
| SUPER | 控制服务器进程(可用于管理权限) |
✅ 警告:不要过度授权权限,以免造成安全漏洞或操作误用。
2.7 DCL 语句的应用场景
| 操作 | 使用场景 |
|---|---|
| 权限赋予 | 为开发账号授权查询与更新权限 |
| 管理员权限 | 用于数据操作、查询及管理 |
| 回收权限 | 防止普通用户误操作 |
| 修改密码 | 保证密码安全更新 |
| 创建只读账号 | 增强数据库安全性 |
2.8 权限管理示例:添加用户并授权
mysql
-- 创建用户
CREATE USER 'app_user'@'192.168.0.100' IDENTIFIED BY 'supersecure123';
-- 授权用户访问名为 test 的数据库
GRANT SELECT, INSERT ON test.* TO 'app_user'@'192.168.0.100';
-- 授权用户具有创建和管理数据库的权限
GRANT CREATE, DROP ON test.* TO 'app_user'@'192.168.0.100';
-- 提交权限
FLUSH PRIVILEGES;
填写
app_user@192.168.0.100账户拥有对test数据库的查询和插入权限,这时即使用户账号变更也可保持权限完整性。
2.9 权限按主机限制
MySQL 支持基于主机的权限管理,这样可以实现网段或 IP 级别防护。
示例:按 IP 授权用户
sql
-- 创建可访问 IP 为 192.168.0.1 上的数据库的用户
CREATE USER 'guest'@'192.168.0.1' IDENTIFIED BY 'guest123';
-- 授权该用户访问特定数据库
GRANT SELECT, UPDATE ON school.students TO 'guest'@'192.168.0.1';
账户权限限于
192.168.0.1,本地用户使用localhost。
2.11 权限安全管理(RBAC)
RBAC(Role-Based Access Control)是一种基于角色的访问控制模型。
示例:
sql
-- 创建角色 'student_role'
CREATE ROLE 'student_role';
-- 授权角色的权限
GRANT SELECT, INSERT ON school.students TO 'student_role';
-- 将角色授予用户
GRANT 'student_role' TO 'student'@'localhost';
-- 提交权限
FLUSH PRIVILEGES;
这样可以避免直接交互数据库用户名和密码,减少敏感信息暴露。
MySQL 的备份与恢复技术
3.1 备份与恢复的重要性
在运维工作中,数据安全 和灾难恢复是至关重要的部分。MySQL 提供了多种备份方式,包括:
- 冷备份(物理备份)
- 逻辑备份(mysqldump 工具)
- 增量备份(基于 binlog)
- 恢复备份
这些备份方式各有适用场景,运维工程师应根据实际情况选择合适的备份方法。
3.2 冷备份(物理备份)
3.2.1 定义
冷备份是一种完全停机 的状态下对数据库物理文件进行复制的方式,通常适用于:
- 运维窗口期间的全量备份;
- 数据库服务器更新或迁移前的备份;
- 对于某些不频繁变更的数据库;
3.2.2 冷备份原理
冷备份的核心是使用数据库的数据目录,通常包含以下文件:
- 数据库文件(
*.ibd、*.frm、*.myd、*.myi等) - 配置文件(
my.cnf或my.ini) - 日志文件(
binlog、error.log、relay.log等)
3.2.3 冷备份操作步骤
步骤一:停止 MySQL 服务
bash
systemctl stop mysqld
步骤二:复制数据目录
bash
cp -r /var/lib/mysql /backup/mysql_backup_$(date +%Y%m%d)
步骤三:记录配置信息
bash
cp /etc/my.cnf /backup/mysql_config_$(date +%Y%m%d).cnf
✅ 注意:在备份前必须确保 MySQL 服务已停止,否则会存在数据不一致的风险。
3.2.4 冷备份的恢复方式
恢复冷备份前,必须恢复数据目录 和配置文件,操作如下:
步骤一:停止 MySQL 服务
bash
systemctl stop mysqld
步骤二:删除原有数据目录
bash
rm -rf /var/lib/mysql
步骤三:替换为备份数据
bash
cp -r /backup/mysql_backup_20250421 /var/lib/mysql
步骤四:启动 MySQL 服务
bash
systemctl start mysqld
步骤五:验证备份
bash
mysql -u root -p -e "SHOW DATABASES;"
3.3 逻辑备份(mysqldump)
3.3.1 定义
逻辑备份是指将数据库的结构和数据以 SQL 文件形式 保存,适合常规的数据迁移、备份管理 及只读访问场景。
3.3.2 逻辑备份命令详解
备份单个数据库
bash
mysqldump -u root -p school > school_backup.sql
将
school数据库导出为 SQL 文件。
备份单个表
bash
mysqldump -u root -p school.students > students_backup.sql
备份整个数据库(所有数据库)
bash
mysqldump -u root -p --all-databases > all_backup.sql
备份时指定字符集
bash
mysqldump -u root -p --default-character-set=utf8mb4 school > school_utf8mb4_backup.sql
备份时指定压缩****
bash
mysqldump -u root -p school > school_backup.sql | gzip > school_backup.sql.gz
3.3.3 逻辑备份的恢复方式
从 SQL 文件中恢复数据
bash
mysql -u root -p school < school_backup.sql
从压缩 SQL 文件恢复数据
bash
gzip -d school_backup.sql.gz | mysql -u root -p school
3.4 增量备份(基于 binlog)
3.4.1 增量备份定义
增量备份是指在上一次完整备份之后 ,仅备份发生变化的数据 ,常用于灾备与审计场景。
3.4.2 增量备份原理
MySQL 中的增量备份 主要通过binlog(二进制日志)实现。它记录了所有对数据库的修改操作,如:
- 插入(INSERT)
- 更新(UPDATE)
- 删除(DELETE)
3.4.3 增量备份操作步骤
步骤一:开启 binlog
编辑 my.cnf 或 my.ini,添加以下内容:
ini
[mysqld]
log-bin = mysql-bin
server-id = 1
binlog-format = ROW # 记录行的增删改操作
步骤二:重启 MySQL 服务
bash
systemctl restart mysqld
步骤三:设置 binlog 备份时间点
bash
mysql> FLUSH LOGS; # 生成新的 binlog 文件
mysql> SHOW MASTER STATUS; # 查看当前的 binlog 位置
✅ 这两个命令帮助确定备份点,以便进行增量恢复。
步骤四:对 binlog 进行备份(如使用 mysqldump 备份后记录 binlog 信息)
bash
# 保存当前 binlog 文件名和位置
mysql> SET GLOBAL log_bin_basename = '/var/lib/mysql/mysql-bin.000010';
mysql> SET GLOBAL binlog_file = 'mysql-bin.000010';
mysql> SET GLOBAL binlog_pos = 123456;
步骤五:执行增量恢复(使用 mysqlbinlog 工具)
bash
mysqlbinlog /var/lib/mysql/mysql-bin.000010 --start-position=123456 | mysql -u root -p school
3.5 恢复必须考虑的事项
| 恢复要点 | 说明 |
|---|---|
| 备份完整性 | 目录或 SQL 文件未损坏 |
| 权限问题 | 恢复数据库时需要对应用户权限 |
| 字符集匹配 | 逻辑备份的字符集与目标环境一致 |
| binlog 模式 | 增量恢复时需要注意 ROW / MIXED / STATEMENT 模式 |
| 物理备份一致性 | 在冷备份中需要注意表结构是否最新 |
| 测试性恢复 | 建议在测试环境或沙箱中练习恢复流程 |