アクティブ・スタンバイ・ペアでのDDL変更

特定のDDL文の自動レプリケーションを構成できます。サポートされているDDL文をアクティブ・マスターで実行すると、それが自動的にアクティブ・スタンバイ・ペアのレプリケーション・スキーム内のすべてのデータベースにレプリケートされます。

アクティブ・スタンバイ・ペア内のすべてのデータベースへのオブジェクト・レプリケーションの制御

DDLReplicationLevelおよびDDLReplicationAction接続属性を使用して、DDL文によって作成または削除されるオブジェクトの、どれをアクティブ・スタンバイ・ペアのレプリケーション・スキームに含まれるデータベースにレプリケートするかを制御します。接続属性の詳細は、『Oracle TimesTen In-Memory Databaseオペレーション・ガイド』TimesTenデータベースを識別するためのデータソース名の指定を参照してください。

DDLReplicationLevel接続属性によって、レプリケートされるDDL文を制御します。

  • DDLReplicationLevel=1の場合。表、索引またはシノニムのCREATE文またはDROP文はスタンバイ・データベースにレプリケートされません。ただし、レプリケート表に対して列の追加または削除を行うことで、それらのアクションがスタンバイ・データベースにレプリケートされます。

  • DDLReplicationLevel=2 (デフォルト)では、表、索引およびシノニムの作成および削除のレプリケーションが有効になります。

    表をレプリケーション・スキームに含めるには、表を作成する前に、DDLReplicationAction接続属性を'INCLUDE' (デフォルト)に設定する必要があります。DDLReplicationAction='EXCLUDE'の場合、表はレプリケーション・スキームに含まれません。表がレプリケーション・スキームから除外されている場合、表を作成または削除するためのDDL文はスタンバイ・マスターにレプリケートされますが、表に対して実行されるDML文はレプリケートされません。

    ノート:

    次の場合にはレプリケーション・スキームから表を除外することが考えられます。

    • NULLを指定できない列に主キーも一意索引もないレプリケーション・スキームに表を作成する場合。

    • データをローカルでのみ使用し、表の更新はレプリケートしない一時表を作成する場合。

    アクティブ・スタンバイ・ペアに既存の表を追加するには、ALTER ACTIVE STANDBY PAIR INCLUDE TABLE文を使用します。表は空である必要があります。

    ただし、ALTER TABLE ... ADD COLUMN NOT NULL DEFAULT文を使用して、表を変更してNOT NULL列をレプリケーション・スキームの一部である表に追加することはできません。表にNOT NULL列を追加する前に、まず、レプリケーション・スキームから表を削除する必要があります。

  • DDLReplicationLevel=3では次のことが可能です。

    • DDLReplicationLevel=2を指定した場合にレプリケートされる同じオブジェクトの、レプリケーション・スキームのすべてのデータベースへのレプリケーション。

    • レプリケーション・スキームのすべてのデータベースへのビューの作成と削除のレプリケーション。

    • レプリケーション・スキームのすべてのデータベースへの作成および削除の順序のレプリケーション(作成前にDDLReplicationAction='INCLUDE' (デフォルト)の場合)。DDLReplicationAction='EXCLUDE'の場合、順序はレプリケーション・スキームに含まれません。順序がレプリケーション・スキームから除外される場合は、順序の作成と削除のためのDDL文はスタンバイ・マスターにレプリケートされますが、アクティブ・マスターとスタンバイ・マスターのそれぞれの順序は別々のオブジェクトとなります。

    • キャッシュ管理ユーザーの名前とパスワードをttCacheUidPwdSet組込みプロシージャを使用してアクティブ・マスターに設定するときに、結果をスタンバイ・マスターにレプリケーション。アクティブ・マスターに対してttCacheUidPwdSet組込みプロシージャを実行するために、キャッシュ・エージェントまたはレプリケーション・エージェントを停止し、再起動する必要はありません。「レプリケーションで使用されるユーザー名またはパスワードの変更」を参照してください。

    • このレベルを使用すると、ALTER TABLE ... ADD COLUMN NOT NULL DEFAULT文を使用して、表を変更してNOT NULL列をレプリケーション・スキームの一部である表に追加できます。

