表領域をバックアップしてもとに戻す一番簡単な方法が知りたい!
いくつか方法は考えられるが、今回は Datapump を使った方法を紹介。
断片化の解消にも効果的!
まずは、検証で使う TEST という名前の表領域を作成し、MYTABLE という名前の表をその表領域に格納しておく。
実行例
SQL> create tablespace test datafile '/u01/app/orcl/oradata/orcl/test01.dbf' size 100M;
表領域が作成されました。
SQL> col file_name for a40
SQL> set linesize 200
SQL> set long 3000
SQL> select tablespace_name, file_name, status, bytes/1024/1024 mbytes, autoextensible from dba_data_files;
TABLESPACE_NAME FILE_NAME STATUS MBYTES AUT
--------------- ---------------------------------------- --------- ------- ---
SYSTEM /u01/app/orcl/oradata/orcl/system0.dbf AVAILABLE 790 YES
SYSAUX /u01/app/orcl/oradata/orcl/sysaux0.dbf AVAILABLE 1020 YES
UNDOTBS1 /u01/app/orcl/oradata/orcl/undotbs.dbf AVAILABLE 4095 YES
USERS /u01/app/orcl/oradata/orcl/users01.dbf AVAILABLE 5665 YES
TEST /u01/app/orcl/oradata/orcl/test01.dbf AVAILABLE 100 NO
SQL> create user scott identified by tiger default tablespace test;
ユーザーが作成されました。
SQL> alter user scott quota 10M on test;
ユーザーが変更されました。
SQL> grant sysdba to scott;
権限付与が成功しました。
SQL> conn scott/tiger
接続されました。
SQL> create table mytable (name char(20));
表が作成されました。
SQL> insert into mytable values ('HELLOMYWORLD');
1行が作成されました。
SQL> select * from mytable;
NAME
---------------
HELLOMYWORLD
SQL> select table_name from dba_tables where tablespace_name= 'TEST';
TABLE_NAME
---------------
MYTABLE
SQL> commit;
コミットが完了しました。
コンテンツ
エクスポートを実行
DIRECTORY OBJECT の作成 & 読み書き権限の付与
ダンプファイルや Datapump 実行時ログを配置するディレクトリを OS 上で用意してから、Oracle からそのディレクトリを認識させる。
そしてそのディレクトリに対するアクセス権を付与しよう。
create or replace directory <ディレクトリ名> as '<パス>';
grant read, write on directory <ディレクトリ名> to <スキーマ名>;
実行例
SQL> create or replace directory dumpdir as '/u01/app/orcl/dumpdir';
ディレクトリが作成されました。
SQL> grant read, write on directory dumpdir to scott;
権限付与が成功しました。
DataPump を実行するスキーマに必要な権限を付与する
Export/Import を実行するそれぞれのスキーマに実行権を付与する。
grant exp_full_database to <スキーマ名>;
grant imp_full_database to <スキーマ名>;
エクスポートとインポートを実施するスキーマが異なっていてもOK!
実行例
SQL> grant exp_full_database to scott;
権限付与が成功しました。
SQL> grant imp_full_database to scott;
権限付与が成功しました。
EXPDP を実行
バックアップしたい表領域を指定してエクスポートする。
expdp <スキーマ名>/<パスワード> directory = <ディレクトリ名> tablespaces = <表領域名>
実行例
SQL> host expdp scott/tiger directory=dumpdir tablespaces=test;
Export: Release 11.2.0.3.0 - Production on 金 6月 25 13:04:48 2021
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
"SCOTT"."SYS_EXPORT_TABLESPACE_01"を起動しています: scott/******** directory=dumpdir dumpfile=expdp.dmp tablespaces=test
BLOCKSメソッドを使用して見積り中です...
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
BLOCKSメソッドを使用した見積り合計: 64 KB
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/COMMENTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/INDEX/INDEXの処理中です
オブジェクト型TABLE_EXPORT/TABLE/CONSTRAINT/CONSTRAINTの処理中です
オブジェクト型TABLE_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICSの処理中です
. . "SCOTT"."MYTABLE" 5.031 KB 1行がエクスポートされました
マスター表"SCOTT"."SYS_EXPORT_TABLESPACE_01"は正常にロード/アンロードされました
******************************************************************************
SCOTT.SYS_EXPORT_TABLESPACE_01に設定されたダンプ・ファイルは次のとおりです:
/home/orcl/dumpdir/expdp.dmp
ジョブ"SCOTT"."SYS_EXPORT_TABLESPACE_01"が13:04:58で正常に完了しました
DataPump は OS のコマンドだけど、OS コマンドは host や ! を前につけると sqplus からでも実行ができるよ
対象の表領域を再作成
表領域の定義を確認する
該当の表領域を削除するまえに、定義を確認しよう。
select dbms_metadata.get_ddl('TABLESPACE','<表領域名>') from dual;
実行例
SQL> select dbms_metadata.get_ddl('TABLESPACE','TEST') from dual;
DBMS_METADATA.GET_DDL('TABLESPACE','TEST')
--------------------------------------------------------------------------------
CREATE TABLESPACE "TEST" DATAFILE
'/u01/app/orcl/oradata/orcl/test01
.dbf' SIZE 104857600
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO
表領域を削除する
drop tablespace <表領域名> including contents and datafiles;
実行例
SQL> drop tablespace test including contents and datafiles;
表領域が削除されました。
SQL> select * From mytable;
select * From mytable
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
新しい表領域を作成する
先ほど確認した表領域の定義を使って新しい表領域を作成する。
create tablespace <新しい表領域名> datafile '<パス>'
実行例
SQL> CREATE TABLESPACE "TEST" DATAFILE
'/u01/app/orcl/oradata/orcl/test01.dbf' SIZE 104857600
LOGGING ONLINE PERMANENT BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE DEFAULT
NOCOMPRESS SEGMENT SPACE MANAGEMENT AUTO;
表領域が作成されました。
インポートを実行
Expdp 実行時に生成されたダンプファイルを指定してインポートを実行する。
impdp <スキーマ名>/<パスワード> directory = <ディレクトリ名> dumpfile= <ダンプファイル名> tablespaces = <新しい表領域名>
実行例
SQL> host impdp scott/tiger directory=dumpdir dumpfile=expdp.dmp tablespaces=test;
Import: Release 11.2.0.3.0 - Production on 金 6月 25 13:15:17 2021
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
接続先: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
マスター表"SCOTT"."SYS_IMPORT_TABLESPACE_01"は正常にロード/アンロードされました
"SCOTT"."SYS_IMPORT_TABLESPACE_01"を起動しています: scott/******** directory=dumpdir dumpfile=expdp.dmp tablespaces=test
オブジェクト型TABLE_EXPORT/TABLE/TABLEの処理中です
オブジェクト型TABLE_EXPORT/TABLE/TABLE_DATAの処理中です
. . "SCOTT"."MYTABLE" 5.031 KB 1行がインポートされました
ジョブ"SCOTT"."SYS_IMPORT_TABLESPACE_01"が13:15:19で正常に完了しました
データがリストアされているか確認
SQL> select * From mytable;
NAME
--------------------
NEORC
SQL> select table_name from dba_tables where tablespace_name= 'TEST';
TABLE_NAME
------------------------------
MYTABLE