个人用云计算学习笔记 --36 MySQL

文章目录

  • 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 数据库管理系统基本功能
  1. 数据定义:通过 DDL 定义数据库三级模式、两级映像及约束,信息存于数据字典。
  2. 数据操作:通过 DML 实现数据增删改查。
  3. 数据组织、存储与管理:分类管理数据字典、用户数据等,优化存储利用率和存取效率。
  4. 数据库运行管理:含并发控制、安全性检查、完整性执行、事务管理等,保障系统正常运行。
  5. 数据库维护:包括数据载入、转换、转储、重组、重构及性能监控。
  6. 数据库保护:通过恢复、并发控制、完整性控制、安全性控制实现,含缓冲区管理等自适应机制。
  7. 通信:支持与操作系统、网络中其他软件的通信及数据库互操作。
1.3.4 数据库管理系统的发展历史
  • 层次数据库:最早的数据库系统,数据组织为树状模型,仅支持一对多关系(代表:IBM 的 IMS)。
  • 网状数据库:以网状数据模型为基础,结点可多上 / 下级,支持多对多联系。
  • 关系型数据库管理系统(RDBMS):采用二维表格模型组织数据,表由行和列组成,常见有 Oracle、MySQL、DB2、SQLServer 等。
1.3.5 关系型数据库相关概念
  • 数据库:关联表的集合。
  • 数据表:数据的矩阵,类似电子表格。
  • 列(column):相同类型数据的集合。
  • 行(Row):一组相关数据(元组 / 记录)。
  • 冗余:存储两倍数据,降低性能但提高安全性。
  • 主键(Primary key):唯一标识,一个表仅一个。
  • 外键:用于关联两个表。
  • 复合键:多个列组成的索引键。
  • 索引:排序的列 / 多列值结构,加速查询(类似书籍目录)。
  • 参照完整性:不允许引用不存在的实体,保证数据一致性。
1.3.6 数据库软件排名(2025 年 9 月)
  1. Oracle(关系型、多模型):1170.62 分

  2. MySQL(关系型、多模型):891.77 分

  3. Microsoft SQL Server(关系型、多模型):717.32 分

  4. PostgreSQL(关系型、多模型):657.17 分

  5. 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_nameSHOW 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)
  1. 安装 Apache、PHP 及扩展。
  2. 配置 MySQL 数据库和用户并授权。
  3. 下载 WordPress 源码,配置域名和目录权限。
  4. 浏览器访问完成安装配置。

4 MySQL 5.x 源码安装

环境准备

  • 系统:CentOS 7,关闭防火墙,设置主机名。
  • 依赖包:ncurses、ncurses-devel、bison、cmake、gcc、gcc-c++。
  • 创建用户:useradd -s /sbin/nologin mysql

安装步骤

  1. 解压 MySQL 和 boost 包,配置安装环境(指定安装路径、字符集、存储引擎等)。
  2. 编译安装:make && make install
  3. 配置权限:chown -R mysql.mysql /usr/local/mysql/
  4. 编辑配置文件 /etc/my.cnf,设置端口、字符集、数据目录等。
  5. 配置环境变量,初始化数据库,启动服务并设置开机自启。
  6. 设置 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。

常见备份方法

冷备份
  1. 停止服务:systemctl stop mysqld
  2. 打包数据目录:tar czf /backup/mysql-$(date +%F).tar.gz /usr/local/mysql/data/*
  3. 启动服务:systemctl start mysqld
  4. 恢复:停止服务,解压备份文件到数据目录,恢复权限后启动。
逻辑备份(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.sqlsource /backup/db.sql
增量备份
  1. 开启二进制日志:在 /etc/my.cnf 中添加 log-bin=mysql-bin,重启服务。
  2. 完整备份:mysqldump -u root -p db_name > /backup/full.sql
  3. 刷新生成新日志:mysqladmin -u root -p flush-logs
  4. 记录增量操作,通过 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)。

配置步骤

主服务器配置
  1. 编辑 /etc/my.cnf:设置 server-id=11、log-bin=master-bin、log-slave-updates=true。
  2. 重启服务,创建复制用户并授权:GRANT REPLICATION SLAVE ON *.* TO 'myslave'@'192.168.108.%' IDENTIFIED BY '123456';
  3. 查看主服务器状态:show master status;(记录 File 和 Position)。
从服务器配置
  1. 编辑 /etc/my.cnf:设置 server-id(22/23)、relay-log、relay-log-index。
  2. 重启服务,执行同步命令: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;
  3. 启动从服务器同步:start slave;,查看状态:show slave status\G;(确保 Slave_IO_Running 和 Slave_SQL_Running 为 Yes)。
Amoeba 代理配置
  1. 安装 JDK 和 Amoeba,配置环境变量。
  2. 授权 Amoeba 访问 MySQL 服务器:grant all on *.* to test@'192.168.108.%' identified by '123.com';
  3. 配置 amoeba.xml(客户端访问账号密码、读写池)和 dbServers.xml(主从服务器地址)。
  4. 启动 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)。

配置步骤

环境准备
  1. 所有节点关闭防火墙,时间同步。
  2. 配置 MySQL 一主两从(参考主从复制配置),授权 MHA 管理用户和复制用户。
  3. 安装 MHA 依赖包(epel 源、perl 相关模块)。
安装 MHA 软件
  • 所有数据节点安装 mha4mysql-node 组件。
  • 管理节点先安装 node 组件,再安装 mha4mysql-manager 组件。
配置无密码认证
  • 管理节点免密登录所有数据节点,数据节点间互免密登录。
配置 MHA
  1. 复制故障切换脚本(master_ip_failover),配置 VIP(虚拟 IP:192.168.108.200)。
  2. 创建 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。
故障修复
  1. 重启原主库,重新配置主从关系(原主库作为新主库的从库)。
  2. 调整 MHA 配置文件,重新启动 MHA Manager。

备选主库选择算法

  1. 优先选择数据最接近主库的从库。
  2. 数据一致时按配置文件顺序选择。
    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。
故障修复
  1. 重启原主库,重新配置主从关系(原主库作为新主库的从库)。
  2. 调整 MHA 配置文件,重新启动 MHA Manager。

备选主库选择算法

  1. 优先选择数据最接近主库的从库。
  2. 数据一致时按配置文件顺序选择。
  3. 配置 candidate_master=1 可强制指定备选主库,check_repl_delay=0 忽略复制延时。
相关推荐
❀͜͡傀儡师2 小时前
Docker 部署 OpenVidu
运维·docker·容器·openvidu
SadSunset2 小时前
Spring框架全面学习总结
java·学习·spring
日更嵌入式的打工仔2 小时前
linux内核查看网口负荷的指令
linux·服务器·笔记
gsls2008082 小时前
服务器状态监控Uptime Kuma
运维·服务器·git
Blossom.1182 小时前
边缘智能新篇章:YOLOv8在树莓派5上的INT8量化部署全攻略
人工智能·python·深度学习·学习·yolo·react.js·transformer
摇滚侠2 小时前
RocketMQ 教程丨深度掌握 MQ 消息中间件,RocketMQ 集群,笔记 28-38
数据库·笔记·rocketmq
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]locks
linux·笔记·学习
大猫会长2 小时前
新手的postgreSQL笔记
数据库·笔记·postgresql
HIT_Weston2 小时前
78、【Ubuntu】【Hugo】搭建私人博客:文章分类
linux·运维·ubuntu