Skip to content

05.项目五 MySQL数据库安全基础

🎯本项目学习目标

  • 能够在 Ubuntu 24.04 LTS 环境下完成 MySQL 的安装与验证(以 MySQL 8.0 为主)
  • 掌握 MySQL 服务的启动/停止,并完成初始密码修改 / 认证方式理解
  • 能够创建受限账户并配置内网远程访问权限(两台 VM 互连)
  • 了解 MySQL 四种主要日志的用途及基本操作,重点掌握 binlog 的开启与基础恢复思路(PITR)

第 1 课 安装与验证:让 MySQL “能跑起来”

Section titled “第 1 课 安装与验证:让 MySQL “能跑起来””

把 MySQL 在 Ubuntu 24.04 上装起来,并能验证:服务在跑、能登录、能看到版本与数据库列表

  • mysql --version 输出
  • sudo systemctl status mysql --no-pager 显示 active(running)
  • MySQL 内执行成功:
    • SELECT VERSION();
    • SHOW DATABASES;

MySQL 是世界上最流行的开源关系型数据库管理系统(RDBMS),大量 Web 系统使用它作为核心数据存储。安全运维从安装开始:安装 ≠ 安全,安装只是第一步

1.4 安装前准备:拍快照 + 换源(Ubuntu 24.04)

Section titled “1.4 安装前准备:拍快照 + 换源(Ubuntu 24.04)”

第 1 步:拍摄 VMware 快照(安全网)

Section titled “第 1 步:拍摄 VMware 快照(安全网)”
  • Ubuntu 24.04 LTS 换源(DEB822 格式)

    Ubuntu 24.04 使用 /etc/apt/sources.list.d/ubuntu.sources(DEB822 格式)。

    Terminal window
    # 1) 备份原文件
    sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
    # 2) 编辑配置文件
    sudo nano /etc/apt/sources.list.d/ubuntu.sources

    将文件内容全部替换为以下内容(阿里云镜像示例):

    Types: deb
    URIs: https://mirrors.aliyun.com/ubuntu
    Suites: noble noble-updates noble-backports
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
    Types: deb
    URIs: https://mirrors.aliyun.com/ubuntu
    Suites: noble-security
    Components: main restricted universe multiverse
    Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg

    保存退出后更新索引:

    Terminal window
    sudo apt update
  • Ubuntu 22.04 LTS 换源(传统 sources.list 格式)

    Ubuntu 22.04 使用传统的 /etc/apt/sources.list 文件。

    Terminal window
    # 1) 备份原文件
    sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak
    # 2) 编辑配置文件
    sudo nano /etc/apt/sources.list

    将文件内容全部替换为以下内容(阿里云镜像示例):

    deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu/ jammy-updates main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu/ jammy-backports main restricted universe multiverse
    deb https://mirrors.aliyun.com/ubuntu/ jammy-security main restricted universe multiverse

    保存退出后更新索引:

    Terminal window
    sudo apt update
Terminal window
# 0) 更新索引
sudo apt update
# 1) 安装 MySQL Server
sudo apt install -y mysql-server
# 2) 启动并设置开机自启
sudo systemctl enable --now mysql
# 3) 验证版本与服务状态
mysql --version
sudo systemctl status mysql --no-pager
Terminal window
sudo mysql_secure_installation
Terminal window
# Ubuntu apt 安装后 root 常见为 auth_socket:sudo 即可进入
sudo mysql
SELECT VERSION();
SHOW DATABASES;
exit;

第 2 课 配置文件与安全基线:把“边界”和“默认坑”补齐

Section titled “第 2 课 配置文件与安全基线:把“边界”和“默认坑”补齐”

我们已经让 MySQL 能跑起来。下一步要让它在正确的边界内运行:远程访问是否允许、字符集是否正确、时间是否一致。否则会出现:远程连不上、乱码、时间错位等常见问题。

  • 找到 Ubuntu 24.04 的主配置文件位置
  • 完成三件“必改且可验证”的基线配置:bind-address / utf8mb4 / time_zone
  • 修改后能重启并验证变量生效

MySQL 配置文件采用 INI 格式,Ubuntu 24.04 主要编辑:

配置段示例:

[mysqld]
port = 3306
bind-address = 127.0.0.1
[client]
port = 3306
  • 127.0.0.1:只允许本机连接(安全但 VM-B 连不上)
  • 内网互连实验建议:改为 0.0.0.0,但必须配合:内网网段账号 + 防火墙限制
