MarkLogic删除字段范围索引致数据库丢失 如何紧急恢复数据
MarkLogic v10.0-4.2 BUG-54775 故障即时修复方案
故障根因说明
该缺陷为MarkLogic v10.0-4.2版本官方确认问题,触发逻辑与故障表现如下:
- 触发路径:先通过admin API创建field range index(字段范围索引),后续通过admin UI删除该索引
- 故障影响:删除操作会误清空对应数据库的整条配置元数据,导致数据库直接变为不可访问状态
- 现有现状:原数据库关联的所有forests(森林)数据文件完整无损坏,直接新建同名数据库尝试挂载原有forests会失败——失败核心原因是每个forest的元数据中绑定了原数据库的唯一
database-id,新建同名数据库自动生成的ID与原ID不匹配,会被系统拦截挂载,并非forests本身损坏。
前置操作(必须先执行)
- 对所有节点的MarkLogic配置目录、forests数据存储目录做全量冷备份,避免操作失误导致数据丢失
- 停止集群所有节点的MarkLogic服务,阻断业务侧写入请求,防止操作过程中出现配置不一致
分步修复操作
- 启动集群中一个节点的MarkLogic服务,其余节点保持停止状态,登录QConsole执行管理操作,全程不要使用admin UI做数据库、索引相关配置操作
- 连接集群的App-Services端口,执行以下管理脚本拉取残留配置、重建原数据库配置:
xquery version "1.0-ml"; import module namespace admin = "http://marklogic.com/xdmp/admin" at "/MarkLogic/admin.xqy"; let $config := admin:get-configuration() (: 替换为故障数据库的原名称 :) let $db-name := "your-broken-db-name" (: 从残留配置中获取原数据库ID,禁止手动生成新ID :) let $original-db-id := admin:database-get-id($config, $db-name) (: 拉取同版本默认数据库配置模板,填入原数据库ID、原有forests列表、原安全权限配置,删除触发故障的异常字段索引配置项 :) let $fixed-db-config := admin:database-create($original-db-id, $db-name, xdmp:database("Security"), (), ()) let $attach-forests := for $forest-id in xdmp:database-forests($original-db-id) return admin:database-attach-forest($fixed-db-config, $original-db-id, $forest-id) let $new-config := admin:save-configuration($attach-forests) return $new-config
- 脚本执行完成后,检查数据库状态,确认数据库显示为
online后,逐台启动其余节点的MarkLogic服务 - 所有节点启动完成后,逐个执行
xdmp:forest-status()检查所有原有forests的挂载状态、数据一致性,若存在未自动挂载的forest,通过admin:database-attach-forest接口手动绑定即可,不要通过UI操作挂载。
未升级版本前的永久规避规则
- 所有field range index的增、删、改操作全程通过admin API执行,禁止通过admin UI操作任何字段范围索引相关配置
- 每次执行数据库配置变更前,先通过
admin:get-configuration()导出全量集群配置备份
注意:修复全程不要在admin UI上点击故障数据库的删除按钮,也不要手动修改forest目录下的元数据文件,避免触发数据块校验失败导致数据不可用。
内容的提问来源于stack exchange,提问作者Vallari Rai
相关产品推荐
相关产品推荐

