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-serverpacman -S mysql 装出来的东西可能和你想的不一样。

1.2 各平台默认包名对照(重要)

系统装 Oracle MySQL装 MariaDB初始化命令
Windowswinget install Oracle.MySQL 或官方安装包官方 MSI安装向导自动完成
macOSbrew install mysqlbrew install mariadbHomebrew 自动完成
Ubuntusudo apt install mysql-serversudo apt install mariadb-serverapt 自动完成
Debian官方仓库没有 Oracle MySQL,需加官方 APT 源sudo apt install default-mysql-serverapt 自动完成
Fedora / RHELsudo dnf install mysql-serversudo dnf install mariadb-server需手动初始化
Arch Linux官方仓库没有 Oracle MySQL,在 AUR / archlinuxcnsudo pacman -S mariadb(官方推荐)必须手动初始化,两者命令不同
Dockermysql:8.4 / mysql:9mariadb: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 onlyCustom,在向导中:

  1. 设置 root 密码(务必记住)
  2. 端口保持默认 3306
  3. 勾选 “Configure MySQL Server as a Windows Service”(开机自启)
  4. 记住向导最后显示的服务名(通常为 MySQL84MySQL80

方法二:官方安装包

前往 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" /M

2.2 macOS(Homebrew)

brew install mysql          # Oracle MySQL
# 或 brew install mariadb   # MariaDB
 
# 启动(二选一)
mysql.server start          # 仅本次启动
brew services start mysql   # 开机自启的后台服务
 
# 首次安全初始化(设置 root 密码、移除匿名用户等)
mysql_secure_installation

Homebrew 安装的 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_installation

Ubuntu 的 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 -y

Debian 上 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-server

2.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 -p

MariaDB 在 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 mysqlmariadb-install-db,这是错误的组合。pacman -S mysql 装的是 Oracle MySQL,没有 mariadb-install-db 这个命令,会直接报 command not found。要么装 mariadb 用 MariaDB 的命令,要么装 mysqlmysqld --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,最可靠,所有环境都有服务器上排查、脚本、学习
myclipip install myclipacman -S mycli自动补全、语法高亮、更友好的提示日常终端使用,强烈推荐
mysqlshMySQL Shell 官方包支持 JS/Python 脚本、AdminAPI运维自动化、InnoDB Cluster
# mycli 用法与 mysql 完全一致,但体验好得多
mycli -u root -p school

4.2 图形化客户端(GUI)

工具平台费用特点
DBeaver Community全平台免费开源通用数据库工具,支持 MySQL/MariaDB/PG 等,首推
MySQL Workbench全平台免费Oracle 官方,建模/管理/查询一体;对 MariaDB 兼容性一般
DataGrip全平台付费(学生免费)JetBrains 出品,SQL 智能补全与重构最强,重度 SQL 开发首选
HeidiSQLWindows免费轻量、启动快,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 / Neovimvim-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.txt

4.4 选择建议

你的情况推荐
刚学 SQL,想专注语法服务端自带 mysql CLI + 本教程
日常在终端工作mycli
要图形化管理数据、跨多种数据库DBeaver Community
重度 SQL 开发 / 已用 JetBrains IDEDataGrip / IDEA 内置数据库工具
在 VS Code 里写项目代码顺便查库Database Client 插件
服务器运维、无 GUImysql / mycli / phpMyAdmin / Adminer

五、服务管理命令

操作Oracle MySQL (Arch/Fedora)MariaDB (Arch)Ubuntu MySQLmacOS (brew)Windows
启动sudo systemctl start mysqldsudo systemctl start mariadbsudo systemctl start mysqlbrew services start mysqlnet start MySQL84
停止sudo systemctl stop mysqldsudo systemctl stop mariadbsudo systemctl stop mysqlbrew services stop mysqlnet stop MySQL84
重启sudo systemctl restart mysqldsudo systemctl restart mariadbsudo systemctl restart mysqlbrew services restart mysql先 stop 再 start
开机自启sudo systemctl enable mysqldsudo systemctl enable mariadbsudo systemctl enable mysqlbrew services start mysql安装时勾选服务
查看状态sudo systemctl status mysqldsudo systemctl status mariadbsudo systemctl status mysqlbrew services listsc query MySQL84
查看日志journalctl -u mysqld -ejournalctl -u mariadb -ejournalctl -u mysql -etail -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 各平台配置文件位置

平台 / 安装方式配置文件路径
WindowsC:\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/mysqlsocket=/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_ciMySQL 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 use3306 端口被占用(可能已有另一个数据库实例)ss -ltnp | grep 3306 找到占用进程
The server quit without updating PID file数据目录权限错误、磁盘满、配置错误检查 /var/lib/mysql 属主为 mysqldf -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 root
FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewPass@2026';
EXIT;
sudo kill $(sudo cat /var/lib/mysql/$(hostname).pid)   # 关闭临时实例
sudo systemctl start mariadb

10.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/MariaDBsystemctl 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_bakmysqldump -u root -p school > school.sql;新库中能查到同样数据

下一章进入 SQL 语言本身:SQL 基础语法;需要连接后端程序时直接看 与后端语言集成


返回 数据库目录