Sybase SQL Anywhere 是Sybase 公 司 開 發 的 一 種 小 型 數 據 庫 產 品, 有 單 用 戶 版 和 多 用 戶 版, 可 安 裝 在Win95、Win98、NT、Netware 等 平 台。SQL Anywhere 的SQL 語 句 基 本 上 和Sybase Adaptive Server 一 致; 而 且 功 能 也 相 當 強;PowerBuilder5.0 以 上 的 版 本 都 自 帶 一 個SQL Anywhere。 因 此, 對 使 用 筆 記 本 或 單 機 的 開 發 人 員 來 說, 選 擇SQL Anywhere 作 為 數 據 庫 來 開 發 應 用 程 序 是 十 分 方 便 的, 故SQL Anywhere 得 到 了 普 遍 的 應 用。 但 是 突 然 斷 電 或 不 正 常 關 機 都 有 可 能 破 壞SQL Anywhere 的 數 據, 由 此 造 成 很 大 的 損 失, 下 面 就 來 介 紹 一 種 恢 復 被 破 壞 的 數 據 庫 的 方 法。
SQL Anywhere 數 據 庫 由 後 綴 分 別 為.db 和.log 的 兩 個 文 件 組 成。 其 中.db 的 文 件 是 用 來 存 放 數 據 庫 信 息( 包 括 表 結 構、 視 圖、 數 據 等)。 而.log 文 件 是 個 日 志 文 件, 用 來 記 錄 用 戶 每 一 次 對 數 據 庫 有 影 響 的 操 作, 例 如 創 建 或 刪 除 表、 視 圖、 觸 發 器 等 對 象, 插 入、 刪 除、 修 改 表 中 的 數 據 等。 所 以 只 要 把.log 文 件 的 內 容 轉 換 成 一 條 條 的 S Q L 語 句, 然 後 再 建 一 個 空 的 數 據 庫, 再 執 行 這 些 S Q L 語 句, 則 恢 復 數 據 的 問 題 就 解 決 了。Sybase 公 司 提 供 了 幾 個 實 用 程 序 來 完 成 以 上 功 能。
現 假 設 數 據 庫 系 統 文 件 分 別 名 為mydb.db 和mydb.log。 如 果mydb.db 已 被 破 壞。 現 在 創 建 一 個 新 的 數 據 庫, 假 設 文 件 分 別 名 為new.db 和new.log。
用Sybase 提 供 的dbtranw.exe, DB32W.EXE, rtsqlw.exe 等 實 用 程 序 來 完 成 恢 復 工 作, 步 驟 如 下 表。
步 驟 命 令 功 能 1. Dbtranw -r -k -y mydb.log db.sql 把.log 文 件 的 內 容 轉 換 成 的 S Q L 語 句 2. Attrib -r mydb.db 修 改 只 讀 文 件mydb.db 的 屬 性 為 可 寫 3. Attrib -r mydb.log 修 改 只 讀 文 件mydb.log 的 屬 性 為 可 寫 4. Copy new.db mydb.db 用 新 的 空 庫 文 件 覆 蓋 被 破 壞 的 舊 庫 文 件 5. Copy new.log mydb.log 用 新 的 日 志 文 件 覆 蓋 舊 的 日 志 文 件 6. DB32W.EXE -d mydb.db 啟 動 數 據 庫SQL Anywhere 7. Rtsqlw -q -c "userid=dba; passWord=sql" read db.sql 執 行 從.log 文 件 中 倒 出 來 的 S Q L 語 句
其 中 第 一 步 的 功 能 是 把 舊 的 日 志 文 件 轉 換 成 S Q L 語 句, 並 放 在 一 個 名 為db.sql 的 文 件 中, 特 別 注 意 它 只 能 在 第 五 步 之 前 操 作, 否 則 日 志 文 件 會 被new.log 所 覆 蓋, 而 導 致 無 法 恢 復 數 據。 最 後 一 步 的 功 能 是 從 文 件db.sql 中 讀 取SQL 語 句 並 執 行, 假 設 數 據 庫 的 用 戶 名 為dba, 而 口 令 為sql。 有 關 各 個 命 令 及 參 數 據 的 更 詳 細 的 用 法 可 以 查 看 相 應 的 幫 助。 在 此 提 醒 用 戶 注 意:.log 文 件 不 能 隨 便 刪 除, 否 則 恢 復 的 數 據 就 不 完 整。