DDLReplicationLevel属性は接続ストリングの一部として設定でき、また、接続開始後にALTER SESSION文を使用して変更できます。

ALTER SESSION SET DDL_REPLICATION_LEVEL=3;

DDLReplicationAction属性は接続ストリングの一部として設定でき、また、接続開始後にALTER SESSION文を使用して変更できます。

ALTER SESSION SET ddl_replication_action='EXCLUDE';

『Oracle TimesTen In-Memory Database SQLリファレンス』ALTER SESSIONおよびALTER ACTIVE STANDBY PAIRを参照してください

ノート:

DDL操作は自動的にコミットされます。RETURN TWOSAFEが指定されている場合は、「RETURN TWOSAFE」で説明されているように、エラーおよびタイムアウトが発生する可能性があります。RETURN TWOSAFEタイムアウトが発生すると、指定されているLOCAL COMMIT ACTIONに関係なく、DDLトランザクションはローカルでコミットされます。

自動的にレプリケートできるDDL文

レプリケーション・エージェントを停止せずに、アクティブ・スタンバイ・ペアで次のDDL文を実行できます。また、これらの文はレプリケーション・スキームのすべてのデータベースにレプリケートされます。

DDLReplicationLevelが2または3の場合(デフォルトは2)、次の文は自動的にレプリケートされます。

  • ユーザーを作成、変更、削除する際のCREATE USER文、ALTER USER文、DROP USER文。

  • ユーザーに権限を付与する、または権限を取り消す際のGRANT文またはREVOKE文。

  • ALTER TABLE ... ADD COLUMN文またはALTER TABLE ... DROP COLUMN文を使用して、列を追加または削除して表を変更します。

    これらはレプリケートされる唯一のALTER TABLE句です。ただし、DDLReplicationLevel=2の場合は、ALTER TABLE ... ADD COLUMN NOT NULL DEFAULT文を使用して、表を変更してNOT NULL列をレプリケーション・スキームの一部である表に追加することはできません。この文はDDLReplicationLevel=3の場合に実行できます。

  • CREATE TABLE文またはDROP TABLE文を使用して、表を作成または削除します。新しい表はアクティブ・スタンバイ・ペアに含まれます。

  • CREATE SYNONYM文またはDROP SYNONYM文を使用して、シノニムを作成または削除します。

  • CREATE INDEX文またはDROP INDEX文を使用して、索引を作成または削除します。

レプリケーション・エージェントを停止せずに、アクティブ・スタンバイ・ペアで次のタスクを実行できます。また、これらの文はレプリケーション・スキームのすべてのデータベースにレプリケートされます。DDLReplicationLevelが3に設定されている場合、次の文は自動的にレプリケートされます。

  • ビューを作成または削除する際のCREATE VIEW文またはDROP VIEW文。

  • 順序を作成または削除する際のCREATE SEQUENCE文またはDROP SEQUENCE文。順序の作成前にDDLReplicationAction接続属性がINCLUDE(デフォルト)に設定されている場合、これらの文はレプリケーション・スキーム内のすべてのデータベースに自動的にレプリケートされ、アクティブ・スタンバイ・ペアに含まれますが、DDLReplicationAction接続属性がEXCLUDEに設定されている場合、順序はレプリケーション・スキームに含まれません。

ttCacheUidPwdSet組込みプロシージャを使用して、キャッシュ管理ユーザーのユーザー名とパスワードをアクティブ・マスターに設定するときに、キャッシュ・エージェントやレプリケーション・エージェントを停止する必要はありません。DDLReplicationLevel=3の場合、この情報はスタンバイ・マスターに自動的にレプリケートされます。「レプリケーションで使用されるユーザー名またはパスワードの変更」を参照してください。

レプリケーション・エージェントを停止した後にのみ、アクティブ・スタンバイ・ペアで次のタスクを実行できます。これらの文はスタンバイ・マスターにレプリケートされないため、これらの文のレプリケーションを実行するか、レプリケーション・エージェントの停止後にレプリケーション・スキーム内のすべてのノードに対してこれらの文を実行することにより、スタンバイ・マスターおよびすべてのサブスクライバに変更が伝播されたことを確認する必要があります。処理が完了したら、すべてのノードでレプリケーション・エージェントを再起動します。

  • マテリアライズド・ビューを作成、削除または変更するためのDDL文。

  • ALTER CACHE GROUP ... SET AUTOREFRESH MODE文またはALTER CACHE GROUP ... SET AUTOREFRESH INTERVAL文を使用した自動リフレッシュ・モードまたは自動リフレッシュ間隔の変更。