[mysqld]
bind-address = 0.0.0.0
port = 3306

B. 字符集:utf8mb4(避免乱码/Emoji问题)

Section titled “B. 字符集:utf8mb4(避免乱码/Emoji问题)”
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4

C. 时区:+08:00(避免时间错 8 小时)

Section titled “C. 时区:+08:00(避免时间错 8 小时)”
[mysqld]
default-time-zone = '+08:00'
Terminal window
sudo systemctl restart mysql
sudo systemctl status mysql --no-pager
SHOW VARIABLES LIKE 'bind_address';
SHOW VARIABLES LIKE 'character_set_server';
SHOW VARIABLES LIKE 'time_zone';
SELECT NOW();

第 3 课 账号与权限:远程能连,但不用 root(最小权限)

Section titled “第 3 课 账号与权限:远程能连,但不用 root(最小权限)”

我们已经允许 MySQL 监听内网(bind-address),接下来要让 VM-B 能连接,同时遵循数据库安全核心:不用 root,按最小权限创建业务账号

  • 理解 MySQL 账户识别方式:'用户名'@'主机'
  • 创建一个只允许内网网段连接的用户
  • 给用户授予某个数据库范围内的最小权限
  • 从 VM-B 远程登录验证

3.3 远程连接三要素(排错顺序)

Section titled “3.3 远程连接三要素(排错顺序)”

下面以数据库 stusta 为例,账号只允许 192.168.100.% 网段连接。

在 VM-A(服务器)登录 MySQL:

Terminal window
sudo mysql
-- 1) 准备示例库
CREATE DATABASE stusta;
-- 2) 创建远程账号(网段限制)
CREATE USER 'app'@'192.168.100.%' IDENTIFIED BY 'App@Pass123!';
-- 3) 最小权限授权(只对 stusta.*)
GRANT SELECT, INSERT, UPDATE, DELETE ON stusta.* TO 'app'@'192.168.100.%';
-- 4) 验证权限
SHOW GRANTS FOR 'app'@'192.168.100.%';

3.5 防火墙(内网实验环境建议)

Section titled “3.5 防火墙(内网实验环境建议)”

若启用了 ufw,可在 VM-A 放通 3306(仅内网):

Terminal window
sudo ufw allow 3306/tcp
sudo ufw status

在 VM-B:

Terminal window
mysql -h 192.168.100.20 -u app -p

登录后验证:

SELECT USER(), CURRENT_USER();
SHOW DATABASES;
USE stusta;
SHOW TABLES;
exit;

第 4 课 日志:会排错、会定位慢、会恢复(重点:binlog)

Section titled “第 4 课 日志:会排错、会定位慢、会恢复(重点:binlog)”

我们已经实现“远程可用 + 最小权限”。最后要补上安全运维闭环:出了问题能查、误操作能追溯、必要时能恢复——这就靠日志。

  • 知道四类日志分别在什么场景用
  • 能查看错误日志、能开启/查看慢查询日志
  • 能开启 binlog,并理解“全量备份 + binlog 回放”的时间点恢复(PITR)思路

4.3 四种主要日志(先会选,再会做)

Section titled “4.3 四种主要日志(先会选,再会做)”
日志类型记录内容主要用途建议
错误日志(Error Log)启动/关闭/运行错误故障排查第一入口默认开启,必须会看
查询日志(General Log)所有 SQL审计/调试仅排错时临时开
二进制日志(binlog)所有写操作事件复制 + PITR 恢复建议开启(重点)
慢查询日志(Slow Log)超过阈值的 SQL性能定位建议开启(会用即可)

4.4 错误日志:服务异常先看这里

Section titled “4.4 错误日志:服务异常先看这里”
Terminal window
tail -100 /var/log/mysql/error.log

4.5 慢查询日志:系统慢了怎么找 SQL

Section titled “4.5 慢查询日志:系统慢了怎么找 SQL”
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
SET GLOBAL slow_query_log = 1;
SET GLOBAL long_query_time = 1;
SHOW GLOBAL STATUS LIKE 'Slow_queries';
Terminal window
tail -50 /var/log/mysql/slow.log

4.6 Binlog(重点):开启 + 验证 + PITR 思路

Section titled “4.6 Binlog(重点):开启 + 验证 + PITR 思路”

4.6.1 开启 binlog(VM-A 修改配置文件)

