Programming/Shell2012. 4. 26. 11:21

DDL 스크립트를 생성하는 쉘 스크립트를 작성해보자.

 

아래와 같이 쉘 스크립트(get_ddl.sh)를 작성하자. 소유자와 오브젝트 타입에 해당하는 오브젝트 목록을 생성하고, DBMS_METADATA.GET_DDL 프로시저를 반복적으로 실행하는 방식이다. 파일로 오브젝트 별로 생성된다. 11행에 저장할 위치를 지정하면 된다. 백업의 보관주기는 일주일이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/bin/ksh
 
if [[ $# != 2 ]]
then
    print "Usage: get_ddl.sh owner object_type"
    exit
fi
 
v_owner=$1
v_object_type=$2
v_bak_dir=...
v_obj_dir=$v_bak_dir/$(date +"%Y%m%d")/$v_owner"_"$v_object_type
rm -rf $v_obj_dir
mkdir -p $v_obj_dir
 
sqlplus -s scott/tiger > $v_bak_dir/$$.lst << EOF
SET FEEDBACK OFF
SET LINESIZE 32767
SET PAGES 0
SET TRIMOUT ON
SELECT   a.object_name
    FROM all_objects a
   WHERE a.owner = '$v_owner'
     AND a.object_type = '$v_object_type'
ORDER BY a.object_name;
EXIT;
EOF
 
for v_obejct_name in $(< $v_bak_dir/$$.lst)
do
sqlplus -s scott/tiger > $v_obj_dir/$v_obejct_name.sql << EOF
SET FEEDBACK OFF
SET LINESIZE 32767
SET LONG  100000
SET PAGES 0
SET TRIMOUT ON
EXEC   DBMS_METADATA.SET_TRANSFORM_PARAM (DBMS_METADATA.SESSION_TRANSFORM, 'SQLTERMINATOR', TRUE);
SELECT DBMS_METADATA.GET_DDL ('$v_object_type', '$v_obejct_name', '$v_owner')
  FROM DUAL;
EXIT;
EOF
done
 
rm -rf $v_bak_dir/$$.lst
find $v_bak_dir -type d -mtime +7 | xargs rm -rf

 

아래와 같은 방식으로 실행할 수 있다.

1
# get_ddl.sh SCOTT TABLE

 

해당 스크립트는 커넥션이 과도하게 발생하는 문제가 있다. 아래 쿼리로 하나의 파일로 생성한 후 파싱하는 방식이 효율적이다.

1
2
3
4
5
SELECT   DBMS_METADATA.GET_DDL (object_type, obejct_name, owner)
    FROM all_objects
   WHERE owner = '$v_owner'
     AND object_type = '$v_object_type'
ORDER BY object_name;


'Programming > Shell' 카테고리의 다른 글

수행 시간 측정 함수  (0) 2012.04.26
쿼리 결과를 쉘 변수에 할당  (0) 2012.04.26
쿼리 주석 제거  (0) 2012.04.25
호스트 자동 로그인  (0) 2012.04.24
쿼리 수행 결과 가공  (0) 2012.04.16
Posted by 정희락_