環境
- CentOS6.4(64bit)
- Oracle 11g
- usr01というユーザー(スキーマ)を作成済み
- MY_DATAという表領域(tablespace)を作成済み
- MY_DATAにはempというテーブルが存在
現在の状況を確認
まずは現在の状態を確認します。
# Systemユーザー(DBA)でOracleにログイン
$sqlplus system/password@XE
# 表領域(テーブルスペース)のパスと名称の一覧を取得
SQL>select TABLESPACE_NAME,FILE_NAME from dba_data_files;
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
USERS
/u01/app/oracle/oradata/XE/users.dbf
SYSAUX
/u01/app/oracle/oradata/XE/sysaux.dbf
UNDOTBS1
/u01/app/oracle/oradata/XE/undotbs1.dbf
TABLESPACE_NAME
------------------------------
FILE_NAME
--------------------------------------------------------------------------------
SYSTEM
/u01/app/oracle/oradata/XE/system.dbf
MY_DATA
/u01/data/MY_DATA.dbf
# スキーマ一(ユーザー)覧
SQL>select distinct username from all_users;
select distinct username from all_users;
USERNAME
------------------------------
XS$NULL
USR01
MDSYS
FLOWS_FILES
HR
CTXSYS
OUTLN
APEX_040000
SYSTEM
APEX_PUBLIC_USER
XDB
USERNAME
------------------------------
ANONYMOUS
SYS
13行が選択されました。
# テーブル一覧
SQL>select owner,table_name from dba_tables where OWNER = 'USR01';
OWNER TABLE_NAME
------------------------------ ------------------------------
USR01 EMP
ユーザーからはMY_DATAという表領域の作成しかしていないですが、他にもシステムで使う表領域も自動で作成されているということが分かりました。ユーザーも同じで幾つかのユーザーが登録されているようですね。
別スキーマへのインポート
では早速別スキーマへのインポートをやってみます。
impdp/expdpを使わず、imp/expでやっています。(現在はimpdp/expdpでやるのが推奨らしいですが、実際に使うのがimp/expだったので今回はこちらで)
- usr01ユーザーでエクスポート
- ユーザーusr02を作成
- ユーザーusr02が作成された時に作成されるusr02のスキーマにエクスポートしたデータをインポート
# usr01スキーマの情報をエクスポート.実施後、エラーがないかログを確認
$exp userid=usr01/12345@XE file=usr01.dmp log=usr01_dump.log
# ユーザー(スキーマ)作成
$sqlplus system/password@XE
SQL> create user usr02 identified by 12345;
SQL> grant CONNECT,RESOURCE to usr02;
SQL> quit
# インポート。別のスキーマ.fromuser,touserで別スキーマにインポートすることを指定
$imp system/password@XE fromuser=usr01 touser=usr02 file=usr01.dmp log=usr02_restore.log
# 確認
$sqlplus usr02/12345@XE
SQL>emp desc;
usr02を削除するときは以下でOK
# ユーザー削除
SQL>drop user usr02 cascade;
ちなみに表領域を指定してエクスポートすることもできますが、その場合、DBAユーザー権限(systemユーザー)が必要でした。