レプリケーション・エージェントを停止せずに、アクティブ・スタンバイ・ペアで次のタスクを実行できます。ただし、これらの文はスタンバイ・マスターにレプリケートされないため、これらの文のレプリケーションを実行するか、レプリケーション・エージェントの停止後にレプリケーション・スキーム内のすべてのノードに対してこれらの文を実行することにより、スタンバイ・マスターおよびすべてのサブスクライバに変更が伝播されたことを確認する必要があります。

  • ALTER CACHE GROUP ... SET AUTOREFRESH STATE文を使用してキャッシュ・グループの自動リフレッシュ状態を変更。ただし、アクティブ・マスターでキャッシュ・グループの自動リフレッシュ状態をOFFに設定することはできません。

  • PL/SQLファンクション、PL/SQLプロシージャ、PL/SQLパッケージまたはPL/SQLパッケージ本体の作成または削除。これらのオブジェクトのレプリケーション・エージェントを停止する必要はありません。「既存のアクティブ・スタンバイ・ペアでの新しいPL/SQLオブジェクトの作成」を参照してください。

  • レプリケートされない他のすべてのDDL文(マテリアライズド・ビューは除く)。

既存のアクティブ・スタンバイ・ペアでの新しいPL/SQLオブジェクトの作成

既存のアクティブ・スタンバイ・ペアに新しいPL/SQLプロシージャ、パッケージ、パッケージ本体またはファンクションを追加するために実行する、いくつかのタスクを示します。

  1. アクティブ・データベースでPL/SQLオブジェクトを作成します。CREATE文はスタンバイ・データベースにレプリケートされません。

  2. スタンバイ・データベースおよびすべてのサブスクライバでのPL/SQLオブジェクトの作成。

  3. アクティブ・データベースの新しいPL/SQLオブジェクトに権限を付与します。GRANT文はスタンバイ・データベースおよびすべてのサブスクライバにレプリケートされます。

アクティブ・スタンバイ・ペアでのDDL変更に関する制限事項

アクティブ・スタンバイ・ペアにおいてDDLに変更を加える場合の、いくつかの制限事項を示します。

DDLReplicationLevelが2または3の場合:

  • CREATE TABLE ... AS SELECT文、ALTER TABLE ... ADD CONSTRAINT文、ALTER TABLE ... ADD UNIQUE文およびALTER TABLE ... MODIFY文は、レプリケートされません。

  • 索引が空の表に作成される場合にのみ、CREATE INDEX文はレプリケートされます。移入済の表に新規の索引を作成するには、DDLReplicationLevelを2未満の値に設定し、アクティブとスタンバイの両方に手動で索引を作成します。

  • DDLReplicationLevelが2または3の場合、次の文はスタンバイ・データベースで実行することはできません。

    • CREATE USERALTER USERDROP USER

    • CREATE TABLEDROP TABLE

    • CREATE INDEXDROP INDEX

    • GRANTREVOKE

    • CREATE SYNONYMDROP SYNONYM

DDLReplicationLevelが3の場合:

  • CREATE SEQUENCE ... CYCLE文はレプリケートされません。

  • DDLReplicationLevel=3の場合、次の文はスタンバイ・データベースで実行できません。

    • CREATE INDEXDROP INDEX

    • DDLReplicationAction='INCLUDE'の場合、CREATE SEQUENCEDROP SEQUENCE

      ノート:

      ただし、DDLReplicationAction='EXCLUDE'DDLReplicationLevel=3の場合は、スタンバイ・マスターで順序を作成または削除できます。

アクティブ・スタンバイ・ペアでのDDL変更の方法を示す例

これらの例では、アクティブ・スタンバイ・ペアでのDDL変更の方法を実際に示します。

次の例は、表を作成してアクティブ・スタンバイ・ペアに含めるときのDDLの変更を示しています。

