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

Oracle 如何更改 RAC 数据库的 DB_NAME?(数据库级别)

原创 小小亮 2022-10-27
1103

在这篇文章中,我们将讨论如何更改RAC 数据库的DB_NAME

由于DB_NAME不仅仅是像DB_UNIQUE_NAME这样的简单数据库参数,所以我们需要做更多的工作。如果您在 SPFILE 中修改DB_NAME,您将收到错误 ORA-32016

对于单实例,您应该选择: Oracle 如何更改单实例数据库的 DB_NAME?

更改 RAC 数据库的数据库名称有两个主要部分。

  1. 更改所有文件的数据库名称
  2. 修改集群上的配置

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_NAMEDB_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

我们更改了数据文件和控制文件。

请注意以下事项:

  1. 一旦你发出命令,不要打断它。
  2. 不仅是数据库名称,DBID 也已更改。
  3. 该实例已被实用程序关闭。
  4. 之后您必须使用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/

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

评论