oracle12cからオンライン再定義機能のうち、表領域の変更や圧縮タイプの変更は1ステップで可能になりました。
しかし、それ以外の、例えば列追加などは以前のような複雑な手順です。
CREATE TABLE emp_redef
(empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
job VARCHAR2(10),
deptno NUMBER(3) NOT NULL)
TABLESPACE USERS;
表が作成されました。
SQL> desc emp_redef
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
DEPTNO NOT NULL NUMBER(3)
まずはテスト用のテーブルを作成します。
この表に対して以下の定義変更を行ないます。
・新しい列mgr、hiredate、salおよびbonusを追加します。
・新しい列bonusを0 (ゼロ)に初期化します。
・列deptnoの値を10増やしています。
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE(
uname => 'tadashi',
tname =>'emp_redef',
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQLプロシージャが正常に完了しました。
表がオンライン再定義可能か確認しています。
エラーが出力されていなければ、問題有りません。
CREATE TABLE int_emp_redef
(empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
job VARCHAR2(10),
mgr NUMBER(5),
hiredate DATE DEFAULT (sysdate),
sal NUMBER(7,2),
deptno NUMBER(3) NOT NULL,
bonus NUMBER (7,2) DEFAULT(0))
TABLESPACE USERS;
SQL> desc int_emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
MGR NUMBER(5)
HIREDATE DATE
SAL NUMBER(7,2)
DEPTNO NOT NULL NUMBER(3)
BONUS NUMBER(7,2)
定義変更後の表を仮表として作成します。
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef',
col_mapping => 'empno empno, ename ename, job job, deptno+10 deptno,
0 bonus',
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQLプロシージャが正常に完了しました。
オンライン再定義を開始します。
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef',
copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => TRUE,
num_errors => num_errors);
END;
/
PL/SQLプロシージャが正常に完了しました。
元表から仮表へ制約やトリガーをコピーします。
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef');
END;
/
PL/SQLプロシージャが正常に完了しました。
オンライン再定義を終了します。
SQL> desc emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
MGR NUMBER(5)
HIREDATE DATE
SAL NUMBER(7,2)
DEPTNO NOT NULL NUMBER(3)
BONUS NUMBER(7,2)
SQL> desc int_emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
DEPTNO NOT NULL NUMBER(3)
この時点で元表と仮表が入れ替わりました。
元表に列が追加されています。
ここまで全てオンラインでの作業です。
しかし、それ以外の、例えば列追加などは以前のような複雑な手順です。
CREATE TABLE emp_redef
(empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
job VARCHAR2(10),
deptno NUMBER(3) NOT NULL)
TABLESPACE USERS;
表が作成されました。
SQL> desc emp_redef
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
DEPTNO NOT NULL NUMBER(3)
まずはテスト用のテーブルを作成します。
この表に対して以下の定義変更を行ないます。
・新しい列mgr、hiredate、salおよびbonusを追加します。
・新しい列bonusを0 (ゼロ)に初期化します。
・列deptnoの値を10増やしています。
BEGIN
DBMS_REDEFINITION.CAN_REDEF_TABLE(
uname => 'tadashi',
tname =>'emp_redef',
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQLプロシージャが正常に完了しました。
表がオンライン再定義可能か確認しています。
エラーが出力されていなければ、問題有りません。
CREATE TABLE int_emp_redef
(empno NUMBER(5) PRIMARY KEY,
ename VARCHAR2(15) NOT NULL,
job VARCHAR2(10),
mgr NUMBER(5),
hiredate DATE DEFAULT (sysdate),
sal NUMBER(7,2),
deptno NUMBER(3) NOT NULL,
bonus NUMBER (7,2) DEFAULT(0))
TABLESPACE USERS;
SQL> desc int_emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
MGR NUMBER(5)
HIREDATE DATE
SAL NUMBER(7,2)
DEPTNO NOT NULL NUMBER(3)
BONUS NUMBER(7,2)
定義変更後の表を仮表として作成します。
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef',
col_mapping => 'empno empno, ename ename, job job, deptno+10 deptno,
0 bonus',
options_flag => DBMS_REDEFINITION.CONS_USE_PK);
END;
/
PL/SQLプロシージャが正常に完了しました。
オンライン再定義を開始します。
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef',
copy_indexes => DBMS_REDEFINITION.CONS_ORIG_PARAMS,
copy_triggers => TRUE,
copy_constraints => TRUE,
copy_privileges => TRUE,
ignore_errors => TRUE,
num_errors => num_errors);
END;
/
PL/SQLプロシージャが正常に完了しました。
元表から仮表へ制約やトリガーをコピーします。
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE(
uname => 'tadashi',
orig_table => 'emp_redef',
int_table => 'int_emp_redef');
END;
/
PL/SQLプロシージャが正常に完了しました。
オンライン再定義を終了します。
SQL> desc emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
MGR NUMBER(5)
HIREDATE DATE
SAL NUMBER(7,2)
DEPTNO NOT NULL NUMBER(3)
BONUS NUMBER(7,2)
SQL> desc int_emp_redef;
名前 NULL? 型
----------------------------------------- -------- ----------------------------
EMPNO NOT NULL NUMBER(5)
ENAME NOT NULL VARCHAR2(15)
JOB VARCHAR2(10)
DEPTNO NOT NULL NUMBER(3)
この時点で元表と仮表が入れ替わりました。
元表に列が追加されています。
ここまで全てオンラインでの作業です。

コメント