Amazon Web Services ブログ

Amazon RDS Custom for Oracle インスタンスの再作成を行う方法 : パート2

本投稿は、Jobin Joseph、 Dwarka RaoとNitin Saxenaによる記事Recreate an Amazon RDS Custom for Oracle database: Part 2を翻訳したものです。

このシリーズではサポートペリメーターに違反することなくAmazon Relational Database Service (Amazon RDS) Custom for Oracleのカスタマイズを行う方法についてベストプラクティスとステップ・バイ・ステップの手順を紹介します。

  • パート1ではタイムゾーンの変更とデータベースの文字コードの変更についてご紹介します。
  • パート2(本投稿)では、データベースの再作成を必要とするデフォルトのブロックサイズの変更についてご紹介します。
  • パート3では、Oracle Flashback Databaseの有効化やTNS構成・データベースオプションの構成の変更、そしてRDS Custom for Oracleインスタンスにパッチを適用するためのベストプラクティスについてご紹介します。

Oracle Databaseにはデータベース作成後に変更できないいくつかの設定があります。デフォルトのブロックサイズは、変更するためにデータベースの再作成が必要な設定の一つです。本投稿では、以下のようなユースケースのためにRDS Custom for Oracleのデータベースを再作成する方法についてご紹介します:

  • データベースの標準的なブロック・サイズの変更 – RDS Custom for Oracleインスタンスはデフォルトのデータベースブロックサイズ(DB_BLOCK_SIZE)である8Kで構築されており、これは多くのユースケースで適しています。このデフォルトのブロックサイズはデータベースの作成後は変更することができず、データベースの再作成が必要になります。一般的に、オンライントランザクションシステム(OLTP)には小さなブロックサイズ(4Kもしくは8K)が適しており、意思決定システム(DSS)には大きなブロックサイズ(8K、16K、32K)が適しています。非標準のブロックサイズ用の表領域を作成することもできますが、SGAの中のバッファキャッシュ領域に構成する非標準用のサブキャッシュ領域を構成する必要があるため、特にメモリ管理が複雑となり、管理が複雑になります。
  • 変更するデータベースキャラクタセット(NLS_CHARACTERSET)が現在のキャラクタセットのスーパーセットではない場合 – このシリーズの最初のパートで議論したように、変更しようとするキャラクタセットが現在のキャラクタセットのスーパーセットの場合、ALTER DATABASEコマンドを用いることでRDS Custom for Oracleのキャラクタセットを変更することができます。そうではない場合、データベースの再作成をすることで任意のキャラクタセットを選択することができます。
  • 各国語キャラクタセット(NLS_NCHAR_CHARCTERSET)の変更パート1で議論したように、内部スキーマに存在するNCHARデータ型の変更作業は複雑です。各国語キャラクタセットをAL16UTF16(デフォルト)からUTF8に変更する手順は既存のデータベースを再作成するほうがシンプルです。
  • 複数の変更を同時に行う – タイムゾーンやNLS_CHARACTERSET、NLS_NCHAR_CHARACTERSET、データベースのブロックサイズなど、複数の構成変更を行いたい時、希望する構成にあわせてデフォルトデータベースを再作成するほうがシンプルです。

データベースの再作成を行うかわりに、希望した構成で構築されている構成済のデータベースのコピーを既存のRDS Custom for Oracleデータベースを置き換える方法も選択できます。より詳細については、Physical migration of Oracle databases to Amazon RDS Custom using RMAN duplicationPhysical migration of Oracle databases to Amazon RDS Custom using Data Guard を参照してください。

要件と制限

RDS Custom for Oracleのデータベース再作成を行う時、ドキュメントに記載されているRequirements and limitations for Amazon RDS Custom for Oracleの手順に従う必要があります。以下の制約が適用されます:

  • プロビジョン時に指定したデータベース名(デフォルトはORCL)と同じものを使う必要があります。データベース名の変更を行いたい場合、希望するデータベース名で新しいRDS Custom for Oracleインスタンスをプロビジョンする必要があります。
  • 本記事の作成時点では、RDS Custom for Oracleはマルチテナント構成をサポートしていません。したがって、再作成するデータベースはnon-CDBアーキテクチャである必要があります。
  • オートメーションフレームワークはデータベースの物理的な配置場所と関連性があるため、データファイル(datafilecontrol_file, redolog)の物理的な場所は変更してはいけません。
  • データベースはarchivelogモードである必要があります。

