dbaplus社群 6小时前
突发!rm -rf数据目录,MySQL故障导致大数据平台彻底瘫痪
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文记录了一次因MySQL备库故障,用户误删主库数据目录,导致整个大数据平台(CDH)瘫痪的事故。文章详细阐述了在业务不能停止的情况下,如何通过锁定数据库、定位删除文件句柄、恢复共享表空间、独立表空间及表结构文件,并进行校验等一系列技术手段来完成数据恢复。同时,作者深刻反思了此次事故暴露出的元数据管理脆弱性、运维流程漏洞以及老旧版本MySQL带来的风险,并提出了严格权限控制、多级备份和自动化巡检等预防措施,强调了预防优于修复的重要性。

💡 事故起因与影响:由于MySQL 5.5备库故障,用户在修复过程中误删了主库数据目录,导致以MySQL为元数据库的大数据平台(CDH)彻底瘫痪,Hive/Impala查询无法进行,暴露了元数据管理和运维流程的严重漏洞。

🛠️ 关键恢复技术:在业务不停歇的情况下,通过设置数据库只读、锁定表、利用`lsof | grep deleted`命令定位被删除但仍持有句柄的文件,并从`/proc/$pid/fd/`中恢复`ibdata1`、`ib_logfile`、`.ibd`文件。同时,从备库复制`.frm`文件以恢复表结构,并通过`ALTER TABLE ... DISCARD TABLESPACE`和`ALTER TABLE ... IMPORT TABLESPACE`进行校验。

⚙️ 技术原理剖析:Linux删除文件时仅移除索引,若进程仍持有句柄,数据块不会立即释放。InnoDB引擎在运行时会保持`.ibd`文件的句柄打开,即使文件被删除,其内容仍可被访问。MySQL 5.6+默认开启`innodb_file_per_table`,而MySQL 8.0+已将表结构信息整合到系统表空间。

🛡️ 经验教训与预防:此次事故凸显了MySQL作为核心生产组件的脆弱性。建议采取严格的权限控制(如sudo审计)、多级备份策略(本地、云、日志)、自动化巡检(如表空间校验),并优先升级老旧版本MySQL,以避免技术债和工具链脱节带来的风险。

詹姆斯邦德007 2025-07-20 08:03 广东

元数据管理脆弱性与运维流程漏洞,一下子全部暴露出来了……

MySQL作为CDH的元数据库,集中管理Hive表结构、分区信息、数据位置及权限配置,是Hive/Impala高效查询的基石,这不用户由于MySQL5.5.6备库故障,需要修复,而误删除主库数据目录,导致大数据平台彻底瘫痪。

本次分享故障的修复过程及最终复盘,本次恢复的关键就是业务不能停止,以最快的速度,恢复持有的句柄,详细的过程如下



一、锁定数据库

    -- 
    设置数据库只读
    SET GLOBAL read_only = 1
    -- 锁表阻止写入
    FLUSH TABLES WITH READ LOCK;


    二、定位删除文件句柄

      mysql> SHOW VARIABLES LIKE 'datadir'
      +---------------+------------------------+
      | Variable_name | Value                  |
      +---------------+------------------------+
      | datadir       | /usr/local/mysql/data/ |
      +---------------+------------------------+


      查看被删除但未释放的文件句柄
      lsof | grep deleted | grep \
      "/usr/local/mysql-5.5.56-linux-glibc2.5-x86_64/data" \
      | awk '{print $2, $5, $10}' \
      > /tmp/deleted_files.txt


      三、分类恢复数据文件


      1、恢复共享表空间文件

        # 恢复ibdata1(句柄号以实际输出为准)
        cat /proc/$pid/fd/64 > /var/lib/data/ibdata1
        chown mysql:mysql /var/lib/data/ibdata1


        # 恢复日志文件(如ib_logfile0)
        cat /proc/$pid/fd/65 > /var/lib/data/ib_logfile0
        chown mysql:mysql /var/lib/data/ib_logfile0


        2、恢复独立表空间

          示例:恢复表mydb.tab1的ibd文件
          cat /proc/$pid/fd/66 > /var/lib/data/mydb/tab1.ibd
          chown mysql:mysql /var/lib/data/mydb/tab1.ibd


          3、恢复表结构文件

            --从备库复制.frm文件(需与原表结构一致)
            cp /path/to/backup/mydb/tab1.frm /var/lib/data/mydb/
            chown mysql:mysql /var/lib/data/mydb/tab1.frm
            如果遇到.frm文件,通过创建表产生


            四、校验frm与ibd文件一致性

              步骤1:解除表空间绑定(需表已存在)
              --删除当前.ibd文件链接
              ALTER TABLE 表名 DISCARD TABLESPACE;


              步骤2:重新绑定并校验
              -- 系统自动校验文件与.frm是否匹配
              ALTER TABLE 表名 IMPORT TABLESPACE; 


              五、技术原理


              1、Linux文件删除机制

              rm 仅移除文件索引,当进程仍持有句柄时,数据仍存于磁盘,通过 /proc//fd 可访问。


              2、MySQL依赖句柄

              InnoDB引擎在运行时保持 .ibd 文件句柄打开,删除后文件状态为 deleted,但内容未清除。


              3、版本差异

              MySQL 5.6+:默认开启 innodb_file_per_table,优先使用独立 .ibd 文件

              MySQL 8.0+:取消 .frm 文件,表结构存于系统表空间(mysql.ibd)


              六、总结

              此次事故暴露了元数据管理脆弱性与运维流程漏洞,CDH高度依赖MySQL,元数据丢失直接导致集群瘫痪,需以“核心生产组件”级别防护MySQL。

              预防优于修复,严格权限控制(如sudo审计)、多级备份(本地+云+日志)、自动化巡检(表空间校验)是避免类似灾难的关键。

              技术债代价高昂,老旧版本(如MySQL 5.5)需优先升级,避免工具链脱节。


              作者丨詹姆斯邦德007

              来源丨公众号:IT邦德(ID:jeamesDB

              dbaplus社群欢迎广大技术人员投稿,投稿邮箱:editor@dbaplus.cn

              阅读原文

              跳转微信打开

              Fish AI Reader

              Fish AI Reader

              AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

              FishAI

              FishAI

              鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

              联系邮箱 441953276@qq.com

              相关标签

              MySQL 大数据平台 CDH 故障恢复 运维安全
              相关文章