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 |