Oracle 更改dbid和dbname工具利器|DBNEWID (NID)分享
NID 實用程序是在Oracle 10g中引入的。DBNEWID 是一個數據庫實用程序,位于 $ORACLE_HOME/bin 目錄中,可以更改操作數據庫的內部數據庫標識符 (DBID) 和數據庫名稱 (DBNAME)。在引入 DBNEWID 實用程序之前,我們曾經手動創建數據庫的副本,并通過重新創建控制文件為其賦予新的數據庫名稱 (DBNAME)。但是,更改實例的內部數據庫標識符 (DBID) 是不可能的。
DBID 是數據庫的內部唯一標識符。由于恢復管理器 (RMAN)通過 DBID 區分數據庫,因此您無法在同一個 RMAN 存儲庫中同時注冊種子數據庫和手動復制的數據庫。DBNEWID 實用程序解決了這個問題。
NID 實用程序允許我們更改
- 只有數據庫的 DBID
- 只有數據庫的 DBNAME
- 數據庫的 DBNAME 和 DBID
更改數據庫的 DBID 是一個嚴肅的過程。當數據庫的 DBID 更改時,該數據庫的所有先前備份和存檔日志將變得不可用。更改 DBID 后,必須使用 RESETLOGS 選項打開數據庫,該選項會重新創建聯機重做日志并將其序列重置為 1。因此,更改 DBID 后應立即備份整個數據庫。
在不更改 DBID 的情況下更改 DBNAME 不需要您使用 RESETLOGS 選項打開,因此數據庫備份和存檔日志不會失效。但是,更改 DBNAME 確實會產生影響。您必須在數據庫名稱更改后更改 DB_NAME 初始化參數以反映新名稱。此外,您可能需要重新創建 Oracle密碼文件. 如果您恢復控制文件的舊備份(在名稱更改之前),那么您應該使用數據庫名稱更改之前的初始化參數文件和密碼文件。
NID 實用程序的參數(Oracle 10g 和Oracle 11g 中的參數相同):
$ nid help=y
- TARGET輸入用戶名和密碼,注意,該用戶必須具有sysdba的權限。譬如target=sys/oracle,當然,如果我們是在操作系統本地操作的話,可用反斜杠連接,即target=/
- REVERT指明一個失敗的DBID操作是否需要回退。默認是NO。注意,如果數據庫的DBID修改成功,該操作無法回退。該回退操作只針對失敗的DBID修改操作。
- DBNAME指定新的數據庫名。
- SETNAME默認是NO,則該數據庫將同時修改DBID和DBNAME。如果指定為YES,則該數據庫將只修改DBNAME
- LOGFILE日志文件,記錄操作信息,默認是覆蓋上個日志文件。如果APPEND設為YES的話,則這次操作信息將被追加到上個日志文件中。APPEND默認是NO。
- HELP用來提示DBNEWID的語法規則。默認為NO
一、更改 DBNAME & DBID
1、查詢數據庫的信息
- SQL> select dbid, name from v$database;
- DBID NAME
- ---------- ---------
- 1744662402 SFMv
2、 備份數據庫
備份腳本示例:
- [localhost]$cat /oracle/ods_backup/bak0.sh
- #!/bin/bash
- export ORACLE_HOME=/oracle/ods/12201
- export ORACLE_SID=orcl
- export DATE=`date +%F`
- export BACK_DIR='/oracle/ods_backup'
- mkdir -p $BACK_DIR/$DATE
- /oracle/ods/12201/bin/rman log=$BACK_DIR/$DATE/rman_backup_$DATE.log target / <<EOF
- run{
- CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
- CONFIGURE CONTROLFILE AUTOBACKUP ON;
- CONFIGURE CONTROLFILE autobackup format for device type disk to '$BACK_DIR/$DATE/CONTROLFILE.%F';
- ALLOCATE CHANNEL disk1 DEVICE TYPE DISK FORMAT '$BACK_DIR/$DATE/full_%d_%T_%s.bak';
- ALLOCATE CHANNEL disk2 DEVICE TYPE DISK FORMAT '$BACK_DIR/$DATE/full_%d_%T_%s.bak';
- ALLOCATE CHANNEL disk3 DEVICE TYPE DISK FORMAT '$BACK_DIR/$DATE/full_%d_%T_%s.bak';
- SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
- BACKUP DATABASE SKIP INACCESSIBLE FILESPERSET 10 PLUS ARCHIVELOG FILESPERSET 20 DELETE ALL INPUT;
- SQL 'ALTER SYSTEM ARCHIVE LOG CURRENT';
- CROSSCHECK BACKUP;
- CROSSCHECK ARCHIVELOG ALL;
- DELETE NOPROMPT EXPIRED BACKUP;
- DELETE NOPROMPT EXPIRED ARCHIVELOG ALL;
- DELETE NOPROMPT OBSOLETE;
- RELEASE channel disk1;
- RELEASE channel disk2;
- RELEASE channel disk3;
- }
- EOF
- export EXPIRE_DATE=`date +%F -d '+7 day ago'`
- rm -rf $BACK_DIR/$EXPIRE_DATE
- exit
3、在干凈關閉后掛載數據庫
- SQL> SHUTDOWN IMMEDIATE
- SQL> STARTUP MOUNT
4、調用 DBNEWID (NID) 實用程序
調用 DBNEWID (NID) 實用程序,使用具有 SYSDBA 權限的用戶從命令行指定 DBNAME。
- $ nid TARGET=sys/password DBNAME=new_name LOGFILE =change_dbname.log
DBNEWID 實用程序在嘗試對文件進行 I/O 之前在數據文件和控制文件的標頭中執行驗證。如果驗證成功,則 DBNEWID 會提示您確認操作(除非您指定日志文件,在這種情況下它不會提示),更改所有數據文件中的 DBID,然后退出。數據庫處于掛載狀態,但尚不可用。
5、更新pfile文件并創建密碼文件(如有必要)
此實用程序不會更改 pfile 中的數據庫名稱,因此請手動更改 pfile 中的數據庫名稱 (DB_NAME) 并創建密碼文件(如有必要)。
- 掛載數據庫SQL> STARTUP MOUNT
- 以 RESETLOGS 模式打開數據庫,恢復正常使用SQL> ALTER DATABASE OPEN RESETLOGS;
- SQL> select dbid, name from v$database;
- DBID NAME---------- ---------
- 1748860243 SFM_DEV
6、進行新的數據庫備份
由于您已重置聯機重做日志,因此舊的備份和歸檔日志在當前的數據庫中不再可用。
二、Changing only DBNAME
在命令行上調用該實用程序;您必須同時指定 DBNAME 和 SETNAME 參數。
- $ nid TARGET=SYS/password DBNAME=newname SETNAME=YES
DBNEWID 在嘗試對文件進行 I/O 之前在控制文件(不是數據文件)的頭中執行驗證。如果驗證成功,則 DBNEWID 會提示確認,更改控制文件中的數據庫名稱,然后退出。DBNEWID 成功完成后,數據庫仍處于掛載狀態但尚不可用。
如果操作成功,更新init文件后啟動數據庫。
如果操作失敗,要恢復更改,請再次運行 DBNEWID 實用程序,指定 REVERT 關鍵字。
- $ nid TARGET=SYS/password REVERT=YES LOGFILE= backout.log
三、Changing only DBID
在命令行上調用該實用程序;不要指定 DBNAME。
- $ nid TARGET=SYS/password
如果操作成功,掛載數據庫并用resetlogs打開。如果操作失敗,要恢復更改,請再次運行 DBNEWID 實用程序,指定 REVERT 關鍵字。
- $ nid TARGET=SYS/password REVERT=YES LOGFILE=backout.log
























