引言
运维Oracle数据库的过程中,由于各种各样的原因,例如早期的命名不规范,可能需要重新修改Oracle数据库的实例名。如果想修改Oracle数据库的实例名,可能会想到以下方法:
- 使用逻辑备份重新创建个规范化的实例名,将数据还原回去
- 手动复制数据库文件副本,重建控制文件并改名
使用逻辑备份的方法比较麻烦,耗时也长,而使用手动重建控制文件又有些复杂,那么还有没有其他方法呢?
答案是有,它就是DBNEWID。
DBNEWID介绍
在早期,虽然可以通过手动复制数据库文件副本,然后重建控制文件来修改数据库名(DBNAME),但并不能给数据库指定新的标识符(DBID),DBID是数据库内部的唯一标识符。由于RMAN程序是通过DBID来区分数据库的,这也就导致无法在同一个RMAN存储库中同时注册这两个数据库。Oracle为了解决该问题,引入了一个新的实用程序,它就是DBNEWID。
DBNEWID实用程序可以修改以下内容:
- 数据库的DBID
- 数据库的DBNAME
- 数据库的DBNAME和DBID
注:DBNEWID实用程序不会修改全局数据库名
语法
nid ::=
nid TARGET = [username] / [password] [@service_name]
[REVERT = { YES | NO }
|DBNAME = new_db_name [SETNAME = { YES | NO }]]
[LOGFILE = logfile [APPEND = { YES | NO }] [HELP = { YES | NO }]]
说明:
- TARGET 指定用于连接数据库的用户名和密码。如果使用的是操作系统身份验证,则可以使用斜杠(/)连接。
- REVERT 指定遇到DBID更改失败时是否恢复旧的DBID,默认为NO,表示不进行恢复;值为YES时,表示恢复失败的DBID更改。注意,REVERT参数只能在DBNEWID程序遇到错误时使用。
- DBNAME 指定新的数据库名。
- SETNAME 指定更改数据库名的同时是否更新DBID。默认为NO,表示更改数据库名并更新DBID;值为YES时,表示仅修改数据库名。
- LOGFILE 指定是否将控制台的内容写入到指定的文件中。默认值为NO,表示不写入;值为YES时,表示将控制台内容写入到指定的文件中,且控制台不再显示信息。
- APPEND 指定是否以追加的形式将控制台内容写入到指定的文件中。默认值为NO,表示以覆盖的形式,也就是每次执行会覆盖现有的日志文件;值为YES时,表示以追加的形式写入到现有的日志文件中。
- HELP 指定是否在控制台打印DBNEWID的语法,默认值为NO,表示不显示DBNEWID的使用语法;值为YES时,将DBNEWID的语法打印到控制台中。
DBNEWID注意事项
DBID修改后,应立即重新执行RMAN备份,因为之前的RMAN创建的备份和归档日志中的DBID是修改前的,这也就导致无法再使用这些来恢复数据库。在打开数据库时,必须使用resetlogs打开,它会重建redo log并将其重置为1。DBNAME修改后,不需要使用resetlogs打开数据库,并且数据库备份和归档日志不会失效,但修改DBNAME后必须要修改初始化参数来映射新的DBNAME。
方案
以下示例均采用虚拟机搭建Oracle 11.2.0.4版本作为演示。
仅修改DBNAME
1、备份参数文件和口令文件
如果仅修改DBNAME,则Oracle旧的RMAN备份还是可以使用的。在执行修改之前,就需要备份参数文件和口令文件,以便后续可能需要恢复旧的控制文件和备份。
进入sqlplus窗口中
[oracle@localhost ~]$ sqlplus / as sysdba
以spfile创建pfile文件
SQL> create pfile from spfile;
进入到dbs目录
[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
备份口令文件
[oracle@localhost dbs]$ cp orapworcl orapworcl.20220419
备份参数文件
[oracle@localhost dbs]$ cp initorcl.ora initorcl.ora.20220419
[oracle@localhost dbs]$ cp spfileorcl.ora spfileorcl.ora.20220419
2、启动到MOUNT模式
DBNEWID实用程序需要在MOUNT模式下执行,因此我们就将数据库切换到MOUNT模式下。
立即关闭数据库
SQL> shutdown immediate
启动数据库至MOUNT模式
SQL> startup mount
3、修改DBNAME
启动至MOUNT后,我们使用DBNEWID实用程序修改DBNAME,我这里将orcl实例改为orcl52。
[oracle@localhost dbs]$ nid target=/ dbname=orcl52 setname=yes
4、修改参数文件及口令文件
执行完DBNAME后,我们修改spfile文件。
由于spfile是二进制文件,不能直接修改,所以就先修改pfile文件,然后再使用pfile文件创建spfile。
编辑pfile文件
[oracle@localhost dbs]$ vim initorcl.ora
将initorcl.ora中的db_name由orcl改为新的orcl52,然后保存并退出。
*.db_name='orcl52'
进入到sqlplus命令
[oracle@localhost dbs]$ sqlplus / as sysdba
创建spfile文件
SQL> create spfile from pfile;
重建口令文件
[oracle@localhost dbs]$ orapwd file=$ORACLE_HOME/dbs/orapworcl force=y;
5、启动数据库
全部配置好后,启动数据库
SQL> startup
仅修改DBID
注意,对于生产环境来说,修改DBID后,需要立即做一次全库备份,因为之前的RMAN备份因DBID的改变已不再可用。非生产环境自行是否需要进行备份。
1、启动到MOUNT模式
DBNEWID实用程序需要在MOUNT模式下执行,因此我们就将数据库切换到MOUNT模式下。
进入sqlplus命令窗口
[oracle@localhost ~]$ sqlplus / as sysdba
立即关闭数据库
SQL> shutdown immediate
启动数据库至MOUNT模式
SQL> startup mount
2、修改DBID
启动至MOUNT模式后,直接使用NID修改。
[oracle@localhost ~]$ nid target=/
3、启动数据库
由于DBID发生了改变,此时我们必须使用resetlogs打开数据库。
进入到sqlplus命令窗口中
[oracle@localhost ~]$ sqlplus / as sysdba
启动数据库至MOUNT
SQL> startup mount
以resetlogs打开数据库
SQL> alter database open resetlogs;
修改DBNAME和DBID
1、启动到MOUNT模式
DBNEWID实用程序需要在MOUNT模式下执行,因此我们就将数据库切换到MOUNT模式下。
进入sqlplus命令窗口
[oracle@localhost ~]$ sqlplus / as sysdba
立即关闭数据库
SQL> shutdown immediate
启动数据库至MOUNT模式
SQL> startup mount
2、修改DBNAME和DBID
启动至MOUNT模式后,直接使用NID修改。
[oracle@localhost ~]$ nid target=/ dbname=orcl52;
3、修改参数文件及口令文件
执行完NID实用程序后,我们修改参数文件及口令文件。
进入sqlplus命令窗口
[oracle@localhost ~]$ sqlplus / as sysdba
使用spfile创建pfile
SQL> create pfile from spfile;
退出sqlplus窗口并进入到dbs目录下
[oracle@localhost ~]$ cd $ORACLE_HOME/dbs
编辑pfile文件
[oracle@localhost dbs]$ vim initorcl.ora
将initorcl.ora中的db_name由orcl改为新的orcl52,然后保存退出。
*.db_name='orcl52'
再次进入到sqlplus命令窗口
[oracle@localhost dbs]$ sqlplus / as sysdba
创建spfile文件
SQL> create spfile from pfile;
重建口令文件
[oracle@localhost dbs]$ orapwd file=$ORACLE_HOME/dbs/orapworcl force=y;
4、启动数据库
配置好后,我们以resetlogs方式启动数据库。
进入到sqlplus命令窗口
[oracle@localhost dbs]$ sqlplus / as sysdba
启动到MOUNT模式
SQL> startup mount
以resetlogs打开数据库
SQL> alter database open resetlogs;
结束
至此,三种修改方式都已经提供,接下来就是连接到数据库中验证是否修改完成的过程,就不再阐述。
评论区