Oracle使用NID调整数据库的DBNAME和DBID

我们知道,在数据库内部,数据库的DBNAME和DBID是数据库标识符,其中,DBID更是数据库的唯一标识符,如果要重新调整数据库的名字,一般是要重建控制文件,为数据库赋予新的名称 (DBNAME);
但是,更改实例的内部数据库标识符 (DBID) 是不可能的,这样对于恢复管理器 (RMAN)来说,由于是通过 DBID来区分数据库的,因此无法在同一个RMAN存储库中同时注册种子数据库和重建之后的数据库。
对此,Oracle专门提供的数据库名字修改工具NID(DBNEWID),解决了这个问题。
NID(DBNEWID)实用程序是在Oracle 10g中引入的,是一个数据库实用程序,位于 $ORACLE_HOME/bin 目录中,可以更改操作数据库的内部数据库标识符 (DBID) 和数据库名称 (DBNAME)。

NID用途:
只修改数据库的DBID;
只修改数据库的DBNAME;
同时修改数据库的DBNAME和DBID;

注意:

  1. 如果仅调整DBNAME,调整之后,数据库是不需要使用RESETLOGS选项就可以正常打开,数据库备份和存档日志都不会失效。调整DBNAME的影响是: 需要调整初始化参数文件中的db_name参数;需要重新创建 Oracle密码文件.
  2. 如果仅调整数据库的DBID,由于更改数据库的DBID是一个全局的操作,一旦数据库的DBID发生改变,对应该数据库的所有备份和存档日志将不再可用,所以在更改 数据库DBID之后,必须使用RESETLOGS选项打开数据库,那么数据库会将联机重做日志的序列重置为1,因此,建议在调整数据库的DBID之后应立即对整个数据库进行备份。

NID 实用程序的参数:

[oracle@dkfdg ~]$ nid -help

DBNEWID: Release 19.0.0.0.0 - Production on Thu Dec 22 17:45:01 2022

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Keyword     Description                    (Default)
----------------------------------------------------
TARGET      Username/Password              (NONE)
DBNAME      New database name              (NONE)
LOGFILE     Output Log                     (NONE)
REVERT      Revert failed change           NO
SETNAME     Set a new database name only   NO
APPEND      Append to output log           NO
HELP        Displays these messages        NO

[oracle@dkfdg ~]$ 

. 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

如下在19c数据库上使用nid进行数据库DBID和DBNAME参数的调整:

  1. 建议调整之前对数据库进行全量备份
    建议在调整DBNAE和DBID前对数据库进行全备,全备备份脚本示例:
[oracle@dkfdg ~]$cat /oracle/ods_backup/bak0.sh 
#!/bin/bash 
export ORACLE_HOME=/u01/app/oracle/product/19.3.0/dbhome_1
export ORACLE_SID=dkf006 
export DATE=`date +%F` 
export BACK_DIR='/u01/app/rmanbak' 
mkdir -p $BACK_DIR/$DATE 
//u01/app/oracle/product/19.3.0/dbhome_1/bin/rman log=$BACK_DIR/$DATE/rman_backup_$DATE.log target / <<EOF 
run{ 
    CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 3 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'; 
    RELEASE channel disk1; 
    RELEASE channel disk2; 
    RELEASE channel disk3; 
} 
EOF 
exit 

场景一、仅仅调整数据库的DBID
1、查询数据库的信息

SQL> select dbid, name from v$database; 
DBID      NAME 
---------- --------- 
2651711443 dkf006 

2、正常关闭数据库,并将数据库启动到mount状态

SQL> SHUTDOWN IMMEDIATE 
SQL> STARTUP MOUNT 
  1. 直接调用NID工具,连接数据库,不需要指定DBNAME
[oracle@dkfdg ~]$ nid target=sys/oracle

DBNEWID: Release 19.0.0.0.0 - Production on Thu Dec 22 17:29:24 2022

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to database DKF006 (DBID=2651711443)

Connected to server version 19.3.0

Control Files in database:
    +DATA/DKF006/CONTROLFILE/current.261.1101088595

Change database ID of database DKF006? (Y/[N]) => Y

Proceeding with operation
Changing database ID from 2651711443 to 2674719348
    Control File +DATA/DKF006/CONTROLFILE/current.261.1101088595 - modified
    Datafile +DATA/DKF006/DATAFILE/system.257.110108848 - dbid changed
    Datafile +DATA/DKF006/DATAFILE/sysaux.258.110108852 - dbid changed
    Datafile +DATA/DKF006/DATAFILE/undotbs1.259.110108853 - dbid changed
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.266.110108879 - dbid changed
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.267.110108879 - dbid changed
    Datafile +DATA/DKF006/DATAFILE/users.260.110108853 - dbid changed
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.268.110108879 - dbid changed
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/system.272.110108943 - dbid changed
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/sysaux.273.110108943 - dbid changed
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/undotbs1.271.110108943 - dbid changed
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/users.275.110108945 - dbid changed
    Datafile +DATA/DKF006/DATAFILE/test.280.110739837 - dbid changed
    Datafile +DATA/DKF006/TEMPFILE/temp.265.110108860 - dbid changed
    Datafile +DATA/DKF006/DBCED86261CB7148E0550A002762E1A4/TEMPFILE/temp.269.110108882 - dbid changed
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/TEMPFILE/temp.274.110108943 - dbid changed
    Control File +DATA/DKF006/CONTROLFILE/current.261.1101088595 - dbid changed
    Instance shut down

Database ID for database DKF006 changed to 2674719348.
All previous backups and archived redo logs for this database are unusable.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database ID.
DBNEWID - Completed succesfully.
  1. 操作成功,打开数据库,会提示数据库需要用resetlogs打开:
