web-dev-qa-db-ja.com

異なるデータテーブルスペースとインデックステーブルスペースを持つOracle 12cエクスポートおよびインポートスキーマ

以下のように、元のエクスポートユーティリティを使用してOracle 12cデータベースからスキーマオブジェクトをエクスポートしたとします。

exp userid=<export_schema_name>/<export_schema_password>@<db_string> file=<file_name>.dmp statistics=none log=<file_name>.log


export_schema_nameはデータとインデックスに異なるテーブルスペースを使用します。data_tbs_1とidx_tbs_1と呼びましょう。 export_schema_nameのすべてのテーブルは、次のように作成されます。

create table <table_name>
(
    -- columns definition
)
tablespace <data_tbs_1>
/
--
alter table <table_name>
add constraint <constraint_name> primary key(<key_name>)
using index tablespace <idx_tbs_1>

次に、エクスポートしたダンプファイルを、以下のように作成した新しいスキーマにインポートします(すでに新しいデータテーブルスペースdata_tbs_2を作成しています)。

create user <import_schema_name> identified by <import_schema_password>
default tablespace <data_tbs_2>

私が使用する最も重要なコマンドは次のとおりです。

imp userid=SYSTEM/<import_system_password>@<db_string> file=<file_name>.dmp statistics=none log=<file_name>.log fromuser=<export_schema_name> touser=<import_schema_name>

私の質問は:

  1. これを行うと、データとインデックスはどこに保存されますか?それらはまだdata_tbs_1とidx_tbs_1にありますかorそれらはすべてdata_tbs_2にあります。
  2. のインデックスがまだidx_tbs_1に保存されている場合、それらを新しいインデックステーブルスペース(idx_tbs_2など)に切り替えるにはどうすればよいですか?
2
phamhoangsy2909

EXPDP(より効率的でパフォーマンスの高いツール)を手元に置いているのに、なぜEXPを使用するのでしょうか。

IMPDPを使用する

これを行うと、データとインデックスはどこに保存されますか?それらはまだdata_tbs_1とidx_tbs_1にありますか、それともすべてdata_tbs_2にありますか。

はい。インポートジョブはDDLを実行してこれらのテーブルを作成し、DDLにはTABLESPACE句が含まれているため、ユーザーのデフォルトのテーブルスペースではなく、テーブルを作成する場所を定義します。オブジェクトは、新しいユーザーのデフォルトのテーブルスペースに関係なく、元のテーブルスペースに作成されます。

これは、ダンプファイルをSQLファイルにエクスポートすることで確認できます。 IMPDPコマンド-

impdp system@orclpdb directory=dp_dir dumpfile=expdp_jay.dmp sqlfile=jay_ddl.sql

DDL-

以下は、SQLファイルからの抜粋です。

CREATE TABLE "JAY"."TBL1"
   (    "TEXT" VARCHAR2(20 BYTE)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "USERS" ; -- Here you can see it has defined the tablespace to create the table.

のインデックスがまだidx_tbs_1に保存されている場合、それらを新しいインデックステーブルスペース(idx_tbs_2など)に切り替えるにはどうすればよいですか?

ダンプのインポート中にREMAP_TABLESPACEパラメータを使用できます。

これは、REMAP_TABLESPACE句を使用してインポートされた同じテーブルのDDLです。

IMPDPコマンド-

impdp system@orclpdb directory=dp_dir dumpfile=expdp_jay.dmp sqlfile=jay2_ddl.sql remap_tablespace=USERS:DATA

DDL-

CREATE TABLE "JAY"."TBL1"
   (    "TEXT" VARCHAR2(20 BYTE)
   ) SEGMENT CREATION IMMEDIATE
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "DATA" ;

REMAP_TABLESPACE

更新:

元のexpおよびimpユーティリティを引き続き使用する理由は、私の会社が以前のバージョンのOracleデータベースにそのレガシーデータをまだ持っているためです。

その場合は、同じテーブルスペースにオブジェクトをインポートし、後でALTER INDEX REBUILD TABLESPACE <new_tbs>コマンドを使用して別のテーブルスペースに移行します。

IMPの使用

オリジナルのインポートツールを使用する必要がある場合は、

  • まず、ダンプファイルからDDLを抽出する必要があります
    indexfile パラメータとfromuserおよびtouserパラメータ(fromusertouserの同じスキーマ名)。

例:imp system@orclpdb file=dumpfile.dmp fromuser=jay touser=jay indexfile=DDL.sql注:REMキーワードと行数の出力を含むSQLファイルを編集するには、多少の労力が必要です。

サンプル:

[Oracle@oracdbuat fra]$ cat DDL.sql

REM  CREATE TABLE "JAY"."EMP2" ("ID" NUMBER) PCTFREE 10 PCTUSED 40
REM  INITRANS 1 MAXTRANS 255 TABLESPACE "DATALRG" LOGGING NOCOMPRESS ;
REM  ... 0 rows
REM  CREATE TABLE "JAY"."EMPLOYEE" ("ID" NUMBER) PCTFREE 10 PCTUSED 40
REM  INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS
REM  1 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE
REM  "USERS" LOGGING NOCOMPRESS ;
REM  ... 0 rows
  • インポートツールによって生成されたSQLファイルを編集して、オブジェクトのテーブルスペースを変更します。

  • SQLPLUSを使用してSQLスクリプトを実行します。

  • すべての制約を無効にする

  • パラメータIGNORE=Yを指定してダンプファイルをインポートし、既存のオブジェクトに関する警告を無視します。

  • 制約を有効にします。

1
JSapkota