DBNEWIDユーティリティを試す（Oracle Database 21c）

# DBIDとは
Oracle Database はデータベース作成時（CREATE DATABASE 文実行時）に指定した名前に加えて一意な ID 番号が割り当てられます。この番号を DBID と呼びます。DBID は管理者が指定することはできず、自動生成されます。データベース名と DBID は V$DATABASE ビューで確認できます。

```SQL:
SQL> SELECT NAME, DBID FROM V$DATABASE;

NAME            DBID
--------- ----------
O21A      2376064149
```

データベース名は初期化パラメーター db_name でも確認できます。この初期化パラメーターは変更できません。

```SQL:
SQL> SHOW PARAMETER db_name
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_name                              string      O21A
```

DBID は Data Guard を構成するデータベース間では同一ですが、それ以外のデータベースでは別の値になります。DBID は制御ファイル、データファイル、アーカイブログ等に埋め込まれているため別のデータベースのファイルを誤って使ってしまうことを防ぐことができます。

# DBNEWID ユーティリティの実行方法と条件
何等かの理由でデータベース名と DBID を変更する必要が出てきた場合、DBNEWID ユーティリティを使います。このユーティリティは Linux 環境では nid コマンドとして実装されています。nidコマンドには以下のオプションを指定します。オプションを指定しないか、HELP=YES を指定すると利用方法が表示されます。

|オプション|説明|デフォルト値|
|:---|:---|:---|
|TARGET| ユーザー名/パスワード|NONE|
|DBNAME| 新規データベース名|NONE|
|LOGFILE|出力ログ|NONE|
|REVERT| 失敗した変更を回復|NO|
|SETNAME|新規データベース名のみを設定|NO|
|APPEND| 出力ログに追加|NO|
|HELP|   これらのメッセージを表示|NO|

nid コマンドを実行するには対象インスタンスが「正常に」停止した後、MOUNT 状態で起動されている必要があります。以下の例ではインスタンスが OPEN 状態で nid コマンドを実行してエラーになっています。

```SQL:
SQL> SELECT STATUS FROM V$INSTANCE;

STATUS
------------
OPEN

SQL> EXIT
$ nid TARGET=SYS DBNAME=O21A

DBNEWID: Release 21.0.0.0.0 - Production on 水 12月 14 22:42:36 2022

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

パスワード:
データベースO21B(DBID=2414682024)に接続しました

NID-00121: データベースをオープンしないでください

データベース名の変更は、検証中に失敗しました - データベースは変更されていません。
DBNEWID - 完了しましたが、検証エラーがあります。
```

次に ABORT 指定でインスタンスを停止して nid コマンドを実行していますが、やはり失敗しています。


```SQL:
SQL> SHUTDOWN ABORT
ORACLEインスタンスがシャットダウンされました。
SQL> STARTUP MOUNT
ORACLEインスタンスが起動しました。

Total System Global Area 1644166648 bytes
Fixed Size                  9686520 bytes
Variable Size            1023410176 bytes
Database Buffers          603979776 bytes
Redo Buffers                7090176 bytes
データベースがマウントされました。
SQL> EXIT
$ nid TARGET=SYS DBNAME=O21B

DBNEWID: Release 21.0.0.0.0 - Production on 水 12月 14 22:51:20 2022

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

パスワード:
データベースO21A(DBID=2376064149)に接続しました

NID-00135: 1個のアクティブ・スレッドがあります

データベース名の変更は、検証中に失敗しました - データベースは変更されていません。
DBNEWID - 完了しましたが、検証エラーがあります。
```

# DBNEWID ユーティリティの実行例

データベース名を O21A から O21B に変更し、新しい DBID を採番します。このため nid コマンドに DBNAME オプションを指定しています。
パスワードの入力と、実行の確認プロンプトが表示されます。コマンドが正常に実行されるとインスタンスは停止します。

```Shell:
$ nid TARGET=SYS DBNAME=O21B

DBNEWID: Release 21.0.0.0.0 - Production on 水 12月 14 22:35:15 2022

Copyright (c) 1982, 2021, Oracle and/or its affiliates.  All rights reserved.

パスワード:
データベースO21A(DBID=2344598892)に接続しました

サーバー・バージョン21.3.0に接続しました

データベースの制御ファイル:
    /u01/app/oracle/oradata/O21A/control01.ctl
    /u01/app/oracle/oradata/O21A/control02.ctl

データベースIDと、データベース名O21AをO21Bに変更しますか。 (Y/[N]) => Y

操作続行中
データベースIDを2344598892から2414682024に変更しています
データベース名をO21AからO21Bに変更しています
    制御ファイル/u01/app/oracle/oradata/O21A/control01.ctl - 変更済です
    制御ファイル/u01/app/oracle/oradata/O21A/control02.ctl - 変更済です
    データファイル/u01/app/oracle/oradata/O21A/system01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/pdbseed/system01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/sysaux01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/pdbseed/sysaux01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/undotbs01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/pdbseed/undotbs01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/users01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb1/system01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb1/sysaux01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb1/undotbs01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb1/users01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb2/system01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb2/sysaux01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb2/undotbs01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb2/users01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/temp01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/pdbseed/temp01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb1/temp01.db - DBIDが変更されました。新規名が書き込まれました
    データファイル/u01/app/oracle/oradata/O21A/O21Apdb2/temp01.db - DBIDが変更されました。新規名が書き込まれました
    制御ファイル/u01/app/oracle/oradata/O21A/control01.ctl - DBIDが変更されました。新規名が書き込まれました
    制御ファイル/u01/app/oracle/oradata/O21A/control02.ctl - DBIDが変更されました。新規名が書き込まれました
    インスタンスが停止しました

データベース名がO21Bに変更されました。
再起動の前に、パラメータ・ファイルを変更し、新規パスワード・ファイルを生成してください。
データベースO21BのデータベースIDが、2414682024に変更されました。
このデータベースに関する以前のすべてのバックアップとアーカイブREDOログは使用できません。
データベースが停止しています。RESETLOGSオプションを指定してオープンしてください。
データベース名とIDの変更が正常に終了しました。
DBNEWID - 正常に完了しました。
```

コマンド実行後はREDOログ、アーカイブログファイルは DBID が異なるため利用できません。初期化パラメーター・ファイル、パスワード・ファイルを作成してからRESETOPENLOGS オプションを使ってインスタンスを起動します。

```SQL:
SQL> STARTUP MOUNT
ORACLEインスタンスが起動しました。

Total System Global Area 1644166648 bytes
Fixed Size                  9686520 bytes
Variable Size             402653184 bytes
Database Buffers         1224736768 bytes
Redo Buffers                7090176 bytes
データベースがマウントされました。

SQL> ALTER DATABASE OPEN RESETLOGS;

データベースが変更されました。

SQL> SELECT DBID,NAME FROM V$DATABASE;

      DBID NAME
---------- ---------
2414682024 O21B

```