在 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
按提示依次操作:
- 输入当前 root 密码(首次安装可能为空,直接回车;若已设密码则输入)。
- 是否启用 validate_password_plugin?
→ 建议选Y,并设置复杂度策略(如长度 ≥8,含大小写/数字/符号)。 - 移除匿名用户?→
Y - 禁止 root 远程登录?→
Y(生产环境强烈建议!) - 删除测试数据库?→
Y - 重新加载权限表?→
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' # 时区匹配业务
🔒 若需允许远程连接:
- 修改
bind-address为0.0.0.0或云服务商内网 IP- 创建对应用户(如
'appuser'@'%')- 务必配置安全组/防火墙(见下文)
✅ 四、防火墙与安全组配置
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)的差异说明?
欢迎告诉我你的具体场景,我可进一步定制方案。
CLOUD技术笔记