MySQL作为最流行的开源关系型数据库之一,在Ubuntu系统上的安装配置是开发者必备技能。不同于Windows环境的一键安装包,Linux环境下需要更多手动配置步骤。我将结合多年运维经验,详细拆解MySQL 8.0在Ubuntu 20.04/22.04 LTS上的完整安装流程,特别针对生产环境中的安全配置要点进行深度解析。
在开始安装前,建议先执行系统更新并检查现有MySQL进程:
bash复制# 更新软件包索引
sudo apt update
# 升级已安装的软件包
sudo apt upgrade -y
# 检查是否已有MySQL进程运行
ps aux | grep mysql
若发现旧版MySQL残留进程,需要先彻底卸载(重要数据请先备份):
bash复制# 停止MySQL服务
sudo systemctl stop mysql
# 完全卸载MySQL及相关配置文件
sudo apt purge mysql-server mysql-client mysql-common -y
sudo apt autoremove -y
# 清理残留数据目录(谨慎操作)
sudo rm -rf /var/lib/mysql /etc/mysql
注意:/var/lib/mysql目录包含所有数据库文件,删除前务必确认已备份重要数据
Ubuntu官方源已提供MySQL 8.0的最新稳定版,安装命令如下:
bash复制sudo apt install mysql-server -y
安装过程不会像Windows那样弹出图形化配置向导,所有配置都需要后续通过命令行完成。安装完成后验证版本:
bash复制mysql --version
# 预期输出:mysql Ver 8.0.xx for Linux on x86_64 (Ubuntu)
MySQL 8.0安装后默认存在匿名账户,存在安全隐患。执行安全脚本进行加固:
bash复制sudo mysql_secure_installation
该脚本会引导完成以下配置:
实操技巧:生产环境建议选择"STRONG"密码策略,密码应包含大小写字母、数字和特殊字符,长度不少于12位
掌握MySQL服务管理是运维基础:
bash复制# 启动服务
sudo systemctl start mysql
# 查看状态
sudo systemctl status mysql
# 设置开机自启
sudo systemctl enable mysql
# 重启服务(修改配置后需要执行)
sudo systemctl restart mysql
MySQL主配置文件通常位于:
关键参数说明:
ini复制[mysqld]
# 监听IP(重要安全参数)
bind-address = 127.0.0.1
# 默认字符集(中文环境建议设置)
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
# 连接数配置
max_connections = 100
wait_timeout = 300
# 日志配置
general_log = 0
slow_query_log = 1
修改配置后必须重启服务生效:
bash复制sudo systemctl restart mysql
默认配置仅允许本地连接,如需远程访问需修改:
bash复制sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
找到bind-address参数:
bind-address = 0.0.0.0bind-address = 192.168.1.100安全警告:生产环境不建议设置为0.0.0.0,应限定特定IP段
不推荐直接使用root账户远程连接,应创建专用用户:
sql复制-- 登录MySQL控制台
sudo mysql -u root -p
-- 创建新用户(示例:用户名为remote,密码为Complex@Pass123)
CREATE USER 'remote'@'%' IDENTIFIED BY 'Complex@Pass123';
-- 授予权限(根据实际需要调整)
GRANT ALL PRIVILEGES ON *.* TO 'remote'@'%' WITH GRANT OPTION;
-- 刷新权限
FLUSH PRIVILEGES;
更安全的做法是限制访问来源IP:
sql复制CREATE USER 'remote'@'192.168.1.%' IDENTIFIED BY 'Complex@Pass123';
Ubuntu默认使用UFW防火墙,需放行MySQL端口:
bash复制# 查看防火墙状态
sudo ufw status
# 允许特定IP访问3306端口
sudo ufw allow from 192.168.1.100 to any port 3306
# 或允许整个子网
sudo ufw allow from 192.168.1.0/24 to any port 3306
MySQL 8.0默认启用SSL,查看当前SSL状态:
sql复制SHOW VARIABLES LIKE '%ssl%';
强制特定用户必须使用SSL连接:
sql复制ALTER USER 'remote'@'%' REQUIRE SSL;
客户端连接时需指定SSL证书:
bash复制mysql -u remote -p -h 服务器IP --ssl-ca=/path/to/ca.pem --ssl-cert=/path/to/client-cert.pem --ssl-key=/path/to/client-key.pem
启用审计插件增强安全监控:
sql复制INSTALL PLUGIN audit_log SONAME 'audit_log.so';
配置审计参数(/etc/mysql/mysql.conf.d/mysqld.cnf):
ini复制[mysqld]
plugin-load-add = audit_log.so
audit_log_format = JSON
audit_log_policy = ALL
audit_log_file = /var/log/mysql/audit.log
错误现象:ERROR 2003 (HY000): Can't connect to MySQL server
排查步骤:
systemctl status mysqlnetstat -tulnp | grep 3306ufw statussudo tail -f /var/log/mysql/error.log错误现象:ERROR 1045 (28000): Access denied
解决方案:
SELECT host,user FROM mysql.user;SHOW GRANTS FOR 'user'@'host';ini复制innodb_buffer_pool_size = 4G
ini复制max_connections = 200
thread_cache_size = 10
bash复制# 完整备份所有数据库
mysqldump -u root -p --all-databases > full_backup.sql
# 备份单个数据库
mysqldump -u root -p database_name > db_backup.sql
# 带时间戳的备份
mysqldump -u root -p database_name | gzip > db_$(date +%Y%m%d).sql.gz
创建备份脚本/usr/local/bin/mysql_backup.sh:
bash复制#!/bin/bash
BACKUP_DIR="/var/backups/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="backup_user"
MYSQL_PASS="Backup@Pass123"
mkdir -p $BACKUP_DIR
mysqldump -u$MYSQL_USER -p$MYSQL_PASS --all-databases | gzip > $BACKUP_DIR/full_$DATE.sql.gz
# 保留最近7天备份
find $BACKUP_DIR -type f -name "*.sql.gz" -mtime +7 -delete
设置cron定时任务:
bash复制sudo crontab -e
# 添加以下内容(每天凌晨2点执行)
0 2 * * * /usr/local/bin/mysql_backup.sh
sql复制-- 查看当前连接数
SHOW STATUS LIKE 'Threads_connected';
-- 查询缓存命中率
SHOW STATUS LIKE 'Qcache%';
-- InnoDB缓冲池状态
SHOW ENGINE INNODB STATUS;
-- 慢查询统计
SHOW VARIABLES LIKE 'slow_query_log';
SHOW VARIABLES LIKE 'long_query_time';
MySQL 8.0强化了Performance Schema功能:
sql复制-- 查看最耗资源的SQL
SELECT * FROM performance_schema.events_statements_summary_by_digest
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
-- 查看表IO统计
SELECT * FROM performance_schema.table_io_waits_summary_by_table
ORDER BY SUM_TIMER_WAIT DESC LIMIT 10;
经过以上完整配置,你的MySQL 8.0服务器已经具备生产环境部署的基本条件。实际运维中还需要根据业务特点持续优化配置参数,并建立完善的监控告警机制。