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

在 Ubuntu 云服务器上安装 MySQL(或 MariaDB)后,进行初始配置是确保数据库安全、性能可调的关键步骤。以下是标准操作流程:


✅ 一、确认安装完成

# 检查 MySQL 服务状态
sudo systemctl status mysql   # 若使用 MariaDB 则为 mariadb

# 若未运行,启动服务
sudo systemctl start mysql
sudo systemctl enable mysql   # 开机自启

💡 提示:Ubuntu 20.04+ 默认安装的是 MySQL 8.0;较旧版本可能为 MariaDB。命令略有差异,但后续步骤通用。


✅ 二、初始化安全设置(推荐方式)

方法 A:使用 mysql_secure_installation(交互式,适合新手)

sudo mysql_secure_installation

按提示依次操作:

  1. 输入当前 root 密码(首次安装可能为空,直接回车;若已设密码则输入)。
  2. 是否启用 validate_password_plugin?
    → 建议选 Y,并设置复杂度策略(如长度 ≥8,含大小写/数字/符号)。
  3. 移除匿名用户?→ Y
  4. 禁止 root 远程登录?→ Y(生产环境强烈建议!)
  5. 删除测试数据库?→ Y
  6. 重新加载权限表?→ Y

✅ 此脚本会自动完成大部分安全加固。


方法 B:手动安全配置(更灵活,适合高级用户)

sudo mysql -u root -p
# 首次可能需先跳过授权插件验证:
# sudo mysql --skip-grant-tables -u root

进入 MySQL 后执行以下 SQL:

-- 1. 修改 root 密码(替换 'YourStrongPassword')
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourStrongPassword';

-- 2. 刷新权限
FLUSH PRIVILEGES;

-- 3. 删除匿名用户
DROP USER ''@'localhost';
DROP USER ''@'%';

-- 4. 禁用 root 远程登录(仅允许 localhost)
DELETE FROM mysql.user WHERE User='root' AND Host NOT IN ('localhost', '127.0.0.1', '::1');

-- 5. 删除 test 数据库及权限
DROP DATABASE IF EXISTS test;
DELETE FROM mysql.db WHERE Db='test' OR Db='test\_%';

-- 6. 创建专用管理用户(可选,推荐用于应用连接)
CREATE USER 'appuser'@'%' IDENTIFIED BY 'AppUserStrongPass!';
GRANT ALL PRIVILEGES ON your_db.* TO 'appuser'@'%';
FLUSH PRIVILEGES;

⚠️ 注意:

  • 若使用 MySQL 8.0+,默认认证插件为 caching_sha2_password;某些客户端(如旧版 PHP/Java)可能不兼容,可临时改回 mysql_native_password(见上),或升级客户端支持新协议。
  • 生产环境切勿让 root 从 % 登录!

✅ 三、配置文件优化(/etc/mysql/mysql.conf.d/mysqld.cnf)

编辑主配置文件(避免直接改 /etc/mysql/my.cnf,因会被覆盖):

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

常见关键项调整(根据服务器资源):

[mysqld]
# 字符集(UTF8MB4 推荐)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci

# 连接数(默认 151,高并发可适当调大,如 500)
max_connections = 500

# 缓冲池(物理内存的 50%~70%,例如 4GB 内存设 2G)
innodb_buffer_pool_size = 2G

# 日志与慢查询(调试用,生产可关闭或限制时间)
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2

# 安全选项
bind-address = 127.0.0.1          # 本地访问(外部需开放防火墙 + 白名单)
# 如需远程访问:改为 0.0.0.0 或具体内网 IP,并配合防火墙规则

# 其他建议
default-time-zone = '+08:00'      # 时区匹配业务

🔒 若需允许远程连接:

  1. 修改 bind-address 为 0.0.0.0 或云服务商内网 IP
  2. 创建对应用户(如 'appuser'@'%')
  3. 务必配置安全组/防火墙(见下文)

✅ 四、防火墙与安全组配置

1. UFW(Ubuntu 默认防火墙)

sudo ufw allow from <你的公网IP> to any port 3306
# 或仅限内网 VPC CIDR(更安全)
sudo ufw allow from 10.0.0.0/8 to any port 3306

sudo ufw reload

2. 云厂商安全组(阿里云/腾讯云/AWS 等)

  • 登录控制台 → 实例 → 安全组
  • 添加入站规则:
    • 类型:自定义 TCP
    • 端口范围:3306
    • 来源:仅填你的办公 IP 或跳板机 IP(❌ 严禁 0.0.0.0/0)

✅ 五、验证配置

# 测试本地连接
mysql -u root -p

# 查看版本与字符集
mysql> SELECT VERSION(), @@character_set_server, @@collation_server;

# 检查用户列表(确认无匿名/root 远程)
mysql> SELECT user, host FROM mysql.user;

# 测试远程连接(从另一台机器)
mysql -h <云服务器公网IP> -u appuser -p

📌 最佳实践补充

项目 建议
备份策略 每日全量 + binlog 增量(mysqldump 或 Percona XtraBackup)
监控 安装 prometheus-mysql-exporter + Grafana 可视化
自动更新 定期 apt update && apt upgrade(注意兼容性)
审计日志 开启 general_log 仅用于调试,生产慎用

需要我提供:

  • 自动化部署脚本(Ansible/Terraform)?
  • Docker 部署 MySQL 的配置示例?
  • 针对特定云厂商(如阿里云 RDS vs 自建 ECS)的差异说明?

欢迎告诉我你的具体场景,我可进一步定制方案。

云服务器