MySQL 入门

文章目录

  • [MySQL 入门](#MySQL 入门)
    • 引言
    • 一、数据库基础核心(必懂概念)
    • [二、MySQL 安装与基础配置](#二、MySQL 安装与基础配置)
      • [1. 安装方式(推荐 CentOS 环境)](#1. 安装方式(推荐 CentOS 环境))
      • [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. 增量备份(基于二进制日志))
    • 六、主从复制与读写分离(高可用基础)
      • [1. 主从复制原理](#1. 主从复制原理)
      • [2. 核心配置步骤](#2. 核心配置步骤)
      • [3. 读写分离(Amoeba 中间件)](#3. 读写分离(Amoeba 中间件))
    • [七、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)。
  • 三大范式(核心)
    1. 1NF:字段原子性,不可拆分(如 "姓名 + 电话" 拆分为两字段)。
    2. 2NF:满足 1NF,非主键字段完全依赖主键(避免部分依赖)。
    3. 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. 简化流程

  1. 部署主从复制(一主两从)。
  2. 所有节点安装 MHA Node 组件,Manager 节点安装 Manager 组件。
  3. 配置无密码 SSH 认证(Manager 免密登录所有 Node)。
  4. 配置 MHA 配置文件(指定主从节点、监控用户、故障切换脚本)。
  5. 启动 MHA Manager,故障时自动切换。

八、总结

MySQL 核心优势在于 "轻量高效、生态完善、易扩展",从单机部署到主从复制、高可用架构,能满足不同场景需求。

  1. 基础 SQL 是核心,重点掌握查询、增删改、授权。
  2. 备份恢复是底线,定期全量 + 增量备份,避免数据丢失。
  3. 主从复制 + 读写分离提升并发,MHA 保障高可用。
相关推荐
7ioik2 小时前
说一说MySQL数据库基本架构?
数据库·mysql·架构
@淡 定2 小时前
Redis持久化机制
数据库·redis·缓存
云老大TG:@yunlaoda3603 小时前
华为云国际站代理商DAS的跨境合规适配是如何保障数据合规的?
网络·数据库·华为云
TG:@yunlaoda360 云老大3 小时前
华为云国际站代理商HiLens的技术优势对跨境客户有哪些具体帮助?
服务器·数据库·华为云
+VX:Fegn08953 小时前
计算机毕业设计|基于springboot + vue健身房管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
东东的脑洞3 小时前
【面试突击】MySQL 查询优化核心面试知识点
mysql·面试·职场和发展
Leon-Ning Liu3 小时前
当SGA大于hugepage的时候,Oracle数据库是怎么使用hugepage的
数据库·oracle
马克学长3 小时前
SSM校园二手交易系统aqj3i(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架·javaweb 开发
利剑 -~3 小时前
letcode数据库题联系
数据库