1. 为什么选择Ubuntu 22.04部署MySQL
作为目前最流行的Linux发行版之一,Ubuntu 22.04 LTS(Jammy Jellyfish)提供了长达5年的官方支持周期,特别适合作为生产环境数据库服务器的基础操作系统。其内置的APT包管理系统能够便捷地获取经过充分测试的MySQL软件包,而systemd服务管理机制则让数据库服务的启停和监控变得简单可靠。
MySQL 8.0作为当前主流版本,相比5.7系列在性能上有显著提升:支持窗口函数、Common Table Expressions(CTE)等高级SQL特性,默认字符集改为更通用的utf8mb4,并引入了不可见索引、降序索引等优化手段。在Ubuntu 22.04上通过官方仓库安装,可以确保获得经过充分兼容性测试的稳定版本组合。
2. 安装前的系统准备
2.1 硬件资源评估
对于开发测试环境,建议至少分配:
- 2核CPU
- 4GB内存
- 50GB存储空间
生产环境则需要根据实际负载进行调整,一般推荐:
- 4核以上CPU
- 8GB以上内存(重要系统建议16GB+)
- 使用SSD存储并预留足够空间(数据量×3)
提示:使用
free -h和df -h命令可快速查看当前资源使用情况
2.2 系统更新与依赖检查
在安装MySQL前,建议先更新系统软件包并安装基础依赖:
bash复制sudo apt update
sudo apt upgrade -y
sudo apt install -y gnupg2 wget software-properties-common
2.3 防火墙配置
如果系统启用了UFW防火墙,需要预先开放MySQL默认端口:
bash复制sudo ufw allow 3306/tcp
sudo ufw enable
3. MySQL安装步骤详解
3.1 添加官方软件仓库
为确保获取最新稳定版,建议使用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.2 执行安装命令
安装MySQL服务器核心组件:
bash复制sudo apt install -y mysql-server
安装过程会提示设置root密码,建议设置强密码(至少12位,含大小写字母、数字和特殊字符)。
3.3 验证安装结果
检查服务状态:
bash复制systemctl status mysql
成功运行应显示"active (running)"状态。也可通过客户端连接测试:
bash复制mysql -u root -p
输入密码后应能进入MySQL命令行界面。
4. 关键安全配置
4.1 运行安全加固脚本
MySQL提供了安全配置向导:
bash复制sudo mysql_secure_installation
按提示完成以下设置:
- 设置密码强度验证策略
- 修改root密码(可选)
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 立即应用权限变更
4.2 创建专用管理账户
建议创建具有特定权限的专用管理账号,而非直接使用root:
sql复制CREATE USER 'admin'@'localhost' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
FLUSH PRIVILEGES;
4.3 配置SSL加密传输
生成并配置SSL证书:
bash复制sudo mysql_ssl_rsa_setup --uid=mysql
在MySQL配置文件中启用SSL:
ini复制[mysqld]
ssl-ca=/var/lib/mysql/ca.pem
ssl-cert=/var/lib/mysql/server-cert.pem
ssl-key=/var/lib/mysql/server-key.pem
5. 性能优化配置
5.1 内存参数调优
编辑配置文件/etc/mysql/mysql.conf.d/mysqld.cnf:
ini复制[mysqld]
innodb_buffer_pool_size = 4G # 建议为系统内存的50-70%
innodb_log_file_size = 512M
key_buffer_size = 256M
query_cache_size = 0 # MySQL 8.0已弃用查询缓存
5.2 存储引擎配置
针对InnoDB引擎优化:
ini复制innodb_flush_log_at_trx_commit = 1 # 完全ACID合规
innodb_file_per_table = ON
innodb_flush_method = O_DIRECT
innodb_read_io_threads = 8
innodb_write_io_threads = 8
5.3 连接管理设置
调整连接相关参数:
ini复制max_connections = 200
wait_timeout = 300
interactive_timeout = 300
thread_cache_size = 32
6. 日常管理操作
6.1 服务启停命令
bash复制# 启动服务
sudo systemctl start mysql
# 停止服务
sudo systemctl stop mysql
# 重启服务
sudo systemctl restart mysql
# 设置开机自启
sudo systemctl enable mysql
6.2 备份与恢复
使用mysqldump进行逻辑备份:
bash复制# 完整备份
mysqldump -u admin -p --all-databases --single-transaction > full_backup.sql
# 单库备份
mysqldump -u admin -p --databases dbname > db_backup.sql
# 恢复数据
mysql -u admin -p < backup_file.sql
6.3 监控与日志
查看错误日志:
bash复制sudo tail -f /var/log/mysql/error.log
启用慢查询日志:
ini复制[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
7. 常见问题排查
7.1 连接失败问题
错误现象:"ERROR 2002 (HY000): Can't connect to local MySQL server"
排查步骤:
- 检查服务状态:
systemctl status mysql - 查看端口监听:
sudo netstat -tulnp | grep 3306 - 检查错误日志:
sudo tail -n 50 /var/log/mysql/error.log
7.2 内存不足问题
错误现象:MySQL频繁崩溃或响应缓慢
解决方法:
- 调整
innodb_buffer_pool_size - 增加swap空间:
sudo fallocate -l 4G /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile - 优化查询减少内存使用
7.3 权限问题处理
错误现象:"Access denied for user..."
解决方法:
- 使用root账户重置密码:
bash复制sudo mysqld_safe --skip-grant-tables & mysql -u root - 在MySQL中执行:
sql复制FLUSH PRIVILEGES; ALTER USER 'username'@'host' IDENTIFIED BY 'newpassword';
8. 高级配置技巧
8.1 配置主从复制
主服务器配置:
ini复制[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
从服务器配置:
ini复制[mysqld]
server-id = 2
relay_log = /var/log/mysql/mysql-relay-bin
read_only = ON
8.2 设置连接池
使用ProxySQL实现高级连接管理:
bash复制sudo apt install -y proxysql
mysql -u admin -p -h 127.0.0.1 -P 6032
配置示例:
sql复制INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,'localhost',3306);
LOAD MYSQL SERVERS TO RUNTIME;
SAVE MYSQL SERVERS TO DISK;
8.3 自动化维护脚本
创建定期优化脚本/usr/local/bin/mysql_maintenance.sh:
bash复制#!/bin/bash
mysqlcheck -u admin -p --auto-repair --optimize --all-databases
mysqldump -u admin -p --all-databases --single-transaction > /backups/mysql/full_$(date +%F).sql
find /backups/mysql/ -type f -mtime +30 -delete
设置cron任务:
bash复制0 3 * * * /usr/local/bin/mysql_maintenance.sh
在实际生产环境中部署MySQL时,我发现合理的参数配置需要根据实际负载不断调整。建议初期使用默认配置,通过监控工具收集性能数据后再针对性优化。对于关键业务系统,应考虑配置高可用方案如MySQL Group Replication或InnoDB Cluster。