ablog

不器用で落着きのない技術者のメモ

Oracle の export/import で対象となるオブジェクト

Oracle の export/import について以下の質問を受けた。

full=yでExportした後に、特定のスキーマの全オブジェクトをImportで戻す場合、戻らないオブジェクトって何かありますか?

ないと思います。

シーケンスオブジェクトも、元を消しとけばExport時の状態に戻るよね?

戻ると思います。

Viewは戻らない。なぜならデータではなく、DDLが記憶されていて流れるから。(これほんと??)

戻ると思います。


OTN のマニュアル(オリジナルのエクスポートおよびインポート) を読む限り、上記の回答であっている。実際に検証してみたが、やはりあっていた。

検証

  • 検証環境
$ uname -a
Linux centos51 2.6.18-128.el5 #1 SMP Wed Jan 21 10:44:23 EST 2009 i686 i686 i386 GNU/Linux

$ echo 'select * from v$version;' |sqlplus / as sysdba
...
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
PL/SQL Release 10.2.0.4.0 - Production
CORE    10.2.0.4.0      Production
TNS for Linux: Version 10.2.0.4.0 - Production
NLSRTL Version 10.2.0.4.0 - Production
  • オブジェクトを作成する。
$ sqlplus scott/tiger
SQL> select table_name from user_tables;

no rows selected

SQL> create sequence seq1
	start with 1
	increment by 1
	maxvalue 500
	minvalue 1
	cycle;
SQL> create table t1 (id number(4));
SQL> create table t2 (id number(4));
SQL> create view v1 as
	select 't1' table_name, count(1) row_count from t1
	union
	select 't2' table_name, count(1) row_count from t2;
  • データを投入する。
SQL> begin
	for i in 1..100 loop
		insert into t1 (id) values(seq1.nextval);
		insert into t2 (id) values(seq1.nextval);
	end loop;
end;
/
SQL> commit;
  • 投入したデータが入っていることを確認する。
SQL> col table_name for a10
SQL>  select * from v1;

TABLE_NAME  ROW_COUNT
---------- ----------
t1                100
t2                100

SQL> select sequence_name, last_number from user_sequences;

SEQUENCE_NAME                  LAST_NUMBER
------------------------------ -----------
SEQ1                                   201
  • export する。
$ export NLS_LANG=American_America.JA16EUC
$ exp system/manager file=scott.dmp owner=scott
  • 全てのオブジェクトを削除する。
$ sqlplus scott/tiger
SQL> drop view v1;
SQL> drop table t1 purge;
SQL> drop table t2 purge;
SQL> drop sequence seq1;
SQL> col object_name for a11
SQL> select object_name from user_objects;
no rows selected
  • import する。
$ export NLS_LANG=American_America.JA16EUC
$ imp system/manager file=scott.dmp fromuser=scott touser=scott
  • 全てのオブジェクトとそのデータが import されていることを確認する。
$ sqlplus scott/tiger
SQL> col object_name for a11
SQL> select object_name from user_objects;

OBJECT_NAME
-----------
SEQ1
T1
T2
V1

SQL> col table_name for a10
SQL> select * from v1;

TABLE_NAME  ROW_COUNT
---------- ----------
t1                100
t2                100

SQL> select sequence_name, last_number from user_sequences;

SEQUENCE_NAME                  LAST_NUMBER
------------------------------ -----------
SEQ1                                   201

補足

import を実行すると、内部的にはSQL(DDLDML)が実行されていると思う。imp コマンドで show=y オプションをつけるとDDL が表示されるし、dump ファイルを strings でみると、DDLDML が見える。import を実行したら、たぶんサーバプロセスが生成されるのでそいつのトレースをとれば何やってるかわかると思う。今回はトレースの取得まではしていない。

  • imp コマンドで show=y オプションをつける
$ imp system/manager file=scott.dmp fromuser=scott touser=scott show=y

Import: Release 10.2.0.4.0 - Production on Wed Jan 13 14:13:01 2010

Copyright (c) 1982, 2007, Oracle.  All rights reserved.


Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

