3.16 データベース間でのGeoRasterデータの転送

GeoRasterデータは、同じデータベース内のスキーマ間、またはデータベース間で転送できます。GeoRasterデータを転送する方法はいくつかあります。

  • GDALまたはGeoRaster ETLツールを使用して、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送します。この方法では、ソースGeoRaster表からGeoTIFFなどの交換ファイル形式にラスターをエクスポートし、その後、ターゲット・スキーマまたはデータベースにそれらをインポートします。
  • SDO_GEOR.copyまたはSDO_GEOR.changeFormatCopyプロシージャを使用して、同じデータベース内のスキーマ間でGeoRasterデータを転送します。アクセス権が付与されている場合、GeoRasterオブジェクトはスキーマ間で直接コピーされます。
  • データ・ポンプ・エクスポート・ユーティリティおよびインポート・ユーティリティを使用して、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送します。詳細は、データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送を参照してください。
  • トランスポータブル表領域を使用して、データベース間でGeoRasterデータを転送します。詳細は、トランスポータブル表領域を使用したGeoRasterデータの転送を参照してください。
  • Oracleデータベース・リンクを使用して、データベース間でGeoRasterデータを転送します。詳細は、GeoRasterデータでのデータベース・リンクの使用を参照してください。

GeoRasterデータベースでは、各ラスター・データ表(RDT)の名前は一意である必要があり、GeoRasterオブジェクトの(rasterDataTable, rasterID)のペアはデータベース内で一意である必要があります(「ラスター・データ表」を参照)。そのため、データ・ポンプ、トランスポータブル表領域またはデータベース・リンクの方法を使用してデータベース間でGeoRasterデータを転送する場合、ターゲット・データベース内のrasterDataTable名またはrasterIDの競合が発生する可能性があります。RDT名を変更して一意にすると属性のペア(rasterDataTable, rasterID)が自動的に一意になるため、これらの各データ転送方法に関する以降のサブセクション内の例で示すように、RDTの名前を変更することで競合を必ず解決することをお薦めします。また、同じ名前のGeoRaster表がターゲット・データベースにすでに存在する場合は、ターゲット・データベース内の転送されたGeoRasterオブジェクトを既存のGeoRaster表に追加するのではなく、それらのオブジェクト用に新しいGeoRaster表を作成することをお薦めします。

3.16.1 データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送

データ・ポンプ・ユーティリティを使用すると、同じデータベース内のスキーマ間、またはデータベース間でGeoRasterデータを転送できます。次に、データベース間でGeoRasterデータを転送する手順を示します。ただし、それらはスキーマ間のGeoRasterデータ転送にも適用できます。データ・ポンプ・エクスポート・ユーティリティおよびインポート・ユーティリティの詳細は、『Oracle Databaseユーティリティ』を参照してください。

データ・ポンプを使用してGeoRasterデータをエクスポートする方法は、他のタイプのデータをエクスポートする場合と同様ですが、GeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)および内部DDLトリガー(名前がSDO_GEOR_ADDL_TRIGGERおよびSDO_GEOR_BDDL_TRIGGER)は除外します。たとえば:

expdp herman DIRECTORY=dump_dir DUMPFILE=data.dmp 
TABLES=herman.georaster_table,herman.rdt_1,herman.rdt_2 
PARFILE=exclude.par
Enter password: password

前述のコードでは、exclude.parファイルの内容は次のとおりです。

exclude=trigger:"like 'GRDMLTR_%'"
exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

