카테고리 없음
Oracle Tablespace 재생성 Script (이관 작업용)
Lawmin
2022. 8. 1. 17:29
1. datafile 경로 및 크기 지정
아래 WITH 절 v 의 경우, dir은 datafile 경로, umb는 최대 단위 datafile 크기를 기재하면 됩니다.
smallfile 인 경우, datafile의 크기는 32GB까지이나, 8KB 블럭은 실제 (131072x-1)*8192 byte만 할당 가능합니다.
이를 byte로 표기하기에는 숫자가 너무 커지므로 간단히 32767(32GB*1024-1)MB로 하였습니다.
2. datafile 은 01, 02와 같은 형태의 순번을 붙였습니다.
3. SYSTEM, SYSAUX, UNDOTBS1, USERS 는 제외하였습니다.
4. Autoextend 값은 10GB 이상 시 1GB, 1GB 이상 시 100MB, 그 아래듣 10MB 로 지정하였습니다.
WITH v AS (
SELECT '/oradata/' dir, 32767 umb FROM DUAL
), t AS (
SELECT LOWER(tablespace_name) tsn,
CEIL(SUM(bytes)/1024/1024) mb
FROM dba_data_files
WHERE tablespace_name NOT IN ('SYSTEM','SYSAUX','UNDOTBS1','USERS')
GROUP BY tablespace_name
), c AS (
SELECT (LEVEL-1)*v.umb lvl FROM DUAL, v CONNECT BY LEVEL <= (SELECT CEIL(MAX(t.mb)/v.umb) FROM t, v)
)
SELECT CASE WHEN c.lvl=0 THEN 'CREATE TABLESPACE ' || t.tsn || ' DATAFILE ''' ELSE ' ' END ||
v.dir || LOWER(t.tsn) || TO_CHAR(c.lvl/v.umb+1, 'FM09') || '.dbf'' SIZE ' || CASE WHEN t.mb-c.lvl>=v.umb THEN v.umb ELSE t.mb-c.lvl END || 'M AUTOEXTEND ON NEXT ' ||
CASE WHEN t.mb >= 10240 THEN '1G' WHEN t.mb >= 1024 THEN '100M' ELSE '10M' END || ' MAXSIZE UNLIMITED' ||
CASE WHEN lvl+(CASE WHEN t.mb-c.lvl>=v.umb THEN v.umb ELSE t.mb-c.lvl END)=t.mb THEN ';' ELSE ',' END sql
FROM t, c, v
WHERE t.mb > c.lvl
ORDER BY t.tsn, c.lvl;