19 04 * * * /home/my/bin/oracleback

crontab -e 를 이용하여 위의 내용을 추가
crontab -l 로 확인할수 있다.

매일 04:19분에 oracleback을 실행한다.


/home/my/bin/oracleback 화일의 내용

#!/bin/bash

#오라클 환경설정 시작
export ORACLE_HOME=/home/my/app/oracle/product/8.0.5
export LD_LIBRARY_PATH=$LD_lIBRARY_PATH:$ORACLE_HOME/lib
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=ORCL
export NLS_LANG=KOREAN_KOREA.KO16KSC5601
#오라클 환경설정 끝

#ss = `date +myDB%y%m%d.dmp` #요렇게 하면 오늘 날짜 생성
#echo `date +myDB%y%m%d.dmp` #밑에 있는 화일경로명을 $ss로 하면 된다.

/home/my/app/oracle/product/8.0.5/bin/exp id/passwd file=/home/my/`date +myDB%Y%m%d.dmp` FULL=Y

ss를 주석처리 했는데
위의 exp 실행문에서 file=$ss 라고 해놓으면 ss란 이름으로 오라클 FULL백업화일이 만들어
집니다. id/passwd 는 오라클 DB 관리자 계정/비밀번호 입니다.

'DataBase' 카테고리의 다른 글

