通過dbms_backup_restore修改oracle的dbid

selectshen發表於2017-05-09
    某些應用場景需要修改oracle的dbid,oracle自帶的nid工具可以修改dbname,產生新的dbid,但不能直接指定dbid。通過跟蹤nid的執行過程,發現它主要是呼叫了dbms_backup_restore下的儲存過程,而dbms_backup_restore.nidbegin是可以指定新的dbid的。

跟蹤的方法:
--測試前請做好備份
1.關閉資料庫並啟動到mount狀態
shutdown immediate;
startup mount;
2.執行nid target=sys/password
在Change database ID of database CT6601? (Y/[N]) =>這一步時暫停
3.跟蹤nid
sqlplus / as sysdba
select b.spid from v$session a,v$process b where a.paddr=b.addr and a.program like 'dbnewid%';
--ospid是上面的查詢結果
oradebug setospid 31423
oradebug TRACEFILE_NAME
oradebug event 10046 trace name context forever ,level 12;
4.步驟2的nid程式繼續執行,直到完成
5.檢視跟蹤檔案的SQL

以下是手動設定dbid的大概方法:
--測試環境是11.2.0.4
--測試前請做好備份。

1.關閉資料庫並啟動到mount狀態
shutdown immediate;
startup mount;
2.檢視當前的dbname和dbid
select dbid ,name  from v$database;
3.修改dbid
--設定新的dbname,dbid   
exec dbms_backup_restore.nidbegin('CT6601', 'CT6601', '1963719358','1959733503',  0, 0, 0);   
     
var v_skipped number;
var v_idchged number;
var v_nmchged number;
--執行以下的查詢結果
select ' exec dbms_backup_restore.nidprocessdf('||file#||',0,:v_skipped, :v_idchged, :v_idchged);' from v$datafile;
--執行以下的查詢結果    
select 'exec dbms_backup_restore.nidprocessdf('||file#||',1,:v_skipped, :v_idchged, :v_idchged);' from v$tempfile;
    
exec dbms_backup_restore.nidprocesscf(:v_idchged, :v_nmchged);
exec  dbms_backup_restore.nidend;
4.關閉資料庫,並resetlogs開啟資料庫。
shutdown immediate;
startup mount;
alter database open resetlogs;



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-2138760/,如需轉載,請註明出處,否則將追究法律責任。

相關文章