在这篇文章中,我们将讨论如何更改RAC 数据库的DB_UNIQUE_NAME。
你注意到了吗?即使我们使用响应文件在静默模式下创建数据库,我们也不能在创建数据库期间(例如 19c)指定与DB_NAME不同的DB_UNIQUE_NAME。
这是因为 Oracle 假设DB_UNIQUE_NAME与DB_NAME相同,这在某些特殊情况下确实不一定正确。至少,我们应该创建具有不同DB_UNIQUE_NAME的备用数据库来构建与主数据库的数据保护。
对于 RAC 数据库,更改DB_UNIQUE_NAME比更改单实例数据库更困难。但是,让我们去做吧。
要更改RAC 数据库的DB_UNIQUE_NAME,我们采取以下 3 个过程。
- 准备新的 SPFILE
- 删除 + 添加 RAC 数据库
- 考虑小缺陷
我们在本节中的目标是为新的这个新的DB_UNIQUE_NAME数据库创建一个新的 SPFILE。
我们在本节中的目标是将数据库添加回集群以获取数据库的新DB_UNIQUE_NAME。
该程序并不完美,存在一些小缺陷,您可能希望以后自己改进。
A. 准备新的 SPFILE
1. 创建 PFILE
让我们在创建 PFILE 之前检查配置。
[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
无论数据库是否正在运行,只要您知道 SPFILE 的位置,您就可以随时从 SPFILE 创建 PFILE。
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.
由于数据库正在运行,所以我们不必在上面的语句中指定 SPFILE 的位置。
2.修改PFILE
我们像这样在 PFILE 中添加一个参数DB_UNIQUE_NAME。
[oracle@primary01 ~]$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora-new
...
*.db_unique_name='TESTCDB' # Added by Ed Chen
最重要的是用新名称替换所有实例名称。
旧 -> 新
--------------------
ORCLCDB1 -> TESTCDB1
ORCLCDB2 -> TESTCDB2
当然,之后您还必须更改两个节点上的ORACLE_SID。
3. 创建新的 SPFILE
我们使用修改后的 PFILE 来创建新的 SPFILE。请记住,该实例仍在运行。
SQL> create spfile='+DATA/ORCLCDB/spfile' from pfile='?/dbs/init@.ora-new';
File created.
SQL> exit
或者,您可以在两个节点上指向 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'
我们已经根据需要创建了一个新的 SPFILE,我们可以在下一节中使用它来配置新的 RAC 数据库。
B. 删除 + 添加 RAC 数据库
现在我们删除数据库,然后使用稍微不同的配置将其添加回来。
1.停止和删除数据库
我们必须确保数据库在删除之前停止。
[oracle@primary01 ~]$ srvctl stop database -d orclcdb
如果您对删除数据库犹豫不决,可以通过响应n取消命令来停止。另外,请确保这是您要删除的名称。
[oracle@primary01 ~]$ srvctl remove database -d orclcdb
Remove the database orclcdb? (y/[n]) y
我决定往前走。
2.添加数据库
[oracle@primary01 ~]$ srvctl add database \
> -db TESTCDB \
> -dbname ORCLCDB \
> -oraclehome /u01/app/oracle/product/19.0.0/db_1 \
> -spfile +DATA/ORCLCDB/spfile \
> -pwfile +DATA/ORCLCDB/PASSWORD/pwdorclcdb.256.1053773741 \
> -startoption OPEN \
> -stopoption IMMEDIATE \
> -role PRIMARY \
> -policy AUTOMATIC \
> -diskgroup DATA \
> -dbtype RAC
这次我使用TESTCDB作为我的DB_UNIQUE_NAME,DB_NAME保持不变。
3.添加实例
然后我们将两个节点添加到数据库中。[oracle@primary01 ~]$ srvctl add instance -db TESTCDB -instance TESTCDB1 -node primary01
[oracle@primary01 ~]$ srvctl add instance -db TESTCDB -instance TESTCDB2 -node primary02
如您所见,我们将节点添加到新数据库中。
更多关于添加 RAC 数据库以及为什么我们使用大写的实例名称,您可以参考:如何在不使用 DBCA 的情况下创建空 RAC 数据库。
4. 查看配置
我们检查 RAC 数据库的配置,以确保一切都准备好启动数据库。
[oracle@primary01 ~]$ srvctl config database -d testcdb
Database unique name: TESTCDB
Database name: ORCLCDB
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: TESTCDB1,TESTCDB2
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
5.启动数据库
如果以上工作都做好了,我们就可以安全启动数据库了。
[oracle@primary01 ~]$ srvctl start database -d testcdb
[oracle@primary01 ~]$ srvctl status database -d testcdb
Instance TESTCDB1 is running on node primary01
Instance TESTCDB2 is running on node primary02
6.检查所有名称
不要忘记在显示参数之前临时或永久更改两个节点上的ORACLE_SID 。
临时更改 ORACLE_SID
[oracle@primary01 ~]$ export ORACLE_SID=TESTCDB1
或使用oraenv更改ORACLE_SID。
[oracle@primary01 ~]$ . oraenv
ORACLE_SID = [ORCLCDB1] ? TESTCDB1
ORACLE_HOME = [/home/oracle] ? /u01/app/oracle/product/19.0.0/db_1
The Oracle base remains unchanged with value /u01/app/oracle
永久更改 ORACLE_SID
[oracle@primary01 ~]$ vi ~/.bash_profile
...
export ORACLE_SID=TESTCDB1
[oracle@primary01 ~]$ . ~/.bash_profile
最后检查,列出数据库中的所有名称。
[oracle@primary01 ~]$ sqlplus / as sysdba
...
SQL> show parameter name
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cdb_cluster_name string
cell_offloadgroup_name string
db_file_name_convert string
db_name string ORCLCDB
db_unique_name string TESTCDB
global_names boolean FALSE
instance_name string TESTCDB1
lock_name_space string
log_file_name_convert string
pdb_file_name_convert string
processor_group_name string
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
service_names string TESTCDB
看起来不错。
C. 考虑小缺陷
似乎一切都很顺利,直到您发现有关新创建的数据文件位置的一些事实。例如,我们创建一个表空间如下:
SQL> CREATE TABLESPACE ERPTBS DATAFILE '+DATA/ORCLCDB/ERPTBS_1.dbf' SIZE 10M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED ,'+DATA/ORCLCDB/ERPTBS_2.dbf' SIZE 10M AUTOEXTEND ON NEXT 10M MAXSIZE UNLIMITED;
Tablespace created.
让我们检查一下他们的位置。
[grid@primary01 ~]$ asmcmd ls -l +DATA/ORCLCDB/ERPTBS*
Type Redund Striped Time Sys Name
DATAFILE UNPROT COARSE DEC 04 11:00:00 N ERPTBS_1.dbf => +DATA/TESTCDB/DATAFILE/ERPTBS.295.1058267833
DATAFILE UNPROT COARSE DEC 04 11:00:00 N ERPTBS_2.dbf => +DATA/TESTCDB/DATAFILE/ERPTBS.296.1058267835
虽然我们将数据文件放在+DATA/ORCLCDB/中,但实际的数据文件在+DATA/TESTCDB/中。这是因为当前数据库的唯一名称现在是 TESTCDB,而不是 ORCLLCDB。要将所有数据库文件移动到+DATA/TESTCDB/,您可以参考以下主题。
- 如何移动spfile
- 如何移动控制文件
- 如何移动数据文件
- 如何移动重做日志
- 如何移动临时文件
不要忘记修改每个客户端的$ORACLE_HOME/network/admin/tnsnames.ora。
原文标题:How to Change DB_UNIQUE_NAME of a RAC Database
原文作者: Ed Chen
原文链接:https://logic.edchen.org/how-to-change-db_unique_name-of-a-rac-database/