RDS Customオートメーションの停止

RDS Custom for OracleのDBインスタンスをカスタマイズする前に、カスタマイズ作業とRDS Customのオートメーションと監視フレームワークが干渉しないようにオートメーションを停止する必要があります。Amazon RDSコンソールもしくはAWS Command Line Interface(AWS CLI)を用いてオートメーションの停止を行うことができます。具体的な手順については、Pausing and resuming RDS Custom automationのマニュアルを参照してください。メンテナンス作業を完了するために必要な時間を想定し、オートメーションを停止します。必要な時間の目処が立たない場合、いったん60分でオートメーションを停止し、停止期間が切れる前に延長することもできます。

データベースパスワードの取得

RDS Custom for Oracleの再作成を行うために、SYS、SYSTEM、RDSADMINユーザーのパスワードを保持しておく必要があります。これらのデータベースユーザーは同じパスワードを共有しますが、以下の手順でAWS Secrets Manager から取得できます:

  1. Amazon RDSコンソール上で、ナビゲーションペインからデータベースを選択し、再作成するデータベースを選択します。
  2. 設定タブを選択しインスタンスのリソースIDを控えておきます(db-ABCDEFGHIJKLMNOPQRS0123456といったフォーマットになっています)。
  3. Secrets Managerのコンソールで、同じ名前をシークレットIDを選択します
    do-not-delete-custom-<resource_id>
  4. シークレットの値を取得するを選択し、データベースユーザーのパスワードを控えておきます。

EC2インスタンスへの接続

データベースを再作成するために、SSHキーあるいはAWS Systems Managerを用いて傘下のAmazon Elastic Compute Cloud(Amazon EC2)インスタンスに接続します。(具体的な手順は、Connecting to your RDS Custom DB instance using AWS Systems Managerを参照してください。)

ec2-userでログインした後、Oracle Databaseのバイナリーの所持ユーザーであるrdsdbユーザーに変更できます。そうすることでsysdba権限を用いてインスタンスに接続できます。以下のコードを参照してください:

$sudo su - rdsdb
$sqlplus / as sysdba
SQL>

現在のデータベース設定を確認し、データベースにアプリケーションデータが入っていないこと、削除して空のデータベースを作成しても安全なことを確認

データベースの再作成プロセスにおける構成変更によっては、現在の設定をデータディクショナリへの問い合わせで確認し、再作成後のデータベースの設定と比較します:

SQL> select PROPERTY_NAME,PROPERTY_VALUE from database_properties where PROPERTY_NAME like '%CHARACTERSET%';

SQL>select TABLESPACE_NAME,BLOCK_SIZE from dba_tablespaces;

Oracleの内部的なレジストリコンポーネントの状態を確認するためにdba_registryを参照することができ、データベース再作成後に同様のクエリーを発行することにより比較ができます:

SQL>select COMP_NAME,VERSION,STATUS from dba_registry;
COMP_NAME                                          VERSION                        STATUS
-------------------------------------------------- ------------------------------ -----------
Oracle Database Catalog Views                      19.0.0.0.0                     VALID
Oracle Database Packages and Types                 19.0.0.0.0                     VALID
Oracle Real Application Clusters                   19.0.0.0.0                     OPTION OFF
Oracle XML Database                                19.0.0.0.0                     VALID
Oracle Text                                        19.0.0.0.0                     VALID

以下のクエリーを用いて非デフォルトのオブジェクトがデータベース内に作成されているかを確認します:

SQL>select owner,count(1) from dba_objects where owner  in(select username from dba_users where oracle_maintained!='Y') group by owner;

no rows selected

データベース再作成後にRDS Custom固有のリソースを再作成するためのSQLスクリプトを準備

これらのリソースにはRDSADMINやRDS Customマスターユーザーやユーザー・プロファイルといったデータベースユーザーが含まれます。

再作成する必要のあるマスターユーザー名を確認します(Amazon RDSコンソールの設定タブ内にあります)。マスターユーザー名がADMINと異なる場合には、以下のスクリプトのADMINのキーワードを正しいユーザー名に置き換えてください:

define v_username = "'RDSADMIN','ADMIN'"

作業用ディレクトリで以下のスクリプトをrecreate_custom_resources_input.sqlとしてコピーし、実行します:

************************ COPY FROM NEXT LINE ***************************
set long 20000 longchunksize 20000 pagesize 0 linesize 1000 feedback off verify off trimspool on
column ddl format a1000
begin
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'SQLTERMINATOR', true);
   dbms_metadata.set_transform_param (dbms_metadata.session_transform, 'PRETTY', true);
