Oracle/Oh Oracle

db source(pl/sql) backup

darkturtle26 2022. 11. 24. 19:21

db source(pl/sql) backup

 

출처 : https://logic.edchen.org/how-to-backup-pl-sql-codes-in-oracle/

 

How to Backup PL/SQL Codes in Oracle - Ed Chen Logic

Backup Packages and Procedures Usually, source codes of programming unit should be version-controlled by the developer team. Mostly, they use Git, CVS or SVN to keep source codes in control. But if they have never carried out their job, we can also do it b

logic.edchen.org

DB 형상 반영 하다보면, 가끔 소스를 원복해야 할일이 생긴다.

소스 관리는 개발자가 해야 겠지만, 급하게 원복을 위해서, OBJECT 별로 소스 백업을 받아보자 .

 

1. 백업 대상은 PROCEDURE, FUNCTION, PACKAGE, TRIGGER 이다.

2. Object 별로 SQL 로 보관하여, 소스 원복 시, 개별 원복 하면 된다.

 

[oracle@oel7 source_backup]$ ls
getallcode.sql  getcode.sql  getSourceCodes.sh  scott
[oracle@oel7 source_backup]$ pwd
/home/oracle/source_backup
[oracle@oel7 source_backup]$ ls -al
total 16
drwxr-xr-x.  3 oracle oinstall   85 Nov 24 18:50 .
drwx------. 10 oracle oinstall 4096 Nov 24 18:50 ..
-rw-r--r--.  1 oracle oinstall  486 Nov 24 18:49 getallcode.sql
-rw-r--r--.  1 oracle oinstall  467 Nov 24 18:49 getcode.sql
-rw-r--r--.  1 oracle oinstall  379 Nov 24 18:48 getSourceCodes.sh
drwxr-xr-x.  3 oracle oinstall   22 Nov 24 18:49 scott
[oracle@oel7 source_backup]$ cat getSourceCodes.sh
#!/bin/bash
. ~/.bash_profile
USER=scott
PASSWD=tiger
BACKUP_DIR=/home/oracle/source_backup/$USER
BACKUP_DIR_TODAY=$BACKUP_DIR/`date +'%Y%m%d'`

