从宝塔卸载 MySQL 到重装那两小时,我学会了先 `mysqldump` 再点确认键

小助手
小助手 版主圣羽星庭 勋望元宿志愿先锋
社区管理
站长杂谈 66 浏览 0 回复

上周脑子一抽,看宝塔面板里 MySQL 5.7 的"卸载"按钮不顺眼,心想反正要升 8.0,干脆干净重装。点完确认才想起来:我他妈数据目录还在 /www/server/data 里,但面板卸载走的是官方脚本,一键清得干干净净。坐在电脑前愣了三十秒,后背全是汗。

最后靠凌晨三点的自动备份苟住,丢了六小时的新注册用户。这事给我整出三条铁律,现在贴显示器边上:

一、卸载前先看脚本里藏了什么

宝塔的卸载不是单纯 yum remove,它会扫配置文件里的数据路径。但很多人(比如我)早年改过 my.cnfdatadir 到外挂盘,面板有时候读不准,或者你手动拖过文件,权限早乱了。现在我的习惯是:卸载前先 ps aux | grep mysql 确认进程,再 cat /etc/my.cnf 拍照存档,最后把数据目录整个 cp -a 到另一块盘。-a 保留权限,这点很重要,MySQL 对目录权限敏感得要死,777 反而启动报错。

二、建表时字符集和排序规则写死,别信默认

重装完 8.0 导入数据,发现部分表报错 Unknown collation: 'utf8mb4_0900_ai_ci'。查了半天,原来 5.7 的备份里有些表显式指定了 8.0 的排序规则——估计是之前用 8.0 客户端导出来的,或者某次升级残留。现在我建表必带完整尾巴:

CREATE TABLE `log` (
  `id` bigint unsigned NOT NULL AUTO_INCREMENT,
  ...
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

排序规则用 unicode_ci 不用 0900_ai_ci,兼容 5.7 和 8.0,省得跨版本迁移时抓瞎。别嫌麻烦,写进你的数据库迁移脚本模板里,以后复制粘贴。

三、升级场景先做"脏读"测试

5.7 到 8.0 不止字符集有坑。我另一次升级(对,我有两次,别问)遇到 sql_mode 默认多了 ONLY_FULL_GROUP_BY,线上几个统计查询直接炸。现在我的流程是:新装目标版本 → 导一份脱敏数据 → 跑一遍核心业务 SQL → 看慢查询日志有没有新冒出来的异常。这叫"脏读"测试,不验证功能正确性,只验证能不能跑通。比正式上线后用户帮你报错体面多了。

最后说个冷门的:卸载残留

宝塔卸载 MySQL 后,/www/server/mysql 目录有时候不会删干净,里面混着旧版本的 lib 文件。如果你紧接着装 8.0,PHP 的 pdo_mysql 扩展可能链到旧的 libmysqlclient,连上数据库就段错误。我遇到过 PHP-FPM 子进程反复崩溃,dmesg 里一堆 segfault,最后是把 /www/server/mysql 手动清掉重装才解决。

现在我的服务器做任何"移除/重装/升级"操作前,必开 screen 会话,全程录 script 日志,命令前面加注释说明要干嘛。不是为了炫技,是凌晨三点脑子不清醒的时候,能看提示问自己一句:备份了吗?路径对吗?回滚方案在哪?

你们有没有过手滑卸载的惊魂时刻?我那次六小时数据,最后是靠阿里云快照 + 本地备份双保险捞回来的,现在三备份策略,钱包在滴血,但睡得着了。

评论0
回复 · 0
还没有回复
微信客服 微信客服