【DataPump】SwingbenchのSOEスキーマを別のPDBへEXPORT/IMPORTする

DataPump

前々回、SwingbenchのOrder Entryをプラガブル・データベース(PDB1)上にインストールしました。
本投稿ではData Pumpを用いてPDB1に作成したSOEスキーマを新規に作成したPDB2にエクスポート/インポートした時の手順を紹介します。

事前準備

-新規でPDBを構築するためにSQL Developerを起動する。

$ cd $ORACLE_HOME/sqldeveloper
$ ./sqldeveloper.sh

-[表示]>[DBA]をクリックする。

-[+]アイコンをクリックする。

-以下を設定し、[接続]をクリックする。
 接続名:orcl
 ユーザー名:sys
 パスワード:********
 接続タイプ:基本
 ロール:SYSDBA
 ホスト名:orahost
 ポート:1521
 サービス名:orcl

-「orcl」の[コンテナ・データベース]を右クリックし、[プラガブル・データベースの作成]をクリックする。

-以下を設定し、[適用]をクリックする。
 データベース名:PDB2
 管理名:PDB2_Admin
 管理パスワード:********
 ファイル名の変換:カスタム名
 ターゲット・ファイル:以下の通り、管理しやすいように書き換える。
  /oradata/ORCL/PDB2/system.dbf
  /oradata/ORCL/PDB2/sysaux.dbf
  /oradata/ORCL/PDB2/pdb2_temp01.dbf
 無制限:☑

-[OK]をクリックする。

-PDB2のローカル・ネット・サービス名を構成する。

vi $ORACLE_HOME/network/admin/tnsnames.ora

tnsnames.oraに以下を追記する。

PDB2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = orahost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = pdb2)
    )
  )

-リスナーを再起動する。

$ lsnrctl stop LISTENER
$ lsnrctl start LISTENER
$ lsnrctl status LISTENER

statusオプションで以下が出力されることを確認する。

サービス"pdb2"には、1件のインスタンスがあります。
  インスタンス"orcl"、状態READYには、このサービスに対する1件のハンドラがあります

-作成直後のOPEN_MODEはMOUNTEDなのでPDB2をオープンする。

$ sqlplus / as sysdba
SQL> ALTER PLUGGABLE DATABASE PDB2 OPEN;

プラガブル・データベースが変更されました。

SQL> quit

-ローカル・ネット・サービス名の検証を実施する。

