Q : 현재 db block size가 16kbytes로 설정된 db가 있다. 이 db의 데이터를 export/import를 이용하여
8kbyte의 db block size를 갖는 db로 마이그레이션을 하려고 한다.
정상적으로 migration이 될까?
반대로 8 kbytes -> 16 kbytes 도 될까?
1. 16 kbytes -> 8 kbytes migration
서버 1 ( db block size = 16kbytes) export
1. 버전 확인
SQL> select * from v$version where rownum <= 1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
2. db block size 확인
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
db_block_size integer 16384
3. 유저 생성 / 권한 부여
SQL> create user test identified by test;
User created.
SQL> grant resource, connect to test;
Grant succeeded.
4. 테이블 생성 / 데이터 입력
SQL> create table t1 (col1 number, col2 varchar2(20));
Table created.
SQL> insert into t1
2 select level, '16k to 8k test'
3 from dual
4 connect by level <= 100;
100 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from t1;
COUNT(*)
----------
100
SQL> select * from t1 where rownum <= 10;
COL1 COL2
---------- ----------------------------------------
1 16k to 8k test
2 16k to 8k test
3 16k to 8k test
4 16k to 8k test
5 16k to 8k test
6 16k to 8k test
7 16k to 8k test
8 16k to 8k test
9 16k to 8k test
10 16k to 8k test
10 rows selected.
5. 데이터 export(유저)
$ exp test/test file=16k_to_8k.dmp log=16k_to_8k_exp.log
$ ls -lrt 16*
-rw-r--r-- 1 oracle oinstall 1241 12월 16 14:57 16k_to_8k_exp.log
-rw-r--r-- 1 oracle oinstall 16384 12월 16 14:57 16k_to_8k.dmp
서버 2 ( db block size = 8kybytes) import
1. 버전 확인
SQL> select * from v$version where rownum <= 1;
BANNER
----------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - Prod
2. db block size 확인
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_block_size integer 8192
3. 유저 생성
SQL> create user test identified by test;
User created.
SQL> grant resource, connect to test;
Grant succeeded.
4. 데이터 import
$ imp test/test file=16k_to_8k.dmp log=16k_to_8k_imp.log
5. 데이터 확인
SQL> show user
USER is "TEST"
SQL> select count(*) from t1;
COUNT(*)
----------
100
SQL> select * from t1 where rownum <= 10;
COL1 COL2
---------- --------------------
1 16k to 8k test
2 16k to 8k test
3 16k to 8k test
4 16k to 8k test
5 16k to 8k test
6 16k to 8k test
7 16k to 8k test
8 16k to 8k test
9 16k to 8k test
10 16k to 8k test
10 rows selected.
2. 8 kbytes -> 16 kbytes migration
서버 1 ( db block size = 8kbytes) export
1 ~ 3은 생략
1. 버전 확인
2. db block size 확인
3. 유저 생성 / 권한 부여
4. 테이블 생성 / 데이터 입력
SQL> drop table t1 purge;
Table dropped.
SQL> create table t1 (col1 number, col2 varchar2(20));
Table created.
SQL> insert into t1
2 select level, '8k to 16k test'
3 from dual
4 connect by level <= 150;
150 rows created.
SQL> commit;
Commit complete.
SQL> select count(*) from t1;
COUNT(*)
----------
150
SQL> select * from t1 where rownum <= 10;
COL1 COL2
---------- --------------------
1 8k to 16k test
2 8k to 16k test
3 8k to 16k test
4 8k to 16k test
5 8k to 16k test
6 8k to 16k test
7 8k to 16k test
8 8k to 16k test
9 8k to 16k test
10 8k to 16k test
10 rows selected.
5. 데이터 export
$ exp test/test file=8k_to_16k.dmp log=8k_to_16k_exp.log
서버 2 ( db block size = 16kbytes) import
1 ~ 3은 생략
1. 버전 확인
2. db block size 확인
3. 유저 생성 / 권한 부여
4. 데이터 import
-- 이미 생성되어 있는 테이블을 삭제
SQL> drop table t1 purge;
Table dropped.
$ imp test/test file=8k_to_16k.dmp log=8k_to_16k_imp.log
5. 데이터 확인
SQL> show user
USER is "TEST"
SQL> select count(*) from t1;
COUNT(*)
----------
150
SQL> select * from t1 where rownum <= 10;
COL1 COL2
---------- ----------------------------------------
1 8k to 16k test
2 8k to 16k test
3 8k to 16k test
4 8k to 16k test
5 8k to 16k test
6 8k to 16k test
7 8k to 16k test
8 8k to 16k test
9 8k to 16k test
10 8k to 16k test
10 rows selected.
A :
테스트의 범위가 조금 협소하긴 하지만 16kbytes -> 8kbytes, 8kbytes -> 16kbytes의 마이그레이션은 잘 되는 것으로 판단됨.