文章目录
- MySQL
-
- [1 数据库原理](#1 数据库原理)
-
- [1.1 数据的分类](#1.1 数据的分类)
- [1.2 数据管理发展历史](#1.2 数据管理发展历史)
-
- [1.2.1 三个发展阶段](#1.2.1 三个发展阶段)
- [1.2.2 文件管理系统的特点](#1.2.2 文件管理系统的特点)
- [1.3 数据库管理系统](#1.3 数据库管理系统)
-
- [1.3.1 相关概念](#1.3.1 相关概念)
- [1.3.2 数据库管理系统特点](#1.3.2 数据库管理系统特点)
- [1.3.3 数据库管理系统基本功能](#1.3.3 数据库管理系统基本功能)
- [1.3.4 数据库管理系统的发展历史](#1.3.4 数据库管理系统的发展历史)
- [1.3.5 关系型数据库相关概念](#1.3.5 关系型数据库相关概念)
- [1.3.6 数据库软件排名(2025 年 9 月)](#1.3.6 数据库软件排名(2025 年 9 月))
- [1.4 关系型数据库理论](#1.4 关系型数据库理论)
-
- [1.4.1 E-R 模型](#1.4.1 E-R 模型)
- [1.4.2 联系类型](#1.4.2 联系类型)
- [1.4.3 数据的操作(CRUD)](#1.4.3 数据的操作(CRUD))
- [1.4.4 数据库的正规化分析(范式)](#1.4.4 数据库的正规化分析(范式))
- [1.4.5 SQL 结构化查询语言](#1.4.5 SQL 结构化查询语言)
- [2 MySQL 安装和基本使用](#2 MySQL 安装和基本使用)
-
- [2.1 MySQL 介绍](#2.1 MySQL 介绍)
-
- [2.1.1 MySQL 历史](#2.1.1 MySQL 历史)
- [2.1.2 MySQL 系列](#2.1.2 MySQL 系列)
- [2.1.3 MySQL 的特性](#2.1.3 MySQL 的特性)
- [2.2 MySQL 安装](#2.2 MySQL 安装)
- [2.3 MySQL 多实例](#2.3 MySQL 多实例)
-
- [2.3.1 数据库多实例介绍](#2.3.1 数据库多实例介绍)
- [2.3.2 MySQL 多实例配置方案](#2.3.2 MySQL 多实例配置方案)
- [2.4 MySQL 组成和常用工具](#2.4 MySQL 组成和常用工具)
-
- [2.4.1 MySQL 主要组成](#2.4.1 MySQL 主要组成)
- [2.4.2 MySQL 中的用户账户](#2.4.2 MySQL 中的用户账户)
- [2.4.3 MySQL 命令类型](#2.4.3 MySQL 命令类型)
- [2.4.4 MySQL 客户端使用](#2.4.4 MySQL 客户端使用)
- [3 SQL 语言](#3 SQL 语言)
-
- [3.1 关系型数据库的构成](#3.1 关系型数据库的构成)
- [3.2 SQL 语言介绍](#3.2 SQL 语言介绍)
-
- [3.2.1 SQL 语言规范](#3.2.1 SQL 语言规范)
- [3.2.2 数据库对象和命名](#3.2.2 数据库对象和命名)
- [3.2.3 SQL 语句分类](#3.2.3 SQL 语句分类)
- [3.2.4 SQL 语句构成](#3.2.4 SQL 语句构成)
- [3.2.5 字符集和排序](#3.2.5 字符集和排序)
- [3.3 管理数据库](#3.3 管理数据库)
- [3.4 数据类型](#3.4 数据类型)
- [3.5 DDL 语句](#3.5 DDL 语句)
-
- [3.5.1 创建表](#3.5.1 创建表)
- [3.5.2 查看表](#3.5.2 查看表)
- [3.5.3 修改和删除表](#3.5.3 修改和删除表)
- [3.6 DML 语句](#3.6 DML 语句)
-
- [3.6.1 插入数据](#3.6.1 插入数据)
- [3.6.2 更新数据](#3.6.2 更新数据)
- [3.6.3 删除数据](#3.6.3 删除数据)
- [3.7 DQL 语句](#3.7 DQL 语句)
- [3.8 MySQL 用户管理](#3.8 MySQL 用户管理)
- [3.9 权限管理和 DCL 语句](#3.9 权限管理和 DCL 语句)
-
- [3.9.1 权限类别](#3.9.1 权限类别)
- [3.9.2 授权](#3.9.2 授权)
- [3.9.3 取消权限](#3.9.3 取消权限)
- [3.9.4 查看权限](#3.9.4 查看权限)
- 权限生效
- [3.10 MySQL 图形化远程管理工具](#3.10 MySQL 图形化远程管理工具)
- [3.11 实现基于 LAMP 架构的开源网站](#3.11 实现基于 LAMP 架构的开源网站)
-
- [3.11.1 LAMP 架构说明](#3.11.1 LAMP 架构说明)
- [3.11.2 PHP 简介](#3.11.2 PHP 简介)
- [3.11.3 博客项目实现(WordPress)](#3.11.3 博客项目实现(WordPress))
- [4 MySQL 5.x 源码安装](#4 MySQL 5.x 源码安装)
- [5 MySQL 的备份与恢复](#5 MySQL 的备份与恢复)
- [6 主从复制和读写分离](#6 主从复制和读写分离)
- [7 MHA 高可用](#7 MHA 高可用)
MySQL
1 数据库原理
1.1 数据的分类

- 结构化数据:可用二维表逻辑表达,有固定格式和长度,存储于关系型数据库,先有结构后有数据(如学生信息表)。
- 半结构化数据:介于结构化与非结构化之间,无严格数据表模型,含分隔标记,先有数据后有结构(如 HTML、JSON、XML、部分 NoSQL 数据库)。
- 非结构化数据:无固定结构和长度,无法用二维表表示,需整体存储(如二进制文件、音视频、位置信息)。
1.2 数据管理发展历史
1.2.1 三个发展阶段
- 人工管理阶段(20 世纪 50 年代中期前):用于科学计算,外部存储为磁带 / 打孔纸带,无专业管理软件,数据管理靠人工,批处理方式。
- 文件系统管理阶段(20 世纪 50 年代后期 - 60 年代中期):兼顾科学计算与信息管理,出现磁盘 / 磁鼓存储,有文件系统管理软件,数据可长期保存,支持批处理和联机实时处理。
- 数据库系统阶段(20 世纪 60 年代后期至今):大容量磁盘普及,硬件降价,数据库系统克服文件系统缺陷,采用复杂结构化数据模型,数据独立性高、冗余度低,通过 DBMS 关联程序与数据。
1.2.2 文件管理系统的特点
- 优点:文件格式多样,数据可长期保存,具有一定独立性。
- 缺点:无统一接口,不支持并发访问,无安全控制,数据间联系弱,冗余不可避免。
1.3 数据库管理系统
1.3.1 相关概念
- 数据库(Database):长期存储在计算机内、有组织、可共享、统一管理的大量数据集合。
- 数据库管理系统(DBMS):操纵和管理数据库的大型软件,负责数据库的建立、使用、维护,保障安全性和完整性。
- 数据库管理员(DBA):负责数据库全生命周期管理,核心目标是保证 DBMS 稳定、安全、完整和高可用。
- 应用程序(Application):能执行特定功能的软件程序。
1.3.2 数据库管理系统特点
- 采用复杂数据模型,数据冗余小、易扩充、可共享。
- 数据与程序独立性高(物理独立性、逻辑独立性)。
- 提供统一查询接口,实现数据与应用程序解耦。
- 具备并发控制、数据备份与恢复、完整性和安全性保障等功能。
1.3.3 数据库管理系统基本功能
- 数据定义:通过 DDL 定义数据库三级模式、两级映像及约束,信息存于数据字典。
- 数据操作:通过 DML 实现数据增删改查。
- 数据组织、存储与管理:分类管理数据字典、用户数据等,优化存储利用率和存取效率。
- 数据库运行管理:含并发控制、安全性检查、完整性执行、事务管理等,保障系统正常运行。
- 数据库维护:包括数据载入、转换、转储、重组、重构及性能监控。
- 数据库保护:通过恢复、并发控制、完整性控制、安全性控制实现,含缓冲区管理等自适应机制。
- 通信:支持与操作系统、网络中其他软件的通信及数据库互操作。
1.3.4 数据库管理系统的发展历史
- 层次数据库:最早的数据库系统,数据组织为树状模型,仅支持一对多关系(代表:IBM 的 IMS)。
- 网状数据库:以网状数据模型为基础,结点可多上 / 下级,支持多对多联系。
- 关系型数据库管理系统(RDBMS):采用二维表格模型组织数据,表由行和列组成,常见有 Oracle、MySQL、DB2、SQLServer 等。
1.3.5 关系型数据库相关概念
- 数据库:关联表的集合。
- 数据表:数据的矩阵,类似电子表格。
- 列(column):相同类型数据的集合。
- 行(Row):一组相关数据(元组 / 记录)。
- 冗余:存储两倍数据,降低性能但提高安全性。
- 主键(Primary key):唯一标识,一个表仅一个。
- 外键:用于关联两个表。
- 复合键:多个列组成的索引键。
- 索引:排序的列 / 多列值结构,加速查询(类似书籍目录)。
- 参照完整性:不允许引用不存在的实体,保证数据一致性。
1.3.6 数据库软件排名(2025 年 9 月)
-
Oracle(关系型、多模型):1170.62 分
-
MySQL(关系型、多模型):891.77 分
-
Microsoft SQL Server(关系型、多模型):717.32 分
-
PostgreSQL(关系型、多模型):657.17 分
-
MongoDB(文档型、多模型):380.50 分
(其余依次为 Snowflake、Redis、IBM Db2、Databricks、Elasticsearch)
1.4 关系型数据库理论
1.4.1 E-R 模型
- 组成:实体(矩形,客观存在的实物)、属性(椭圆形,实体的特性)、联系(菱形,实体间关联规则)。
- 用途:数据库设计中数据建模的工具,不受 DBMS 约束。
1.4.2 联系类型
- 一对一(1:1):如学号与学生的对应关系。
- 一对多(1:n):如老师与课程的对应关系。
- 多对多(m:n):如学生与课程的对应关系。
1.4.3 数据的操作(CRUD)
- Create(新增):插入数据。
- Read(读取):查询数据,SQL 关键字 SELECT。
- Update(更新):修改数据,SQL 关键字 UPDATE。
- Delete(删除):移除数据,SQL 关键字 DELETE。
1.4.4 数据库的正规化分析(范式)
- 第一范式(1NF):字段值不可分解,无重复属性,保证列原子性。
- 第二范式(2NF):在 1NF 基础上,每列均与主键完全相关(无部分依赖)。
- 第三范式(3NF):在 2NF 基础上,每列与主键直接相关(无传递依赖),一般数据库满足 3NF 即可。
- 更高范式:BCNF、4NF、5NF(完美范式),冗余度更低。
1.4.5 SQL 结构化查询语言
- 定义:用于存取、查询、更新和管理关系数据库系统的查询和程序设计语言。
- 运行模式:C/S 模式,客户端发送查询语句,服务端返回结果。
- 接口:MySQL 自带 CLI 接口,GUI 接口可通过第三方工具实现,应用程序通过数据库驱动通信。
2 MySQL 安装和基本使用
2.1 MySQL 介绍
2.1.1 MySQL 历史
- 命名由来:创始人 Michael Widenius 以女儿名字 "My" 命名。
- 关键节点:1979 年原型 UNIREG 诞生;1995 年首个内部版本发布;1999 年 MySQL AB 成立;2008 年被 Sun 收购;2009 年随 Sun 被 Oracle 收购;2010 年 5.5 正式版发布,InnoDB 成为默认引擎。
- 标志:海豚 "sakila",源自斯威士兰方言。
- 行业应用:全球 Top20 网站中 90% 使用,如 Facebook、Google、淘宝、腾讯等。
2.1.2 MySQL 系列
- 官方 MySQL:先后属 MySQL AB、Sun、Oracle。
- Percona Server:兼容 MySQL,含 XtraDB 引擎,侧重性能与可靠性,不接受外部贡献。
- MariaDB:MySQL 之父创建的分支,兼容 MySQL,开源免费,Fedora 等 Linux 发行版已切换使用。
2.1.3 MySQL 的特性
- 开源免费,支持二次开发。
- 采用标准 SQL 语言管理。
- 跨平台,支持多种编程语言。
- 插件式存储引擎,灵活选择。
- 单进程、多线程工作模式。
- 丰富的测试组件和扩展。
2.2 MySQL 安装
参考 MySQL 安装手册。
2.3 MySQL 多实例
2.3.1 数据库多实例介绍
- 定义:一台服务器运行多个 MySQL 服务端进程,各进程监听独立端口,有独立配置和数据。
- 优点:节约硬件资源、便于版本对比、集中管理。
- 缺点:资源抢占、单点风险。
2.3.2 MySQL 多实例配置方案
- 支持不同版本或相同版本实现多实例,如 3306 端口对应 MySQL 5.7,3307 端口对应 MySQL 8.0。
2.4 MySQL 组成和常用工具
2.4.1 MySQL 主要组成
- 服务端程序:
- mysqld_safe:安全启动脚本。
- mysqld:核心服务端程序。
- mysqld_multi:多实例工具。
- 客户端程序:
- mysql:交互式 CLI 工具。
- mysqldump:备份工具。
- mysqladmin:服务端管理工具。
- mysqlimport:数据导入工具。
- MyISAM 管理工具:
- myisamchk:检测 MyISAM 库。
- myisampack:打包 MyISAM 表(只读)。
- 配置文件:/etc/my.cnf 及 /etc/my.cnf.d/ 下的客户端、服务端配置文件,生效顺序为 /etc/my.cnf > /etc/mysql/my.cnf > ~/.my.cnf。
2.4.2 MySQL 中的用户账户
详见 MySQL 用户管理章节。
2.4.3 MySQL 命令类型
- 客户端命令:本地执行(如 clear、connect、exit、help 等)。
- 服务端命令:发送到服务端执行(如 CREATE、ALTER、SELECT 等),可通过
help contents查看分类。
2.4.4 MySQL 客户端使用
- 常用选项:-V(版本)、-u(用户名)、-p(密码)、-h(主机)、-P(端口)、-D(数据库)、-H(HTML 输出)、-E(垂直显示)等。
- 常用命令:显示当前数据库(\s)、切换数据库(use)、调用系统命令(!)、修改提示符(prompt)、执行 SQL 脚本(source)、重连(\r)等。
- mysqladmin 工具:支持创建 / 删除数据库、修改密码、查看状态、关闭服务等操作。
- mycli 工具:Python 开发,支持自动完成和语法高亮,需通过 pip 安装。
3 SQL 语言
3.1 关系型数据库的构成
| 组件 | 关键字 | 说明 |
|---|---|---|
| 数据库 | database | 表的集合,对应文件系统中的目录 |
| 表 | table | 二维表形式,存储数据 |
| 索引 | index | 建立在列上,加速查询 |
| 视图 | view | 虚拟表,关联多个表供查询 |
| 存储过程 | procedure | 完成特定功能的 SQL 集合,可直接调用 |
| 存储函数 | function | 带参数的 SQL 集合 |
| 触发器 | trigger | 满足触发条件时执行的 SQL 集合 |
| 事件调度器 | event scheduler | 数据库计划任务 |
| 用户 | user | 连接服务端的账号 |
| 权限 | privilege | 用户可操作的数据库 / 表及连接 IP 限制 |
3.2 SQL 语言介绍
3.2.1 SQL 语言规范
- 不区分大小写(建议关键字大写),以
;结尾。 - 关键字不可跨行或简写,可用空格 / TAB 缩进。
- 注释:单行(-- 或 #)、多行(/* ... */)。
3.2.2 数据库对象和命名
- 对象:数据库、表、索引、视图、用户等。
- 命名规则:可含字母、数字、#_$,不可使用 MySQL 保留字。
3.2.3 SQL 语句分类
| 类型 | 说明 | 具体语句 |
|---|---|---|
| DDL | 数据定义语言 | CREATE、DROP、ALTER |
| DML | 数据操纵语言 | INSERT、DELETE、UPDATE |
| DQL | 数据查询语言 | SELECT |
| DCL | 数据控制语言 | GRANT、REVOKE |
| TCL | 事务控制语言 | BEGIN、COMMIT、ROLLBACK、SAVEPOINT |
3.2.4 SQL 语句构成
- 关键字组成子句,多条子句组成语句(如 SELECT 子句 + FROM 子句 + WHERE 子句)。
3.2.5 字符集和排序
- 默认字符集:MySQL 8.0 及以上为 utf8mb4,早期为 latin1。
- 查看字符集:
show CHARACTER SET;查看排序规则:SHOW COLLATION。 - 修改字符集:通过配置文件或 ALTER DATABASE/TABLE 语句。
3.3 管理数据库
- 查看数据库列表:
SHOW DATABASES; - 创建数据库:
CREATE DATABASE [IF NOT EXISTS] db_name [CHARACTER SET charset]; - 查看创建语句:
SHOW CREATE DATABASE db_name; - 修改数据库:
ALTER DATABASE db_name [CHARACTER SET charset]; - 删除数据库:
DROP DATABASE [IF EXISTS] db_name;(或通过 mysqladmin 工具)。
3.4 数据类型
| 类型大类 | 具体类型及关键字 |
|---|---|
| 整数类型 | TINYINT、SMALLINT、MEDIUMINT、INT(INTEGER)、BIGINT |
| 浮点类型 | FLOAT、DOUBLE |
| 定点数类型 | DECIMAL |
| 位类型 | BIT |
| 日期时间类型 | YEAR、TIME、DATE、DATETIME、TIMESTAMP |
| 文本字符串类型 | CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT |
| 枚举类型 | ENUM |
| 集合类型 | SET |
| 二进制字符串类型 | BINARY、VARBINARY、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB |
| JSON 类型 | JSON 对象、JSON 数组 |
| 空间数据类型(单值) | GEOMETRY、POINT、LINESTRING、POLYGON |
| 空间数据类型(集合) | MULTIPOINT、MULTILINESTRING、MULTIPOLYGON、GEOMETRYCOLLECTION |
列属性
| 关键字 | 含义 |
|---|---|
| NULL | 允许 NULL 值 |
| NOT NULL | 不允许 NULL 值 |
| DEFAULT | 默认值 |
| PRIMARY KEY | 主键 |
| AUTO_INCREMENT | 自动递增(适用于整数) |
| UNSIGNED | 无符号 |
| CHARACTER SET name | 指定字符集 |
3.5 DDL 语句
3.5.1 创建表
- 格式:
CREATE TABLE [IF NOT EXISTS] tbl_name (col1 type1 修饰符, ...) [表选项]; - 表选项:ENGINE(存储引擎)、CHARSET(字符集)等。
- 方式:直接创建、通过查询现存表创建(含数据)、复制表结构(不含数据)。
3.5.2 查看表
- 列出表:
SHOW TABLES [FROM db_name]; - 查看建表语句:
SHOW CREATE TABLE [db_name.]tbl_name; - 查看表结构:
DESC [db_name.]tbl_name或SHOW COLUMNS FROM ...; - 查看表状态:
SHOW TABLE STATUS LIKE 'tbl_name'; - 查看支持的存储引擎:
SHOW ENGINES;
3.5.3 修改和删除表
- 修改表名:
ALTER TABLE tbl_name RENAME TO new_name; - 添加字段:
ALTER TABLE tbl_name ADD COLUMN col type [AFTER col_name]; - 修改字段类型:
ALTER TABLE tbl_name MODIFY COLUMN col type; - 更改字段名和类型:
ALTER TABLE tbl_name CHANGE COLUMN old_col new_col type; - 删除字段:
ALTER TABLE tbl_name DROP COLUMN col; - 添加 / 删除主键:
ALTER TABLE tbl_name ADD PRIMARY KEY (col);/ALTER TABLE tbl_name DROP PRIMARY KEY; - 删除表:
DROP TABLE [IF EXISTS] tbl_name;
3.6 DML 语句
3.6.1 插入数据
- 格式:
INSERT INTO tbl_name [(col1,...)] VALUES (val1,...), (val2,...); - 特性:可批量插入,支持默认值、NULL 值,存在重复键时可通过
ON DUPLICATE KEY UPDATE更新。
3.6.2 更新数据
- 格式:
UPDATE [IGNORE] tbl_name SET col1=val1,... [WHERE condition]; - 注意:必须加 WHERE 条件(否则更新全表),可通过
safe-updates配置强制限制。
3.6.3 删除数据
- 格式:
DELETE FROM tbl_name [WHERE condition]; - 清空表:
TRUNCATE TABLE tbl_name;(DDL 语句,效率高,不支持事务)。 - 生产环境建议:逻辑删除(如设置 is_del 字段),而非物理删除。
3.7 DQL 语句
核心语法要素
- 字段别名:
col AS alias。 - 过滤条件(WHERE):支持算术运算符(+、-、*、/、%)、比较运算符(=、<>、>、< 等)、范围查询(BETWEEN)、集合查询(IN)、空值查询(IS NULL)、模糊查询(LIKE,% 任意字符,_ 单个字符)、逻辑运算符(AND、OR、NOT)。
- 去重(DISTINCT):去除重复行。
- 分组(GROUP BY):按指定字段分组,配合聚合函数(count、sum、max、min、avg)使用。
- 分组过滤(HAVING):过滤分组聚合结果。
- 排序(ORDER BY):ASC(升序,默认)、DESC(降序)。
- 分页(LIMIT):
LIMIT [offset,] row_count,offset 默认为 0。 - 锁机制:
FOR UPDATE(写锁)、LOCK IN SHARE MODE(读锁)。
单表操作范例
- 直接查询字符串 / 变量 / 函数:
select 'str', @@port, now(); - 指定字段查询:
select id, name from tbl_name; - 条件查询:
select * from tbl_name where id > 10 and age < 30; - 分组统计:
select gender, count(*) from tbl_name group by gender having count(*) > 5; - 排序分页:
select * from tbl_name order by id desc limit 5, 10;
3.8 MySQL 用户管理
用户组成
- 用户名 + 主机(Host)唯一标识用户,Host 支持主机名、IP、网段、通配符(% 任意字符,_ 单个字符)。
用户操作
- 创建用户:
CREATE USER 'username'@'host' [IDENTIFIED BY 'password']; - 重命名用户:
RENAME USER 'old'@'host' TO 'new'@'host'; - 删除用户:
DROP USER 'username'@'host'; - 修改密码:
ALTER USER 'username'@'host' IDENTIFIED BY 'new_pwd';或通过 mysqladmin 工具。 - 忘记密码:通过
--skip-grant-tables启动服务修改,或删除数据目录重置(清空所有数据)。
3.9 权限管理和 DCL 语句
3.9.1 权限类别
- 管理类:CREATE USER、SUPER、SHUTDOWN 等。
- 程序类(针对函数 / 存储过程 / 触发器):CREATE、ALTER、DROP、EXECUTE。
- 库和表级别:ALTER、CREATE、SELECT、INSERT 等,含 WITH GRANT OPTION(权限转赠)。
- 字段级别:SELECT (col1)、UPDATE (col1) 等。
- 所有权限:ALL PRIVILEGES 或 ALL。
3.9.2 授权
- 格式:
GRANT priv_type [(col_list)] ON priv_level TO 'user'@'host' [WITH GRANT OPTION]; - priv_level:.(所有库表)、db_name.*(指定库)、db_name.tbl_name(指定表)等。
3.9.3 取消权限
- 格式:
REVOKE priv_type [(col_list)] ON priv_level FROM 'user'@'host';
3.9.4 查看权限
- 查看指定用户:
SHOW GRANTS FOR 'user'@'host'; - 查看当前用户:
SHOW GRANTS FOR CURRENT_USER;
权限生效
- MariaDB 自动重读授权表,MySQL 可通过
FLUSH PRIVILEGES;手动刷新。
3.10 MySQL 图形化远程管理工具
常见工具:Navicat、SQLyog、DBbear 等,需先创建用户并授权远程访问。
3.11 实现基于 LAMP 架构的开源网站
3.11.1 LAMP 架构说明
- L(Linux)、A(Apache)、M(MySQL)、P(PHP),中小型动态网站常用组合。
3.11.2 PHP 简介
- 服务器端脚本语言,用于动态 WEB 开发,支持嵌入 HTML,可通过命令行使用。
- 版本支持:各版本有明确的活跃支持和安全支持周期。
- 核心配置(php.ini):暴露版本控制、执行时间、内存限制、文件上传限制、时区等。
3.11.3 博客项目实现(WordPress)
- 安装 Apache、PHP 及扩展。
- 配置 MySQL 数据库和用户并授权。
- 下载 WordPress 源码,配置域名和目录权限。
- 浏览器访问完成安装配置。
4 MySQL 5.x 源码安装
环境准备
- 系统:CentOS 7,关闭防火墙,设置主机名。
- 依赖包:ncurses、ncurses-devel、bison、cmake、gcc、gcc-c++。
- 创建用户:
useradd -s /sbin/nologin mysql。
安装步骤
- 解压 MySQL 和 boost 包,配置安装环境(指定安装路径、字符集、存储引擎等)。
- 编译安装:
make && make install。 - 配置权限:
chown -R mysql.mysql /usr/local/mysql/。 - 编辑配置文件 /etc/my.cnf,设置端口、字符集、数据目录等。
- 配置环境变量,初始化数据库,启动服务并设置开机自启。
- 设置 root 密码,授权远程登录。
基础 SQL 操作
- 创建数据库:
create database school; - 创建表:
CREATE TABLE info (id INT NOT NULL PRIMARY KEY AUTO_INCREMENT, ...); - 插入数据:
insert into info (name, score) values ('唐三', 90); - 修改数据:
update info set address='北京' where name='唐三'; - 删除数据:
delete from info where id=1; - Python 导出表数据:通过 pandas、sqlalchemy、pymysql 库连接数据库,导出为 Excel。
5 MySQL 的备份与恢复
数据备份的重要性
- 数据丢失风险:程序错误、人为操作、磁盘故障、灾难等,备份是数据安全的关键。
备份分类
物理备份
- 冷备份(脱机备份):关闭数据库,打包数据文件,速度快、恢复简单。
- 热备份(联机备份):数据库运行中备份,依赖日志文件。
- 温备份:锁定表格(可读不可写)时备份。
逻辑备份
- 备份数据库逻辑组件(表、数据等),常用工具 mysqldump。
常见备份方法
冷备份
- 停止服务:
systemctl stop mysqld。 - 打包数据目录:
tar czf /backup/mysql-$(date +%F).tar.gz /usr/local/mysql/data/*。 - 启动服务:
systemctl start mysqld。 - 恢复:停止服务,解压备份文件到数据目录,恢复权限后启动。
逻辑备份(mysqldump)
- 备份单个数据库:
mysqldump -u root -p db_name > /backup/db.sql。 - 备份多个数据库:
mysqldump -u root -p --databases db1 db2 > /backup/db1db2.sql。 - 备份所有数据库:
mysqldump -u root -p --all-databases > /backup/all.sql。 - 备份单个表:
mysqldump -u root -p db_name tbl_name > /backup/tbl.sql。 - 恢复:
mysql -u root -p db_name < /backup/db.sql或source /backup/db.sql。
增量备份
- 开启二进制日志:在 /etc/my.cnf 中添加
log-bin=mysql-bin,重启服务。 - 完整备份:
mysqldump -u root -p db_name > /backup/full.sql。 - 刷新生成新日志:
mysqladmin -u root -p flush-logs。 - 记录增量操作,通过 mysqlbinlog 恢复:
mysqlbinlog /usr/local/mysql/data/mysql-bin.00000x | mysql -u root -p。
6 主从复制和读写分离
目标
- 数据冗余与灾难恢复,提升并发能力,避免锁冲突。
读写分离原理
- 主服务器:处理写操作(INSERT、UPDATE、DELETE)。
- 从服务器:处理读操作(SELECT)。
- 数据同步:主服务器将变更记录到二进制日志,从服务器通过 I/O 线程复制到中继日志,SQL 线程重放日志同步数据。
方案
- 程序代码内部实现。
- 中间代理层实现(如 MySQL-Proxy、Amoeba)。
实验拓扑
- 主服务器(mysql-master:192.168.108.101)、从服务器(mysql-slave01:192.168.108.102;mysql-slave02:192.168.108.103)、代理(amoeba:192.168.108.110)、客户端(mysql-client:192.168.108.111)。
配置步骤
主服务器配置
- 编辑 /etc/my.cnf:设置 server-id=11、log-bin=master-bin、log-slave-updates=true。
- 重启服务,创建复制用户并授权:
GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.108.%' IDENTIFIED BY '123456';。 - 查看主服务器状态:
show master status;(记录 File 和 Position)。
从服务器配置
- 编辑 /etc/my.cnf:设置 server-id(22/23)、relay-log、relay-log-index。
- 重启服务,执行同步命令:
change master to master_host='192.168.108.101', master_user='myslave', master_password='123456', master_log_file='master-bin.000001', master_log_pos=604;。 - 启动从服务器同步:
start slave;,查看状态:show slave status\G;(确保 Slave_IO_Running 和 Slave_SQL_Running 为 Yes)。
Amoeba 代理配置
- 安装 JDK 和 Amoeba,配置环境变量。
- 授权 Amoeba 访问 MySQL 服务器:
grant all on *.* to test@'192.168.108.%' identified by '123.com';。 - 配置 amoeba.xml(客户端访问账号密码、读写池)和 dbServers.xml(主从服务器地址)。
- 启动 Amoeba,客户端通过 Amoeba 访问数据库(端口 8066)。
验证
- 主服务器创建数据库 / 表 / 插入数据,从服务器同步。
- 客户端写操作仅在主服务器生效,读操作在从服务器轮询,实现读写分离。
7 MHA 高可用
传统主从架构问题
- 单点故障,主库宕机后业务中断。

MHA 概述
- 功能:MySQL 高可用故障切换和主从复制软件,故障切换时间 0-30 秒。
- 组成:MHA Manager(管理节点)、MHA Node(数据节点)。
- 特点:支持一主多从,自动保存主库二进制日志,降低数据丢失风险,支持半同步复制。
实验拓扑
- 主服务器(mysql-master:192.168.108.131)、
- 从服务器(mysql-slave01:192.168.108.132;
mysql-slave02:192.168.108.133)、 - 管理节点(mha:192.168.108.130)。

配置步骤
环境准备
- 所有节点关闭防火墙,时间同步。
- 配置 MySQL 一主两从(参考主从复制配置),授权 MHA 管理用户和复制用户。
- 安装 MHA 依赖包(epel 源、perl 相关模块)。
安装 MHA 软件
- 所有数据节点安装 mha4mysql-node 组件。
- 管理节点先安装 node 组件,再安装 mha4mysql-manager 组件。
配置无密码认证
- 管理节点免密登录所有数据节点,数据节点间互免密登录。
配置 MHA
- 复制故障切换脚本(master_ip_failover),配置 VIP(虚拟 IP:192.168.108.200)。
- 创建 MHA 配置文件 /etc/masterha/app1.cnf,设置管理日志、工作目录、主库 binlog 目录、复制用户密码等。
验证配置
- 检查 SSH 无密码认证:
masterha_check_ssh -conf=/etc/masterha/app1.cnf。 - 检查主从复制:
masterha_check_repl -conf=/etc/masterha/app1.cnf。
启动 MHA
- 手动在主库配置 VIP,启动 MHA Manager:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &。 - 查看 MHA 状态:
masterha_check_status --conf=/etc/masterha/app1.cnf。
故障模拟与修复
故障模拟
- 主库宕机:
pkill -9 mysql,MHA 自动将候选从库(mysql-slave01)提升为主库,转移 VIP。
故障修复
- 重启原主库,重新配置主从关系(原主库作为新主库的从库)。
- 调整 MHA 配置文件,重新启动 MHA Manager。
备选主库选择算法
- 优先选择数据最接近主库的从库。
- 数据一致时按配置文件顺序选择。
terha/app1.cnf`。
- 检查主从复制:
masterha_check_repl -conf=/etc/masterha/app1.cnf。
启动 MHA
- 手动在主库配置 VIP,启动 MHA Manager:
nohup masterha_manager --conf=/etc/masterha/app1.cnf --remove_dead_master_conf --ignore_last_failover < /dev/null > /var/log/masterha/app1/manager.log 2>&1 &。 - 查看 MHA 状态:
masterha_check_status --conf=/etc/masterha/app1.cnf。
故障模拟与修复
故障模拟
- 主库宕机:
pkill -9 mysql,MHA 自动将候选从库(mysql-slave01)提升为主库,转移 VIP。
故障修复
- 重启原主库,重新配置主从关系(原主库作为新主库的从库)。
- 调整 MHA 配置文件,重新启动 MHA Manager。
备选主库选择算法
- 优先选择数据最接近主库的从库。
- 数据一致时按配置文件顺序选择。
- 配置 candidate_master=1 可强制指定备选主库,check_repl_delay=0 忽略复制延时。