在这篇文章中,我们将讨论如何更改RAC 数据库的DB_NAME。
由于DB_NAME不仅仅是像DB_UNIQUE_NAME这样的简单数据库参数,所以我们需要做更多的工作。如果您在 SPFILE 中修改DB_NAME,您将收到错误 ORA-32016。
对于单实例,您应该选择: Oracle 如何更改单实例数据库的 DB_NAME?。
更改 RAC 数据库的数据库名称有两个主要部分。
- 更改所有文件的数据库名称
- 修改集群上的配置
A. 更改所有文件的数据库名称
我们在本节中所做的是为了以后顺利更改所有数据库文件上的数据库名称。首先,让我们看看目前的状态。
[oracle@primary01 ~]$ srvctl status database -d orclcdb
Instance ORCLCDB1 is running on node primary01
Instance ORCLCDB2 is running on node primary02
[oracle@primary01 ~]$ srvctl config database -d orclcdb
Database unique name: ORCLCDB
Database name: ORCLCDB
Oracle home: /u01/app/oracle/product/19.0.0/db_1
Oracle user: oracle
Spfile: +DATA/ORCLCDB/PARAMETERFILE/spfile.275.1053776653
Password file: +DATA/ORCLCDB/PASSWORD/pwdorclcdb.256.1053773741
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: ORCLCDB1,ORCLCDB2
Configured nodes: primary01,primary02
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
如您所见,DB_NAME和DB_UNIQUE_NAME都是ORCLCDB。我想将DB_NAME更改为TESTCDB
1. 创建 PFILE
我们创建一个纯文本参数文件,以便轻松修改参数。为了防止覆盖原始参数文件(如果有),我们将所有参数输出到另一个文件。
[oracle@primary01 ~]$ sqlplus / as sysdba
...
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string +DATA/ORCLCDB/PARAMETERFILE/sp
file.275.1053776653
SQL> create pfile='?/dbs/init@.ora-new' from spfile;
File created.
SQL> exit;
如果你不知道什么是“?” 或“@”符号在上述语句中的含义,您可以参考:Oracle Database 中使用了哪些符号。
2. 停止和禁用 RAC 数据库
我们将启动数据库以供以后在此实例中独占使用,因此我们需要从集群中停止并禁用它。
[oracle@primary01 ~]$ srvctl stop database -d orclcdb
[oracle@primary01 ~]$ srvctl status database -d orclcdb
Instance ORCLCDB1 is not running on node primary01
Instance ORCLCDB2 is not running on node primary02
[oracle@primary01 ~]$ srvctl disable database -d orclcdb
3. PFILE启动挂载
为了在这个实例中独占使用数据库,我们必须在没有集群的情况下启动它。
[oracle@primary01 ~]$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora-new
...
#*.cluster_database=true
注释掉参数后,CLUSTER_DATABASE回到默认值FALSE。
如果您不禁用CLUSTER_DATABASE,则更改将失败并显示NID-00120: Database should bemounted exclusive。
我们通过参数文件启动数据库挂载。
[oracle@primary01 ~]$ sqlplus / as sysdba
...
Connected to an idle instance.
SQL> startup mount pfile='?/dbs/init@.ora-new';
ORACLE instance started.
...
Database mounted.
4.更改数据库名称
通过使用nid,一个 DBNEWID 实用程序,我们现在可以更改数据库名称。在执行之前请确保环境变量都是正确的。
[oracle@primary01 ~]$ echo $ORACLE_HOME
/u01/app/oracle/product/19.0.0/db_1
[oracle@primary01 ~]$ echo $ORACLE_SID
ORCLCDB1
[oracle@primary01 ~]$ nid target=sys/password dbname=TESTCDB
DBNEWID: Release 19.0.0.0.0 - Production on Thu Dec 3 19:19:34 2020
Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved.
Connected to database ORCLCDB (DBID=2824835543)
Connected to server version 19.3.0
Control Files in database:
+DATA/ORCLCDB/control01.ctl
+DATA/ORCLCDB/control02.ctl
Change database ID and database name ORCLCDB to TESTCDB? (Y/[N]) => Y
Proceeding with operation
Changing database ID from 2824835543 to 2799630695
Changing database name from ORCLCDB to TESTCDB
Control File +DATA/ORCLCDB/control01.ctl - modified
Control File +DATA/ORCLCDB/control02.ctl - modified
Datafile +DATA/ORCLCDB/system01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/sysaux01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/undotbs01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/pdbseed/system01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/pdbseed/sysaux01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/users01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/pdbseed/undotbs01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/undotbs02.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/system01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/sysaux01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/undotbs01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/system01_i2_undo.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/users01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/temp01.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/pdbseed/temp012020-10-14_11-20-07-799-am.db - dbid changed, wrote new name
Datafile +DATA/ORCLCDB/ORCLPDB/temp01.db - dbid changed, wrote new name
Control File +DATA/ORCLCDB/control01.ctl - dbid changed, wrote new name
Control File +DATA/ORCLCDB/control02.ctl - dbid changed, wrote new name
Instance shut down
Database name changed to TESTCDB.
Modify parameter file and generate a new password file before restarting.
Database ID for database TESTCDB changed to 2799630695.
All previous backups and archived redo logs for this database are unusable.
Database is not aware of previous backups and archived logs in Recovery Area.
Database has been shutdown, open database with RESETLOGS option.
Succesfully changed database name and ID.
DBNEWID - Completed succesfully.
如果您不想要新的 DBID,可以设置SETNAME=YES以防止 DBID 更改。例如:
[oracle@test ~]$ nid target=sys/password dbname=TESTCDB setname=YES
我们更改了数据文件和控制文件。
请注意以下事项:
- 一旦你发出命令,不要打断它。
- 不仅是数据库名称,DBID 也已更改。
- 该实例已被实用程序关闭。
- 之后您必须使用RESETLOGS打开数据库。
B. 修改集群上的配置
现在我们要回去处理集群了。
1.修改PFILE
我们将在参数文件中做以下事情。
- 通过删除前导注释符号 (#) 将CLUSTER_DATABASE恢复为TRUE 。
- 将DB_NAME更改为新的数据库名称TESTCDB。
- 添加一个像往常一样设置为ORCLLCDB的DB_UNIQUE_NAME参数。
[oracle@primary01 ~]$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora-new
...
*.cluster_database=true
*.db_name='TESTCDB' # Changed by Ed Chen
*.db_unique_name='ORCLCDB' # Added by Ed Chen
2. 创建一个新的 SPFILE
为了正确定位SPFILE,我们首先通过参数文件启动数据库到NOMOUNT。
[oracle@primary01 ~]$ sqlplus / as sysdba
...
Connected to an idle instance.
SQL> startup nomount pfile='?/dbs/init@.ora-new';
ORACLE instance started.
...
SQL> show parameter name;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cdb_cluster_name string
cell_offloadgroup_name string
db_file_name_convert string
db_name string TESTCDB
db_unique_name string ORCLCDB
global_names boolean FALSE
instance_name string ORCLCDB1
lock_name_space string
log_file_name_convert string
pdb_file_name_convert string
processor_group_name string
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string ORCLCDB
正如我们所见,除了DB_NAME是新名称外,其他所有名称都保持不变。
换句话说,实例现在知道当前DB_UNIQUE_NAME是什么。因此,新创建的 SPFILE 不会被放到错误的目录中。
SQL> create spfile='+DATA/ORCLCDB/spfile' from pfile='?/dbs/init@.ora-new';
File created.
SQL> shutdown immediate;
ORA-01507: database not mounted
ORACLE instance shut down.
或者,您可以在两个节点上指向 PFILE 中 SPFILE 的位置。
[oracle@primary01 ~]$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora
spfile='+DATA/ORCLCDB/spfile'
[oracle@primary02 ~]$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora
spfile='+DATA/ORCLCDB/spfile'
2.修改RAC配置
我们在集群配置中修改以下两点:
- 新数据库名称:TESTCDB
- 新 SPFILE 目标:'+DATA/ORCLCDB/spfile'
[oracle@primary01 ~]$ srvctl modify database -d orclcdb -dbname TESTCDB
[oracle@primary01 ~]$ srvctl modify database -d orclcdb -spfile '+DATA/ORCLCDB/spfile'
让我们检查一下新配置。
[oracle@primary01 ~]$ srvctl config database -d orclcdb
Database unique name: ORCLCDB
Database name: TESTCDB
Oracle home: /u01/app/oracle/product/19.0.0/db_1
Oracle user: oracle
Spfile: +DATA/ORCLCDB/spfile
Password file: +DATA/ORCLCDB/PASSWORD/pwdorclcdb.256.1053773741
Domain:
Start options: open
Stop options: immediate
Database role: PRIMARY
Management policy: AUTOMATIC
Server pools:
Disk Groups: DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency:
OSDBA group: dba
OSOPER group: oper
Database instances: ORCLCDB1,ORCLCDB2
Configured nodes: primary01,primary02
CSS critical: no
CPU count: 0
Memory target: 0
Maximum memory: 0
Default network number for database services:
Database is administrator managed
3.启动挂载
我们需要在启动之前将数据库恢复到集群中。
[oracle@primary01 ~]$ srvctl enable database -d orclcdb
启动要挂载的数据库以供以后打开。
[oracle@primary01 ~]$ srvctl start database -d orclcdb -o mount
[oracle@primary01 ~]$ srvctl status database -d orclcdb
Instance ORCLCDB1 is running on node primary01
Instance ORCLCDB2 is running on node primary02
4.打开重置日志
由于我们更改了 DBID,我们需要使用RESETLOGS打开数据库。
节点 1
[oracle@primary01 ~]$ sqlplus / as sysdba
...
SQL> alter database open resetlogs;
Database altered.
SQL> select inst_id, open_mode from gv$database;
INST_ID OPEN_MODE
---------- --------------------
1 READ WRITE
2 MOUNTED
由于使用ALTER DATABASE OPEN打开数据库只影响当前实例,因此我们需要在其余节点上打开数据库。
节点 2
[oracle@primary02 ~]$ sqlplus / as sysdba
...
SQL> alter database open;
Database altered.
SQL> select inst_id, open_mode from gv$database;
INST_ID OPEN_MODE
---------- --------------------
1 READ WRITE
2 READ WRITE
请注意,如果您没有通过在nid命令中指定SETNAME=YES来更改 DBID ,那么您不必使用RESETLOGS打开数据库。
新的数据库标识符如下:
SQL> select dbid from v$database;
DBID
----------
2799630695
最后一件事,您应该删除我们之前创建的参数文件,以防止以错误的方式启动数据库。有关该主题的更多信息,您可以参考:为什么 SPFILE 在 RAC 中不起作用。
原文标题:How to Change DB_NAME of a RAC Database
原文作者: Ed Chen
原文链接:https://logic.edchen.org/how-to-change-db_name-of-a-rac-database/