1. 项目背景与需求解析
最近在CentOS Stream 9服务器上部署新应用时,遇到了MySQL 8.4.7版本与现有环境不兼容的问题。更棘手的是,默认安装将数据库文件放在了系统盘,而我们需要将其迁移到大容量数据盘。经过多次实践,我总结出一套完整的解决方案,不仅能彻底卸载现有MySQL,还能实现自定义路径安装。
这个需求在数据库运维中非常典型——当遇到版本冲突、存储空间不足或性能优化时,我们经常需要"重装+迁移"的组合操作。传统做法需要手动执行十几个步骤,而通过脚本化处理,整个过程可以压缩到5分钟内完成,且保证数据安全无损。
2. 环境准备与安全防护
2.1 系统环境确认
首先通过以下命令确认系统版本和MySQL状态:
cat /etc/redhat-release # 确认是CentOS Stream 9 mysql --version # 确认当前安装的是8.4.7 df -h # 查看磁盘分区情况重要提示:操作前务必确认备份了所有数据库!即使是一键脚本,数据安全永远是第一位的。
2.2 备份策略实施
推荐使用mysqldump进行全量备份:
mkdir -p /backup/mysql mysqldump -u root -p --all-databases > /backup/mysql/full_backup_$(date +%F).sql对于大型数据库,可以考虑物理备份:
systemctl stop mysqld rsync -av /var/lib/mysql /backup/mysql/ systemctl start mysqld3. 彻底卸载MySQL 8.4.7
3.1 标准卸载流程
常规卸载命令如下:
dnf remove mysql-server mysql-client mysql-common但这种方式往往会有残留,我们需要更彻底的清理方案。
3.2 深度清理脚本
创建clean_mysql.sh脚本:
#!/bin/bash # 停止服务 systemctl stop mysqld # 移除软件包 dnf remove -y mysql-* # 清理残留文件 rm -rf /var/lib/mysql rm -rf /var/log/mysqld.log rm -rf /etc/my.cnf rm -rf /etc/my.cnf.d # 删除用户和组 userdel mysql groupdel mysql # 清理依赖项 dnf autoremove -y执行权限和运行:
chmod +x clean_mysql.sh ./clean_mysql.sh3.3 验证卸载结果
检查是否还有残留:
rpm -qa | grep mysql find / -name "*mysql*"4. 自定义路径安装MySQL 8.4.7
4.1 准备数据盘
假设我们要安装到/data/mysql:
mkdir -p /data/mysql chown -R mysql:mysql /data/mysql4.2 官方源安装
添加MySQL官方YUM源:
rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm安装指定版本:
dnf install -y mysql-server-8.4.74.3 配置文件定制
编辑/etc/my.cnf:
[mysqld] datadir=/data/mysql socket=/data/mysql/mysql.sock [client] socket=/data/mysql/mysql.sock4.4 初始化数据库
使用新路径初始化:
mysqld --initialize --user=mysql --datadir=/data/mysql查看临时密码:
grep 'temporary password' /var/log/mysqld.log5. 服务配置与优化
5.1 安全加固
运行安全脚本:
mysql_secure_installation建议设置:
- 修改root密码
- 移除匿名用户
- 禁止root远程登录
- 移除测试数据库
- 重载权限表
5.2 服务管理
配置systemd单元文件:
systemctl enable mysqld systemctl start mysqld systemctl status mysqld5.3 性能调优
根据服务器配置调整/etc/my.cnf:
innodb_buffer_pool_size = 4G innodb_log_file_size = 512M max_connections = 2006. 数据恢复与验证
6.1 恢复备份数据
mysql -u root -p < /backup/mysql/full_backup_2023-11-15.sql6.2 验证安装结果
检查安装路径:
mysql -e "SHOW VARIABLES LIKE 'datadir';"验证版本:
mysql -e "SELECT VERSION();"7. 常见问题解决方案
7.1 初始化失败问题
错误现象:
[ERROR] --initialize specified but the data directory exists and is not writable解决方法:
chown -R mysql:mysql /data/mysql rm -rf /data/mysql/*7.2 服务启动失败
查看详细日志:
journalctl -xe常见原因:
- SELinux阻止访问
- 目录权限不正确
- 配置文件语法错误
7.3 连接socket问题
错误信息:
Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'解决方案:
ln -s /data/mysql/mysql.sock /var/lib/mysql/mysql.sock8. 一键脚本整合
将上述流程整合为reinstall_mysql.sh:
#!/bin/bash # 参数定义 MYSQL_VERSION="8.4.7" DATA_DIR="/data/mysql" BACKUP_DIR="/backup/mysql" # 备份阶段 mkdir -p $BACKUP_DIR mysqldump -u root -p --all-databases > $BACKUP_DIR/full_backup_$(date +%F).sql # 卸载阶段 systemctl stop mysqld dnf remove -y mysql-* rm -rf /var/lib/mysql /var/log/mysqld.log /etc/my.cnf /etc/my.cnf.d userdel mysql groupdel mysql dnf autoremove -y # 安装阶段 rpm -Uvh https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm dnf install -y mysql-server-$MYSQL_VERSION # 配置阶段 mkdir -p $DATA_DIR chown -R mysql:mysql $DATA_DIR cat > /etc/my.cnf <<EOF [mysqld] datadir=$DATA_DIR socket=$DATA_DIR/mysql.sock [client] socket=$DATA_DIR/mysql.sock EOF # 初始化 mysqld --initialize --user=mysql --datadir=$DATA_DIR chown -R mysql:mysql $DATA_DIR # 服务启动 systemctl enable mysqld systemctl start mysqld # 获取临时密码 TEMP_PWD=$(grep 'temporary password' /var/log/mysqld.log | awk '{print $NF}') echo "临时密码: $TEMP_PWD"使用说明:
- 保存为reinstall_mysql.sh
- chmod +x reinstall_mysql.sh
- ./reinstall_mysql.sh
- 根据输出的临时密码登录并修改
9. 后续维护建议
- 定期备份策略:
# 每天全量备份 0 2 * * * mysqldump -u root -pPASSWORD --all-databases > /backup/mysql/full_$(date +\%F).sql- 监控磁盘空间:
df -h /data- 性能监控设置:
# 安装监控工具 dnf install -y mytop- 定期维护:
-- 每周执行 ANALYZE TABLE; OPTIMIZE TABLE;