次に、データ・ポンプを使用してGeoRasterデータ(つまり、GeoRaster表および関連するラスター・データ表(RDT))をターゲット・データベースにインポートするための一般的な手順を示します。

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. データ・ポンプ・ダンプ・ファイル内のGeoRasterオブジェクトとターゲット・データベース内のGeoRasterオブジェクトとの間に競合があるかどうかを確認します。
    1. ターゲット・データベースにGeoRasterオブジェクトがない場合は、競合はありません。
    2. ダンプ・ファイル内のGeoRaster表名およびRDT名がわかっている場合は、ターゲット・データベースでSDO_GEOR_ADMIN.isRDTNameUniqueファンクションを使用してRDT名の競合があるかどうかを確認します。たとえば:
      SELECT SDO_GEOR_ADMIN.isRDTNameUnique(<rdt_name>) FROM DUAL;

      前述のコードでは、<rdt_name>はダンプ・ファイル内のRDTの名前です。問合せでFALSEが返された場合、<rdt_name>にRDT名の競合があります。

    3. ダンプ・ファイル内のGeoRaster表名およびRDT名が不明な場合は、SQLFILEオプションを指定してimpdpを使用し、すべてのインポートDDL文をファイルに取得します。GeoRaster表名およびRDT名を、そのファイル内のDDL文から取得します。たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp SQLFILE=dpump_dir:ddl.sql REMAP_SCHEMA=herman:scott

      前述のコードでは、ddl.sqlに、impdpによって実行されるDDL文が含まれています。次に、ddl.sql内の各RDT名について、ターゲット・データベースでSDO_GEOR_ADMIN.isRDTNameUniqueファンクションを使用してRDT名の競合があるかどうかを確認します。

  3. ステップ2でRDT名の競合が検出された場合、またはインポートしたRDT表の名前を変更する場合は、このステップをスキップしてステップ4に進みます。それ以外の場合は、次の説明に従ってGeoRaster表およびRDT表をインポートし、インポートしたデータを検証します。この後は、ステップ4をスキップしてもかまいません。これは、このステップの最後に必要なGeoRasterデータがすでにインポートされているためです。

    他のタイプのデータをインポートする場合と同じようにGeoRasterデータをインポートしますが、エクスポート操作でGeoRasterの内部DMLトリガー(名前がGRDMLTR_で始まるもの)およびDDLトリガー(SDO_GEOR_ADDL_TRIGGERおよびSDO_GEOR_BDDL_TRIGGER)を除外しなかった場合は、除外します。たとえば:

    impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp PARFILE=exclude.par
     REMAP_SCHEMA=herman:scott TABLES=herman.georaster_table,herman.rdt_1,herman.rdt_2

    前述のコードでは、exclude.parファイルの内容は次のとおりです。

    exclude=trigger:"like 'GRDMLTR_%'"
    exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
    exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

    GeoRasterの内部DMLトリガーおよびDDLトリガーを除外しないと、次のようなimpdpエラーが発生します。ただし、それらのエラーは無視しても問題ありません。

    ORA-39083: Object type TRIGGER failed to create with error:
    ORA-13391:  GeoRaster reserved names cannot be used to create regular triggers
  4. 競合を解決し、GeoRasterデータをインポートします。
    1. インポート中にRDT名を新しいRDT名に変更するには、REMAP_TABLEオプションを指定してimpdpを使用することでRDTをインポートします(RDT名がターゲット・データベース全体で一意であることを確認してください)。データ転送を容易にするために、また推奨事項として、新しいRDT名は、古いRDT名すべての末尾に文字列と数字を付加することで作成します。
      たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp
      TABLES=herman.rdt_1,herman.rdt_2 REMAP_SCHEMA=herman:scott 
      REMAP_TABLE=herman.rdt_1:rdt_1_imp_1, herman.rdt_2:rdt_2_imp_1

      前述のコードでは、rdt_1rdt_1_imp_1に再マップされ、rdt_2rdt_2_imp_1に再マップされます。

    2. CONTENT=METADATA_ONLYオプションを指定してimpdpを使用することでGeoRaster表のメタデータをインポートし、ステップ3の説明に従ってGeoRasterのDMLトリガーおよびDDLトリガーを除外します。
      たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp TABLES=herman.georaster_table 
      REMAP_SCHEMA=herman:scott CONTENT=metadata_only PARFILE=exclude.par

      ターゲット・スキーマにそのGeoRaster表がすでに存在する場合は、前述のコードでREMAP_TABLEオプションを使用して、インポートしたGeoRaster表名を新しい名前に再マップすることをお薦めします。

    3. GeoRaster表のメタデータをインポートするターゲット・データベースにログインし、インポートしたGeoRaster表ごとに一時DMLトリガーを作成します。これにより、ステップdのデータ・インポート中に、インポートしたGeoRasterオブジェクトのrasterDataTable属性が新しいRDT名に自動的に置換されます。新しいRDT名は、ステップaの新しいRDT名と同じである必要があります。
      DMLトリガー定義の例を次に示します。
      DEFINE tname=georaster_table  -- the georaster table name
      DEFINE cname=grobj            -- the georaster column name
      DEFINE rdt_suffix=’IMP’       -- the string to append  to the RDT names 
      DEFINE seq_num=1              -- the number to append  to the RDT names
      
      CREATE OR REPLACE TRIGGER tmp_dml_trigger 
        BEFORE INSERT ON &tname 
        FOR EACH ROW 
        BEGIN
        -- the new RDT table name is constructed as the old RDT table name appended with
        -- the string defined in rdt_suffix and the sequence number defined in seq_num. 
        :new.&cname.rasterDataTable := :new.&cname.rasterDataTable||’_&rdt_suffix’||’_’||’&seq_num’;
        END;
      /
      
    4. CONTENT=DATA_ONLYオプションを指定してimpdpを使用することで、GeoRaster表データをインポートします。たとえば:
      impdp scott DIRECTORY=dpump_dir DUMPFILE=data.dmp  
      TABLES=herman.georaster_table REMAP_SCHEMA=herman:scott CONTENT=data_only

      ステップbでREMAP_TABLEオプションを使用した場合は、前述のコードにもそのオプションを含めます。

    5. ステップcで作成した一時DMLトリガーを削除します。インポートしたデータを検証して確認します。
    前述の例では、ソース・データベース内のスキーマHERMANからターゲット・データベース内のスキーマSCOTTに、GeoRaster表georaster_tableおよび2つのRDT (rdt_1およびrdt_2)を転送しています。georaster_table内のすべてのGeoRasterオブジェクトはそれらのラスター・セル・データをrdt_1またはrdt_2に格納し、これら2つのRDTは他のGeoRaster表で使用されないものとします。