Section titled “4.6.1 开启 binlog(VM-A 修改配置文件)”

编辑:

Terminal window
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

[mysqld] 段添加(或确认存在):

[mysqld]
log_bin = /var/lib/mysql/mysql-bin
binlog_format = ROW
server_id = 1

重启并验证:

Terminal window
sudo systemctl restart mysql
SHOW VARIABLES LIKE 'log_bin';
SHOW VARIABLES LIKE 'binlog_format';
SHOW BINARY LOGS;
SHOW MASTER STATUS;

4.6.2 解析与按时间筛选(了解 + 会用命令)

Section titled “4.6.2 解析与按时间筛选(了解 + 会用命令)”
Terminal window
sudo mysqlbinlog --base64-output=DECODE-ROWS -v /var/lib/mysql/mysql-bin.000001 | less

按时间范围:

Terminal window
sudo mysqlbinlog \
--start-datetime="2026-04-21 08:00:00" \
--stop-datetime="2026-04-21 10:00:00" \
/var/lib/mysql/mysql-bin.000001 | less

示例(思路演示):

Terminal window
# 1) 恢复全量备份
mysql -u root -p < full_backup.sql
# 2) 回放 binlog 到误操作前
sudo mysqlbinlog \
--stop-datetime="2026-04-21 09:59:59" \
/var/lib/mysql/mysql-bin.000001 \
/var/lib/mysql/mysql-bin.000002 | mysql -u root -p

课时核心能力验收点(可检查)
第 1 课:安装验证装得起来服务 active + SELECT VERSION()
第 2 课:配置基线配得安全bind-address/utf8mb4/time_zone 生效
第 3 课:账号权限管得住人VM-B 能用最小权限账号远程登录
第 4 课:日志与恢复能追溯/能恢复能查看错误/慢查询;binlog 开启并能解释 PITR

  • 附录 A:MySQL 与 SQL Server 主要差异(对比表)

    特性MySQLSQL Server
    许可证开源(GPL)/ 商业双轨商业(微软授权)
    运行平台Linux、Windows、macOS主要 Windows(2017+ 支持 Linux)
    主要生态LAMP、Web 应用、云原生企业级 Windows 应用
    存储引擎多引擎(InnoDB / MyISAM 等)单一引擎
    SQL 方言标准 SQL + MySQL 扩展T-SQL(Transact-SQL)
    价格免费(社区版)收费(企业版较贵)
  • 附录 B:安装场景与方法对比(课堂不展开)

    场景说明推荐安装方式
    课程实验 / 个人学习VMware 虚拟机中练习apt 安装(本项目推荐)
    Web 项目开发本地或测试服务器apt 安装 或 Docker
    生产环境部署正式线上服务apt / 二进制包 + 加固脚本
    快速验证 / CI 流水线一次性测试环境Docker 容器(秒级启停)
    高性能调优需要自定义编译参数源码编译安装
  • 附录 C:MySQL 安装后的目录结构与系统库(速查)

    路径说明使用场景
    /usr/bin/客户端工具(mysql、mysqladmin、mysqldump 等)日常操作、备份
    /usr/sbin/mysqldMySQL 服务器进程排查进程问题
    /var/lib/mysql/数据目录备份、迁移、磁盘空间排查
    /var/log/mysql/日志目录(错误日志等)故障排查
    /etc/mysql/mysql.conf.d/mysqld.cnf主配置文件修改端口、绑定地址、日志等
    数据库说明使用场景
    mysql用户账户、权限、插件配置管理用户权限、排查认证问题
    information_schema元数据库(只读虚拟库)查询表结构、索引信息
    performance_schema性能监控数据性能调优、慢查询分析
    sys高级视图快速获取性能摘要
  • 附录 D:密码管理多方式(旧系统兼容,课堂不作为主线)

    • MySQL 8.0 推荐:ALTER USER ... IDENTIFIED BY ...;
    • SET PASSWORD ... = PASSWORD() 为旧语法(8.0 已弃用 PASSWORD())
    • mysqladmin 适用于脚本化,但注意密码泄露风险(命令历史/进程列表)
  • 附录 E:Navicat 远程连接与 8.0 认证插件兼容性

    MySQL 8.0 默认使用 caching_sha2_password,旧版 Navicat 可能不支持。可升级客户端,或对该账号临时降级:

    ALTER USER 'app'@'192.168.100.%'
    IDENTIFIED WITH mysql_native_password BY 'App@Pass123!';