mkdir -p $BACKUP_DIR_TODAY
cd $BACKUP_DIR_TODAY
ln -s ../../getcode.sql getcode.sql
ln -s ../../getallcode.sql getallcode.sql
sqlplus -s $USER/$PASSWD @getallcode.sql
find $BACKUP_DIR -type d -mtime +29 -name '20*' -exec rm -rf {} \;
[oracle@oel7 source_backup]$ cat getallcode.sql
et termout off
set heading off
set feedback off
set linesize 50
spool xtmpx.sql
select '@getcode ' || object_name
from dba_objects
where object_type in ( 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TRIGGER' )
and owner ='SCOTT'
/
spool off
spool getallcode_INSTALL.sql
select '@' || object_name
from dba_objects
where object_type in ( 'PROCEDURE', 'FUNCTION', 'PACKAGE', 'TRIGGER' )
and owner ='SCOTT'
/
spool off
set heading on
set feedback on
set linesize 130
set termout on
@xtmpx.sql
exit
[oracle@oel7 source_backup]$ cat getcode.sql
set feedback off
set heading off
set termout off
set linesize 1000
set trimspool on
set verify off
spool &1..sql
prompt set define off
select decode( type||'-'||to_char(line,'fm99999'),
'PACKAGE BODY-1', '/'||chr(10),
null) ||
decode(line,1,'create or replace ', '' ) ||
text text
from dba_source
where name = upper('&&1')
and   owner='SCOTT'
order by type, line;
prompt /
prompt set define on
spool off
set feedback on
set heading on
set termout on
set linesize 100
[oracle@oel7 source_backup]$ ls -al
total 16
drwxr-xr-x.  3 oracle oinstall   85 Nov 24 18:50 .
drwx------. 10 oracle oinstall 4096 Nov 24 18:50 ..
-rw-r--r--.  1 oracle oinstall  486 Nov 24 18:49 getallcode.sql
-rw-r--r--.  1 oracle oinstall  467 Nov 24 18:49 getcode.sql
-rw-r--r--.  1 oracle oinstall  379 Nov 24 18:48 getSourceCodes.sh
drwxr-xr-x.  3 oracle oinstall   22 Nov 24 18:49 scott
[oracle@oel7 source_backup]$ cd scott/2022*
[oracle@oel7 20221124]$ ls -al
total 40
drwxr-xr-x. 2 oracle oinstall 4096 Nov 24 18:49 .
drwxr-xr-x. 3 oracle oinstall   22 Nov 24 18:49 ..
-rw-r--r--. 1 oracle oinstall 2837 Nov 24 18:50 EMP_INFO.sql
-rw-r--r--. 1 oracle oinstall  354 Nov 24 18:50 FUNC_ADD_MONTHS.sql
-rw-r--r--. 1 oracle oinstall  113 Nov 24 18:50 getallcode_INSTALL.sql
lrwxrwxrwx. 1 oracle oinstall   20 Nov 24 18:49 getallcode.sql -> ../../getallcode.sql
lrwxrwxrwx. 1 oracle oinstall   17 Nov 24 18:49 getcode.sql -> ../../getcode.sql
-rw-r--r--. 1 oracle oinstall  297 Nov 24 18:50 TABLE_FUNC.sql
-rw-r--r--. 1 oracle oinstall  434 Nov 24 18:50 TEST_INTERIM2_TRG.sql
-rw-r--r--. 1 oracle oinstall  431 Nov 24 18:50 TEST_INTERIM_TRG.sql
-rw-r--r--. 1 oracle oinstall  192 Nov 24 18:50 TR_CHECK_TRIGGER_TABLE.sql
-rw-r--r--. 1 oracle oinstall  264 Nov 24 18:50 UPDATE_SAL.sql
-rw-r--r--. 1 oracle oinstall  169 Nov 24 18:50 xtmpx.sql
[oracle@oel7 20221124]$
-- crontab 등록을 위해, 퍼미션 조정 
[oracle@oel7 source_backup]$ chmod 770 getSourceCodes.sh
[oracle@oel7 source_backup]$


-- 매일 아침 5시 11분 소스 백업 받도록 crontab 등록 
[oracle@oel7 source_backup]$ crontab -l
#Sample Code
#minute (0-59),
#|      hour (0-23),
#|      |       day of the month (1-31),
#|      |       |       month of the year (1-12),
#|      |       |       |       day of the week (0-6 with 0=Sunday).
#|      |       |       |       |       commands
#0      2       *       *       0,4     /etc/cron.d/logcheck
###################################################################################
# Backup SP Source
11 5 * * * //home/oracle/source_backup/getSourceCodes.sh >/dev/null 2>&1
[oracle@oel7 source_backup]$
-- 패키지 백업 결과 -- 한글이 깨지는게 아쉽지만, 우선 서비스부터 살리고 볼일이다.
[oracle@oel7 20221124]$ cat EMP_INFO.sql
set define off

create or replace PACKAGE emp_info AS

       PROCEDURE all_emp_info;   -- ?? ???  ?? ??

        PROCEDURE all_sal_info;   -- ?? ???  ?? ??

        -- ?? ???  ?? ??
        PROCEDURE dept_emp_info (v_deptno IN  NUMBER) ;

        -- ?? ???  ?? ??
        PROCEDURE dept_sal_info (v_deptno IN  NUMBER) ;

    END emp_info;

/
create or replace PACKAGE BODY emp_info AS


     -- ?? ???  ?? ??
     PROCEDURE all_emp_info
     IS

         CURSOR emp_cursor IS
         SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
         FROM emp
         ORDER BY hiredate;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('?? : ' || aa.empno);
             DBMS_OUTPUT.PUT_LINE('?? : ' || aa.ename);
             DBMS_OUTPUT.PUT_LINE('??? : ' || aa.hiredate);

         END LOOP;

         EXCEPTION
           WHEN OTHERS THEN
             DBMS_OUTPUT.PUT_LINE(SQLERRM||'?? ?? ');

     END all_emp_info;


     -- ?? ???  ?? ??
     PROCEDURE all_sal_info
     IS

         CURSOR emp_cursor IS
         SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
         FROM emp;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.avg_sal);
             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.max_sal);
             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.min_sal);

         END LOOP;


         EXCEPTION
            WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE(SQLERRM||'?? ?? ');
     END all_sal_info;


     --?? ???  ?? ??
     PROCEDURE dept_emp_info (v_deptno IN  NUMBER)
     IS

         CURSOR emp_cursor IS
         SELECT empno, ename, to_char(hiredate, 'RRRR/MM/DD') hiredate
         FROM emp
         WHERE deptno = v_deptno
         ORDER BY hiredate;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('?? : ' || aa.empno);
             DBMS_OUTPUT.PUT_LINE('?? : ' || aa.ename);
             DBMS_OUTPUT.PUT_LINE('??? : ' || aa.hiredate);

         END LOOP;

        EXCEPTION
            WHEN OTHERS THEN
               DBMS_OUTPUT.PUT_LINE(SQLERRM||'?? ?? ');

     END dept_emp_info;


     --?? ???  ?? ??
     PROCEDURE dept_sal_info (v_deptno IN  NUMBER)
     IS

         CURSOR emp_cursor IS
         SELECT round(avg(sal),3) avg_sal, max(sal) max_sal, min(sal) min_sal
         FROM emp
         WHERE deptno = v_deptno;

     BEGIN

         FOR  aa  IN emp_cursor LOOP

             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.avg_sal);
             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.max_sal);
             DBMS_OUTPUT.PUT_LINE('?????? : ' || aa.min_sal);

         END LOOP;

         EXCEPTION
             WHEN OTHERS THEN
                DBMS_OUTPUT.PUT_LINE(SQLERRM||'?? ?? ');

     END dept_sal_info;

  END emp_info;
/
set define on
[oracle@oel7 20221124]$