1. CentOS 9环境准备与MySQL安装基础
在CentOS 9上安装MySQL前,需要先确保系统环境符合要求。与早期版本不同,CentOS 9默认使用DNF作为包管理器,这为我们提供了更高效的软件管理方式。首先通过以下命令更新系统:
sudo dnf update -y sudo dnf install epel-release -yMySQL官方为RHEL系发行版提供了专门的YUM仓库,我们需要先添加这个仓库:
sudo rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm注意:如果遇到GPG密钥验证失败,可运行
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022后再试
验证仓库是否添加成功:
sudo dnf repolist enabled | grep "mysql.*-community.*"2. MySQL服务器核心安装步骤
2.1 安装MySQL社区版服务器
执行以下命令安装MySQL服务器核心组件:
sudo dnf install mysql-community-server -y安装完成后,系统会自动创建mysql用户和必要的系统目录。可以通过以下命令验证安装版本:
mysqld --version2.2 初始化MySQL服务
首次启动前需要初始化数据目录:
sudo mysqld --initialize --user=mysql这个操作会:
- 创建系统表空间(ibdata1)
- 初始化系统数据库(mysql, sys等)
- 在日志中生成临时root密码(查看方法见下文)
启动MySQL服务并设为开机自启:
sudo systemctl start mysqld sudo systemctl enable mysqld2.3 获取初始密码并修改
查看初始化时生成的临时密码:
sudo grep 'temporary password' /var/log/mysqld.log使用临时密码登录:
mysql -uroot -p立即修改root密码(MySQL 8.0要求强密码):
ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewStrong@Pass123'; FLUSH PRIVILEGES;3. MySQL基础安全配置
3.1 运行安全加固脚本
MySQL提供了安全配置向导:
sudo mysql_secure_installation该脚本会引导完成以下安全设置:
- 密码强度验证插件配置
- 匿名用户删除
- 禁止root远程登录
- 测试数据库移除
- 权限表重载
3.2 防火墙配置
允许MySQL默认端口(3306)通过防火墙:
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload生产环境建议仅对特定IP开放,可使用
--add-rich-rule规则
4. MySQL配置文件优化
4.1 主要配置文件位置
CentOS 9上MySQL的主要配置文件位于:
/etc/my.cnf:主配置文件/etc/my.cnf.d/:配置片段目录/var/lib/mysql/:数据目录
4.2 基础性能调优
编辑配置文件:
sudo vi /etc/my.cnf在[mysqld]段添加以下优化参数:
[mysqld] # 内存相关 innodb_buffer_pool_size = 1G # 建议为物理内存的50-70% innodb_log_file_size = 256M innodb_log_buffer_size = 16M # 连接相关 max_connections = 200 thread_cache_size = 10 # 查询缓存 query_cache_type = 1 query_cache_size = 64M # 其他优化 innodb_file_per_table = ON innodb_flush_log_at_trx_commit = 2 # 平衡性能与可靠性修改后重启服务生效:
sudo systemctl restart mysqld5. 常见问题解决方案
5.1 安装失败问题排查
问题1:Error: Unable to find a match: mysql-community-server
解决方案:
- 确认已正确添加MySQL仓库
- 清除DNF缓存:
sudo dnf clean all - 检查CentOS 9版本:
cat /etc/redhat-release
问题2:GPG key retrieval failed
解决方案:
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-20225.2 连接与权限问题
问题3:Access denied for user 'root'@'localhost'
解决方案:
- 停止MySQL服务:
sudo systemctl stop mysqld - 启动安全模式:
sudo mysqld_safe --skip-grant-tables & - 无密码登录:
mysql -u root - 重设密码(如上文所述)
问题4:Can't connect to local MySQL server
解决方案:
# 检查服务状态 sudo systemctl status mysqld # 查看错误日志 sudo tail -50 /var/log/mysqld.log # 常见原因包括: # - 端口冲突 # - 数据目录权限问题 # - 配置文件语法错误5.3 性能优化建议
慢查询监控:
SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 2; SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';定期维护:
# 优化所有表 mysqlcheck -u root -p --auto-repair --optimize --all-databases备份策略:
# 每日全量备份 mysqldump -u root -p --all-databases > /backup/mysql-full-$(date +%F).sql
6. 进阶配置与工具集成
6.1 远程访问配置
如需允许远程连接,需执行:
CREATE USER 'remoteuser'@'%' IDENTIFIED BY 'StrongPassword123!'; GRANT ALL PRIVILEGES ON *.* TO 'remoteuser'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;同时在/etc/my.cnf中注释掉:
# bind-address = 127.0.0.16.2 工作台管理工具安装
安装MySQL官方工作台:
sudo dnf install mysql-workbench-community -y6.3 性能监控工具
安装常用监控工具:
sudo dnf install mytop -y使用示例:
mytop -u root -p7. 版本升级与维护
7.1 小版本升级
通过DNF直接升级:
sudo dnf update mysql-community-server -y7.2 大版本升级注意事项
- 先备份所有数据库
- 查看官方升级指南
- 按顺序升级相关组件
- 运行
mysql_upgrade工具
7.3 日常维护命令
# 查看运行状态 sudo systemctl status mysqld # 查看资源占用 mysqladmin -u root -p processlist # 检查表状态 mysqlcheck -u root -p --all-databases8. 实际应用技巧
8.1 批量导入数据优化
mysql -u root -p dbname < dump.sql优化参数:
[mysqldump] quick max_allowed_packet=256M net_buffer_length=32K8.2 数据库字符集设置
创建数据库时指定UTF-8:
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;8.3 定时任务配置
使用cron定期备份:
0 3 * * * /usr/bin/mysqldump -u root -pPassword123! --all-databases | gzip > /backup/mysql-$(date +\%F).sql.gz9. 安全加固建议
定期审计用户权限:
SELECT user, host FROM mysql.user; SHOW GRANTS FOR 'username'@'host';启用审计日志:
[mysqld] plugin-load-add = audit_log.so audit_log_format = JSON audit_log_policy = ALLSSL连接配置:
ALTER USER 'remoteuser'@'%' REQUIRE SSL;
10. 性能监控与优化
10.1 关键指标监控
-- 查看当前连接数 SHOW STATUS LIKE 'Threads_connected'; -- InnoDB缓冲池命中率 SELECT (1 - (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_reads') / (SELECT variable_value FROM performance_schema.global_status WHERE variable_name = 'Innodb_buffer_pool_read_requests')) * 100 AS buffer_pool_hit_ratio;10.2 索引优化建议
分析未使用索引:
SELECT * FROM sys.schema_unused_indexes;10.3 查询优化技巧
使用EXPLAIN分析慢查询:
EXPLAIN SELECT * FROM large_table WHERE condition;优化建议包括:
- 添加适当索引
- 避免SELECT *
- 优化JOIN操作
- 合理使用子查询