首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

誤 UPDATE 正式庫密碼字段緊急恢復實戰:利用測試庫備份表與 PL/SQL 遊標精準回滾

     編輯:Oracle 資料庫相關知識

事故現場

  • 兩用戶:COM (正式庫)、COMTEST (測試庫),均有表 TAW_RM_USER (含 PASSWORD、USER_ID)。
  • 誤執行:UPDATE COM.TAW_RM_USER SET PASSWORD='123456'; 全表密碼被覆蓋。
  • 最近 DMP 備份 10 天前,期間新增用戶、修改其他字段,直接導入覆蓋不可行。

恢復方案 (5 步走)

  1. 備份測試庫現狀:
    CREATE TABLE COMTEST.TAW_RM_USER_BAK AS SELECT * FROM COMTEST.TAW_RM_USER;
  2. 清空測試庫目標表:
    DROP TABLE COMTEST.TAW_RM_USER;
  3. 導入 DMP 到測試庫:
    IMP COMTEST/COMTEST FILE=backup.dmp TABLES=TAW_RM_USER FROMUSER=COM TOUSER=COMTEST

    得到 10 天前正式庫密碼快照 (表名 COMTEST.TAW_RM_USER)。

  4. PL/SQL 遊標精準回寫正式庫:
    DECLARE
      CURSOR C_SRC IS SELECT USER_ID, PASSWORD FROM COMTEST.TAW_RM_USER;
      V_USER_ID COMTEST.TAW_RM_USER.USER_ID%TYPE;
      V_PWD     COMTEST.TAW_RM_USER.PASSWORD%TYPE;
    BEGIN
      OPEN C_SRC;
      LOOP
        FETCH C_SRC INTO V_USER_ID, V_PWD;
        EXIT WHEN C_SRC%NOTFOUND;
        UPDATE COM.TAW_RM_USER
           SET PASSWORD = V_PWD
         WHERE USER_ID = V_USER_ID;  -- 僅匹配舊用戶,新增用戶不受影響
      END LOOP;
      CLOSE C_SRC;
      COMMIT;
    END;
  5. 恢復測試庫:
    DROP TABLE COMTEST.TAW_RM_USER;
    CREATE TABLE COMTEST.TAW_RM_USER AS SELECT * FROM COMTEST.TAW_RM_USER_BAK;

關鍵設計點

  • 主鍵關聯:以 USER_ID 為唯一鍵,避免姓名重複導致錯誤更新。
  • 增量保護:WHERE USER_ID = V_USER_ID 確保僅更新 DMP 存在的用戶,期間新增用戶密碼保持現狀。
  • 其他字段不動:僅回寫 PASSWORD,郵箱、電話等近期變更完整保留。

事後建議

  • 正式庫啟用 DDL觸發器 審計所有 UPDATE 操作,關鍵表加 FGA 精細審計。
  • 建立「只讀」賬號供日常查詢,DML 操作需臨時提權審批。
  • 備份頻次提升至每日增量 + 每周完全,縮小 RPO。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved