1. 为什么选择MySQL 8?
MySQL作为最流行的开源关系型数据库之一,8.0版本带来了诸多革命性改进。在我管理的生产环境中,窗口函数、原子DDL操作和JSON增强功能彻底改变了数据处理方式。特别是默认字符集从latin1改为utf8mb4,直接解决了中文乱码这个困扰开发者多年的问题。
性能提升方面,新版查询优化器对复杂查询的提速效果明显。有次我将5.7版本迁移到8.0后,一个多表关联报表查询从27秒降到了3秒。对于Ubuntu用户来说,官方APT源提供的MySQL 8安装包经过充分测试,比手动编译安装更可靠。
2. 环境准备与依赖检查
2.1 系统兼容性确认
首先通过lsb_release -a查看Ubuntu版本。我在20.04 LTS和22.04 LTS上实测都运行良好,但要注意18.04需要先升级GLIBC。曾经有同事在16.04上强行安装导致依赖地狱,最后不得不重装系统。
内存建议至少2GB,我试过在1GB的测试机上安装,虽然能运行但稍复杂的查询就会触发OOM。用free -h检查内存时,重点看available值而非free值。
2.2 清理旧版本残留
如果之前安装过MariaDB或MySQL 5.x,必须彻底清理:
bash复制sudo apt purge mysql* mariadb*
sudo rm -rf /etc/mysql /var/lib/mysql
sudo apt autoremove
有次升级时没清理干净,导致配置文件冲突,mysqld服务死活起不来。后来发现是/etc/mysql下残留的my.cnf覆盖了新版本配置。
3. 安装过程详解
3.1 添加官方APT源
MySQL提供的.deb包会自动配置APT源,比Ubuntu自带仓库版本更新:
bash复制wget https://dev.mysql.com/get/mysql-apt-config_0.8.22-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.22-1_all.deb
在弹出的配置界面选择"MySQL Server & Cluster"和"mysql-8.0"。曾经手快直接回车,结果装成了Connector组件。
3.2 实际安装操作
更新源后执行:
bash复制sudo apt update
sudo apt install mysql-server
安装过程中会提示设置root密码。这里有个坑:如果直接回车跳过,8.0版本会默认使用auth_socket插件,导致后续客户端无法密码登录。建议务必设置强密码。
4. 安全加固与初始化
4.1 运行安全脚本
MySQL提供的mysql_secure_installation脚本能处理基础安全设置:
bash复制sudo mysql_secure_installation
建议开启以下选项:
- 移除匿名用户(生产环境必选)
- 禁止root远程登录(Web应用服务器必选)
- 移除test数据库(安全审计要求)
4.2 创建专用用户
永远不要用root操作数据库,应该创建应用专用用户:
sql复制CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'ComplexP@ssw0rd';
GRANT ALL PRIVILEGES ON appdb.* TO 'appuser'@'localhost';
权限分配原则:遵循最小权限原则。有次给实习生开了全局FILE权限,结果误操作删除了系统文件。
5. 关键配置调优
5.1 修改my.cnf配置
/etc/mysql/my.cnf中需要调整的核心参数:
ini复制[mysqld]
default_authentication_plugin=mysql_native_password # 兼容旧客户端
character-set-server=utf8mb4 # 完整UTF-8支持
collation-server=utf8mb4_unicode_ci
innodb_buffer_pool_size=1G # 建议物理内存的50-70%
innodb_log_file_size=256M # 大事务需要更大日志
修改配置后需要重启服务:sudo systemctl restart mysql
5.2 性能监控设置
启用性能schema监控:
sql复制UPDATE performance_schema.setup_instruments SET ENABLED = 'YES';
UPDATE performance_schema.setup_consumers SET ENABLED = 'YES';
这对排查慢查询特别有用。上周就是通过performance_schema发现了一个全表扫描的N+1查询问题。
6. 日常运维要点
6.1 备份策略实施
推荐使用mysqldump配合cron定时备份:
bash复制mysqldump -u appuser -p appdb | gzip > /backups/appdb_$(date +%F).sql.gz
保留策略建议:每日全备保留7天,每周全备保留4周。曾经因为只保留7天备份,遇到逻辑错误时无法回滚到更早版本。
6.2 升级注意事项
小版本升级直接apt upgrade即可,但跨大版本升级(如5.7→8.0)需要:
- 完整备份所有数据库
- 查阅官方升级指南的兼容性说明
- 在测试环境验证无误后再升级生产环境
有次没看发行说明直接升级,结果发现移除了GROUP BY的隐式排序特性,导致分页功能异常。
7. 故障排查实录
7.1 服务无法启动
常见原因及解决方案:
| 现象 | 排查命令 | 解决方法 |
|---|---|---|
| 端口占用 | sudo netstat -tulnp |
杀死冲突进程或修改MySQL端口 |
| 权限问题 | sudo journalctl -u mysql |
检查/var/lib/mysql所有者是否为mysql |
| 磁盘满 | df -h |
清理日志或扩容磁盘 |
7.2 连接数爆满
快速释放连接:
sql复制SELECT * FROM information_schema.processlist;
KILL <process_id>;
长期解决方案是优化连接池配置,或在应用层实现重试机制。我们有个PHP应用没关连接,导致积累了3000+僵尸连接。
8. 安全防护建议
8.1 防火墙配置
仅允许应用服务器IP访问:
bash复制sudo ufw allow from 192.168.1.100 to any port 3306
云环境还需要配置安全组规则。曾经有台测试库没设防火墙,被挖矿程序攻陷。
8.2 审计日志启用
在my.cnf中添加:
ini复制[mysqld]
plugin-load-add=audit_log.so
audit_log_format=JSON
audit_log_file=/var/log/mysql/audit.log
这能满足等保2.0的三级要求。去年审计时就是靠这个日志证明了数据访问合规性。
安装完成后,我习惯用mysql-shell进行管理,它的JavaScript模式比传统客户端更强大。特别是对于JSON字段操作,可以直接用JS语法处理,比SQL语句直观得多。