本投稿は、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 duplication と Physical 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アーキテクチャである必要があります。
- オートメーションフレームワークはデータベースの物理的な配置場所と関連性があるため、データファイル(
datafile
、control_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 から取得できます:
- Amazon RDSコンソール上で、ナビゲーションペインからデータベースを選択し、再作成するデータベースを選択します。
- 設定タブを選択しインスタンスのリソースIDを控えておきます(
db-ABCDEFGHIJKLMNOPQRS0123456
といったフォーマットになっています)。
- Secrets Managerのコンソールで、同じ名前をシークレットIDを選択します
do-not-delete-custom-<resource_id>
。
- シークレットの値を取得するを選択し、データベースユーザーのパスワードを控えておきます。
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インスタンスの設定タブからデータベース名を確認することができます。
rdsdb
ユーザーからsysdba
としてデータベースに接続し、サーバーパラメータファイル(SPファイル)からパラメータファイル(PFILE)を作成します。drop databaseコマンドはインスタンスで用いられているSPFILEを削除するため、この手順によって現在のパラメータ設定を保存します。
$sqlplus / as sysdba
SQL>create pfile from spfile;
- データベース作成後にSPFILEを同様の場所で再作成するため、SPFILEの元の場所を確認しておきます:
ls -l $ORACLE_HOME/dbs/spfileORCL.ora
この結果は/rdsdbdata/admin/
に配置されているオリジナルファイルへのsoft linkを示します(例: /rdsdbdata/admin/ORCL/pfile/spfileORCL.ora
)。
- データベースをrestricted modeにし既存のデータベースを削除します:
SQL>shutdown immediate
SQL> startup restrict mount
SQL>drop database;
SQL>exit
- drop databaseコマンドの前に作成したPFILEからSPFILEを作成し、
$ORACLE_HOME/dbs
ディレクトリにsoft linkを作成します。
データベース作成前にパラメータファイルの変更を必要とする構成変更を行おうとする場合、この段階で実施する必要があります。例えばデータベースのブロックサイズを変更する場合、新しいブロックサイズを反映させるためパラメータファイル($ORACLE_HOME/dbs/initORCL.ora)を編集する必要があります。ブロックサイズを16Kにする場合、以下のエントリーをパラメータファイルに追加してください:
以下のコマンドの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/
- インスタンスを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
パラメータで指定されている親ディレクトリを使ってください。
- データベースを手動で作成します(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
- データベースディクショナリビュー、シノニム、パッケージを作成します。
通常の状況では以下の2つのスクリプトは15分以下で完了します。nohupユーティリティを用いてバックグラウンドで実施することも可能です。
SQL>@?/rdbms/admin/catalog.sql
SQL>@?/rdbms/admin/catproc.sql
- 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
- データベースを
archivelog
モードに変更します:
SQL>shutdown immediate
SQL>startup mount
SQL>alter database archivelog;
SQL>alter database open;
データベース作成後のscriptの実行
以下のステップを完了してください:
- 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;
- 前段で作成したスクリプトを用いてRDS Custom固有のリソースを作成します:
SQL>@recreate_custom_resources_output.sql
- 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インスタンスにパッチを適用する場合のベストプラクティスについてご紹介します。
本投稿へのご意見はコメント欄にお願いします。
翻訳はソリューションアーキテクトの 矢木 覚 が担当しました。原文はこちらです。