解 决sybase 用 户 数 据 库

不 能 进 入 故 障 的 一 种 方 法

国 家 气 象 中 心
李 集 明, 邓 莉

---- 几 天 前, 我 的 一 位 同 事 在 启 动sybase 数 据 库 时, 由 于 疏 忽, 忘 记 首 先 打 开 装 有 用 户 数 据 库(daydb) 的 外 置 硬 盘 驱 动 器。 导 致 数 据 库 引 擎 在 启 动 时 出 现 错 误:

	udactivate: error starting virtual disk 5
	(启动虚拟磁盘5错误)
	Open '/wkdisk/data1.dat', No suck file or directory
	(打开'/wkdisk/data1.dat',没有此文件或目录)
	udstario: vdn 5 has not been setup
	Error: 840,severity 17,state 1
	Device 'datadev1' has not been 
    correctly activated at startup time
	 (在启动时设备'datadev1'没有正确地激活)
	Unable to proceed with the recorvery 
    of dbid(6) because of precious error
	(因为上述错误,dbid(6)不能执行恢复进程)
	Database 'daydb' cannot be opened
	(数据库'daydb'不能打开)
	An earlier attempt at recorvery marked it 'suspect'
	(以前的一个恢复动作失败导致标识其‘可疑’)

---- 这 样, 由 于 驻 留 有 数 据 库 设 备 文 件 的 磁 盘 驱 动 器 未 开 启, 导 致 在sybase 数 据 库 启 动 时 不 能 正 确 地 激 活 相 应 地 数 据 库 虚 拟 设 备, 从 而 造 成 用 户 数 据 库‘dbid(6)’ 即‘daydb’ 不 能 打 开, 无 法 进 入。

---- 出 现 此 错 误 后, 我 们 首 先 用isql 以 数 据 库 管 理 员 的 身 份 登 录 到 数 据 库 中, 尝 试 进 入daydb 数 据 库, 系 统 显 示 此 数 据 库 为‘ 可 疑 的’, 不 能 打 开, 请 看 系 统 错 误 记 录 文 件errorlog 查 找 错 误。 而errorlog 文 件 中 记 录 的 错 误 即 为 数 据 库 引 擎 启 动 时 显 示 的 错 误。 我 们 又 尝 试 用 数 据 库 检 查 维 护 命 令dbcc checkdb 来 解 决, 系 统 同 样 显 示“ 此 数 据 库 为‘ 可 疑 的’, 不 能 打 开。”, 利 用dbcc checkalloc( 检 查 数 据 库 的 页 面 分 配) 也 失 败 了, 似 乎 只 剩 下 使 用dbcc repairdb(daydb,dropdb) 命 令( 修 复 受 损 的 数 据 库, 这 条 命 令 实 际 上 就 是 删 除 此 受 损 数 据 库, 因 为 受 损 数 据 库 不 能 用drop database 命 令 删 除) 这 条 途 径 了-- 在sybase 数 据 库 的 随 机 技 术 文 档 中 也 是 这 样 说 的。 这 样 势 必 要 从 数 据 库 的 备 份 带 上 恢 复 上 次 该 数 据 库 的 备 份。 但 是, 在 几 天 前 刚 刚 对daydb 数 据 库 作 过 较 大 地 更 新, 而 更 新 后 还 没 有 来 得 及 备 份, 所 以, 这 条 途 径 实 乃 万 不 得 已 时 的 措 施。

---- 这 时, 猛 然 想 到 在sybase 系 统 中 起 重 要 作 用 的 系 统 表, 系 统 反 复 显 示daydb 数 据 库 为‘ 可 疑 的’, 此 标 记 很 可 能 记 录 在 冒 个 系 统 表 中, 而 改 掉 此 标 志 就 有 可 能 重 新 获 得 对daydb 数 据 库 的 控 制 权, 想 到 这 里, 我 们 立 刻 查 阅sybase 数 据 库 随 机 技 术 文 档 中 有 关 系 统 表 的 描 述, 在sysdatabases 系 统 表 中 找 到 表 示 数 据 库 状 态 的 字 段‘status', 细 看 后 面 的 注 解, 果 然:256 – database is suspect , 这 就 说 明 此 字 段 中, 数 字256 表 示 数 据 库 为‘ 可 疑 的’。 查 看 系 统 中daydb 数 据 库 相 应 字 段 的 数 值 为324, 这 是 因 为status 字 段 表 示 数 据 库 的 各 种 属 性, 如:bulkcopy , recorvery time 等, 每 种 属 性 都 有 一 对 应 的 数 值, 各 种 数 据 库 现 在 存 在 属 性 的 数 值 之 和 即 为status 字 段 的 数 值。 用isql 以 数 据 库 管 理 员 的 身 份(sa) 进 入sybase 数 据 库 系 统, 系 统 表 存 储 在master 数 据 库 中 即sa 进 入sybase 的 默 认 数 据 库, 用update 命 令 更 改sysdatabases 系 统 表, 把daydb 数 据 库 的status 字 段 的 值 改 为68(324-256)。 然 后 关 闭sybase 数 据 库 系 统(shutdown), 再 重 新 启 动sybase 数 据 库 引 擎, 系 统 显 示 中 有recorvery dbid(6), 等 一 两 分 钟, 系 统 启 动 完 成, 无 错 误 提 示。 进 入 数 据 库 系 统, 使 用use daydb 进 入daydb 数 据 库, 成 功 !, 检 索 一 些 数 据 表, 正 常 ! 至 此, 故 障 顺 利 解 决。

---- 总 结 这 次 故 障 的 发 生 和 解 决, 笔 者 提 醒 同 样 肩 负 数 据 库 管 理 责 任 的 同 仁, 第 一, 在 启 动 数 据 库 时, 一 定 要 先 把 存 有 数 据 库 设 备 文 件 的 磁 盘 驱 动 器 打 开; 第 二, 当 发 生 类 似 故 障 时, 不 要 慌 张, 匆 忙 地 删 除 受 损 数 据 库; 应 仔 细 查 阅 系 统 有 关 技 术 文 档, 特 别 是 要 关 注 系 统 表 和 系 统 的 存 储 过 程, 往 往 可 以 通 过 对 系 统 表 的 修 改 排 除 故 障; 第 三, 数 据 库 重 要 更 新 后 一 定 要 及 时 做 备 份。

---- 上 例 故 障 排 除,sybase 数 据 库 版 本 为10.0.1, 操 作 系 统 为sun sorlaris 2.5