end;
/
define v_username = "'RDSADMIN','ADMIN'"
spool recreate_custom_resources_output.sql
select dbms_metadata.get_ddl('DIRECTORY','OPATCH_INST_DIR') as ddl from dual;
select dbms_metadata.get_ddl('DIRECTORY','OPATCH_LOG_DIR') as ddl from dual;
select dbms_metadata.get_ddl('DIRECTORY','OPATCH_SCRIPT_DIR') as ddl from dual;
select dbms_metadata.get_ddl('PROFILE', 'RDSADMIN') AS ddl
from   dual;
select 'CREATE BIGFILE TABLESPACE "RDSADMIN" DATAFILE SIZE 50M AUTOEXTEND ON MAXSIZE 33554431M LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;' from dual;
select 'CREATE BIGFILE TABLESPACE "USERS" DATAFILE SIZE 100M AUTOEXTEND ON MAXSIZE 33554431M LOGGING ONLINE PERMANENT EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT  NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;' from dual;
select dbms_metadata.get_ddl('TABLESPACE','TEMP' ) AS ddl from dual;
select dbms_metadata.get_ddl('USER', u.username) AS ddl
from   dba_users u
where  u.username in (&v_username)
union all
select dbms_metadata.get_granted_ddl('TABLESPACE_QUOTA', tq.username) AS ddl
from   dba_ts_quotas tq
where  tq.username in (&v_username)
union all
select dbms_metadata.get_granted_ddl('ROLE_GRANT', rp.username) AS ddl
from   dba_users rp
where  rp.username in (&v_username)
union all
select dbms_metadata.get_granted_ddl('SYSTEM_GRANT', sp.username) AS ddl
from   dba_users sp
where  sp.username in (&v_username)
union all
select dbms_metadata.get_granted_ddl('OBJECT_GRANT', tp.username) AS ddl
from   dba_users tp
where  tp.username in (&v_username)
and exists (select 'x' from dba_tab_privs tabpri where tabpri.grantee=tp.username)
union all
select dbms_metadata.get_granted_ddl('DEFAULT_ROLE', lp.username) AS ddl
from   dba_users lp
where  lp.username in (&v_username)
/
set linesize 80 pagesize 14 feedback on trimspool on verify on
spool off
************************ COPY UNTIL PREVIOUS LINE ***************************

sysdbaとしてSQL*Plusで前述のスクリプトを実行します:

$sqlplus / as sysdba
SQL>@recreate_custom_resources_input.sql

この手順によってデータベース再作成後に必要となるrecreate_custom_resources_output.sqlファイルを現在の作業ディレクトリに作成します。

EC2インスタンスに接続されたセッションからデータベースの再作成を行います

