在 Ubuntu 上安装 MySQL 后,很多新手直接跳过初始配置,导致后续出现安全漏洞、连接报错或者性能瓶颈。作为长期折腾云服务器的老鸟,我把这套流程拆解成几个关键步骤,尽量讲清楚“为什么”这么做,而不仅仅是“怎么做”。
目前主流的 Ubuntu LTS 版本(如 20.04/22.04)默认源里的 MySQL 通常是 8.0+ 版本,认证插件也换成了 auth_socket 或 caching_sha2_password,这和以前 MySQL 5.7 的玩法不太一样。
第一步:验证服务状态与基础启动
安装命令通常很简单:
sudo apt update
sudo apt install mysql-server
安装完成后,MySQL 服务通常会自动启动。你可以检查状态:
systemctl status mysql.service
如果看到 active (running),说明核心进程没问题。如果没有,手动启动并设置开机自启:
sudo systemctl start mysql
sudo systemctl enable mysql
注意:Ubuntu 18.04/20.04 之后,MySQL 的安装脚本会自动调用
mysql_secure_installation。如果你当时没运行或者跳过了,现在必须补上。这是最核心的初始配置环节。
第二步:运行安全加固脚本(必做)
执行以下命令:
sudo mysql_secure_installation
这个交互式脚本会问你几个问题,建议按如下逻辑回答:
-
Validate Password Component(密码强度校验):
- 提示是否启用密码强度检查插件。
- 建议:选
Y(启用)。对于云服务器来说,弱口令是第一个被爆破的目标。它要求密码包含大小写、数字、特殊字符,且长度至少 8 位。
-
Change the root password?(修改 Root 密码):
- 如果你之前没设过密码,这里会让你设一个强密码。
- 建议:一定要设一个复杂的密码,不要图省事用
123456。
-
Remove anonymous users?(删除匿名用户):
- 建议:选
Y。生产环境不需要匿名访问,留着只是增加攻击面。
- 建议:选
-
Disallow root login remotely?(禁止 Root 远程登录):
- 建议:强烈建议选
Y。 - 原因:Root 用户拥有最高权限,如果允许从任何 IP 远程登录,你的服务器很容易成为暴力破解的目标。正确的做法是创建一个普通的管理员账号用于远程连接,Root 只保留本地操作权限。
- 建议:强烈建议选
-
Remove test database and access to it?(删除测试数据库):
- 建议:选
Y。测试库对生产环境毫无价值,只会暴露结构信息。
- 建议:选
-
Reload privilege tables now?(重新加载权限表):
- 建议:选
Y。让上述更改立即生效。
- 建议:选
第三步:处理认证插件差异(坑点最多的一步)
这是 MySQL 8.0 和旧版本最大的区别,也是很多开发者连不上数据库的原因。
情况 A:你使用 Linux 命令行工具(root 用户)
Ubuntu 默认将 MySQL 的 root 用户认证方式设置为 auth_socket。这意味着:只要你是系统 root 用户,就可以免密登录 MySQL,而不需要输入 MySQL 密码。
测试一下:
sudo mysql
如果能直接进入 mysql> 界面,说明正常。这种方式在运维层面是最安全的。
情况 B:你需要通过应用程序(PHP, Java, Python 等)连接
大多数应用代码无法以 root 身份登录,也不能使用 auth_socket 插件(因为应用没有操作系统级别的 root 权限)。你需要创建一个专门的应用账户。
-
先通过 sudo 进入 MySQL:
sudo mysql -
创建新用户并授权(推荐单独建一个业务账号,不要用 root):
-- 创建用户 'myapp',允许从任意主机连接(%),使用 caching_sha2_password 加密 CREATE USER 'myapp'@'%' IDENTIFIED WITH caching_sha2_password BY 'YourStrongPassword123!'; -- 授予所有数据库权限(根据最小权限原则,生产环境建议指定具体数据库) GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'%'; -- 刷新权限 FLUSH PRIVILEGES; -
关键点:如果你的应用程序比较老(比如某些旧版的 PHP PDO 或 Node.js 模块),可能不支持
caching_sha2_password。如果遇到Authentication plugin 'caching_sha2_password' cannot be loaded错误,需要将用户认证方式改回旧的mysql_native_password:ALTER USER 'myapp'@'%' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword123!'; FLUSH PRIVILEGES;
第四步:配置防火墙(UFW)
Ubuntu 默认使用 UFW 防火墙。MySQL 默认监听 127.0.0.1:3306,所以外部是无法访问的,这是安全的。
但如果你确实需要从其他机器(比如你的开发机或另一台云服务器)连接这台 MySQL:
-
编辑 MySQL 配置文件,允许监听非本地地址:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf找到
bind-address = 127.0.0.1,将其注释掉或改为0.0.0.0。 -
重启 MySQL 服务:
sudo systemctl restart mysql -
开放端口(仅在你明确知道谁需要访问时才这样做):
sudo ufw allow from <客户端IP> to any port 3306 # 例如:sudo ufw allow from 192.168.1.100 to any port 3306警告:绝对不要直接执行
sudo ufw allow 3306,这会让全世界都能尝试爆破你的数据库。务必限制特定 IP。
第五步:时区与编码配置(可选但推荐)
为了避免“时间差一天”的诡异 bug 和中文乱码问题,建议在配置文件中统一设置。
编辑 /etc/mysql/mysql.conf.d/mysqld.cnf,在 [mysqld] 部分添加:
[mysqld]
# 设置字符集为 utf8mb4,支持 emoji 和生僻字
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 设置时区,避免依赖系统时区带来的不一致
default-time-zone = '+08:00'
保存后重启服务:
sudo systemctl restart mysql
总结 Checklist
- [ ] 服务已启动 (
systemctl status mysql) - [ ] 已运行
mysql_secure_installation并设置了强密码 - [ ] Root 用户已禁止远程登录
- [ ] 已创建专用的非 Root 应用账号(如需远程连接)
- [ ] 防火墙已正确配置(要么不开放端口,要么只开放特定 IP)
- [ ] 字符集设为
utf8mb4(可选,但强烈建议)
按照这个流程走下来,你的 MySQL 实例在安全性和可用性上就已经达到了生产环境的基本要求了。如果有具体的报错日志,可以贴出来,再针对性排查。
云技术博客