文章目录
- [MySQL 入门](#MySQL 入门)
-
- 引言
- 一、数据库基础核心(必懂概念)
-
- [1. 数据分类与数据库发展](#1. 数据分类与数据库发展)
- [2. 关系型数据库基础](#2. 关系型数据库基础)
-
- (1)核心概念
- [(2)ER 模型与范式](#(2)ER 模型与范式)
- [二、MySQL 安装与基础配置](#二、MySQL 安装与基础配置)
-
- [1. 安装方式(推荐 CentOS 环境)](#1. 安装方式(推荐 CentOS 环境))
-
- [(1)YUM 安装(简单高效)](#(1)YUM 安装(简单高效))
- (2)源码安装(自定义需求)
- [2. 基础配置](#2. 基础配置)
-
- (1)配置文件路径
- [(2)多实例配置(一台服务器运行多个 MySQL)](#(2)多实例配置(一台服务器运行多个 MySQL))
- [三、核心 SQL 语句(高频实操)](#三、核心 SQL 语句(高频实操))
-
- [1. DDL:数据定义语言(建库、建表)](#1. DDL:数据定义语言(建库、建表))
- [2. DML:数据操作语言(增删改)](#2. DML:数据操作语言(增删改))
- [3. DQL:数据查询语言(核心高频)](#3. DQL:数据查询语言(核心高频))
- [4. DCL:数据控制语言(权限)](#4. DCL:数据控制语言(权限))
- 四、用户与权限管理(实用技巧)
-
- [1. 密码管理](#1. 密码管理)
- [2. 安全设置](#2. 安全设置)
- 五、数据备份与恢复(避免删库跑路)
-
- [1. 冷备份(停止服务,适合小库)](#1. 冷备份(停止服务,适合小库))
- [2. 逻辑备份(mysqldump,常用)](#2. 逻辑备份(mysqldump,常用))
- [3. 增量备份(基于二进制日志)](#3. 增量备份(基于二进制日志))
- 六、主从复制与读写分离(高可用基础)
- [七、MHA 高可用(应对主库故障)](#七、MHA 高可用(应对主库故障))
-
- [1. 核心架构](#1. 核心架构)
- [2. 核心功能](#2. 核心功能)
- [3. 简化流程](#3. 简化流程)
- 八、总结
MySQL 入门
引言
MySQL 作为全球最流行的开源关系型数据库,凭借轻量、高效、兼容强的特性,占据了 Web 开发、云原生等场景的半壁江山。无论是个人项目、中小型企业系统,还是 Facebook、淘宝等大型平台,都能看到它的身影。
一、数据库基础核心(必懂概念)
1. 数据分类与数据库发展
(1)数据分类
- 结构化数据:二维表形式(如用户信息、订单数据),适合关系型数据库存储。
- 半结构化数据:无固定表结构,含标记分隔(如 JSON、XML),常见于 NoSQL 数据库。
- 非结构化数据:无固定格式(如音视频、图片),需文件系统或对象存储。
(2)数据库发展三阶段
- 人工管理阶段:无专用软件,数据手动维护,批处理为主。
- 文件系统阶段:磁盘存储,数据长期保存,但冗余高、无统一接口。
- 数据库系统阶段:由 DBMS 统一管理,支持共享、低冗余、高独立(物理 / 逻辑独立)。
2. 关系型数据库基础
(1)核心概念
- 数据库(Database):表的集合,逻辑存储单元。
- 表(Table):二维结构,行(记录)+ 列(字段)。
- 主键(Primary Key):唯一标识记录,非空且唯一。
- 外键(Foreign Key):关联两个表,保证数据一致性。
- 索引(Index):加速查询,类似书籍目录。
(2)ER 模型与范式
- ER 模型:实体(矩形)、属性(椭圆形)、关系(菱形),描述数据关联(1:1、1:n、m:n)。
- 三大范式(核心)
- 1NF:字段原子性,不可拆分(如 "姓名 + 电话" 拆分为两字段)。
- 2NF:满足 1NF,非主键字段完全依赖主键(避免部分依赖)。
- 3NF:满足 2NF,非主键字段不传递依赖主键(避免间接依赖)。
二、MySQL 安装与基础配置
1. 安装方式(推荐 CentOS 环境)
(1)YUM 安装(简单高效)
bash
# 1. 配置阿里云 YUM 源
cat > /etc/yum.repos.d/mysql.repo << EOF
[mysql80-community]
name=MySQL 8.0 Community Server
baseurl=https://mirrors.aliyun.com/mysql/MySQL-8.0/yum/mysql-8.0-community-el8-x86_64/
enabled=1
gpgcheck=0
EOF
# 2. 安装 MySQL
dnf install -y mysql-community-server
# 3. 启动并设置开机自启
systemctl enable mysqld --now
# 4. 查看初始密码(用于首次登录)
grep 'temporary password' /var/log/mysqld.log
# 5. 首次登录并修改密码
mysql -uroot -p
ALTER USER 'root'@'localhost' IDENTIFIED BY 'MySQL@123'; # 密码需含大小写+数字+符号
(2)源码安装(自定义需求)
核心步骤(以 MySQL 5.7 为例):
bash
# 1. 安装依赖
dnf install -y ncurses-devel bison cmake gcc gcc-c++
# 2. 解压源码包并编译
tar -zxvf mysql-5.7.44.tar.gz -C /opt
cd /opt/mysql-5.7.44
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DWITH_BOOST=/usr/local/boost
make && make install
# 3. 初始化并启动
useradd -s /sbin/nologin mysql
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/bin/mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
systemctl start mysqld
2. 基础配置
(1)配置文件路径
-
主配置文件:
/etc/my.cnf(或/etc/my.cnf.d/mysql-server.cnf) -
核心配置项:
ini[mysqld] datadir=/var/lib/mysql # 数据目录 socket=/var/lib/mysql/mysql.sock # 通信套接字 port=3306 # 端口 character-set-server=utf8mb4 # 字符集(支持 emoji) max_connections=1000 # 最大连接数
(2)多实例配置(一台服务器运行多个 MySQL)
- 核心思路:不同端口(3306、3307)、不同数据目录、不同配置文件,通过
mysqld_multi管理。
三、核心 SQL 语句(高频实操)
SQL 分为 DDL(定义)、DML(操作)、DQL(查询)、DCL(控制),以下是最常用命令:
1. DDL:数据定义语言(建库、建表)
sql
# 1. 建库(指定字符集)
CREATE DATABASE IF NOT EXISTS school DEFAULT CHARACTER SET utf8mb4;
# 2. 切换数据库
USE school;
# 3. 建表(含主键、自增、默认值)
CREATE TABLE IF NOT EXISTS student (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, # 自增主键
name VARCHAR(20) NOT NULL, # 非空
age TINYINT UNSIGNED, # 无符号 tinyint(0-255)
gender ENUM('M','F') DEFAULT 'M', # 枚举类型,默认 M
create_time DATETIME DEFAULT CURRENT_TIMESTAMP # 默认当前时间
) ENGINE=InnoDB; # 存储引擎(默认 InnoDB)
# 4. 修改表(添加字段、修改类型)
ALTER TABLE student ADD COLUMN phone CHAR(11) AFTER name; # 在 name 后加手机号字段
ALTER TABLE student MODIFY phone VARCHAR(11); # 修改字段类型
# 5. 删除表/库
DROP TABLE IF EXISTS student;
DROP DATABASE IF EXISTS school;
2. DML:数据操作语言(增删改)
sql
# 1. 插入数据(单条/多条)
INSERT INTO student (name, age, gender) VALUES ('唐三', 20, 'M');
INSERT INTO student (name, age, gender) VALUES ('叶凡', 18, 'F'), ('萧炎', 22, 'M');
# 2. 更新数据(必加 WHERE,避免全表更新)
UPDATE student SET age=21 WHERE id=1; # 按主键更新(安全)
UPDATE student SET age=23, gender='M' WHERE name='叶凡';
# 3. 删除数据(逻辑删除优先)
DELETE FROM student WHERE id=3; # 物理删除(谨慎)
# 推荐逻辑删除:添加 is_del 字段,标记删除
ALTER TABLE student ADD COLUMN is_del TINYINT DEFAULT 0;
UPDATE student SET is_del=1 WHERE id=3; # 标记为删除
3. DQL:数据查询语言(核心高频)
sql
# 1. 基础查询(全表/指定字段)
SELECT * FROM student; # 全表查询(生产环境慎用)
SELECT id, name, age FROM student WHERE is_del=0; # 查询未删除的记录
# 2. 条件过滤(WHERE)
SELECT * FROM student WHERE age > 18 AND gender='M'; # 且条件
SELECT * FROM student WHERE age BETWEEN 18 AND 22; # 范围
SELECT * FROM student WHERE name LIKE '唐%'; # 模糊查询(%任意字符)
SELECT * FROM student WHERE name IS NOT NULL; # 非空
# 3. 分组与聚合(GROUP BY + 聚合函数)
SELECT gender, COUNT(*) AS total FROM student GROUP BY gender; # 按性别统计人数
SELECT gender, AVG(age) AS avg_age FROM student GROUP BY gender HAVING avg_age > 20; # 分组后过滤
# 4. 排序与分页(ORDER BY + LIMIT)
SELECT * FROM student ORDER BY age DESC; # 按年龄降序
SELECT * FROM student LIMIT 0, 10; # 分页(第1页,10条/页)
SELECT * FROM student LIMIT 10 OFFSET 10; # 第2页(跳过前10条)
4. DCL:数据控制语言(权限)
sql
# 1. 创建用户(指定登录主机)
CREATE USER IF NOT EXISTS 'app_user'@'192.168.108.%' IDENTIFIED BY 'App@123'; # 仅内网网段登录
# 2. 授权(库级/表级权限)
GRANT SELECT, INSERT, UPDATE ON school.student TO 'app_user'@'192.168.108.%'; # 仅学生表的增查改
GRANT ALL PRIVILEGES ON school.* TO 'app_user'@'192.168.108.%'; # 整个school库的所有权限
FLUSH PRIVILEGES; # 刷新权限
# 3. 查看权限
SHOW GRANTS FOR 'app_user'@'192.168.108.%';
# 4. 回收权限
REVOKE DELETE ON school.student FROM 'app_user'@'192.168.108.%';
四、用户与权限管理(实用技巧)
1. 密码管理
bash
# 1. 修改密码(登录后)
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123';
# 2. 命令行修改(未登录)
mysqladmin -uroot -p'OldPass@123' password 'NewPass@123';
# 3. 忘记 root 密码(紧急处理)
# 步骤1:修改配置文件,跳过授权表
vim /etc/my.cnf
[mysqld]
skip-grant-tables # 添加该行
systemctl restart mysqld
# 步骤2:免密登录并重置密码
mysql -uroot
UPDATE mysql.user SET authentication_string='' WHERE user='root' AND host='localhost';
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@123';
# 步骤3:删除 skip-grant-tables,重启 MySQL
2. 安全设置
- 禁止 root 远程登录:
RENAME USER 'root'@'%' TO 'root'@'localhost'; - 限制登录主机:创建用户时指定
@'192.168.108.%'(仅内网),避免@'%'(任意主机)。 - 启用
safe-updates:避免无 WHERE 条件的 UPDATE/DELETE,配置文件添加[mysqld] safe-updates。
五、数据备份与恢复(避免删库跑路)
1. 冷备份(停止服务,适合小库)
bash
# 备份
systemctl stop mysqld
tar czf /backup/mysql-$(date +%F).tar.gz /var/lib/mysql
systemctl start mysqld
# 恢复
systemctl stop mysqld
rm -rf /var/lib/mysql/*
tar xzf /backup/mysql-2025-10-01.tar.gz -C /var/lib/mysql
chown -R mysql:mysql /var/lib/mysql
systemctl start mysqld
2. 逻辑备份(mysqldump,常用)
bash
# 备份单个库
mysqldump -uroot -p'Pass@123' school > /backup/school-$(date +%F).sql
# 备份多个库
mysqldump -uroot -p'Pass@123' --databases school test > /backup/multi-db.sql
# 备份所有库
mysqldump -uroot -p'Pass@123' --all-databases > /backup/all-db.sql
# 恢复
mysql -uroot -p'Pass@123' school < /backup/school-2025-10-01.sql
3. 增量备份(基于二进制日志)
bash
# 1. 开启二进制日志(配置文件)
vim /etc/my.cnf
[mysqld]
log-bin=mysql-bin # 启用二进制日志
server-id=1 # 唯一ID(主从复制必需)
systemctl restart mysqld
# 2. 全量备份后刷新生效
mysqldump -uroot -p'Pass@123' --all-databases > /backup/full-$(date +%F).sql
mysqladmin -uroot -p'Pass@123' flush-logs # 生成新的二进制日志文件
# 3. 增量恢复(基于日志文件)
mysqlbinlog --no-defaults /var/lib/mysql/mysql-bin.000002 | mysql -uroot -p'Pass@123'
六、主从复制与读写分离(高可用基础)
1. 主从复制原理
- 主库(Master):记录数据变更到二进制日志(binlog)。
- 从库(Slave):通过 IO 线程读取主库 binlog,写入中继日志(relay log),SQL 线程重放中继日志,同步数据。
2. 核心配置步骤
(1)主库配置
sql
# 1. 授权复制用户
CREATE USER 'repl'@'192.168.108.%' IDENTIFIED BY 'Repl@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.108.%';
FLUSH PRIVILEGES;
# 2. 查看主库状态(记录 File 和 Position)
SHOW MASTER STATUS;
# 输出示例:File=mysql-bin.000003,Position=156
(2)从库配置
sql
# 1. 配置从库连接主库
CHANGE MASTER TO
MASTER_HOST='192.168.108.101', # 主库IP
MASTER_USER='repl',
MASTER_PASSWORD='Repl@123',
MASTER_LOG_FILE='mysql-bin.000003', # 主库的 File
MASTER_LOG_POS=156; # 主库的 Position
# 2. 启动从库复制
START SLAVE;
# 3. 验证复制状态(IO和SQL线程均为 Yes 则成功)
SHOW SLAVE STATUS\G;
# 关键字段:Slave_IO_Running=Yes,Slave_SQL_Running=Yes
3. 读写分离(Amoeba 中间件)
- 核心思路:主库写,从库读,中间件分发请求。
- 简化配置:Amoeba 配置主库(写池)和从库(读池),应用连接 Amoeba 地址即可。
七、MHA 高可用(应对主库故障)
1. 核心架构
- Manager 节点:监控主从集群,触发故障切换。
- Node 节点:部署在所有 MySQL 节点,执行故障切换脚本(如保存 binlog、提升从库为主库)。
2. 核心功能
- 主库故障时,30 秒内自动切换到备选从库。
- 自动保存主库未同步的 binlog,最小化数据丢失。
- 支持一主多从架构,确保高可用。
3. 简化流程
- 部署主从复制(一主两从)。
- 所有节点安装 MHA Node 组件,Manager 节点安装 Manager 组件。
- 配置无密码 SSH 认证(Manager 免密登录所有 Node)。
- 配置 MHA 配置文件(指定主从节点、监控用户、故障切换脚本)。
- 启动 MHA Manager,故障时自动切换。
八、总结
MySQL 核心优势在于 "轻量高效、生态完善、易扩展",从单机部署到主从复制、高可用架构,能满足不同场景需求。
- 基础 SQL 是核心,重点掌握查询、增删改、授权。
- 备份恢复是底线,定期全量 + 增量备份,避免数据丢失。
- 主从复制 + 读写分离提升并发,MHA 保障高可用。