3.16.2 トランスポータブル表領域を使用したGeoRasterデータの転送

Oracle Databaseトランスポータブル表領域機能を使用して、データベース間でGeoRasterデータを転送できます。空間データでの表領域転送機能の使用の詳細は、Oracle Database管理者ガイドデータベース間での表領域の転送を参照してください。

トランスポートする表領域に、GeoRaster表またはラスター・データ表(RDT)に対する空間索引が含まれる場合、状況によってはいくつかの準備ステップを実行する必要があります。空間データでのトランスポータブル表領域機能の使用の詳細は、Oracle Spatial開発者ガイドSDO_UTIL.INITIALIZE_INDEXES_FOR_TTSプロシージャの使用上のノートを参照してください。

次の項で説明する手順で、トランスポータブル表領域を使用してデータベース間でGeoRasterデータを転送できます。

3.16.2.1 ソース・データベースからの表領域のエクスポート

GeoRasterデータの移行のためにソース・データベースから表領域をエクスポートするには、次の手順を実行します。

  1. 転送する表領域が自己完結型であることを確認します。たとえば、SQL*PlusでDBAとして次を実行します。
    EXECUTE DBMS_TTS.TRANSPORT_SET_CHECK(‘tbs_1, tbs_2’, TRUE);
    SELECT * FROM TRANSPORT_SET_VIOLATIONS;

    前述のコードでは、tbs_1およびtbs_2は、転送する表領域の名前です。

  2. 転送する表領域をREAD ONLYにします。たとえば、SQL*PlusでDBAとして次を実行します。
    ALTER TABLESPACE tbs_1 READ ONLY;
    ALTER TABLESPACE tbs_2 READ ONLY;
  3. DATAPUMP_EXP_FULL_DATABASEロールを持つユーザーとしてデータ・ポンプ・エクスポート・ユーティリティを実行します。たとえば:
    $ expdp <user_name> DUMPFILE=tbs_meta.dmp DIRECTORY=data_pump_dir TRANSPORT_TABLESPACES=tbs_1,tbs_2 LOGFILE=tts_exp.log
  4. ステップ3でエクスポートしたダンプ・ファイル、および表領域データファイルを、ターゲット・データベースからアクセスできるディレクトリに転送します。
  5. 表領域をREAD WRITEモードに戻します。
    ALTER TABLESPACE tbs_1 READ WRITE;
    ALTER TABLESPACE tbs_2 READ WRITE;

3.16.2.2 ターゲット・データベースへの表領域のインポート