SQL> startup
ORACLE instance started.

Total System Global Area 1241510080 bytes
Fixed Size                  9134272 bytes
Variable Size             402653184 bytes
Database Buffers          822083584 bytes
Redo Buffers                7639040 bytes
Database mounted.
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open

SQL> 
  1. 使用resetlogs打开数据库:
SQL> alter database open RESETLOGS;

Database altered.

SQL> 

6.回退方案:
如果操作失败,要恢复更改,执行成功也可以在resetlogs前进行恢复,再次运行 DBNEWID 实用程序,指定 REVERT 关键字。
正常关闭数据库,并启动到mount状态

[oracle@dkfdg ~]$ nid TARGET=sys/oracle  REVERT=YES LOGFILE=rollback.log 

由于数据库我已经resetlogs打开,已无法恢复,此时恢复会有报错:

DBNEWID: Release 19.0.0.0.0 - Production on Thu Dec 22 18:01:55 2022
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to database DKF006 (DBID=2674719348)

NID-00128: Cannot revert change of database, change not in progress

Reversion of database changes failed during validation - database is intact.
DBNEWID - Completed with validation errors.

[oracle@dkfdg ~]$ 

二、仅仅调整数据库的DBNAME
1、查询数据库的信息

SQL> select dbid, name from v$database; 
DBID      NAME 
---------- --------- 
2651711443 dkf006 

2、正常关闭数据库,并将数据库启动到mount状态

SQL> SHUTDOWN IMMEDIATE 
SQL> STARTUP MOUNT 

3、使用 DBNEWID (NID) 工具更改数据库的DBNAME

[oracle@dkfdg ~]$ nid TARGET=sys/oracle DBNAME=dkf007 SETNAME=YES 

DBNEWID: Release 19.0.0.0.0 - Production on Thu Dec 22 18:16:10 2022

Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

Connected to database DKF006 (DBID=2674719348)

Connected to server version 19.3.0

Control Files in database:
    +DATA/DKF006/CONTROLFILE/current.261.1101088595

Change database name of database DKF006 to DKF007? (Y/[N]) => Y

Proceeding with operation
Changing database name from DKF006 to DKF007
    Control File +DATA/DKF006/CONTROLFILE/current.261.1101088595 - modified
    Datafile +DATA/DKF006/DATAFILE/system.257.110108848 - wrote new name
    Datafile +DATA/DKF006/DATAFILE/sysaux.258.110108852 - wrote new name
    Datafile +DATA/DKF006/DATAFILE/undotbs1.259.110108853 - wrote new name
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/system.266.110108879 - wrote new name
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/sysaux.267.110108879 - wrote new name
    Datafile +DATA/DKF006/DATAFILE/users.260.110108853 - wrote new name
    Datafile +DATA/DKF006/86B637B62FE07A65E053F706E80A27CA/DATAFILE/undotbs1.268.110108879 - wrote new name
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/system.272.110108943 - wrote new name
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/sysaux.273.110108943 - wrote new name
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/undotbs1.271.110108943 - wrote new name
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/DATAFILE/users.275.110108945 - wrote new name
    Datafile +DATA/DKF006/DATAFILE/test.280.110739837 - wrote new name
    Datafile +DATA/DKF006/TEMPFILE/temp.265.110108860 - wrote new name
    Datafile +DATA/DKF006/DBCED86261CB7148E0550A002762E1A4/TEMPFILE/temp.269.110108882 - wrote new name
    Datafile +DATA/DKF006/DBCEFC8A3ACE81CBE0550A002762E1A4/TEMPFILE/temp.274.110108943 - wrote new name
    Control File +DATA/DKF006/CONTROLFILE/current.261.1101088595 - wrote new name
    Instance shut down

Database name changed to DKF007.
Modify parameter file and generate a new password file before restarting.
Succesfully changed database name.
DBNEWID - Completed succesfully.

DBNEWID 在尝试对文件进行 I/O 之前在控制文件(不是数据文件)的头中执行验证。如果验证成功,则 DBNEWID 会提示确认,更改控制文件中的数据库名称,然后退出,DBNEWID 成功完成后,数据库会自动进行关闭。

4、更新pfile文件并创建密码文件(如有必要)
此实用程序不会更改 pfile 中的数据库名称,因此请手动更改 pfile 中的数据库名称 (DB_NAME) 并创建密码文件(如有必要)。

如果操作失败,要恢复更改,请再次运行 DBNEWID 实用程序,指定 REVERT 关键字。

[oracle@dkfdg ~]$ nid TARGET=sys/oracle  REVERT=YES LOGFILE=rollback.log 

三、同时更改数据库的DBNAME和DBID
1、查询数据库的信息

SQL> select dbid, name from v$database; 
DBID      NAME 
---------- --------- 
2651711443 dkf006 

2、正常关闭数据库,并将数据库启动到mount状态

SQL> SHUTDOWN IMMEDIATE 
SQL> STARTUP MOUNT 

3、使用 DBNEWID (NID) 工具更改数据库的DBNAME和DBID
注意:DBNEWID 实用程序在尝试对文件进行 I/O 之前在数据文件和控制文件的标头中执行验证。如果验证成功,则 DBNEWID 会提示确认操作(除非您指定日志文件,在这种情况下它不会提示),更改所有数据文件中的 DBID,数据库会进行关闭,然后退出。

$ nid TARGET=sys/password DBNAME=dkf007 LOGFILE =change_dbname.log 

4、更新spfile文件并创建密码文件(如有必要)
此实用程序不会更改 spfile 中的数据库名称,因此请手动更改 spfile 中的数据库名称 (DB_NAME) 并创建密码文件(如有必要)。

完.

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kuifeng.dong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值