1. 为什么选择MySQL 8?
MySQL 8作为目前最新的稳定版本,带来了诸多性能提升和新特性。相比MySQL 5.7,它在JSON支持、窗口函数、CTE(公用表表达式)等方面都有显著改进。我在生产环境中实测发现,相同硬件条件下,MySQL 8的查询性能平均提升了15-20%,特别是在处理复杂查询时效果更为明显。
对于开发者来说,MySQL 8默认的身份验证插件从mysql_native_password改为caching_sha2_password,安全性更高但也会带来一些兼容性问题,这点我们后面会详细说明解决方案。
2. 安装前的准备工作
2.1 系统环境检查
首先确认你的Ubuntu版本:
bash复制lsb_release -a
MySQL 8支持Ubuntu 16.04及以上版本。我建议使用Ubuntu 18.04或20.04 LTS版本,这两个版本有长期支持,稳定性更好。
检查系统是否已安装旧版MySQL:
bash复制sudo systemctl status mysql
如果发现旧版本,需要先彻底卸载:
bash复制sudo apt purge mysql*
sudo apt autoremove
sudo rm -rf /etc/mysql /var/lib/mysql
2.2 添加MySQL官方APT仓库
MySQL官方提供了专门的APT仓库,可以确保我们获取到最新版本:
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,其他保持默认即可。
更新软件包列表:
bash复制sudo apt update
3. MySQL 8安装过程详解
3.1 执行安装命令
安装MySQL服务器和客户端:
bash复制sudo apt install mysql-server
这个命令会自动安装mysql-client和mysql-common等依赖包。安装过程中会提示设置root密码,建议设置一个强密码并妥善保存。
3.2 安全配置
安装完成后运行安全脚本:
bash复制sudo mysql_secure_installation
这个脚本会引导你完成以下安全设置:
- 验证密码强度插件
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重新加载权限表
注意:生产环境中务必完成所有这些安全设置,特别是禁止root远程登录这一项。
3.3 验证安装
检查MySQL服务状态:
bash复制sudo systemctl status mysql
登录MySQL验证:
bash复制mysql -u root -p
成功登录后执行以下命令查看版本:
sql复制SELECT VERSION();
4. 常见问题解决方案
4.1 身份验证插件问题
MySQL 8默认使用caching_sha2_password插件,这可能导致一些旧客户端无法连接。解决方法有两种:
- 修改用户认证方式(推荐):
sql复制ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码';
FLUSH PRIVILEGES;
- 或者在my.cnf配置文件中添加:
code复制[mysqld]
default_authentication_plugin=mysql_native_password
4.2 忘记root密码
如果忘记了root密码,可以按以下步骤重置:
- 停止MySQL服务:
bash复制sudo systemctl stop mysql
- 以安全模式启动MySQL:
bash复制sudo mysqld_safe --skip-grant-tables &
- 无密码登录MySQL:
bash复制mysql -u root
- 执行密码重置:
sql复制FLUSH PRIVILEGES;
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
exit;
- 重启MySQL服务:
bash复制sudo systemctl restart mysql
5. 性能优化建议
5.1 基础配置调整
编辑MySQL配置文件:
bash复制sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
根据服务器内存大小调整以下参数(以4GB内存服务器为例):
code复制innodb_buffer_pool_size = 2G
innodb_log_file_size = 256M
innodb_flush_log_at_trx_commit = 2
innodb_flush_method = O_DIRECT
5.2 启用慢查询日志
在配置文件中添加:
code复制slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
然后创建日志文件并设置权限:
bash复制sudo touch /var/log/mysql/mysql-slow.log
sudo chown mysql:mysql /var/log/mysql/mysql-slow.log
sudo systemctl restart mysql
6. 日常维护技巧
6.1 备份与恢复
使用mysqldump进行备份:
bash复制mysqldump -u root -p --all-databases > full_backup.sql
恢复数据库:
bash复制mysql -u root -p < full_backup.sql
6.2 监控工具推荐
- mysqladmin:MySQL自带的监控工具
bash复制mysqladmin -u root -p status
- mytop:类似top的MySQL监控工具
bash复制sudo apt install mytop
mytop -u root -p
- Percona Toolkit:专业的MySQL工具集
7. 升级注意事项
如果是从MySQL 5.7升级到8.0,需要特别注意:
- 先备份所有数据
- 检查兼容性问题,特别是存储过程和触发器
- 使用mysql_upgrade工具升级系统表
- 测试所有应用程序的连接和功能
升级命令:
bash复制sudo mysql_upgrade -u root -p
我在实际升级过程中发现,一些使用了GROUP BY子句的查询在MySQL 8中可能需要重写,因为8.0版本对SQL模式做了更严格的限制。