これらの手順はデフォルトのデータベース名がORCLとなっていることを想定しています。以下の手順においてお客様の構成に応じて実際のデータベース名をORCLと置換する必要があります。Amazon RDSコンソール上のRDS Custom for Oracle DBインスタンスの設定タブからデータベース名を確認することができます。

  1. rdsdbユーザーからsysdbaとしてデータベースに接続し、サーバーパラメータファイル(SPファイル)からパラメータファイル(PFILE)を作成します。drop databaseコマンドはインスタンスで用いられているSPFILEを削除するため、この手順によって現在のパラメータ設定を保存します。
    $sqlplus / as sysdba
    SQL>create pfile from spfile;
  2. データベース作成後にSPFILEを同様の場所で再作成するため、SPFILEの元の場所を確認しておきます:
    ls -l $ORACLE_HOME/dbs/spfileORCL.ora

    この結果は/rdsdbdata/admin/に配置されているオリジナルファイルへのsoft linkを示します(例: /rdsdbdata/admin/ORCL/pfile/spfileORCL.ora)。

  3. データベースをrestricted modeにし既存のデータベースを削除します:
    SQL>shutdown immediate
    SQL> startup restrict mount
    SQL>drop database;
    SQL>exit
  4. drop databaseコマンドの前に作成したPFILEからSPFILEを作成し、$ORACLE_HOME/dbsディレクトリにsoft linkを作成します。
    データベース作成前にパラメータファイルの変更を必要とする構成変更を行おうとする場合、この段階で実施する必要があります。例えばデータベースのブロックサイズを変更する場合、新しいブロックサイズを反映させるためパラメータファイル($ORACLE_HOME/dbs/initORCL.ora)を編集する必要があります。ブロックサイズを16Kにする場合、以下のエントリーをパラメータファイルに追加してください:

    *.db_block_size=16384

    以下のコマンドのORCLを実際のデータベース名に置き換えます:

    $sqlplus / as sysdba
    SQL> create spfile='/rdsdbdata/admin/ORCL/pfile/spfileORCL.ora' from pfile;
    SQL>exit

    SPFILEへのシンボリック・リンクを作成します:

    $ ln -s /rdsdbdata/admin/ORCL/pfile/spfileORCL.ora $ORACLE_HOME/dbs/
  5. インスタンスをmountで起動し、controlfileディレクトリを作成します。
    controlfileの親ディレクトリはdrop databaseコマンドによって削除されているため、create databaseコマンド発行前にディレクトリの再作成を行います。

    $sqlplus / as sysdba
    SQL> startup nomount
    SQ> show parameter control_files
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
    control_files                        string      /rdsdbdata/db/ORCL_A/controlfile/control-01.ctl
    SQL>exit
    
    $mkdir -p /rdsdbdata/db/ORCL_A/controlfile

    前述のコマンドのcontrol_filesパラメータで指定されている親ディレクトリを使ってください。

  6. データベースを手動で作成します(Secrets Managerから取得したDBユーザーのパスワードをyour-passwordと置き換えてください)
    $sqlplus / as sysdba
    
    -- Below script creates the database with database character set JA16EUCTILDE and national character set UTF8
    
    SQL>CREATE DATABASE ORCL
    USER SYS IDENTIFIED BY "your-password"
    USER SYSTEM IDENTIFIED BY "your-password"
    SET DEFAULT BIGFILE TABLESPACE
    EXTENT MANAGEMENT LOCAL
    DEFAULT TEMPORARY TABLESPACE temp
    DEFAULT TABLESPACE users
    MAXLOGFILES 50
    MAXDATAFILES 1000
    UNDO TABLESPACE "UNDO_T1"
    CHARACTER SET JA16EUCTILDE
    NATIONAL CHARACTER SET UTF8;
    
    -- Below script creates the database with database character set AL32UTF8 and database Time Zone GMT+4
    
    SQL>CREATE DATABASE ORCL
    USER SYS IDENTIFIED BY "your-password"
    USER SYSTEM IDENTIFIED BY "your-password"
    SET DEFAULT BIGFILE TABLESPACE
    EXTENT MANAGEMENT LOCAL
    DEFAULT TEMPORARY TABLESPACE temp
    DEFAULT TABLESPACE users
    MAXLOGFILES 50
    MAXDATAFILES 1000
    UNDO TABLESPACE "UNDO_T1"
    SET TIME_ZONE = '+04:00'
    CHARACTER SET AL32UTF8
  7. データベースディクショナリビュー、シノニム、パッケージを作成します。
    通常の状況では以下の2つのスクリプトは15分以下で完了します。nohupユーティリティを用いてバックグラウンドで実施することも可能です。

    SQL>@?/rdbms/admin/catalog.sql
    SQL>@?/rdbms/admin/catproc.sql 
  8. SQL*PlusでPRODUCT_USER_PROFILEを用いている場合、SYSTEMユーザーでpupbld.sqlを実行することにより必要なオブジェクトを作成します。
    SQL>connect system/<your password> -- Password used for SYSTEM in create database command
    SQL>@?/sqlplus/admin/pupbld.sql
    SQL>exit
    
  9. データベースをarchivelogモードに変更します:
    SQL>shutdown immediate
    SQL>startup mount
    SQL>alter database archivelog;
    SQL>alter database open;

データベース作成後のscriptの実行

以下のステップを完了してください:

  1. password verification functionsでプロファイルを作成し、DEFAULTプロファイルに設定します:
    SQL>@?/rdbms/admin/utlpwdmg.sql
    
    SQL>ALTER PROFILE DEFAULT LIMIT
    FAILED_LOGIN_ATTEMPTS UNLIMITED
    PASSWORD_LIFE_TIME UNLIMITED
    PASSWORD_VERIFY_FUNCTION NULL;
  2. 前段で作成したスクリプトを用いてRDS Custom固有のリソースを作成します:
    SQL>@recreate_custom_resources_output.sql
  3. RDSADMINプロファイルをSYS、SYSTEM、DBSNMPユーザーに割り当て、USER_LOCKパッケージを作成するためuserlock.sqlを実行します:
    SQL>alter user SYS profile RDSADMIN;
    SQL>alter user SYSTEM profile RDSADMIN;
    SQL>alter user DBSNMP profile RDSADMIN;
    
    SQL>@?/rdbms/admin/userlock.sql

