1. 为什么选择Ubuntu 22.04部署MySQL
作为目前最流行的LTS版本之一,Ubuntu 22.04(Jammy Jellyfish)为数据库服务提供了稳定的运行环境。其内置的APT源中已经包含了MySQL 8.0的最新稳定版本,这使得安装过程变得异常简单。我在生产环境中多次使用这个组合,发现其内存管理优化和内核调度策略特别适合数据库工作负载。
注意:虽然Ubuntu源中的MySQL版本经过充分测试,但会比官方源稍晚几天更新。对版本敏感的用户可以考虑后续介绍的官方源安装方式。
2. 安装前的系统准备
2.1 硬件需求评估
根据我的经验,即使是测试环境也建议至少满足:
- 2核CPU(生产环境建议4核以上)
- 4GB内存(重要系统建议8GB+)
- 50GB存储空间(考虑日志和备份)
可以通过以下命令检查当前资源:
bash复制free -h
df -h
lscpu
2.2 系统更新与依赖检查
在开始安装前,务必执行:
bash复制sudo apt update
sudo apt upgrade -y
sudo apt install -y gnupg wget lsb-release
这确保了软件源索引是最新的,并且安装了必要的工具包。我遇到过因为系统时钟不同步导致安装失败的情况,建议同时运行:
bash复制sudo timedatectl set-ntp true
3. MySQL安装的三种方式
3.1 使用Ubuntu官方源安装(推荐新手)
最简单的安装方式:
bash复制sudo apt install -y mysql-server
安装完成后会自动创建systemd服务,可以通过以下命令验证:
bash复制sudo systemctl status mysql
3.2 使用MySQL官方仓库安装
如果需要最新版本:
bash复制wget https://dev.mysql.com/get/mysql-apt-config_0.8.24-1_all.deb
sudo dpkg -i mysql-apt-config_0.8.24-1_all.deb
sudo apt update
sudo apt install -y mysql-server
这种方式可以让你选择具体的MySQL版本(如8.0或5.7系列)。
3.3 使用Docker容器部署
对于需要隔离环境的场景:
bash复制docker run --name mysql -e MYSQL_ROOT_PASSWORD=yourpassword -p 3306:3306 -d mysql:8.0
重要:生产环境务必配置持久化卷和数据备份策略。
4. 初始安全配置
4.1 运行安全向导
MySQL安装后必须执行:
bash复制sudo mysql_secure_installation
这个交互式脚本会引导你完成:
- 设置root密码强度验证策略
- 移除匿名用户
- 禁止root远程登录
- 删除测试数据库
- 重新加载权限表
4.2 防火墙配置
Ubuntu默认使用ufw,建议开启:
bash复制sudo ufw allow 3306/tcp
sudo ufw enable
如果使用云服务,还需要在安全组中开放对应端口。
5. 关键配置文件详解
5.1 /etc/mysql/my.cnf 主配置文件
典型的生产环境配置示例:
ini复制[mysqld]
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
log-error=/var/log/mysql/error.log
pid-file=/var/run/mysqld/mysqld.pid
# 内存配置
innodb_buffer_pool_size = 4G # 建议为物理内存的50-70%
key_buffer_size = 256M
# 连接设置
max_connections = 200
wait_timeout = 600
# 日志配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2
log_queries_not_using_indexes = 1
5.2 配置调优建议
根据服务器规格调整:
- 小型服务器(2核4G):
ini复制innodb_buffer_pool_size = 2G max_connections = 100 - 中型服务器(4核8G):
ini复制innodb_buffer_pool_size = 4G max_connections = 200 - 大型服务器(8核16G+):
ini复制innodb_buffer_pool_size = 12G max_connections = 500
修改配置后需要重启服务:
bash复制sudo systemctl restart mysql
6. 用户管理与权限设置
6.1 创建管理用户
避免使用root账户日常操作:
sql复制CREATE USER 'admin'@'%' IDENTIFIED BY 'StrongPassword123!';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
FLUSH PRIVILEGES;
6.2 应用账户最佳实践
为每个应用创建独立用户:
sql复制CREATE USER 'webapp'@'localhost' IDENTIFIED BY 'AppPassword456!';
GRANT SELECT, INSERT, UPDATE, DELETE ON webapp_db.* TO 'webapp'@'localhost';
7. 备份与恢复策略
7.1 使用mysqldump
基本备份命令:
bash复制mysqldump -u admin -p --all-databases > full_backup.sql
推荐添加以下参数:
bash复制mysqldump -u admin -p \
--single-transaction \
--routines \
--triggers \
--events \
--hex-blob \
--quick \
--all-databases | gzip > full_backup_$(date +%F).sql.gz
7.2 自动备份脚本示例
创建/usr/local/bin/mysql_backup.sh:
bash复制#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%F)
USER="admin"
PASSWORD="yourpassword"
mkdir -p $BACKUP_DIR/$DATE
mysqldump -u $USER -p$PASSWORD --all-databases | gzip > $BACKUP_DIR/$DATE/full_backup.sql.gz
# 保留最近7天备份
find $BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
添加到cron定时任务:
bash复制0 2 * * * /usr/local/bin/mysql_backup.sh
8. 性能监控与优化
8.1 常用监控命令
查看运行状态:
sql复制SHOW STATUS LIKE 'Threads_connected';
SHOW ENGINE INNODB STATUS;
检查慢查询:
sql复制SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
8.2 安装MySQLTuner
这个Perl脚本能给出优化建议:
bash复制wget https://raw.githubusercontent.com/major/MySQLTuner-perl/master/mysqltuner.pl
chmod +x mysqltuner.pl
./mysqltuner.pl
9. 常见问题排查
9.1 连接数耗尽
错误现象:
code复制ERROR 1040 (HY000): Too many connections
解决方案:
- 临时增加连接数:
sql复制SET GLOBAL max_connections = 300; - 永久修改配置:
ini复制max_connections = 300
9.2 内存不足
错误日志中出现:
code复制[ERROR] InnoDB: Cannot allocate memory for the buffer pool
解决方法:
- 检查当前配置:
sql复制SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; - 适当降低缓冲池大小或增加服务器内存
10. 高可用方案简介
10.1 主从复制配置
在主服务器上:
sql复制CREATE USER 'repl'@'%' IDENTIFIED BY 'ReplPassword789!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
在my.cnf中添加:
ini复制[mysqld]
server-id = 1
log_bin = /var/log/mysql/mysql-bin.log
binlog_format = ROW
在从服务器上:
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='ReplPassword789!',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS= 107;
START SLAVE;
10.2 使用MySQL Router
官方提供的中间件,可以实现读写分离:
bash复制sudo apt install -y mysql-router
配置示例:
ini复制[routing:read_write]
bind_address = 0.0.0.0
bind_port = 6446
destinations = master:3306
routing_strategy = first-available
[routing:read_only]
bind_address = 0.0.0.0
bind_port = 6447
destinations = slave1:3306,slave2:3306
routing_strategy = round-robin
11. 升级与迁移注意事项
11.1 小版本升级
对于Ubuntu源安装的MySQL:
bash复制sudo apt update
sudo apt upgrade mysql-server
11.2 大版本迁移
建议流程:
- 在新服务器上安装新版本
- 使用mysqldump导出数据
- 在新服务器上导入
- 测试应用兼容性
- 切换DNS或IP
重要:MySQL 5.7到8.0的升级需要特别注意密码认证插件的变化,建议先阅读官方升级指南。
12. 安全加固建议
12.1 定期审计
安装审计插件:
sql复制INSTALL PLUGIN audit_log SONAME 'audit_log.so';
配置审计规则:
ini复制[mysqld]
audit_log_format=JSON
audit_log_policy=ALL
12.2 加密连接配置
生成SSL证书:
bash复制sudo mysql_ssl_rsa_setup --uid=mysql
强制使用SSL:
sql复制ALTER USER 'admin'@'%' REQUIRE SSL;
13. 容器化部署进阶
13.1 持久化数据卷
正确挂载数据目录:
bash复制docker run --name mysql \
-v /path/to/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-d mysql:8.0
13.2 自定义配置
挂载配置文件:
bash复制docker run --name mysql \
-v /path/to/my.cnf:/etc/mysql/my.cnf \
-v /path/to/datadir:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourpassword \
-d mysql:8.0
14. 性能测试工具
14.1 使用sysbench
安装测试工具:
bash复制sudo apt install -y sysbench
执行测试:
bash复制sysbench oltp_read_write \
--db-driver=mysql \
--mysql-host=localhost \
--mysql-port=3306 \
--mysql-user=admin \
--mysql-password=yourpassword \
--mysql-db=sbtest \
--tables=10 \
--table-size=100000 \
prepare
15. 替代方案评估
15.1 MySQL分支比较
| 特性 | MySQL官方版 | MariaDB | Percona Server |
|---|---|---|---|
| 兼容性 | 官方标准 | 高度兼容 | 完全兼容 |
| 性能优化 | 基础 | 中等 | 高度优化 |
| 高可用方案 | InnoDB集群 | Galera | XtraDB集群 |
| 监控工具 | 企业版提供 | 有限 | PMM集成 |
15.2 云数据库考虑
对于生产环境,也可以考虑:
- AWS RDS MySQL
- Azure Database for MySQL
- Google Cloud SQL
这些托管服务省去了维护工作,但成本较高且定制性受限。