MySQL 01 - 安装与配置
MySQL 是世界上最流行的开源关系型数据库之一,是 LAMP/LNMP 技术栈的核心。本章从零开始:先讲清楚 MySQL 与 MariaDB 的区别(这是新手最容易踩的坑),再给出各平台经过验证的安装步骤,然后带你 10 分钟跑通第一条查询,最后是客户端选择、服务管理、配置文件、字符集、故障排查与密码重置。
本章命令均在真实环境验证。文中标注了每个命令适用的系统与软件包,请先确认自己装的是 Oracle MySQL 还是 MariaDB,两者的初始化命令完全不同——用错就会报
command not found。
一、先搞清楚:MySQL 还是 MariaDB
1.1 两者的关系
- MySQL:Oracle 公司维护的原始版本
- MariaDB:MySQL 原作者在 Oracle 收购后创建的分支,目标是「永远开源、向后兼容的替代品」
两者 90% 的 SQL 语法与命令行工具兼容,但包名、初始化命令、服务名、部分高级特性不同。很多系统(如 Arch Linux、Debian)官方仓库默认提供的是 MariaDB,apt install mysql-server 或 pacman -S mysql 装出来的东西可能和你想的不一样。
1.2 各平台默认包名对照(重要)
| 系统 | 装 Oracle MySQL | 装 MariaDB | 初始化命令 |
|---|---|---|---|
| Windows | winget install Oracle.MySQL 或官方安装包 | 官方 MSI | 安装向导自动完成 |
| macOS | brew install mysql | brew install mariadb | Homebrew 自动完成 |
| Ubuntu | sudo apt install mysql-server | sudo apt install mariadb-server | apt 自动完成 |
| Debian | 官方仓库没有 Oracle MySQL,需加官方 APT 源 | sudo apt install default-mysql-server | apt 自动完成 |
| Fedora / RHEL | sudo dnf install mysql-server | sudo dnf install mariadb-server | 需手动初始化 |
| Arch Linux | 官方仓库没有 Oracle MySQL,在 AUR / archlinuxcn | sudo pacman -S mariadb(官方推荐) | 必须手动初始化,两者命令不同 |
| Docker | mysql:8.4 / mysql:9 | mariadb:11 | 容器自动完成 |
记忆点:
mariadb-install-db是 MariaDB 的工具;Oracle MySQL 没有这个命令,它用mysqld --initialize。这两个命令搞混是新手第一课。
1.3 选哪个?
| 场景 | 推荐 |
|---|---|
| 公司要求 Oracle MySQL 生态(如某些云服务、企业软件) | Oracle MySQL 8.4 LTS |
| 个人学习、Linux 发行版自带、追求完全开源 | MariaDB 11.x |
| 教程/书籍示例(大多以 MySQL 8 为准) | Oracle MySQL 8.4 LTS |
| 生产环境长期维护 | MySQL 8.4 LTS 或 MariaDB 11.x LTS |
版本说明:MySQL 8.0 已于 2026 年 4 月结束主流支持,新项目不要再选 8.0;8.4 是当前 LTS,9.x 是创新版本(尝鲜用)。MariaDB 选 11.x LTS。本章命令对 8.4/9.x 与 MariaDB 11.x 均适用,差异处会单独标注。
二、多平台安装
2.1 Windows
方法一:winget(推荐)
# 安装 MySQL Installer(不是直接装服务端)
winget install Oracle.MySQL安装完成后从开始菜单打开 MySQL Installer,选择 Server only 或 Custom,在向导中:
- 设置 root 密码(务必记住)
- 端口保持默认 3306
- 勾选 “Configure MySQL Server as a Windows Service”(开机自启)
- 记住向导最后显示的服务名(通常为
MySQL84或MySQL80)
方法二:官方安装包
前往 https://dev.mysql.com/downloads/installer/ 下载 mysql-installer-community,步骤同上。
安装后客户端位于 C:\Program Files\MySQL\MySQL Server 8.4\bin,建议加入 PATH:
# 以管理员身份运行,路径按实际版本调整
setx PATH "%PATH%;C:\Program Files\MySQL\MySQL Server 8.4\bin" /M2.2 macOS(Homebrew)
brew install mysql # Oracle MySQL
# 或 brew install mariadb # MariaDB
# 启动(二选一)
mysql.server start # 仅本次启动
brew services start mysql # 开机自启的后台服务
# 首次安全初始化(设置 root 密码、移除匿名用户等)
mysql_secure_installationHomebrew 安装的 MySQL 初始 root 密码为空,直接 mysql -u root 进入后应立即用 mysql_secure_installation 设置密码。
2.3 Ubuntu
sudo apt update
sudo apt install mysql-server -y
# 安装脚本会自动初始化数据目录并启动服务
sudo systemctl status mysql # 注意:Ubuntu 上服务名是 mysql
# 安全初始化
sudo mysql_secure_installationUbuntu 的 MySQL 8 默认 root 使用
auth_socket插件:系统 root 用户直接sudo mysql即可登录,无需密码。要用密码登录(例如给后端程序连接),见第五章用户管理。
2.4 Debian
Debian 官方仓库不提供 Oracle MySQL。两个选择:
# 选择一:MariaDB(官方仓库默认,简单)
sudo apt update
sudo apt install default-mysql-server -y
sudo mariadb-secure-installation
# 选择二:Oracle MySQL 官方 APT 源(需要哪个版本装哪个)
# 1. 到 https://dev.mysql.com/downloads/repo/apt/ 下载 mysql-apt-config_*.deb
sudo dpkg -i mysql-apt-config_*.deb # 选择 MySQL 8.4
sudo apt update
sudo apt install mysql-community-server -yDebian 上
apt install mysql-server实际会安装 MariaDB(通过default-mysql-server虚拟包)。如果你按网上的教程敲了mysql-server却发现是 MariaDB,原因就在这里。
2.5 Fedora / RHEL / Rocky
# Oracle MySQL 社区版
sudo dnf install mysql-server -y
sudo systemctl enable --now mysqld
# 从错误日志获取初始临时密码
sudo grep 'temporary password' /var/log/mysql/mysql.log
# 或(日志走 journal 时)
sudo journalctl -u mysqld | grep 'temporary password'
sudo mysql_secure_installation
# 若想用 MariaDB:sudo dnf install mariadb-server2.6 Arch Linux(本章重点,两条路线)
Arch 官方仓库默认提供 MariaDB,Oracle MySQL 不在官方仓库(在 AUR,部分第三方仓库如 archlinuxcn 也提供)。两条路线的初始化命令不同,这是最常见的翻车点。
路线 A:MariaDB(Arch 官方推荐)
# 1. 安装
sudo pacman -S mariadb
# 2. 初始化数据目录(必须在启动服务之前!)
sudo mariadb-install-db --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# 3. 启动并设置开机自启
sudo systemctl enable --now mariadb
# 4. 安全初始化
sudo mariadb-secure-installation
# 5. 连接
sudo mariadb -u root -pMariaDB 在 Arch 上的配置文件:主文件 /etc/my.cnf,片段目录 /etc/my.cnf.d/,服务端选项写在 /etc/my.cnf.d/server.cnf 的 [mariadb] 段。字符集默认已是 utf8mb4。
路线 B:Oracle MySQL(AUR / archlinuxcn)
# 1. 安装(按你的软件源三选一)
sudo pacman -S mysql # 已配置 archlinuxcn 仓库时
yay -S mysql # AUR(用你的 AUR helper)
# 官方 extra 仓库没有 mysql 包;若 pacman 报 "target not found",说明未配置 archlinuxcn,请用 AUR helper
# 2. 初始化数据目录 —— 注意:不是 mariadb-install-db!
sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql
# 这条命令会生成一个随机 root 临时密码,并打印在终端/错误日志里,请立刻记下
# 3. 启动服务(服务名是 mysqld,不是 mariadb)
sudo systemctl enable --now mysqld
# 4. 用临时密码登录并立即改密
mysql -u root -p
# 输入刚才记下的临时密码
# 5. 安全初始化(可选,但强烈建议)
mysql_secure_installation如果初始化时没有记下临时密码,可以找回:
# 初始化时日志输出到 stderr(默认),systemd 启动后可在 journal 中查找
sudo journalctl -u mysqld | grep -i 'temporary password'如果不想用随机密码,可以改用空密码初始化(仅限本机学习环境):
# 数据目录必须为空!如果之前初始化失败,先确认目录中没有需要保留的数据
sudo mysqld --initialize-insecure --user=mysql --basedir=/usr --datadir=/var/lib/mysql
sudo systemctl start mysqld
mysql -u root # 空密码直接登录
mysql_secure_installation # 然后立刻设置密码常见误解:网上大量教程写「Arch 安装 MySQL」时混用
pacman -S mysql和mariadb-install-db,这是错误的组合。pacman -S mysql装的是 Oracle MySQL,没有mariadb-install-db这个命令,会直接报command not found。要么装mariadb用 MariaDB 的命令,要么装mysql用mysqld --initialize。
2.7 Docker(最省事,推荐新手先体验)
# MySQL 8.4 LTS
docker run -d \
--name mysql8 \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=testdb \
-p 3306:3306 \
-v mysql_data:/var/lib/mysql \
mysql:8.4
# 进入容器内的客户端
docker exec -it mysql8 mysql -uroot -p123456常用可选参数:
--character-set-server=utf8mb4 --collation-server=utf8mb4_0900_ai_ci
-v ./init:/docker-entrypoint-initdb.d # 首次启动自动执行目录内的 .sql/.sh
-e MYSQL_USER=app -e MYSQL_PASSWORD=app123 # 顺便创建普通用户用 Docker Compose 更适合配合后端项目(见 08 与后端语言集成):
services:
mysql:
image: mysql:8.4
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: appdb
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-p123456"]
interval: 5s
retries: 10
volumes:
mysql_data:2.8 安装后验证
mysql --version # 客户端版本
mysqladmin -u root -p version # 服务端版本 + 运行状态
systemctl status mysqld # Arch/Fedora 的 Oracle MySQL
systemctl status mariadb # Arch 的 MariaDB
systemctl status mysql # Ubuntu 的 Oracle MySQL三、新手 10 分钟上手
安装完成后,跟着这段走一遍,你就能完整理解数据库的用法。假设你已经启动服务并能用 root 登录。
3.1 启动服务并登录
# 启动(服务名按你安装的包选择)
sudo systemctl start mysqld # 或 mariadb / mysql
# 登录:-u 指定用户,-p 表示交互式输入密码
mysql -u root -p登录成功后提示符变为 mysql>,这里输入的是 SQL 语句,每条以分号 ; 结尾再回车执行。
3.2 建库、建表、插数据、查询
-- 1. 创建一个数据库(字符集必须显式指定 utf8mb4)
CREATE DATABASE school CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
-- 2. 切换到该数据库(后续语句都在这个库里执行)
USE school;
-- 3. 创建一张表
CREATE TABLE students (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
score DECIMAL(5,2),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 4. 插入数据
INSERT INTO students (name, age, score) VALUES
('张三', 20, 92.5),
('李四', 21, 85.0),
('王五', 19, 77.5);
-- 5. 查询
SELECT * FROM students;
SELECT name, score FROM students WHERE score >= 80 ORDER BY score DESC;预期输出:
+----+--------+------+-------+---------------------+
| id | name | age | score | created_at |
+----+--------+------+-------+---------------------+
| 1 | 张三 | 20 | 92.50 | 2026-09-14 20:55:00 |
| 2 | 李四 | 21 | 85.00 | 2026-09-14 20:55:00 |
| 3 | 王五 | 19 | 77.50 | 2026-09-14 20:55:00 |
+----+--------+------+-------+---------------------+3.3 查看环境与退出
SELECT VERSION(); -- 服务端版本
SELECT USER(); -- 当前登录用户@主机
SHOW DATABASES; -- 列出所有数据库
SHOW TABLES; -- 列出当前库的所有表
DESC students; -- 查看表结构
EXIT; -- 退出(QUIT 或 \q 同效)到这里,数据库的「安装 → 连接 → 建库 → 建表 → 增删改查」闭环就跑通了。后续章节会逐个展开语法细节。
四、客户端与编辑器选型
「用什么写 SQL、管理数据库」是新手最容易迷糊的问题。数据库本身只提供服务端,你需要一个客户端来连接它。以下按使用场景分类。
4.1 命令行客户端
| 工具 | 安装 | 特点 | 适合 |
|---|---|---|---|
mysql / mariadb | 随服务端自带 | 官方 CLI,最可靠,所有环境都有 | 服务器上排查、脚本、学习 |
mycli | pip install mycli 或 pacman -S mycli | 自动补全、语法高亮、更友好的提示 | 日常终端使用,强烈推荐 |
mysqlsh | MySQL Shell 官方包 | 支持 JS/Python 脚本、AdminAPI | 运维自动化、InnoDB Cluster |
# mycli 用法与 mysql 完全一致,但体验好得多
mycli -u root -p school4.2 图形化客户端(GUI)
| 工具 | 平台 | 费用 | 特点 |
|---|---|---|---|
| DBeaver Community | 全平台 | 免费开源 | 通用数据库工具,支持 MySQL/MariaDB/PG 等,首推 |
| MySQL Workbench | 全平台 | 免费 | Oracle 官方,建模/管理/查询一体;对 MariaDB 兼容性一般 |
| DataGrip | 全平台 | 付费(学生免费) | JetBrains 出品,SQL 智能补全与重构最强,重度 SQL 开发首选 |
| HeidiSQL | Windows | 免费 | 轻量、启动快,Windows 下口碑很好 |
| Navicat | 全平台 | 付费 | 老牌商业工具,界面友好 |
| TablePlus / Beekeeper Studio | 全平台 | 免费/付费 | 现代化 UI,轻量美观 |
| phpMyAdmin | 浏览器(PHP) | 免费 | 网页版管理,适合服务器上没有 GUI 的场景 |
| Adminer | 浏览器(单 PHP 文件) | 免费 | 比 phpMyAdmin 更轻,一个文件即可部署 |
4.3 在编辑器里写 SQL
如果你要在项目里写较长的 SQL 或管理迁移脚本:
| 编辑器 | 方案 | 说明 |
|---|---|---|
| VS Code | 插件 Database Client(原 MySQL)或 SQLTools + 对应驱动 | 边写边执行,结果内嵌显示,免费 |
| JetBrains IDEA / DataGrip | 内置 Database 工具窗口 | 补全、跳转、格式化、版本对比全都有 |
| Vim / Neovim | vim-dadbod + vim-dadbod-ui | 在 Vim 内执行查询并把结果输出到 buffer |
| 任何编辑器 | .sql 文件 + mysql < file.sql | 最朴素也最通用,适合脚本与版本管理 |
# 在终端批量执行 SQL 文件(常用于初始化脚本、迁移)
mysql -u root -p school < init.sql
# 把查询结果导出为文件
mysql -u root -p school -e "SELECT * FROM students" > result.txt4.4 选择建议
| 你的情况 | 推荐 |
|---|---|
| 刚学 SQL,想专注语法 | 服务端自带 mysql CLI + 本教程 |
| 日常在终端工作 | mycli |
| 要图形化管理数据、跨多种数据库 | DBeaver Community |
| 重度 SQL 开发 / 已用 JetBrains IDE | DataGrip / IDEA 内置数据库工具 |
| 在 VS Code 里写项目代码顺便查库 | Database Client 插件 |
| 服务器运维、无 GUI | mysql / mycli / phpMyAdmin / Adminer |
五、服务管理命令
| 操作 | Oracle MySQL (Arch/Fedora) | MariaDB (Arch) | Ubuntu MySQL | macOS (brew) | Windows |
|---|---|---|---|---|---|
| 启动 | sudo systemctl start mysqld | sudo systemctl start mariadb | sudo systemctl start mysql | brew services start mysql | net start MySQL84 |
| 停止 | sudo systemctl stop mysqld | sudo systemctl stop mariadb | sudo systemctl stop mysql | brew services stop mysql | net stop MySQL84 |
| 重启 | sudo systemctl restart mysqld | sudo systemctl restart mariadb | sudo systemctl restart mysql | brew services restart mysql | 先 stop 再 start |
| 开机自启 | sudo systemctl enable mysqld | sudo systemctl enable mariadb | sudo systemctl enable mysql | brew services start mysql | 安装时勾选服务 |
| 查看状态 | sudo systemctl status mysqld | sudo systemctl status mariadb | sudo systemctl status mysql | brew services list | sc query MySQL84 |
| 查看日志 | journalctl -u mysqld -e | journalctl -u mariadb -e | journalctl -u mysql -e | tail -f /opt/homebrew/var/mysql/*.err | 事件查看器 / my.ini 中 log-error |
服务名对照是排查问题的关键:
mysqld是 Oracle MySQL 在 Arch/Fedora 上的服务名,mariadb是 MariaDB 在 Arch 上的服务名,Ubuntu 上 Oracle MySQL 的服务名却是mysql。用错服务名会报Unit xxx.service not found。
六、客户端连接
6.1 本地连接
# -u 用户名 -p 密码交互输入(推荐,避免密码进 shell 历史)
mysql -u root -p
# 明文指定密码(仅测试环境用)
mysql -u root -p123456
# 直接连接到某个库
mysql -u appuser -p testdb
# 指定 socket(服务未监听 TCP 或 socket 路径特殊时)
mysql -u root -p --socket=/run/mysqld/mysqld.sock登录成功后常用状态命令:
SELECT VERSION(); -- 服务端版本
SELECT USER(); -- 当前登录用户@主机
SHOW DATABASES; -- 列出所有数据库
SHOW PROCESSLIST; -- 查看当前连接
EXIT; -- 退出6.2 远程连接
mysql -h 192.168.1.100 -P 3306 -u appuser -p
# -h 主机 -P 端口(大写 P) -u 用户 -p 密码远程连不上时按四步排查:
-- 第一步:确认用户允许从该主机连接(% 表示任意主机)
SELECT user, host FROM mysql.user WHERE user = 'appuser';
-- 第二步:授予远程访问权限(MySQL 8 需先 CREATE USER 再 GRANT)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'StrongPass123!';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'%';
FLUSH PRIVILEGES;
-- 第三步:确认服务端监听了公网地址而非仅 127.0.0.1
SHOW VARIABLES LIKE 'bind_address';# 第四步:确认防火墙放行 3306 端口
sudo ufw allow 3306/tcp # Ubuntu
sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload # Fedora安全提醒:把
bind-address改成0.0.0.0并开放 3306 意味着数据库暴露在网络上。生产环境应通过内网、VPN 或 SSH 隧道访问,不要把数据库直接暴露到公网。SSH 隧道示例:ssh -L 3306:127.0.0.1:3306 user@server # 本地 3306 转发到服务器的数据库
七、配置文件
7.1 各平台配置文件位置
| 平台 / 安装方式 | 配置文件路径 |
|---|---|
| Windows | C:\ProgramData\MySQL\MySQL Server 8.4\my.ini |
| macOS (Homebrew, Apple Silicon) | /opt/homebrew/etc/my.cnf |
| macOS (Homebrew, Intel) | /usr/local/etc/my.cnf |
| Ubuntu (apt) | /etc/mysql/my.cnf,实际配置在 /etc/mysql/mysql.conf.d/mysqld.cnf |
| Debian (MariaDB) | /etc/mysql/mariadb.conf.d/50-server.cnf |
| Fedora (dnf) | /etc/my.cnf + /etc/my.cnf.d/mysql-server.cnf |
| Arch (MariaDB) | /etc/my.cnf + /etc/my.cnf.d/server.cnf |
| Arch (Oracle MySQL, AUR/archlinuxcn) | 默认不提供配置文件,可用内置默认值;需要时自行创建 /etc/my.cnf |
| Docker | 挂载到容器 /etc/mysql/conf.d/ |
Arch Oracle MySQL 用户注意:该包默认没有
/etc/my.cnf,所有参数用编译默认值(datadir=/var/lib/mysql、socket=/run/mysqld/mysqld.sock、日志输出到 stderr/journal)。要自定义参数就新建/etc/my.cnf,不要照抄 MariaDB 的[mariadb]段,MySQL 用的是[mysqld]段。
7.2 常用配置项
[mysqld]
# 监听端口
port = 3306
# 监听地址:默认只听本机;允许远程改为 0.0.0.0(注意安全)
bind-address = 127.0.0.1
# 最大并发连接数(默认 151)
max_connections = 500
# 服务端默认字符集(MySQL 8 默认已是 utf8mb4)
character-set-server = utf8mb4
collation-server = utf8mb4_0900_ai_ci
# InnoDB 缓冲池大小,建议物理内存的 50%~70%(默认 128M 偏小)
innodb_buffer_pool_size = 2G
# 慢查询日志
slow_query_log = ON
long_query_time = 2
slow_query_log_file = /var/log/mysql/slow.log
[client]
default-character-set = utf8mb4修改后重启服务生效:
sudo systemctl restart mysqld # 或 mariadb / mysql验证配置是否生效:
SHOW VARIABLES LIKE 'max_connections';
SHOW VARIABLES LIKE 'character_set_server';7.3 配置排错
-- 查看某个参数的当前值与来源文件(MySQL 8.0.14+)
SELECT @@max_connections;
SELECT * FROM performance_schema.variables_info WHERE VARIABLE_NAME = 'max_connections';# 启动失败时先用这个检查配置语法与最终生效值
mysqld --validate-config
mysqld --print-defaults八、字符集问题:utf8 vs utf8mb4
这是 MySQL 最经典的坑:MySQL 的 utf8 是残缺实现,最多只存 3 字节,无法保存 emoji 和部分生僻字(4 字节 UTF-8 字符),写入会报 Incorrect string value 错误。
| 项目 | utf8(utf8mb3) | utf8mb4 |
|---|---|---|
| 最大字节 | 3 字节 | 4 字节 |
| emoji 支持 | 否,报错或截断 | 是 |
| 生僻汉字 | 部分缺失 | 完整支持 |
| 结论 | 不要用 | 统一使用 |
正确做法:
-- 建库建表显式指定 utf8mb4
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;
CREATE TABLE t (
name VARCHAR(100)
) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;关于排序规则(collation):
| 排序规则 | 特点 |
|---|---|
utf8mb4_general_ci | 速度快,比较粗糙,大小写不敏感(旧版本默认) |
utf8mb4_unicode_ci | 基于标准 Unicode 排序,多语言更准确(MariaDB 常用) |
utf8mb4_0900_ai_ci | MySQL 8 默认,Unicode 9.0,性能与准确度兼顾(Oracle MySQL 推荐) |
排查与修复已有表:
SHOW CREATE TABLE t; -- 查看建表语句中的字符集
SHOW FULL COLUMNS FROM t; -- 查看每列字符集
ALTER TABLE t CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci;九、启动失败排查(含真实报错对照)
MySQL 启动失败时,第一步永远是看日志:
sudo journalctl -xeu mysqld -e # Oracle MySQL
sudo journalctl -xeu mariadb -e # MariaDB
sudo tail -100 /var/log/mysql/error.log # 配置了文件日志时常见错误对照表:
| 报错信息 | 根本原因 | 解决方法 |
|---|---|---|
sudo: mariadb-install-db:找不到命令 | 装的是 Oracle MySQL 包,它没有 MariaDB 的初始化工具 | 改用 sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql;或改装 mariadb 包 |
Job for mysqld.service failed because the control process exited | 服务启动失败,需看具体日志 | journalctl -xeu mysqld 查看真正原因 |
[ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.user' doesn't exist | 数据目录没有初始化(用户遇到的典型情况) | 停止服务,执行 mysqld --initialize 后再启动 |
[Warning] The mysql.component table is missing | 同上,系统表未创建 | 同上 |
Can't connect to local MySQL server through socket '/run/mysqld/mysqld.sock' | 服务没启动,或 socket 路径不对 | systemctl status 确认服务;mysql --socket=路径 指定 |
Access denied for user 'root'@'localhost' | 密码错误或认证插件不匹配 | 用初始临时密码;忘记密码见第十章重置 |
Address already in use | 3306 端口被占用(可能已有另一个数据库实例) | ss -ltnp | grep 3306 找到占用进程 |
The server quit without updating PID file | 数据目录权限错误、磁盘满、配置错误 | 检查 /var/lib/mysql 属主为 mysql;df -h 看磁盘 |
Data directory /var/lib/mysql is not empty | 对非空目录执行 --initialize | 确认无重要数据后清空目录,或备份后重来 |
用户实战案例复盘:在 Arch 上执行
sudo pacman -S mysql(装了 Oracle MySQL 9.7),却执行了sudo mariadb-install-db ...,于是报找不到命令;随后直接systemctl enable --now mysqld,因为数据目录从未初始化,服务启动失败并报Table 'mysql.user' doesn't exist。正确顺序是:sudo mysqld --initialize --user=mysql --basedir=/usr --datadir=/var/lib/mysql sudo systemctl enable --now mysqld mysql -u root -p # 输入初始化时打印的临时密码
十、重置 root 密码
忘记 root 密码时,用 skip-grant-tables(跳过权限校验)模式进入后改密。以下操作会让数据库短暂失去保护,请尽快完成并恢复。
10.1 Oracle MySQL 流程
# 第一步:停止服务
sudo systemctl stop mysqld
# 第二步:跳过权限表启动(后台运行,仅本机)
sudo mysqld_safe --skip-grant-tables --skip-networking &
# 第三步:无密码直接登录
mysql -u root-- 第四步:刷新权限后修改密码
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026';
EXIT;# 第五步:停掉临时实例并恢复正常服务
sudo mysqladmin -u root -p'NewPass@2026' shutdown
# 若上面命令失败,可 sudo killall mysqld
sudo systemctl start mysqld
mysql -u root -p'NewPass@2026' # 验证新密码10.2 MariaDB 流程
sudo systemctl stop mariadb
sudo mariadbd-safe --skip-grant-tables --skip-networking &
mariadb -u rootFLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026';
EXIT;sudo kill $(sudo cat /var/lib/mysql/$(hostname).pid) # 关闭临时实例
sudo systemctl start mariadb10.3 注意事项
| 要点 | 说明 |
|---|---|
FLUSH PRIVILEGES 必须先执行 | skip-grant-tables 下内存中未加载授权表,先刷新才能 ALTER USER |
--skip-networking 必须加上 | 该模式下任何人都能免密登录,禁掉网络防止被外部趁虚而入 |
| 操作期间数据库无保护 | 尽快完成,改完立即重启恢复正常模式 |
| 密码策略报错 | MySQL 8 默认要求含大小写字母、数字、特殊符号且长度至少 8 位;可临时调整 validate_password 组件策略 |
| Ubuntu 的 auth_socket | 系统 root 用 sudo mysql 登录后可直接 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '新密码'; 切换为密码登录 |
十一、本章小结
| 主题 | 关键结论 |
|---|---|
| MySQL vs MariaDB | 先确认装的是哪个;mariadb-install-db(MariaDB)≠ mysqld --initialize(Oracle MySQL) |
| 各平台包名 | Ubuntu 用 mysql-server;Debian 默认是 MariaDB;Arch 官方只有 MariaDB,Oracle MySQL 在 AUR/archlinuxcn |
| 安装流程 | 装包 → 初始化(Arch/Fedora 必须手动)→ 启动服务 → 安全初始化 |
| 服务名 | mysqld(Arch/Fedora MySQL)、mariadb(Arch MariaDB)、mysql(Ubuntu) |
| 客户端 | 学习用 mysql CLI,日常用 mycli,图形化用 DBeaver,重度开发用 DataGrip |
| 配置文件 | 各平台路径不同;Arch Oracle MySQL 默认无配置文件 |
| 字符集 | 永远用 utf8mb4,不要用 MySQL 的假 utf8 |
| 排错 | 先看 journalctl -xeu 服务名,再对照错误表 |
| 忘记密码 | skip-grant-tables → FLUSH PRIVILEGES → ALTER USER → 重启 |
练习
| 序号 | 任务 | 验收标准 |
|---|---|---|
| 1 | 在你使用的系统上安装并启动 MySQL/MariaDB | systemctl status 显示 active;mysql -u root -p 能登录 |
| 2 | 跑通第三章的 10 分钟上手流程 | 能独立建库、建表、插入 3 条数据并查询出来 |
| 3 | 安装一个图形化客户端(推荐 DBeaver)并连接本机数据库 | 能在 GUI 中看到 school 库与 students 表 |
| 4 | 故意把 max_connections 改成 50,重启并验证 | SHOW VARIABLES LIKE 'max_connections'; 返回 50;改回默认并重启 |
| 5 | 用 mysqldump 导出 school 库并导入到新库 school_bak | mysqldump -u root -p school > school.sql;新库中能查到同样数据 |
下一章进入 SQL 语言本身:SQL 基础语法;需要连接后端程序时直接看 与后端语言集成。
返回 数据库目录