努力
加油

Ubuntu云服务器安装MySQL后如何进行初始配置?

在 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

这个交互式脚本会问你几个问题,建议按如下逻辑回答:

  1. Validate Password Component(密码强度校验):

    • 提示是否启用密码强度检查插件。
    • 建议:选 Y(启用)。对于云服务器来说,弱口令是第一个被爆破的目标。它要求密码包含大小写、数字、特殊字符,且长度至少 8 位。
  2. Change the root password?(修改 Root 密码):

    • 如果你之前没设过密码,这里会让你设一个强密码。
    • 建议:一定要设一个复杂的密码,不要图省事用 123456。
  3. Remove anonymous users?(删除匿名用户):

    • 建议:选 Y。生产环境不需要匿名访问,留着只是增加攻击面。
  4. Disallow root login remotely?(禁止 Root 远程登录):

    • 建议:强烈建议选 Y。
    • 原因:Root 用户拥有最高权限,如果允许从任何 IP 远程登录,你的服务器很容易成为暴力破解的目标。正确的做法是创建一个普通的管理员账号用于远程连接,Root 只保留本地操作权限。
  5. Remove test database and access to it?(删除测试数据库):

    • 建议:选 Y。测试库对生产环境毫无价值,只会暴露结构信息。
  6. 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 权限)。你需要创建一个专门的应用账户。

  1. 先通过 sudo 进入 MySQL:

    sudo mysql
  2. 创建新用户并授权(推荐单独建一个业务账号,不要用 root):

    -- 创建用户 'myapp',允许从任意主机连接(%),使用 caching_sha2_password 加密
    CREATE USER 'myapp'@'%' IDENTIFIED WITH caching_sha2_password BY 'YourStrongPassword123!';
    
    -- 授予所有数据库权限(根据最小权限原则,生产环境建议指定具体数据库)
    GRANT ALL PRIVILEGES ON *.* TO 'myapp'@'%';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
  3. 关键点:如果你的应用程序比较老(比如某些旧版的 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:

  1. 编辑 MySQL 配置文件,允许监听非本地地址:

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

    找到 bind-address = 127.0.0.1,将其注释掉或改为 0.0.0.0。

  2. 重启 MySQL 服务:

    sudo systemctl restart mysql
  3. 开放端口(仅在你明确知道谁需要访问时才这样做):

    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

  1. [ ] 服务已启动 (systemctl status mysql)
  2. [ ] 已运行 mysql_secure_installation 并设置了强密码
  3. [ ] Root 用户已禁止远程登录
  4. [ ] 已创建专用的非 Root 应用账号(如需远程连接)
  5. [ ] 防火墙已正确配置(要么不开放端口,要么只开放特定 IP)
  6. [ ] 字符集设为 utf8mb4(可选,但强烈建议)

按照这个流程走下来,你的 MySQL 实例在安全性和可用性上就已经达到了生产环境的基本要求了。如果有具体的报错日志,可以贴出来,再针对性排查。