起因
私たちは、本番環境でのテーブル製品上のデータの一部重複を削除します。我々が開始する前に、以下のように、我々はまず、テーブルのバックアップを作成しました。
CREATE TABLE APP.PRODUCT_201910 TABLESPACE "TABLESPACE_1" nologging AS SELECT * FROM APP.PRODUCT WHERE 1=2;
INSERT /*+ APPEND PARALLEL(8) */ INTO APP.PRODUCT_201910 nologging SELECT * FROM APP.PRODUCT;
COMMIT;
なお、CATSを使用して作成します(TABLE ASのCREATE)テーブルの方法、表には、その親の制約、ID列、列のデフォルト値または主キーから継承しません。
完成した後、我々は、製品動作させるために始めたが、理由はDBのパフォーマンスは、時間の当初の見積り以内に完了されていません。他のスクリプトへのフォローアップには影響を与えないために、この操作は、製品をバックに復元されます放棄することを決めました。
開発
まず第一に、我々は、DBAが手動で殺す、実行中のクエリを検索してみましょう。
第二に、我々は戻って元のテーブルにバックアップテーブルと交換してください。
RENAME APP.PRODUCT TO APP.PRODUCT_BROKEN;
RENAME TABLE APP.PRODUCT_201910 TO APP.PRODUCT;
しかし、それはここで終わらない、多くのオリジナルのテーブルが戻ってプロパティを変更する必要があります。いくつかのステップを欠場することは容易であるため、このプロセスは、特別な注意が必要です。
设置シーケンス、デフォルト値
これは、比較的一般的であり、速すぎて、いくつかの手順を実行します。
シーケンスを追加します。
DROP SEQUENCE APP.PRODUCT_ID_SEQ
ALTER TABLE APP.PRODUCT MODIFY PRODUCT_ID NUMBER(10,0) DEFAULT APP.PRODUCT_ID_SEQ.NEXTVAL
設定されたデフォルト値
ALTER TABLE APP.PRODUCT MODIFY PRODUCT_KEY VARCHAR2(300 CHAR) DEFAULT '-1';
ALTER TABLE APP.PRODUCT MODIFY PRODUCT_TYPE_ID NUMBER(5,0) DEFAULT -1;
ALTER TABLE APP.PRODUCT MODIFY DATE TIMESTAMP (6) DEFAULT CURRENT_TIMESTAMP;
拘束を設定します
- プラス主キー。
- テーブルへの外部キーのリンクがあるかどうか確認してください。
-- 1
DROP CONSTRAINT APP.PRODUCT_PK
ALTER TABLE APP.PRODUCT ADD CONSTRAINT APP.PRODUCT_PK PRIMARY KEY ("PRODUCT_PK");
-- 2
SELECT * FROM DBA_CONSTRAINTS A, DBA_CONSTRAINTS B
WHERE A.CONSTRAINT_TYPE = 'R'
AND A.R_CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND A.R_OWNER = B.OWNER
AND B.TABLE_NAME = 'PRODUCT'
AND B.OWNER = 'APP';
インデックスを設定します。
少し遅いかもしれインデックスを追加します。
DROP INDEX APP.IDX_PRODUCT_KEY_DATE
CREATE INDEX APP.IDX_PRODUCT_KEY_DATE ON APP.PRODUCT ("PUBLIC_KEY", "END_DATE")
PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
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 "TABLESPACE_1";
インデックス、主キーを追加作成する必要はありません、注意すべきです。
Oracleは、一意キーまたは主キーに一意のインデックスを作成することによって、テーブルの上にUNIQUEキーまたはPRIMARY KEY整合性制約を施行します。制約が有効になっている場合に、このインデックスは、Oracleによって自動的に作成されます。
依存関係を設定
依存オブジェクトの再構築:ここでの再構成が唯一の直接依存するオブジェクトです。
-- check sql
SELECT * FROM DBA_DEPENDENCIES A WHERE A.REFERENCED_NAME = 'PRODUCT' AND A.REFERENCED_OWNER = 'APP';
-- modify sql
SELECT 'alter '||DECODE(TYPE,'PACKAGE BODY','PACKAGE',TYPE)||' '||OWNER||'.'||NAME||' compile;'
FROM DBA_DEPENDENCIES A
WHERE A.REFERENCED_NAME = 'PRODUCT'
AND A.REFERENCED_OWNER = 'APP';
特権セット
権限の再構築
-- check sql
SELECT * FROM DBA_TAB_PRIVS WHERE TABLE_NAME = UPPER('PRODUCT') AND OWNER = UPPER('APP');
-- modify sql
SELECT 'grant ' || PRIVILEGE || ' on ' || OWNER || '.' || TABLE_NAME || ' to ' || GRANTEE || ';'
FROM DBA_TAB_PRIVS
WHERE TABLE_NAME = UPPER('PRODUCT')
AND OWNER = UPPER('APP');
概要
上記に加えて
- シーケンス、デフォルト値
- 制約
- 指数
- 依存
- 特権
、そこマテリアライズド・ビューをし、マテリアライズド・ビュー・ログをしている、あなたは、特定の参照リンクを参照してくださいすることができます。
だから、名前の変更方法とかなり厄介です。データの量は、多くのケースではない場合、あまりエラーが発生しやすい便利で簡単な、直接、元のテーブルにデータを挿入することをお勧めします。