[Oracle] Database link, Synonym How to  (0) 2007.01.09
[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09
cd /backup
tar cvpfz /backup/home.tar.gz /home --exclude=/home/test

일반적으로 tar 로 백업시 사용되는 확장자 규칙은 압축되지 않고 단순히 하나의 파일로 패킹(packing) 한 파일의 경우에는 "tar" 를, gzip 으로 압축된 파일의 경우에는 "tar.gz" 나 "tgz" 를 확장자로 한다. 따라서 확장자가 home.tar.gz나 home.tgz일 경우 tar로 packing 된 후 gzip으로 압축되었음을 뜻한다.

백업시 ``z'' (압축) 옵션의 사용에 유의하여야 한다. 단순히 하나의 파일로 압축 백업시에는 때에 따라 데이터의 일부가 손상되는 경우가 있는데, 이때에는 백업된 파일 전체가 깨어져 복구를 할 수 없게 되는 경우가 있다. 백업 시 압축을 하지 않고 단순히 tar 로 묶은 경우에는 설사 압축파일이 깨어졌다 하더라도 압축 파일의 복구가 가능하기 때문에 백업 시 압축을 할 것인지 여부를 신중히 선택하여야 한다.
아울러 현재까지 안정 KERNEL인 Kernel 2.2의 경우 하나의 파일은 최대 2G 가 최대 사이즈인데, 특정 파티션 이하에 많은 파일이 있어 하나의 파일로 백업할 경우 2G를 넘을 경우에는 적당히 분산하여 백업을 하여야 한다.
이때에는 아래와 같은 방법이 가능할 것이다.

tar cvfpz home_a_h.tar.gz /home/[a-h]*
tar cvfpz home_i_p.tar.gz /home/[i-p]*
tar cvfpz home_q_z.tar.gz /home/[q-z]*



>> 실제 백업 스크립트 예.

#!/bin/sh .................. (1)

cd /backup .................. (2)
rm -f *.tar.gz ................... (3)
tar cvfpz apache.tar.gz /usr/local/apache/* ........ (4)
tar cvfpz home.tar.gz /home/* --exclude=/home/test ........ (5)
tar cvfpz etc.tar.gz /etc/* ........... (6)
tar cvfpz mail.tar.gz /var/spool/mail/* ........... (7) ,
chown backup.backup *.tar.gz .............. (8)
chmod 700 *.tar.gz .............. (9)
ls -alh | mail -s "백업정보" backup@tt.co.kr ........ (10)
df --sync -h | mail -s "파티션정보" backup@tt.co.kr .......... (11)


(1) 시작되는 내용이 Shell Script 임을 정의한다.
(2) 백업작업이 이루어지는 파티션인 /backup 으로 이동한다.
(3) 기존의 백업된 파일을 모두 삭제한다.
(4) - (7) 번까지는 백업을 해야 할 디렉토리 이하에 대해 데이터를 각각 백업한다.
(8) 백업된 파일의 소유권을 backup 으로 설정한다.
(9) 백업된 파일의 권한을 700 으로 설정한다.
(10) 백업이 제대로 되었는지 확인하기 위해 현재의 디렉토리내 백업 파일의 리스트를 백업 담당자인 backup@tt.co.kr 에게 메일로 발송한다.
(11) 혹 파티션이 찰 수도 있으니 현재의 파티션 사용 정보를 백업담당자에게 메일로 발송 한다.



>> 증가분 백업하기.

#!/bin/sh ...........(1)

TODAY=`date +"%d %b %Y"` ........... (2)
PREVIOUSDAY=`cat FULL_BACKED_DAY` ............ (3)
tar cvfpzG _modified_home.tgz -N "$PREVIOUSDAY" /home ..........(4)

/home 에 대해 Full Backup을 실행하기로 한다.(이때 Full 백업 스크립트 제일 하단에
echo `date +"%d %b %Y"` > FULL_BACKED_DAY 를 추가한다)

이후 매일 위의 스크립트를 실행하면 풀백업 이후 추가 및 변경된 파일 및 디렉토리만 선별하여 별도로 백업을 하게 되는 것이다.
(1) 실행되는 스크립트가 Shell 스크립트임을 정의한다.
(2) 현재의 시각을 -N 옵션이 이해할 수 있는 13 Jan 2001 형태로 TODAY 라는 변수에
대입한다.
(3) 이전에 Full 백업시의 시각인 FULL_BACKED_DAY를 읽어 PREVIOUSDAY 라는 변수에 대입한다.
(4) /home 디렉토리 이하에 대해 Full 백업시의 시각 이후로 변경, 추가된 파일에 대해서만 modified_home.tgz 라는 파일로 저장한다.



# 참고

cron 이용하기.

cron 은 일종의 일정관리 데몬으로서 기본 설정파일인 crontab 에 따라 정해진 시각에 따라 주기적으로 명령을 수행한다. crontab 는 7개의 구성요소로 이루어지는데, 6번째 필드(User)는 생략되어도 무방하다.

분 / 시 / 날짜 / 달 / 요일 / 사용자 / 명령어

각 항목은 정수로 나타낼 수도 있고 또한 몇 개의 항목은 와일드카드 문자로 인식되는 ``*'' 문자로 표현이 가능한데, * 는 "매"의 의미이다. 즉 시간 항목에 * 이 있다면 매시간이라는 뜻이고 날짜 항목에 * 이 있으면 매일이라는 뜻이 되는 것이다. 그리고 하나의 필드에 중복된 시간을 나타내고자 하면 콤마로 구분하면 되고, 연속된 시간을 나타내고자 하면 하이픈(-)을 이용하여 일정기간을 나타낼 수 있다.
참고로 분은 0-59, 시는 0-23, 날짜는 0-31, 달은 0-12(0또는 12는 12월, 1은 1월...), 요일은 0-7(0과 7은 일요일, 1은 월요일)로 나타낸다.

/etc/crontab 파일예
01 * * * * root run-parts /etc/cron.hourly
02 2 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
0 0 * * 1 root rdate -s time.bora.net && clock -w

위 그림에서 각각의 의미를 알아보도록 하자.
첫줄은 매시 1분에 /etc/cron.hourly 디렉토리내의 스크립트를 실행한다는 의미이고,
두번째줄은 매일 02시 2분에 /etc/cron.daily 내의 스크립트를 실행한다는 의미이고,
세번째줄은 매월, 매일 새벽 4시 22분에 /etc/cron.weekly 디렉토리내 스크립트를 실행하는 것처럼 보이지만 5번째 필드인 <요일> 필드값이 0 이므로 1주일에 1회 일요일(0이므로) 에 /etc/cron.weekly 디렉토리내의 스크립트를 실행하라는 것이다.
다섯번째줄과 같이 매일,매주 0시0분, 매주 월요일(1) 에 rdate -s time.bora.net && clock -w 라는 명령어를 실행하라고 직접 명령어를 지정해 줄 수도 있다.
각 디렉토리 내 실행 스크립트는 정기적으로 시스템에 의해 실행이 되어야 하므로 실행(eXecute) 권한이 있어야 함은 당연하다. 따라서 위에서 작성한 스크립트를 700 정도의 적당한 실행권한을 부여하여 해당 디렉토리에 설정해 주면 될 것이다.
또는 직접 /etc/crontab를 편집하여 실행시간을 정의할 수도 있다.

DB 등 중요 데이터 매일 백업하기.
--> /etc/cron.daily/db_bak.sh
#!/bin/sh
dat=`date +%Y%m%d%H%M`
tar cvfpz /backup/db/mysql_$dat.tgz /usr/local/mysql/var/*
chmod 700 /backup/db/*

--> /etc/cron.3days/db_del.sh
#!/bin/sh
find /backup/db/ -mtime +3 -exec rm -f {} \;

/backup/db 에는 3일치 데이터가 늘 저장됨.

CREATE OR REPLACE PROCEDURE P_RESET_SEQ( SEQ_NAME IN VARCHAR2 )
IS
L_VAL NUMBER;
BEGIN
EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL' INTO L_VAL;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY -' || L_VAL || ' MINVALUE 0';

EXECUTE IMMEDIATE 'SELECT ' || SEQ_NAME || '.NEXTVAL FROM DUAL' INTO L_VAL;

EXECUTE IMMEDIATE 'ALTER SEQUENCE ' || SEQ_NAME || ' INCREMENT BY 1 MINVALUE 0';
END;
/

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] TOAD에서 Explain Plan 보기  (1) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09
[Oracle] DB Link How-To  (0) 2007.01.09

옵티마이져를 이해하기 위해서는

실행계획(EXPLAIN PLAN)을 반드시 분석해보는 것이 좋다.

1, TOAD에서 간단히 실행계획을 보기위해서 다음 테이블을 생성한다.

CREATE TABLE PLAN_TABLE
(
STATEMENT_ID VARCHAR2(30) , -- 사용자가 지정한 제목
TIMESTAMP DATE , -- 실행계획이 수립된 날짜와 시간
REMARKS VARCHAR2(80) , -- 사용자가 부여한 주석(COMMENTS)
OPERATION VARCHAR2(30) , -- AND-EQUAL,INDEX, SORT 등과 같은 실행 연산자
OPTIONS VARCHAR2(30) , -- BY ROWID, JOIN, FULL 등과 같은 실행 옵션
OBJECT_NODE VARCHAR2(128), -- 사용한 데이타베이스 링크
OBJECT_OWNER VARCHAR2(30) , -- 객체를 생성한 소유자
OBJECT_NAME VARCHAR2(30) , -- 테이블, 인덱스, 클러스터 등의 객체의 이름
OBJECT_INSTANCE NUMERIC , -- SQL문의 FROM절에 기술된 객체를 좌에서 우로 부여한 번호
OBJECT_TYPE VARCHAR2(30) , -- UNIQUE, NON-UNIQUE INDEX 등의 객체의 종류
OPTIMIZER VARCHAR2(255), -- CHOOSE, FIRST_ROW 등의 현재의 옵티마이져 모드
SEARCH_COLUMNS NUMERIC , -- 현재 사용하지 않음
ID NUMERIC , -- 수립된 각 실행단계에 붙여진 일련번호
PARENT_ID NUMERIC , -- 부모단계의 일련번호
POSITION NUMERIC , -- 부모 ID를 가지고 있는 자식 ID간의 처리순
COST NUMERIC ,
CARDINALITY NUMERIC ,
BYTES NUMERIC ,
OTHER_TAG VARCHAR2(255),
OTHER LONG -- 다른 필요한 텍스트를 저장하기 위한 필드
);

☞ PLAN_TABLE 생성 스크립트는 $ORACLE_HOME/rdbms/admin/utlxplan.sql과 같다

2. TOAD의 메뉴에서 VIEW->OPTION->ORACLE->EXPLAIN PLAN TABLE NAME 란에 위에서 생성한 테이블명

('PLAN_TABLE')과사용할 오라클 USERID를 적는다.

3. 실행계획을 보고 싶은 쿼리문을 실행한후 VIEW->EXPLAIN PLAN

'DataBase' 카테고리의 다른 글

[Oracle] 아카이브 백업 / 복구  (0) 2007.01.09
[Oracle] cron을 이용한 Oracle 백업  (0) 2007.01.09
[Oracle] 시퀀스 초기화 프로시저  (0) 2007.01.09
[Oracle] Create SYNONYM  (0) 2007.01.09
[Oracle] DB Link How-To  (0) 2007.01.09

오늘은 그만열기의 샘플소스

========================팝업여는쪽 소스======================
<html>
<head><title></title>
<script language="JavaScript">
<!--
function getCOOKIE(name)
{
var Found;
Found = false;
var start, end;
var i = 0;

while(i <= document.COOKIE.length)
{
start = i;
end = start + name.length;
if(document.COOKIE.substring(start, end) == name)
{
//Found = true;
return true;
break;
}
i++;
}

if(Found == true)
{
start = end + 1;
end = document.COOKIE.indexOf(';', start);
if(end < start)
end = document.COOKIE.length;
return document.COOKIE.substring(start, end);
}
return '';
}

function openPopup()
{
if (getCOOKIE('popup') != true)
window.open('popup.html', 'popup', 'left=0,top=0,toolbar=no,status=no,width=400,height=400,directories=no,scrollbars=no,Location=no,resizable=no,menubar=no');
}
//-->
</script>
</head>
<body onLoad="JavaScript:openPopup();">
...
</body>
</html>
============================================================


========================팝업쪽 소스==========================
<html>
<head><title><title>
<script language="JavaScript">
<!--
//다시 열지 않기 선택시 -- setCOOKIE("화일명","y",1) 화일명을 수정해주고 메인에도 같이 수정해 줄것.
function controlCOOKIE()
{
setCOOKIE("popup","y", 1)
window.close();
}
//쿠키 생성 함수

function setCOOKIE(name, value, expire)
{
var expire_date = new Date()
expire_date = new Date(expire_date.getTime() + 60*60*24*1000)
document.COOKIE = name + "=" + escape(value) + "; expires=" + expire_date.toGMTString() +"; path=/";
self.close();
}

//쿠키 소멸 함수
function clearCOOKIE(name)
{
var today = new Date()
//어제 날짜를 쿠키 소멸 날짜로 설정한다.
var expire_date = new Date(today.getTime() - 60*60*24*1000)
document.COOKIE = name + "= " + "; expires=" + expire_date.toGMTString()
}

function closeWindow()
{
window.close();
}
//-->
</script>
</head>
<body>
.
생략
.
.
.
.

<input type="checkbox" name="nopopup" onClick="JavaScript:controlCOOKIE();"> 오늘은 그만 열기 <input type="button" name="closepopup" value="close" onClick="JavaScript:closeWindow();">
============================================================
</body>
</html>

개발자는 참 알아야 할 것도 많다... --a

개발한 프로그램에서 날짜를 표시해주거나

조회조건으로 날자를 입력받아야 할 때가 있습니다.

물론 켈린더 콘트롤을 사용해도 무방하지만...

부득이하게 콤보박스나, 텍스트 박스로 입력받아야 하는 경우가

종종 있습니다.

만약 날짜를 택스트 박스로 YYYYMMDD 이런식으로 받았을경우

데이터베이스로 보내기 전에 검증을 거쳐야 할 것입니다..

우리가 쓰는 달력에는 규칙이 있죠.

현대에 전세계에서 공통적으로 사용하는것이

그레고리력이라는건데...

원리는 이렇습니다.

하루는 지구가 자전을하는 주기로 24시간쯤 되고

1년은 지구가 태양의 주위를 공전하는 주기로 약 365일 쯤 되는건 다 아실껍니다.

문제은 이게 딱 떨어지는게 아니고 지구가 태양의 주위를 자전과 공전을 동시에 하기때문에 딱 정수로 떨어지는게 아니라는 점이죠

정확히 말하면 1년은 약 365.2425일쯤 됩니다.

그레고리력에서는 1년을 365일로 표기하고 있는데....

요 남은 0.2425일이 문제입니다.

4년이면 약 하루의 오차가 생기죠.

요걸 2월달에 하루 더 낑겨 넣은게 윤년입니다.

즉 해단년을 4로 나누어 떨어지는 해는 윤년이란 이야기 입니다.

헌데... 의심 많은분들은 벌써 눈치 채셨겠지만....

4년이면 약 하루의 오차...에서 요 약 하루가 문제입니다.

적확히 말하면 1일이 아니기때문에...

이게또 오랜 시간 지나면 쌓여서 오차가 생긴다는 거죠.

해서 4년에 한번씩 1일을 더해주다 100의 배수가 되는 해에는

평년으로 해주고, 다시 400의 배수가 되는 해에는 윤년으로 하기로 한거죠

이게 바로 그레고리력입니다.

그레고리력은 몇가지 단점에도 불구하고

태양회귀년과 3000천년에 하루 정도 오차가 생길정도로 오차가 적다는 장점에서

현재 세계표준력으로 사용하고 있습니다.

물론 앞으로 약 1000년후면 3000년이 되서 하루의 오차가 생기겠지만

그건 어찌할지 나두 모르죠 ㅋㅋ

그래고리력에 알고리즘에 기반 윤년 체크

function getLastDay(solar_date)
{
var MonthTable = new Array(31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
if (((solar_date.getYear() % 4 == 0) && (solar_date.getYear() % 100 != 0)) || (solar_date.getYear()% 400 == 0))
MonthTable[1] = 29;
else
MonthTable[1] = 28;
return MonthTable[solar_date.getMonth()];
}

//사용법
// 예로 2004년 2월의 마지막 날이 몇일인지 알고 싶으면

var nowDate = new Date();

nowDate.setYear( 2000);
nowDate.setMonth(2-1); // 월은 0=1월, 1=2월... 11=12월

nowDate.date= getLastDay(nowDate);

/*******************************************************/
/* 숫자 데이터중에서 Comma(,) 를 전부 없애는 함수 */
/*******************************************************/
function removeComma(obj)
{
var src = new String(obj.value);
var rtn_value = "";
for (var i=0; i<src.length; i++)
{
var ch = src.charAt(i);
if( (ch >= "0" && "9" >= ch) || ch == "-" || ch == ".")
rtn_value = rtn_value + ch;
}
if( rtn_value.length = 0)
rtn_value = 0;
return rtn_value;
}

/*********************************************************/
/* 소수점 자리가 있는 숫자 중에서 Comma(,)를 붙이는 함수 */
/*********************************************************/
function setComma(s)
{
for(j=0; j<s.length; j++)
s= s.replace(/,/g,"");
var t="";
var i;
var j=0;
var tLen =s.length;

if (s.length <= 3 )
{
return s;
}

for(i=0;i<tLen;i++)
{
if (i!=0 && ( i % 3 == tLen % 3) ) t += ",";
if(i < s.length ) t += s.charAt(i);
}
return t;
}

웹개발시 입력값의 길이를 체크할때

string.length 를 이용하면 무조건 한글이건 영문이건

1글자로 체크함.

서버측에서 실제 저장할때는 알파뉴메릭(숫자, 영문자, 아스키코드 등)은 1byte, 한글 및 특수문자는 2byte로 처리함으로

한글이 포함된경우 폼에서 자바스크립트로 체크하더라도

데이터베이스에 저장할때 에러가 나죠

한글,특수문자를 2자리로 계산해서 폼에서 체크하도록 한

예제입니다.


<html>
<head>
<title> new document </title>
</head>
<script language="JavaScript">
<!--
function check()
{
var string = document.a.test.value;
alert(getStringLength(string));
}

// 문자열 길이 체크 알파뉴메릭(1자리), 한글(2자리)
function getStringLength (str)
{
var retCode = 0;
var strLength = 0;

for (i = 0; i < str.length; i++)
{
var code = str.charCodeAt(i)
var ch = str.substr(i,1).toUpperCase()

code = parseInt(code)

if ((ch < "0" || ch > "9") && (ch < "A" || ch > "Z") && ((code > 255) || (code < 0)))
strLength = strLength + 2;
else
strLength = strLength + 1;
}
return strLength;
}
//-->
</script>
</head>
<body>
<form name="a">
<input type="text" name="test"><input type="button" value="체크" onClick="JavaScript:check();">
</form>
</body>
</html>



+ Recent posts