數據庫遷移/克隆場景:目標庫需創建與源庫密碼完全一致的用戶,但源庫密碼明文未知(應用配置文件加密、人員離職等),且不允許修改密碼(會導致下游應用斷連)。
Oracle數據字典DBA_USERS.PASSWORD存儲的是加密密文(10g為DES/AES混合,11g+為SHA-1/SHA-256)。ALTER USER ... IDENTIFIED BY VALUES 'encrypted_hash'語法允許直接導入密文,繞過明文驗證。
SET LONG 100
SELECT username, password
FROM dba_users
WHERE username IN ('JW_PUB1', 'PORTAL');
輸出示例:
| USERNAME | PASSWORD |
|---|---|
| JW_PUB1 | 1141B75987409AA1 |
| PORTAL | A9B80747F4D3AF98 |
-- 若用戶不存在
CREATE USER jw_pub1 IDENTIFIED BY VALUES '1141B75987409AA1';
CREATE USER portal IDENTIFIED BY VALUES 'A9B80747F4D3AF98';
-- 若用戶已存在(需先解鎖)
ALTER USER jw_pub1 IDENTIFIED BY VALUES '1141B75987409AA1' ACCOUNT UNLOCK;
ALTER USER portal IDENTIFIED BY VALUES 'A9B80747F4D3AF98' ACCOUNT UNLOCK;
-- 使用應用原有連接串測試
sqlplus jw_pub1/original_password@target_db
-- 或由應用中間件發起連接測試
| 源版本 | 目標版本 | 可行性 | 備註 |
|---|---|---|---|
| 10g | 10g/11g/12c/19c | ✅ 完全兼容 | 密文格式相同 |
| 11g | 11g/12c/19c | ✅ 完全兼容 | 11g引入區分大小寫密文 |
| 12c/19c | 12c/19c | ✅ 兼容 | 支援SHA-256/PBKDF2 |
| 11g+ | 10g | ❌ 不可行 | 低版本無法解析高版本密文 |
-- 導出僅用戶定義(含密文)
expdp system/xxx DIRECTORY=dp_dir DUMPFILE=users.dmp \
SCHEMAS=jw_pub1,portal INCLUDE=USER
-- 導入時自動保留密文
impdp system/xxx DIRECTORY=dp_dir DUMPFILE=users.dmp \
SCHEMAS=jw_pub1,portal
注意:INCLUDE=USER導出的CREATE USER語句已包含IDENTIFIED BY VALUES子句,導入無需額外操作。
.dmp或查詢結果勿留存於非受控環境,用完即銷毀。IDENTIFIED BY VALUES是DBA在「不知明文、不可改密、必須同步」三約束下的殺手鐧。配合Data PumpINCLUDE=USER,可實現百萬用戶級的無感密碼遷移。