GeoRasterデータの移行のためにターゲット・データベースに表領域をインポートするには、次の手順を実行します。

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. データ・ポンプ・インポート・ユーティリティを実行します。たとえば:
    $ impdp <user_name> DIRECTORY=data_pump_dir DUMPFILE=tbs_meta.dmp 
    LOGFILE=tts_imp.log TRANSPORT_DATAFILES='/app/oracle/oradata/tbs_1.dbf', ’/app/oracle/oradata/tbs_2.dbf’ 
    REMAP_SCHEMA=src_gruser1:target_gruser1 REMAP_SCHEMA=src_gruser2:target_gruser2 PARFILE=exclude.par

    前述のコードでは、<user_name>DATAPUMP_EXP_FULL_DATABASEロールを持つユーザーです。

    exclude.parファイルの内容は次のとおりです。

    exclude=trigger:"like 'GRDMLTR_%'"
    exclude=trigger:"= 'SDO_GEOR_ADDL_TRIGGER'"
    exclude=trigger:"= 'SDO_GEOR_BDDL_TRIGGER'"

    そのGeoRaster表名がターゲット・データベース・スキーマにすでに存在する場合は、impdpコマンドのREMAP_TABLEオプションを使用してGeoRaster表名を新しい名前に再マップします。

  3. 転送された表領域をREAD WRITEモードに設定します。
    ALTER TABLESPACE tbs_1 READ WRITE;
    ALTER TABLESPACE tbs_2 READ WRITE;
  4. ターゲット・データベース内にRDT名の競合があるかどうかを確認します。
    1. DBAとして次の問合せを実行することで、転送された表領域内のGeoRaster表および列を確認します。
      SELECT t.owner, t.table_name, c.column_name 
      FROM dba_all_tables t, dba_tab_columns c 
      WHERE t.tablespace_name IN ('TBS_1', ‘TBS_2’) 
           AND t.owner = c.owner 
           AND t.table_name = c.table_name 
           AND c.data_type = 'SDO_GEORASTER' 
           AND c.data_type_owner IN ('MDSYS', 'PUBLIC');

      前述のコードでは、TBS_1およびTBS_2は、転送された表領域の名前です。この問合せでは、転送された表領域内のGeoRaster表および列の名前のリストが返されます。

    2. RDT名の競合があるかどうかを確認します。
      SELECT a.rdt_name 
          	    FROM ( SELECT UNIQUE t.<column_name>.rasterdatatable rdt_name 
                  		FROM <owner>.<table_name> t) a
                      WHERE SDO_GEOR_ADMIN.isRDTNameUnique(a.rdt_name)=’FALSE’;
      
      

      前述のコードでは、<owner><table_name>および<column_name>は、ステップaで返された名前です。

      この問合せでは、名前を変更する必要がある、転送された表領域内の競合しているRDT名が返されます。
  5. ステップ4でRDT名の競合がない場合は、このステップをスキップしてステップ6に進みます。それ以外の場合は、転送されたRDTの名前を変更することで、ターゲット・データベース内の競合を解決します。
    1. DBA_TRIGGERSビューを問い合せることで、転送されたGeoRaster表のDMLトリガー名(GRDMLTR_で始まるもの)を確認します。
      SELECT owner, trigger_name FROM dba_triggers WHERE table_owner = ‘<owner>’
      AND table_name = ‘<table_name>’ AND trigger_name LIKE 'GRDMLTR_%';

      前述のコードでは、<table_name>および<owner>は、ステップ4で検出された競合しているRDT名があるGeoRaster表の名前と所有者です。

    2. DBAとして接続し、ステップaで返されたDMLトリガーを無効にします。
      ALTER TRIGGER <owner>.<TRIGGER_NAME> DISABLE;
    3. 競合しているRDTを新しい名前に変更し、GeoRaster表内のGeoRasterオブジェクトのrasterDataTable属性を更新します。SQL*Plusで所有者としてRDTに接続します。
      RENAME <old_rdt> to <new_rdt>;
      UPDATE <table_name> t  SET t.<column_name>.rasterDataTable = ‘<new_rdt>’ 
      WHERE t.<column_name>.rasterDataTable=’<old_rdt>’;

      前述のコードで:

      • <old_rdt>: 競合している古いRDT名
      • <new_rdt>: ターゲット・データベース内で一意の新しいRDT名
      • <table_name>: GeoRaster表名
      • <column_name>: ステップ4で返された競合するRDT名に関連付けられているGeoRaster列名

      競合するRDTすべてについてこのステップを繰り返します。

    4. DBAとして接続し、ステップbで無効にしたDMLトリガーを有効にします。
      ALTER TRIGGER <owner>.<TRIGGER_NAME> ENABLE;
  6. 競合がないか、ステップ5で競合を解決した場合は、SDO_GEOR_ADMIN.registerGeoRasterObjectsをコールして、転送されたGeoRasterオブジェクトを登録します。たとえば、SQL*PlusでDBAとして次を実行します。
    EXECUTE SDO_GEOR_ADMIN.registerGeoRasterObjects;

3.16.3 GeoRasterデータでのデータベース・リンクの使用

Oracle Databaseリリース12.2以降、データベース・リンクを使用して、あるデータベースから別のデータベースにGeoRasterデータを転送できます。

データベース・リンクを介してSQL問合せを実行し、ラスター・データ表(RDT)内のリモートGeoRasterオブジェクトの属性およびバイナリ・データにアクセスできます。GeoRaster PL/SQLパッケージで提供されるGeoRasterデータ操作は、データベース・リンクを介してリモートGeoRasterオブジェクトで使用することはできません。