$ sqlplus system/********@pdb2
SQL> quit

エクスポートの実施

-PDB1にDataPumpのエクスポート用DIRECTORYを作成する

$ mkdir /home/oracle/tmp/exp
$ sqlplus system/********@pdb1
SQL> CREATE DIRECTORY EXP_DIR as '/home/oracle/tmp/exp';
   書式:CREATE DIRECTORY ディレクトリ名 as ‘ディレクトリパス’;
ディレクトリが作成されました。

-作成されたディレクトリに誤りがないかを確認する。

SQL> COL DIRECTORY_NAME FORMAT a20
SQL> COL DIRECTORY_PATH FORMAT a50
SQL> SET PAGESIZE 100
SQL> SELECT DIRECTORY_NAME,DIRECTORY_PATH FROM DBA_DIRECTORIES;
SQL> quit

-データのエクスポートを実施する。

$ expdp system/********@pdb1 directory=EXP_DIR full=y dumpfile=pdb1_exp.dmp logfile=exp_all.log

インポートの実施

-PDB2にDataPumpのインポート用DIRECTORYを作成する。

$ mkdir /home/oracle/tmp/imp
$ sqlplus system/********@pdb2
SQL> CREATE DIRECTORY IMP_DIR as '/home/oracle/tmp/exp';

ディレクトリが作成されました。

※今回は同じサーバ上で実施しているためIMP用のディレクトリもEXP_DIRと同じディレクトリを指定しています。

-作成されたディレクトリに誤りがないかを確認する。

SQL> COL DIRECTORY_NAME FORMAT a20
SQL> COL DIRECTORY_PATH FORMAT a50
SQL> SET PAGESIZE 100
SQL> SELECT DIRECTORY_NAME,DIRECTORY_PATH FROM DBA_DIRECTORIES;

-DMPファイルからSQLファイルを作成する。

$ impdp system/********@orahost:1521/pdb2 full=y dumpfile=pdb1_exp.dmp directory=IMP_DIR sqlfile=imp_all_pdb2.sql

-出力したSQLファイルから「CREATE USER “SOE” ~」を確認する。

出力した「imp_all_pdb2.sql」より確認した結果

CREATE USER "SOE" IDENTIFIED BY VALUES 'パスワード'
DEFAULT TABLESPACE "SOE"
TEMPORARY TABLESPACE "TEMP";

-DEFAULT TABLESPACE=SOE、TEMPORARY TABLESPACE=TEMPが存在するかを確認する。

表領域SOEがあるかを確認

SQL> COL FILE_NAME format a50
SQL> COL TABLESPACE_NAME FORMAT a20
SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES;

一時領域TEMPがあるかを確認

SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_TEMP_FILES;

上記結果より表領域のみを今回は手動で作成する。

-出力したSQLファイルから「CREATE BIGFILE TABLESPACE “SOE” ~」を確認する。

出力した「imp_all_pdb2.sql」より確認した結果

CREATE BIGFILE TABLESPACE "SOE" DATAFILE
SIZE 2469396480
AUTOEXTEND ON NEXT 67108864 MAXSIZE 33554431M
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1048576 DEFAULT
 NOCOMPRESS  SEGMENT SPACE MANAGEMENT AUTO;

-表領域:SOEを作成する。



$ sqlplus system/********@pdb2
SQL> CREATE BIGFILE TABLESPACE "SOE" DATAFILE '/oradata/ORCL/PDB2/soe.dbf'
2  SIZE 2469396480
3  AUTOEXTEND ON NEXT 67108864 MAXSIZE 33554431M
4  LOGGING ONLINE PERMANENT BLOCKSIZE 8192
5  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1048576 DEFAULT
6  NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;

表領域が作成されました。

→SQLの1行目のディレクトリ指定はPDB2の既存の表領域格納先と合わせる。
 それ以外はSQLファイルに記載された内容で実行する。

-SOEユーザーを作成する。

SQL> CREATE USER "SOE" IDENTIFIED BY VALUES 'パスワード'
  2        DEFAULT TABLESPACE "SOE"
  3        TEMPORARY TABLESPACE "TEMP";

ユーザーが作成されました。

→ SQLファイルに記載された内容で実行する。

-データのインポートを実施する。

$ impdp system/********@orahost:1521/pdb2 schemas=SOE dumpfile=pdb1_exp.dmp directory=IMP_DIR logfile=imp_pdb2_soe.log

~実行結果~
Import: Release 12.1.0.2.0 - Production on 木 1月 9 00:22:07 2020

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

接続先: Oracle Database 12c Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options
マスター表"SYSTEM"."SYS_IMPORT_SCHEMA_01"は正常にロード/アンロードされました
"SYSTEM"."SYS_IMPORT_SCHEMA_01"を起動しています: system/********@orahost:1521/pdb2 schemas=SOE dumpfile=pdb1_exp.dmp directory=IMP_DIR logfile=imp_pdb2_soe.log
オブジェクト型DATABASE_EXPORT/SCHEMA/USERの処理中です
ORA-31684: オブジェクト型USER:"SOE"はすでに存在します
オブジェクト型DATABASE_EXPORT/SCHEMA/GRANT/SYSTEM_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/ROLE_GRANTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/DEFAULT_ROLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLESPACE_QUOTAの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/SEQUENCE/SEQUENCEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/PROCACT_SCHEMAの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLEの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/TABLE_DATAの処理中です
. . "SOE"."ORDER_ITEMS"                         231.2 MB 4349140行がインポートされました
. . "SOE"."INVENTORIES"                         15.21 MB  898152行がインポートされました
. . "SOE"."ORDERS"                              129.9 MB 1438813行がインポートされました
. . "SOE"."ADDRESSES"                           110.3 MB 1503440行がインポートされました
. . "SOE"."CUSTOMERS"                           108.4 MB 1003438行がインポートされました
. . "SOE"."CARD_DETAILS"                        64.04 MB 1503438行がインポートされました
. . "SOE"."LOGON"                               51.51 MB 2395132行がインポートされました
. . "SOE"."ORDERENTRY_METADATA"                 5.609 KB       4行がインポートされました
. . "SOE"."PRODUCT_DESCRIPTIONS"                221.2 KB    1000行がインポートされました
. . "SOE"."PRODUCT_INFORMATION"                 188.4 KB    1000行がインポートされました
. . "SOE"."WAREHOUSES"                          35.92 KB    1000行がインポートされました
オブジェクト型DATABASE_EXPORT/SCHEMA/PACKAGE/PACKAGE_SPECの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/INDEX/INDEXの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/INDEX/FUNCTIONAL_INDEX/INDEXの処理中 です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/INDEX/STATISTICS/FUNCTIONAL_INDEX/INDEX_STATISTICSの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/VIEW/VIEWの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/PACKAGE_BODIES/PACKAGE/PACKAGE_BODYの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/CONSTRAINT/REF_CONSTRAINTの処理中です
オブジェクト型DATABASE_EXPORT/SCHEMA/TABLE/STATISTICS/TABLE_STATISTICSの処理中です
オブジェクト型DATABASE_EXPORT/STATISTICS/MARKERの処理中です
ORA-39082: オブジェクト型PACKAGE BODY:"SOE"."ORDERENTRY"の作成の際、コンパイル・エラーが発生しました
ジョブ"SYSTEM"."SYS_IMPORT_SCHEMA_01"が完了しましたが、2エラーが木 1月 9 00:26:53 2020 elapsed 0 00:04:44で発生しています

-上記のインポート実行結果からエラー内容を確認する。

・エラー1
ORA-31684: オブジェクト型USER:"SOE"はすでに存在します
→前の手順で作成したので無視する。

・エラー2
ORA-39082: オブジェクト型PACKAGE BODY:"SOE"."ORDERENTRY"の作成の際、コンパイル・エラーが発生しました
→コンパイル・エラーが発生したため、次の手順でエラー原因を特定する。

コンパイル・エラーの解消

-インポート時に発生したコンパイル・エラー内容を確認する。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER=PDB2;
SQL> COL OWNER format a10
SQL> COL OBJECT_NAME format a20
SQL> COL OBJECT_TYPE format a20
SQL> COL STATUS format a10
SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS FROM ALL_OBJECTS WHERE STATUS = 'INVALID';

SQL> SHOW ERRORS PACKAGE BODY SOE.ORDERENTRY

-再コンパイルを実施する。

SQL> EXECUTE UTL_RECOMP.RECOMP_SERIAL('SOE');

PL/SQLプロシージャが正常に完了しました。

-再コンパイルでエラーが解消されたかを確認する。

SQL> SHOW ERRORS PACKAGE BODY SOE.ORDERENTRY

-PDB1のSOEスキーマにDBMS_LOCKが付与されているかを確認する。

SQL>  COL GRANTEE format a10
SQL>  COL OWNER format a10
SQL>  COL TABLE_NAME format a20
SQL>  COL PRIVILEGE format a20
SQL>  COL COMMON format a10
SQL>  SET PAGESIZE 100
SQL>  SELECT GRANTEE,OWNER,TABLE_NAME,PRIVILEGE,COMMON FROM DBA_TAB_PRIVS WHERE GRANTEE='SOE';

DBMS_LOCK
DBMS_LOCKパッケージは、Oracle Lock Managementサービスへのインタフェースを提供します。特定モードのロックを要求したり、同一または別のインスタンスにある別のプロシージャ内で識別できる一意の名前をロックに付けたり、ロック・モードの変更およびロックの解放を行うことができます。

https://docs.oracle.com/cd/E16338_01/appdev.112/b56262/d_lock.htm

PDB1でOrder Entryのベンチマークを開始し、以下SELECT文を実施すると
「3=行排他ロック」がかかっていることがわかる。

SQL> COL ORACLE_USERNAME FORMAT a20
SQL> COL OS_USER_NAME FORMAT a20
SQL> COL OBJECT_NAME FORMAT a20z
SQL> SELECT ORACLE_USERNAME,OBJECT_NAME,LOCKED_MODE
2  FROM V$LOCKED_OBJECT A INNER JOIN DBA_OBJECTS B
3  ON A.OBJECT_ID = B.OBJECT_ID;

-DBMS_LOCK権限を付与する。

$ sqlplus / as sysdba
SQL> ALTER SESSION SET CONTAINER=PDB2;
SQL> GRANT EXECUTE ON DBMS_LOCK TO SOE;

権限付与が成功しました。

-再コンパイルを実施する。

SQL> EXECUTE UTL_RECOMP.RECOMP_SERIAL('SOE');

PL/SQLプロシージャが正常に完了しました。

-再コンパイルでエラーが解消されたかを確認する。

SQL> SHOW ERRORS PACKAGE BODY SOE.ORDERENTRY

エラーはありません。

SQL> SELECT OWNER,OBJECT_NAME,OBJECT_TYPE,STATUS FROM ALL_OBJECTS WHERE STATUS = 'INVALID';

レコードが選択されませんでした。

今回はSwingbenchのSOEスキーマをDataPumpで別のPDBへインポートする手順を紹介しました。
DataPumpでのエクスポート/インポートはエラーが発生するケースが多いため、今後もハマった箇所があれば投稿していきたいと思います。

コメント

タイトルとURLをコピーしました