DBMS_REDEFINTIONを使用してオンラインでテーブルを再定義する
オンラインテーブルの再定義により、データを使用できなくすることなく、Oracle®テーブルを本番環境で再構築できます。一時テーブルを使用してデータを移動するのは快適かもしれませんが、より良い解決策があります。
テーブルを再構築しながらデータをステージングして移動すると、テーブルとデータの両方が一定期間使用できなくなります。これは、企業にとって好ましい状況ではありません。これは、DBMS_REDEFINITION
が 次の画像に示すように、パッケージは1日を節約します:
定期的に、次の理由でOracletableの論理構造または物理構造を変更する必要があります。
- クエリまたはデータ操作言語(DML)のパフォーマンスを向上させるため
- アプリケーションの変更に対応するため
- ストレージを管理するには
Oracle Databaseは、テーブルの可用性に大きな影響を与えることなくテーブル構造を変更するメカニズムを提供します。これは、オンラインテーブル再定義と呼ばれます。オンラインでテーブルを再定義すると、テーブルを再定義する従来の方法と比較して、パフォーマンスが大幅に向上します。
テーブルがオンラインで再定義されると、ほとんどの再定義プロセス中にクエリとDMLの両方にアクセスできます。テーブルは、テーブルのサイズや再定義の複雑さに関係なく、短時間だけ排他モードでロックされます。再定義プロセスは、ユーザーには完全に透過的です。
オンラインテーブルの再定義には、再定義されるテーブルが現在使用しているスペースとほぼ同等の空きスペースが必要です。
テーブルを再編成する方法はたくさんあります。ダウンタイムが課題である場合は、DBMS_REDEFINITION
パッケージはこのタスクに最適なオプションです。
次の手順を使用して、テーブルをオンラインで再定義します。
-
by key
のいずれかで再定義方法を選択します またはby rowids
。キー別 :再定義に使用する主キーまたは疑似主キーを選択します。疑似主キーは、すべてのコンポーネント列に
NOT NULL
が含まれる一意のキーです。 制約。この方法では、再定義の前後のテーブルのバージョンは、同じプライマリキー列で構成されている必要があります。これは、再定義の推奨されるデフォルトの方法です。rowid別: 使用可能なキーがない場合は、この方法を使用してください。このメソッドでは、
M_ROW$$
という名前の非表示の列 は、テーブルの再定義後のバージョンに追加されます。再定義が完了したら、この列を削除するか、未使用としてマークする必要があります。COMPATIBLE
の場合 が10.2.0以上に設定されている場合、再定義の最終フェーズでは、この列が未使用として自動的に設定されます。次に、ALTER TABLE ... DROP UNUSED COLUMNS
を使用できます。 これを削除するステートメント。このメソッドは、索引構成表では使用できません。 -
CAN_REDEF_TABLE
を呼び出して、テーブルをオンラインで再定義できることを確認します 手順。テーブルがオンライン再定義の候補ではない場合、この手順により、テーブルをオンラインで再定義できない理由を示すエラーが発生します。 -
必要なすべての論理属性と物理属性を使用して、空の暫定テーブルを(再定義するテーブルと同じスキーマに)作成します。
-
再定義されるテーブルのすべてのインデックス、制約、許可、およびトリガーを使用して暫定テーブルを作成する必要はありません。これは、
COPY_TABLE_DEPENDENTS
を使用して自動的に実行できます。 手順。 -
より大きなテーブルのパフォーマンスを向上させるために、次のコマンドを使用して並列に設定できます。
ALTER SESSION force parallel dml parallel degree-of-parallelism; ALTER SESSION force parallel query parallel degree-of-parallelism;
-
FINISH_REDEF_TABLE
コマンドはテーブルの再定義を完了します。この手順の間、元のテーブルは、元のテーブルのデータ量に関係なく、短時間排他モードでロックされます。ただし、FINISH_REDEF_TABLE
再定義を完了する前に、保留中のすべてのDML操作がコミットされるのを待ちます。 -
rowids
を使用した場合 再定義とCOMPATIBLE
初期化パラメータが10.1.0以下に設定されている場合は、非表示の列M_ROW$$
を削除する必要があります 再定義されたテーブルに追加されました。次のコマンドを使用して、列を「未使用」に設定することもできます。ALTER TABLE <table_name> SET UNUSED (M_ROW$$);
COMPATIBLE
の場合 10.2.0以上の場合、この非表示の列は自動的にUNUSED
に設定されます 再定義が完了したとき。次に、ALTER TABLE ... DROP UNUSED COLUMNS
を使用して列を削除できます。 声明。暫定テーブルに対する実行中のクエリが完了するのを待ってから、暫定テーブルを削除します。
次のセクションでは、サンプルテーブルの再定義のためのさまざまなコマンドと出力の例を示します。
sqlplusを開始
次のサンプルは、sqlplus
の開始を示しています :
[oracle@vm215 ~]$ sqlplus amit/amit
SQL*Plus: Release 11.2.0.3.0 Production on Sat Oct 29 05:44:44 2016
Copyright (c) 1982, 2011, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
次のサンプルは、デモテーブル名TEST1
の作成を示しています。 AMIT
の下 スキーマ。
SQL> CREATE TABLE TEST1 ( ID NUMBER(10) ,
ENAME VARCHAR2(10),
SAL NUMBER(10) ) ;
次のサンプルは、一括行の挿入とPPA_AGGGREGATE_TARGET
の設定を示しています。 AMIT
で スキーマから最大値まで。
SQL> INSERT INTO AMIT.TEST1 SELECT ROWNUM, 'T'|| ROWNUM,
DBMS_RANDOM.VALUE(100000, 999999) FROM DUAL CONNECT BY LEVEL < 1000000;
999999 ROWS CREATED.
SQL> COMMIT;
COMMIT COMPLETE.
次のサンプルは、table TEST1
に関連する依存オブジェクトの作成を示しています。 行。これにより、オンラインの再定義中に何が起こるかを確認できます。
ビューの作成
SQL> CREATE VIEW TEST1_VW AS SELECT * FROM TEST1 ;
VIEW CREATED.
シーケンスの作成
SQL> CREATE SEQUENCE TEST_SEQ ;
SEQUENCE CREATED.
手順の作成
CREATE OR REPLACE PROCEDURE PROC1 (P_ID IN NUMBER)
AS V_ID NUMBER ;
BEGIN
SELECT SAL
INTO V_ID
FROM TEST1
WHERE ID = P_ID;
END;
/
PROCEDURE CREATED.
DMLトリガーの作成
SQL> CREATE OR REPLACE TRIGGER AMIT_TRIG
BEFORE INSERT OR UPDATE ON TEST1
FOR EACH ROW
DECLARE
X NUMBER;
BEGIN
SELECT COUNT(*) INTO X
FROM TEST1
WHERE ID = :NEW.ID;
IF X > 0 THEN
RAISE_APPLICATION_ERROR(-20501, 'ID' || :NEW.ID || ' ALREADY EXISTS');
END IF;
END;
/
TRIGGER CREATED.
主キーの作成
SQL> ALTER TABLE TEST1 ADD CONSTRAINT TEST1_ID_PK PRIMARY KEY (ID) ;
TABLE ALTERED.
再定義する前にステータスを取得する
SQL> COLUMN OBJECT_NAME FORMAT A20
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM USER_OBJECTS ORDER BY OBJECT_NAME;SQL>
OBJECT_NAME OBJECT_TYPE STATUS
-------------------- ------------------- -------
AMIT_TRIG TRIGGER VALID
PROC1 PROCEDURE VALID
TEST1 TABLE VALID
TEST1_ID_PK INDEX VALID
TEST1_VW VIEW VALID
TEST_SEQ SEQUENCE VALID
6 ROWS SELECTED.
次のサンプルは、rowids
のいずれかを使用してテーブルをオンラインで再定義できることを確認する方法を示しています。 またはprimary key
:
主キーの使用
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE ('AMIT','TEST1',DBMS_REDEFINITION.CONS_USE_PK);
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
rowidの使用
SQL> EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE ('AMIT','TEST1',DBMS_REDEFINITION.CONS_USE_ROWID);
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
次のサンプルは、依存オブジェクトなしで新しい暫定テーブルのレプリカを作成する方法を示しています。
SQL> CREATE TABLE TEST1_REORG AS SELECT * FROM TEST1 WHERE ROWNUM=5 ;
TABLE CREATED.
SQL> SELECT COUNT(*) FROM TEST1_REORG ;
COUNT(*)
----------
0
SQL> SELECT COUNT(*) FROM TEST1;
COUNT(*)
----------
999999
次のサンプルは、特権ユーザーを使用してテーブル再定義タスクを実行することによる接続を示しています。
[oracle@vm215 ~]$ sqlplus / as sysdba
Sql*plus: release 11.2.0.3.0 production on sat oct 29 05:16:48 2016
Copyright (c) 1982, 2011, oracle. All rights reserved.
Connected to:
Oracle database 11g enterprise edition release 11.2.0.3.0 - 64bit production
With the partitioning, olap, data mining and real application testing options
次のサンプルは、主キーを使用して再定義を開始する方法を示しています。
SQL> EXEC DBMS_REDEFINITION.START_REDEF_TABLE('AMIT','TEST1', 'TEST1_REORG');
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
次のサンプルは、mview、主キー、ビュー、シーケンス、トリガーなどの依存オブジェクトを自動的にコピーする方法を示しています。 IGNORE_ERROR
TRUE
に設定されています COPY_TABLE_DEPENDENTS
による主キー違反を回避するため コマンド。
SQL> DECLARE
N PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('AMIT', 'TEST1','TEST1_REORG',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, N);
END;
/
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
次のサンプルは、DBA_REDEFINITION_ERRORS
のエラーのチェックを示しています。 ビュー:
SQL> COL OBJECT_NAME FOR A25
SET LIN200 PAGES 200
COL DDL_TEXT FOR A60
SELECT OBJECT_NAME, BASE_TABLE_NAME, DDL_TXT
FROM DBA_REDEFINITION_ERRORS;
NO ROWS SELECTED
次のサンプルは、両方のテーブルの行数を検証し、中間テーブルと同期する方法を示しています。
SQL> SELECT COUNT(*) FROM AMIT.TEST1_REORG ;
COUNT(*)
----------
999999
SQL> SELECT COUNT(*) FROM AMIT.TEST1 ;
COUNT(*)
----------
999999
SQL> EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('AMIT', 'TEST1', 'TEST1_REORG');
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
次のサンプルは、再定義の終了を示しています。
SQL> EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE ('AMIT', 'TEST1', 'TEST1_REORG');
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
SQL> COLUMN OBJECT_NAME FORMAT A40
SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
FROM DBA_OBJECTS
WHERE OWNER='AMIT';
OBJECT_NAME OBJECT_TYPE STATUS
--------------------- ------------------- -------
TEST1_VW VIEW INVALID
TEST_SEQ SEQUENCE VALID
PROC1 PROCEDURE VALID
TEST1 TABLE VALID
TEST1_REORG TABLE VALID
TEST1_ID_PK INDEX VALID
TMP$$_TEST1_ID_PK0 INDEX VALID
TMP$$_AMIT_TRIG0 TRIGGER INVALID
AMIT_TRIG TRIGGER INVALID
9 ROWS SELECTED.
次のサンプルは、完全な依存関係を使用してスキーマを再コンパイルする方法を示しています。これは、前の手順でトリガーが無効であるために必要です。
SQL> EXEC UTL_RECOMP.RECOMP_SERIAL('AMIT') ;
PL/SQL PROCEDURE SUCCESSFULLY COMPLETED.
SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS FROM DBA_OBJECTS WHERE OWNER='AMIT';
OBJECT_NAME OBJECT_TYPE STATUS
---------------------------------------- ------------------- -------
TEST1_VW VIEW VALID
TEST_SEQ SEQUENCE VALID
PROC1 PROCEDURE VALID
TEST1 TABLE VALID
TEST1_REORG TABLE VALID
TEST1_ID_PK INDEX VALID
TMP$$_TEST1_ID_PK0 INDEX VALID
TMP$$_AMIT_TRIG0 TRIGGER VALID
AMIT_TRIG TRIGGER VALID
9 ROWS SELECTED.
次のサンプルは、暫定テーブルの削除を示しています。
SQL> DROP TABLE AMIT.TEST1_REORG;
TABLE DROPPED.
テーブル構造を変更し、エンドユーザーが同時にアクセスする必要がある場合は、DBMS_REFDEFINITION
を使用してください 。
この機能は、ダウンタイムなしでデータを再編成するのに役立ち、オンライントランザクション処理(OLTP)環境での顧客のダウンタイムによって引き起こされる課題を回避します。
[フィードバック]タブを使用して、コメントを書き込んだり、質問したりします。
-
Accessでテーブルデザイナを使用してテーブルを作成する方法
データをより効率的に分析および管理するために、MicrosoftOfficeAccessはデータを関連テーブルのコレクションとして保存します。したがって、Accessデータベースを関連するテーブルのコレクションとして表示できます。 テーブルデザイナを使用してテーブルを作成するプロセス アクセス それほど難しいことではありません。 Accessでテーブルデザイナを使用してテーブルを作成する方法 Accessデータベースは、関連するテーブルのコレクションとして表示できます。 Accessのテーブルは、件名に基づいた行と列のリストです。テーブルの各行はレコードと呼ばれ、すべての列はフィールド
-
Oracle外部テーブルを使用する
外部テーブルは、データベースの外部に格納されているフラットファイルからデータを受け取り、Oracle®がそれらのファイルのデータをクエリできるようにします。 はじめに Oracleは、SQL*Loaderでサポートされている任意のファイル形式を解析できます。外部テーブルでデータ操作言語(DML)を使用することはできませんが、クエリ、結合、および並べ替えの操作にDMLを使用することはできます。外部テーブルに対してビューとシノニムを作成することもできます。 外部テーブル機能を利用するには、ORACLE_LOADERaccessドライバを使用し、データファイルがテキスト形式であることを確認する必