アクティブ・データベースで、DDLReplicationLevel2に、DDLReplicationAction'INCLUDE'に設定します。

Command > ALTER SESSION SET ddl_replication_level=2;
Session altered.
Command > ALTER SESSION SET ddl_replication_action='INCLUDE';
Session altered.

表を作成します。表には主キーまたは索引が含まれている必要があります。

Command > CREATE TABLE tabinclude (col1 NUMBER NOT NULL PRIMARY KEY);
Table created.

tabincludeに1行挿入します。

Command > INSERT INTO tabinclude VALUES (55);
1 row inserted.

スタンバイ・データベースで、INSERT文がレプリケートされていることを確認します。これは、tabinclude表がアクティブ・スタンバイ・ペアに含まれていることを示します。

Command > SELECT * FROM tabinclude;
< 55 >
1 row found.

または、ttIsql repschemesコマンドを使用して、どの表がアクティブ・スタンバイ・ペアに含まれているかを確認します。

次の例は、表を作成して後からアクティブ・スタンバイ・ペアに含めるときのDDLの変更を示しています。

アクティブ・データベースで、DDLReplicationLevel2に、DDLReplicationAction'EXCLUDE'に設定します。

Command> ALTER SESSION SET ddl_replication_level=2;
Session altered.
Command> ALTER SESSION SET ddl_replication_action='exclude';
Session altered.

主キーまたは索引を含まない表を作成します。その表をアクティブ・スタンバイ・ペアに含めてみます。

Command> CREATE TABLE newtab (a NUMBER NOT NULL);
Command> ALTER ACTIVE STANDBY PAIR INCLUDE TABLE newtab;
 8000: No primary or unique index on non-nullable column found for replicated 
 table TERRY.NEWTAB
The command failed.

表に索引を作成します。その表をアクティブ・スタンバイ・ペアに含めます。

Command> CREATE UNIQUE INDEX ixnewtab ON newtab(a);
Command> ALTER ACTIVE STANDBY PAIR INCLUDE TABLE newtab;

表に1行挿入します。

Command> INSERT INTO newtab VALUES (5);
1 row inserted.

スタンバイ・データベースで、行が挿入されていることを確認します。

Command> SELECT * FROM newtab;
< 5 >
1 row found.

この例では、表をアクティブ・スタンバイ・ペアに含めるのに主キーを必要としない場合について示しています。

次の例では、CREATE INDEXがレプリケートされた場合のDDLの変更を示します。

アクティブ・データベースで、DDLReplicationLevel=2およびDDLReplicationAction='INCLUDE'を設定します。

Command> ALTER SESSION SET ddl_replication_level=2;
Session altered.
Command> ALTER SESSION SET ddl_replication_action='include';
Session altered.

主キーを含む表を作成します。表は自動的にアクティブ・スタンバイ・ペアに含められます。

Command> CREATE TABLE tab2 (a NUMBER NOT NULL, b NUMBER NOT NULL, 
        PRIMARY KEY (a));

表に索引を作成します。

Command> CREATE UNIQUE INDEX ixtab2 ON tab2 (b);

スタンバイ・データベースで、CREATE INDEX文がレプリケートされていることを確認します。

Command> indexes;
 
Indexes on table TERRY.TAB2:
  IXTAB2: unique range index on columns:
    B
  TAB2: unique range index on columns:
    A
  2 indexes found.
 
Indexes on table TERRY.NEWTAB:
  NEWTAB: unique range index on columns:
    A
  1 index found.
 
Indexes on table TERRY.TABINCLUDE:
  TABINCLUDE: unique range index on columns:
    A
  1 index found.
4 indexes found on 3 tables.

次の例では、CREATE SYNONYMがレプリケートされた場合のDDLの変更を示します。

DDLReplicationLevelはデフォルトの2に設定されています。tabincludeのシノニムを作成します。

Command> CREATE SYNONYM syntabinclude FOR tabinclude;
Synonym created.

スタンバイ・データベースで、ttIsql synonymsコマンドを使用して、CREATE SYNONYM文がレプリケートされていることを確認します。

Command> synonyms;
TERRY.SYNTABINCLUDE
1 synonym found.