Export file created by EXPORT:V10.02.01 via conventional path
import done in JA16EUC character set and AL16UTF16 NCHAR character set
. importing SCOTT's objects into SCOTT
 "BEGIN  "
 "sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','"
 "CURRENT_SCHEMA'), export_db_name=>'ORCL', inst_scn=>'261305');"
 "COMMIT; END;"
 "ALTER SESSION SET CURRENT_SCHEMA= "SCOTT""
 "CREATE SEQUENCE "SEQ1" MINVALUE 1 MAXVALUE 500 INCREMENT BY 1 START WITH 20"
 "1 CACHE 20 NOORDER CYCLE"
 "CREATE TABLE "T1" ("ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAX"
 "TRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL D"
 "EFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS"
. . skipping table "T1"                               

 "ALTER SESSION SET CURRENT_SCHEMA= "SCOTT""
 "CREATE TABLE "T2" ("ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAX"
 "TRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL D"
 "EFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS"
. . skipping table "T2"                               

 "ALTER SESSION SET CURRENT_SCHEMA= "SCOTT""
 "CREATE FORCE VIEW "SCOTT"."V1"                           ("TABLE_NAME","ROW"
 "_COUNT") AS "
 "select 't1' table_name, count(1) row_count from t1"
 "      union"
 "      select 't2' table_name, count(1) row_count from t2"
Import terminated successfully without warnings.
  • strings コマンドで dump の中身をのぞいてみる。
$ strings scott.dmp 
>EXPORT:V10.02.01
DSYSTEM
RUSERS
8192
                                       Wed Jan 13 14:5:28 2010scott.dmp
#C##
#C##
+09:00
BYTE
UNUSED
INTERPRETED
DISABLE:ALL
METRICSU
CONNECT SCOTT
METRICSUpre-schema procedural objects and actions
PROCACTION
BEGIN  
sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT('USERENV','CURRENT_SCHEMA'), export_db_name=>'ORCL', inst_scn=>'261305');
COMMIT; END;
METRICEU 11
METRICSUforeign function library names for user    
METRICEU 11
METRICSUPUBLIC type synonyms
METRICEU 11
METRICSUprivate type synonyms
METRICEU 11
METRICSUobject type definitions for user    
METRICEU 11
METRICSUpre-schema procedural objects and actions
METRICEU 11
METRICSUdatabase links
METRICEU 11
METRICSUsequence numbers
CREATE SEQUENCE "SEQ1" MINVALUE 1 MAXVALUE 500 INCREMENT BY 1 START WITH 201 CACHE 20 NOORDER CYCLE
METRICEU 12
METRICSUcluster definitions
METRICEU 12
METRICSUXDB Schemas by user 
METRICEU 12
TABLE "T1"
CREATE TABLE "T1" ("ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS
INSERT INTO "T1" ("ID") VALUES (:1)
TABLE "T2"
CREATE TABLE "T2" ("ID" NUMBER(4, 0))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS
INSERT INTO "T2" ("ID") VALUES (:1)
ENDTABLE
METRICSUsynonyms
METRICEU 100
METRICSUviews
CREATE VIEW "V1" ("TABLE_NAME","ROW_COUNT") AS 
select 't1' table_name, count(1) row_count from t1
        union
        select 't2' table_name, count(1) row_count from t2
METRICEU 101
METRICSUstored procedures
METRICEU 101
METRICSUoperators
METRICEU 101
METRICSUAnalyze cluster statements 
METRICEU 101
METRICSUreferential integrity constraints
METRICEU 101
METRICSUtriggers
METRICEU 101
METRICSUindextypes
METRICEU 101
METRICSUbitmap, functional and extensible indexes
METRICEU 101
METRICSUposttables actions
METRICEU 101
METRICSUmaterialized views
METRICEU 101
METRICSUsnapshot logs
METRICEU 101
METRICSUjob queues
METRICEU 101
METRICSUrefresh groups and children
METRICEU 101
METRICSUdimensions
METRICEU 101
METRICSUPost-inst procedural actions 
METRICEU 101
METRICSUpost-schema procedural objects and actions
METRICEU 112
METRICSUstatistics
METRICEU 112
METRICEUG0
EXIT
EXIT