Release Update(RU)の詳細に応じてSQLレジストリを更新するためdatapatchを実行します

以下のコードを実行します:

$ORACLE_HOME/OPatch/datapatch -verbose

再作成されたデータベースの設定を確認

データベース再作成の過程で変更した構成に応じて、データディクショナリを問い合わせることにより現在の設定を確認することができます:

SQL> select PROPERTY_NAME,PROPERTY_VALUE from database_properties where PROPERTY_NAME like '%CHARACTERSET%';

select TABLESPACE_NAME,BLOCK_SIZE from dba_tablespaces;

Oracleの内部的なレジストリコンポーネントの状態を確認するためにdba_registryを参照することができ、データベース再作成プロセスが成功していることを確認できます:

select COMP_NAME,VERSION,STATUS from dba_registry;
COMP_NAME                                          VERSION                        STATUS
-------------------------------------------------- ------------------------------ -----------
Oracle Database Catalog Views                      19.0.0.0.0                     VALID
Oracle Database Packages and Types                 19.0.0.0.0                     VALID
Oracle Real Application Clusters                   19.0.0.0.0                     OPTION OFF
Oracle XML Database                                19.0.0.0.0                     VALID
Oracle Text                                        19.0.0.0.0                     VALID

データベースの中にINVALIDなオブジェクトがないことを確認します:

SQL>
   Select substr(owner,1,12) owner,
           substr(object_name,1,30) object,
           substr(object_type,1,30) type, status,
           created
    from
          dba_objects where status <>'VALID'
SQL> 

no rows selected

オートメーションの再開

RDS Customのオートメーションと監視フレームワークを有効化するため、インスタンスのオートメーションを再開します。

RDS Customオートメーションフレームワークの確認

カスタマイズ作業を終えた後にオートメーションを再開すると、作業ステップが正常に進んでいる場合はAmazon RDSコンソールのインスタンスの状態が利用可能になり、RDS Customインスタンスは自動バックアップを開始します。バックアップが完了した時、Amazon RDSコンソールのメンテナンスとバックアップのセクションを確認するか、AWS CLIで以下のように実行することで最も遅い復元可能な時刻を確認できます:

aws rds describe-db-instances --db-instance-identifier demo-2-replica
"LatestRestorableTime": "2022-05-18T11:21:27+00:00"

Amazon RDSコンソールからインスタンスによって作成された最新のスナップショットを確認することもできます(自動バックアップを選択し、データベースを選択し、システムスナップショットを選択します)もしくは、AWS CLIで以下のように実行します:

aws rds describe-db-snapshots --db-instance-identifier  demo-2-replica --query="max_by(DBSnapshots, &SnapshotCreateTime)"


"DBSnapshotIdentifier": "rds:demo-2-replica-2022-05-18-11-16",
 "DBInstanceIdentifier": "demo-2-replica",
 "SnapshotCreateTime": "2022-05-18T11:17:33.417000+00:00",

この例では、demo-2-replicaはRDS Custom for Oracleインスタンスのインスタンス識別子です。

オートメーションが再開された後に作成された最新のスナップショットを確認すると、最も早い復元可能な時刻はオートメーションを停止した時間を指していることが確認できます。10分後に再度同じクエリーを発行すると、インスタンスのステータスがhealthになっていることが確認できます。

まとめ

この投稿では、RDS Custom for Oracleのデフォルトデータベースに対してデフォルトブロックサイズの変更といったデータベースの再作成を必要とする変更を行う場合のステップバイステップのガイドとベストプラクティスについて紹介しました。

RDS Custom for Oracleのキャラクタセットの変更やタイムゾーンの変更といったカスタマイズを行う場合はパート1をご参照ください。パート3ではOracle Flashback Databaseの有効化やTNS構成やデータベースオプションの変更といったカスタマイズ、そしてRDS Custom for Oracleインスタンスにパッチを適用する場合のベストプラクティスについてご紹介します。

本投稿へのご意見はコメント欄にお願いします。


翻訳はソリューションアーキテクトの 矢木 覚 が担当しました。原文はこちらです。