暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 如何更改 RAC 数据库的 DB_UNIQUE_NAME?(系统级别)

原创 小小亮 2022-10-27
972

在这篇文章中,我们将讨论如何更改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 个过程。

  1. 准备新的 SPFILE
  2. 我们在本节中的目标是为新的这个新的DB_UNIQUE_NAME数据库创建一个新的 SPFILE。

  3. 删除 + 添加 RAC 数据库
  4. 我们在本节中的目标是将数据库添加回集群以获取数据库的新DB_UNIQUE_NAME

  5. 考虑小缺陷
  6. 该程序并不完美,存在一些小缺陷,您可能希望以后自己改进。

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_NAMEDB_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/,您可以参考以下主题。

  1. 如何移动spfile
  2. 如何移动控制文件
  3. 如何移动数据文件
  4. 如何移动重做日志
  5. 如何移动临时文件

不要忘记修改每个客户端的$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/

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论