ノート:

異なるリリースのデータベース間の相互運用性サポートは、Oracle相互運用性サポートで確認できます。

データベース・リンクを介してGeoRasterデータを転送するには:

  1. ターゲット・データベース・スキーマがGeoRasterに対応していることを確認します。スキーマ・レベルでのGeoRasterの有効化で説明されているステップに従います。
  2. 次のSQL文を実行して、ターゲット・データベースにデータベース・リンクを作成します。
    CREATE PUBLIC DATABASE LINK <dblink name> 
          CONNECT TO <username> IDENTIFIED BY <password>
          USING '<tnsname>';

    前述のコードで:

    • <dblink name>: データベース・リンクの名前
    • <username>: GeoRaster表が存在するソース・データベース・スキーマに接続するためのユーザー名
    • <password>: ソース・データベース・ユーザーのパスワード
    • <tnsname>: ターゲット・データベースのtnsname.oraに定義されているソース・データベース接続名
  3. ソース・データベースから転送するGeoRaster表およびRDTを特定します。ターゲット・データベースから次の問合せを実行して、GeoRaster表内のGeoRasterオブジェクトに関連付けられているRDTを取得します。
    SELECT UNIQUE t.<column_name>.rasterDataTable FROM <source_georaster_table>@<dblink_name> t;

    前述のコードでは、<column_name>は、ソース・データベース内の <source_georaster_table>のGeoRaster列名です。

  4. ソース・データベースからターゲット・データベースにRDTデータを転送します。
    CREATE TABLE <target_rdt_table> AS (SELECT * FROM <source_rdt_table>@<dblink_name>);
    前述のコードの<source_rdt_table>は、ステップ3で特定したRDTです(この例では、<source_rdt_table>には転送するラスター・データのみが含まれていると想定しています)。<source_rdt_table>がターゲット・データベース内で一意である場合(SDO_GEOR_ADMIN.isRDTNameUnique(<source_rdt_table>)trueを返す)、<target_rdt_table><source_rdt_table>と同じである必要があります。それ以外の場合は、<target_rdt_table>の一意の名前を選択します。
  5. ソース・データベースからターゲット・データベースにGeoRaster表内のGeoRasterオブジェクトを転送します。次のように、新しいGeoRaster表をターゲット・データベース内に作成できます。
    CREATE TABLE <target_georaster_table> AS (SELECT * FROM <source_georaster_table>@<dblink_name>);
    ステップ4でターゲット・データベース内で作成した新しいRDTの名前<target_rdt_table>がソース・データベース内のRDT名<source_rdt_table>と異なる場合は、<target_georaster_table>内のGeoRasterオブジェクトのrasterDataTable属性を次のように更新する必要があります。
    1. スキーマ・ユーザーとして接続し、GeoRaster表のGeoRaster DMLトリガー名を確認します。
      SELECT trigger_name FROM user_triggers WHERE table_name = ‘<target_georaster_table>’ AND trigger_name LIKE 'GRDMLTR_%';

      前述のコードでは、<target_georaster_table>はターゲット・データベース内のGeoRaster表名です

    2. DBAとして接続し、GeoRaster DMLトリガーを無効にします。
      ALTER TRIGGER <owner>.<trigger_name> DISABLE;
    3. スキーマ・ユーザーとして接続し、GeoRasterオブジェクトのrasterDataTable属性を更新します。
      UPDATE <target_georaster_table> t  SET t.<column_name>.rasterDataTable = ‘<target_rdt_table>’ 
      WHERE t.<column_name>.rasterDataTable=’<source_rdt_table>’;

      前述のコードでは、<source_rdt_table>および<target_rdt_table>は、ステップ4で使用した表名です。<column_name>は、<target_georaster_table>内のGeoRaster列名です。

    4. DBAとして接続し、GeoRaster DMLトリガーを有効にします。
      ALTER TRIGGER <owner>.<trigger_name> ENABLE;
  6. スキーマ・ユーザーとして接続し、ターゲット・データベース内の転送されたGeoRasterオブジェクトを登録します。
    EXECUTE SDO_GEOR_ADMIN.registerGeorasterObjects;

    データ・ポンプ・インポート・ユーティリティでデータベース・リンクを使用して、ソース・データベースからターゲット・データベースにGeoRasterデータを直接転送することもできます。データ・ポンプ・インポート・ユーティリティを使用してGeoRasterデータを転送する方法の詳細は、データ・ポンプ・ユーティリティを使用したGeoRasterデータの転送を参照してください。