1. 环境准备与安装MySQL 8.0
在Ubuntu 22.04上部署MySQL 8.0之前,我们需要确保系统环境干净且依赖项完整。Ubuntu 22.04的官方仓库已经内置了MySQL 8.0的安装包,这使得安装过程变得非常简单。不过在实际操作中,我发现很多新手容易忽略一些关键细节,导致后续配置出现问题。
首先打开终端,执行以下命令更新软件包列表:
sudo apt update
这个步骤相当于刷新手机应用商店的软件列表,确保我们获取的是最新版本的安装包。我遇到过不少案例,因为跳过这步直接安装,导致后续出现依赖冲突。
接下来执行安装命令:
sudo apt install mysql-server -y
这里的-y参数表示自动确认所有提示,适合自动化部署场景。安装完成后,系统会自动创建mysql用户和必要的系统账户。值得注意的是,Ubuntu的MySQL包已经包含了完整的服务管理脚本,不需要额外配置systemd单元文件。
安装完成后,建议立即检查服务状态:
sudo systemctl status mysql
正常情况下应该看到"active (running)"的状态提示。如果遇到启动失败,最常见的原因是端口冲突。可以用sudo netstat -tulnp | grep 3306检查3306端口是否被占用。
2. 初始安全配置
MySQL安装完成后,最危险的就是默认的空密码root账户。我在生产环境中见过太多因为忽略这步导致的数据泄露案例。执行以下命令启动安全向导:
sudo mysql_secure_installation
这个交互式脚本会引导你完成以下关键设置:
- 设置root密码强度验证策略(建议选择中等强度)
- 移除匿名用户账户
- 禁止root远程登录
- 移除测试数据库
- 立即重载权限表
特别提醒:在设置密码时,如果遇到"Failed! Error: SET PASSWORD has no significance for user 'root'@'localhost'"错误,这是因为Ubuntu的特殊权限机制。这时需要改用以下方式:
sudo mysql
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的强密码';
FLUSH PRIVILEGES;
3. 用户权限深度配置
生产环境中直接使用root账户是极其危险的。我建议为每个应用创建专属数据库用户。以下是一个完整的用户创建示例:
CREATE DATABASE app_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'app_user'@'%' IDENTIFIED BY 'Complex@Password123';
GRANT ALL PRIVILEGES ON app_db.* TO 'app_user'@'%';
FLUSH PRIVILEGES;
这里有几个关键点:
utf8mb4字符集支持完整的Unicode字符(包括emoji)@'%'允许从任何主机连接,如果限定IP可以写成@'192.168.1.%'- 权限范围精确到具体数据库(app_db.*)
查看用户权限可以使用:
SHOW GRANTS FOR 'app_user'@'%';
4. 远程访问安全设置
开启远程连接需要修改两个关键配置。首先是调整MySQL的绑定地址:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到bind-address和mysqlx-bind-address两行,将其注释掉或改为0.0.0.0。
然后是防火墙设置。Ubuntu默认使用ufw防火墙,执行:
sudo ufw allow 3306/tcp
sudo ufw enable
对于云服务器用户,还需要在云平台的安全组中开放3306端口。以AWS EC2为例,需要在"安全组入站规则"中添加MySQL/Aurora类型规则。
验证远程连接是否生效:
mysql -h 服务器IP -u app_user -p
5. 性能调优与监控
基础部署完成后,我建议进行一些基本的性能调优。编辑配置文件:
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
在[mysqld]段落下添加:
innodb_buffer_pool_size = 1G # 建议为物理内存的50-70%
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 0 # MySQL 8.0已移除查询缓存
安装监控工具:
sudo apt install mytop
使用时执行mytop -u root -p即可实时监控查询状态。
6. 备份与恢复方案
任何数据库部署都必须配套备份策略。以下是简单的定时备份方案:
sudo crontab -e
添加以下内容实现每天凌晨3点全量备份:
0 3 * * * /usr/bin/mysqldump -u root -p密码 --all-databases | gzip > /backups/mysql_$(date +\%Y\%m\%d).sql.gz
恢复数据库时使用:
zcat backup.sql.gz | mysql -u root -p
对于重要生产环境,建议配置主从复制。首先在主服务器上启用二进制日志:
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
然后在从服务器上配置:
CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='replica_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=具体位置;
7. 常见问题排查
遇到连接问题时,可以按以下步骤排查:
- 检查服务状态:
sudo systemctl status mysql - 查看错误日志:
sudo tail -f /var/log/mysql/error.log - 测试本地连接:
mysql -u root -p - 检查端口监听:
sudo ss -tulnp | grep 3306 - 验证防火墙规则:
sudo ufw status numbered
我遇到过最棘手的案例是SELinux导致的问题,解决方法:
sudo setsebool -P mysql_connect_any 1
对于性能问题,可以使用内置诊断工具:
EXPLAIN ANALYZE SELECT * FROM your_table WHERE condition;
SHOW ENGINE INNODB STATUS;

621

被折叠的 条评论
为什么被折叠?



