블로그 이미지
숏퐁숑

카테고리

분류 전체보기 (70)
게임기획자 준비 (18)
게임기획 참고자료 (7)
프로그램 (33)
숨쉬기 활동 (10)
Total
Today
Yesterday

달력

« » 2025.7
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

공지사항

태그목록

최근에 올라온 글

엑스플랫폼으로 PC의 시간을 보여달라는 요청을 처리해 준 후 년/월/일/시/분/초를 자바 스크립트로 구현하는 방법을 정리해 보았다.

 

/*******************************************************************************
 ★ 설명
    해당 PC의 오늘 날짜 + 시간을 가져온다.
 ★ parameter
 ★ return
    - 성공 = yyyyMMddhhmiss형태의 오늘 날짜 ( 예 : "20121122223010" )
    - 실패 = 없음
******************************************************************************/
function TodayTime()
{
 var strToday = "";
 var objDate = new Date();
 var sToday  = objDate.getFullYear().toString();
 sToday += Right("0" + (objDate.getMonth() + 1), 2);
 sToday += Right("0" + objDate.getDate(), 2);
 sToday += Right("0" + objDate.getHours(), 2);
 sToday += Right("0" + objDate.getMinutes(), 2);
 sToday += Right("0" + objDate.getSeconds(), 2);
 //strToday += objDate.getMilliseconds();
 return sToday;

 

/*******************************************************************************
 ★ 설명
    문자열의 오른쪽에서 nSize만큼의 문자열을 가져온다.
 ★ Parameter
    1. sOrg   : 원래 문자열( 예 : "aaBBbbcc" )
    2. nSize  : 가져올문자열 길이 ( 예 : 2 )
 ★ return
    - 성공 = 오른쪽에서 nSize만큼의 문자열 ( 예 : "cc" )
    - 실패 = ""
 ★ 주의사항
    sOrg의 길이가 nSize보다 작은경우는 sOrg가 Return된다.
    ( 예 : sOrg="a", nSize=2 ==> return = "a" )
 ******************************************************************************/
function Right(sOrg, nSize)
{
 if( IsNull(sOrg) || IsNull(nSize) )  return "";
 
 if( sOrg.length < nSize )
  return sOrg;
 else
  return sOrg.substr(sOrg.length-nSize, nSize);
}

////////////////////////////////////////////////////////////////////////////////
// String & Number Start
////////////////////////////////////////////////////////////////////////////////
/*******************************************************************************
 ★ 설명
    입력값이 null에 해당하는 경우 모두를 한번에 체크한다.
 ★ Parameter
    1. sValue : 체크할 문자열( 예 : null 또는 undefined 또는 "" 또는 "abc" )
 ★ return
    - sValue가 undefined, null, NaN, "", Array.length = 0인 경우 = true
    - 이외의 경우 = false
******************************************************************************/
function IsNull(sValue)
{
 if( new String(sValue).valueOf() == "undefined")
  return true;
 if( sValue == null )
  return true;
 if( ("x"+sValue == "xNaN") && ( new String(sValue.length).valueOf() == "undefined" ) )
  return true;
 if( sValue.length == 0 )
  return true;
 return false;
}

 

// 시계처리 함수
function Clock()
{
 date_str = TodayTime();
 yy = date_str.substr(0,4);  //년
 mm = date_str.substr(4,2);  //월
 dd = date_str.substr(6,2);  //요일
 hh = date_str.substr(8,2);  //시간
 mi = date_str.substr(10,2); //분
 ss = date_str.substr(12,2); //초
 return hh + " : " + mi + " : " + ss;
}

 

function comp_timer_ontimer(obj:Form, e:TimerEventInfo)
{
 Static_clock.text = Clock();   //한국 시간
}

 

요렇게 추가해 놓으면 일단 작업은 끝!!

그리고 중요한 부분은 엑스플랫폼의 Source 부분을 열어서 밑에 빨간부분처럼 수정해주어야 한다.

<Form id="work" classname="main" inheritanceid="" position="absolute 0 0 1012 617" titletext="Work Frame" scrollbars="none" onload="work_onload" onsize="work_onsize" ontimer="comp_timer_ontimer" visible="true" style="background:darkgray;">

 

마지막으로 화면이 실행되자마자 실행되게 하기위해 onload 부분에

Static_clock.text = Clock(); // 시계표시용 Static Component에 시간표시
this.setTimer(1,1000);  // Timer구동 <= 타이머를 1초간격으로 설정해주면 위에 ontimer에 설정되어있는 함수를 호출해준다. 그럼 실제 시간이 초당 흘러가는 효과를 나타낼 수 있다!

 

한국 시간은 이렇게 구해왔는데... 워싱턴의 시간과 베이징의 시간도 표현하고 싶어서~~

 

function Clock() {
  var arg = arguments;
  var time = new Date();
 
 if(arg[1])
 time.setHours(time.getHours()+arg[1]);
 
 var yy = time.getFullYear();
  var mm = time.getMonth() + 1;
  var dd = time.getDate();
 
 var minute = time.getMinutes();
  var second = time.getSeconds();
  var hour = time.getHours();
 
 if(hour<=12) {
   if(hour<10) hour = "AM 0" + hour;
   else hour = "AM " + hour;
  }
  else hour = "PM " + (hour-12);
  if(mm<10) mm = "0" + mm;
  if(dd<10) dd = "0" + dd;
  if(minute<10) minute = "0" + minute;
  if(second<10) second = "0" + second;
 
  return yy +"년 "+ mm +"월 "+ dd +"일 "+ hour +":"+ minute +":"+ second;
 }

 

요렇게 만들면 모든 나라의 날짜와 시차를 구할 수 있다.

 

호출 할때는  clock('usa',-14) 요렇게 호출하면 미국과 14시간 차이남으로 미국의 현재 시간을 불러올 수 있다. clock('bejing',1) 요렇게 하면 베이징과의 시차가 1시간 이니까 베이징의 현재시간을 나타낼 수 있다.

Posted by 숏퐁숑
, |

Backup & Recovery

프로그램/ORACLE / 2016. 11. 30. 09:47

 - 관리자로써의 의무

  • 데이터베이스를 어떠한 오류로 부터로의 보호
  • MTBF를 늘리고
  • MTTR을 줄인다
    • MTTR : Fail이 난 이후 복구해서 다시 정상적으로 작동할 때까지(복구시간)
    • MTTF : Fail이 발생하고 다음번 Fail이 발생하는 시간
    • MTBF : MTTR+MTTF(DB신뢰도/가용도)
  • 최소의 데이터 손실을 줄인다
  • Case by Case에 대한 Test를 모두 해본다 -> 결제

- Fail의 종류

  • 구문(문장) 오류
  • 사용자 실수의 오류
  • 네트워크 오류
  • 세션 오류
  • 인스턴스 오류(껐다 켜라..!)
    • SMON의 복구 과정을 거쳐라!
  • 매체 오류(Storage, Device, File)

일반적인 문제

해결책

부적합한 데이터의 입력시도

정상적인 데이터만 입력해라

불충분한 권한으로 작업시도

적절한 오브젝트나 시스템 권한을 부여

공간할당 실패

· Resumable Space를 가동시키면 Space가 꽉 찰 경우 작업이 일시정지되고 Alert!이 발생한다.

· 사용자에 대한 공간할당을 해준다

· 테이블 스페이스를 추가한다

잘못된 어플리케이션 에러

개발자나 사용자에게 정확한 에러를 찾게한다

 

 

 

- User Process Failure

  • 비정상적 종료
  • 세션을 종료시키는 프로그램에 오류발생
  • Solution : DBA의 개입이 필요없다. PMON이 알아서 처리해준다. 문제를 발생한 Trend를 보고 판단한다
  • 계속해서 연결 끊김현상(비정상적인 종료)가 발생하면
    • 사용자의 교육이 필요
    • Network Fail을 의심해본다
    • 비정상적으로 종료되는 Application도 확인해본다

- Network Failure

  • Listener오류
    • 백업 리스너를 구성해서 재빠르게 대응한다
    • Failover(계속적인 접근시도) 기능을 이용한다
  • 네트워크 카드 오류
    • 백업 랜카드를 준비해둔다
  • 네트워크 장비 오류
    • 백업 네트워크 장비를 준비해둔다

- User Error

  • 데이터를 실수로 삭제하거나 수정했을경우(DML실수)
  • 실수로 드랍을 할경우(DDL 실수)
  • Solution : 휴지통을 이용해서 복구 & 롤백, Purge로 삭제했을 경우는 Backup(불완전복구) 정보로 복구한다
  • LogMiner : FlashBack 보다는 기능이 떨어지지만, 예전부터 사용해왔던 복구도구이다.

- Instance Failure

  • 정전
  • 하드웨어 오류
  • 필수 백그라운드 프로세서중 오류
  • 비상종료
  • Solution : Startup 명령을 사용해서 Restart(SMON이 복구)
  • 복구된후 Alert!로그와 Trace File & EM을 보고 오류를 분석한다
  • ※ Commit된 정보를 DataFile로 적용시키는것 : Roll Fowarding

- CKPT

  • DBWr Process에게 Signal을 보낸다
  • 신호받은 DBWr는 Dirty Block(Buffer Cache에 있다)를 Data File로 기록한다
    • Check Point Queue에 Dirty Block의 정보가 있다.
  • DB FIle Header와 Contorl 파일의 정보를 Update한다.
  • 무결성 체크!
  • Check Point Position : Check Point Position과 현재 DB 상태의 거리가 가까울수록 Recovery 시간이 짧다
  • Check Point가 존재하는 이유
    • Dirty Block을 Data FIle로 주기적으로 내려쓰기 위해
    • Recovery Time을 줄일수있다.
    • Shutdown시 Data 기록을 확실히 보장한다

- LGWr

  • Redo Log FIle
    • DB의 모든 변경사항
    • 데이터 손실로부터 보호하기 위해 다중화를 하고 다중화된 멤버는 서로다른 Disk에 위치시킨다!
      • 단점 : I/O를 많이 발생하고, Disk 공간을 차지한다
  • 언제?
    • Commit 할때마다
    • 3초마다
    • DBWn Wirte가 쓰기전

- ARCn

  • 옵션 프로세서이다
  • 아카이브로그 모드가 활성되어 있는 경우 online Redo Log 파일을 자동으로 아카이브한다
  • DB의 모둔 변경 사항을 영원히 보존한다.
  • EM & CMD로 할수있다.

- Instance Recovery

  • 종료될때 제대로 종료되지 않은 DB가 있으면 복구후 OPEN한다
  • 자동설정되어있다
  • Rego Log Group에 있는 내용으로 재적용 해준다
    • Roll Fowarding -> Commit된 정보와 DataFile이 일치가 안되면 적용
    • Roll Back -> Commit 되지 않은 값을 Undo Segment에 있는 값(Orinigal) 과 DataFIle값을 비교해서 롤백
  • OPEN이 되면 DataFile과 Redo Log이 열린다. 이때 복구작업이 진행된다(SMON)
  • Check Point Position의 마지막 정보와 Redo Log File의 마지막 정보를 비교해서 동기화시킨다

- RBA(Redo Log File의 전체 Address)

- fast-start-mttr-target = 900 -> Instance Recovery 하는데 걸리는 최대 시간

  • 900초 분량의 Dirty Blcok의 개수
  • 시간이 짧을경우 : 복구시간은 짧아지지만 DBWr I/O는 많이발생
  • 시간이 길경우 : 복구시간은 길어지지만 DBWr I/O는 적게발생

- Media Failure

  • Disk Driver 오류
  • Disk Controller 오류
  • DB 파일 오류
  • Solution
    • 백업한 데이터로 부터 복구
    • 필요에 따라서 Redo(Redo Log FIle & Archive File) 정보 적용
    • 새로운 위치를 지정(Disk Fail일 경우)

- 복구능력 향상을 위한 구성

  • 최대한 일반적인 백업 스케쥴을 구성(증분백업정책)
  • Control 파일과, Redo Log Group의 다중화
  • Redo Log의 Archive를 잘 보관

- Control Files

  • 최소한 2개이상의 Control 파일은 다중화 시켜라
  • 서로다른 디스크에 각각 저장
  • Control File 백업
    • alter database backup controlfile to trace -> udump/*.trc
    • alter database backup controlfile to trace as '경로/파일"
    • alter database backup controlfile to '경로/파일' -> Image Backup(File로 생성)
  • 실습
    • WS1-2-ch14. Managed Control File LAB

- Redo Log File

 

  • 그룹이 2개 이상이여야 하는 이유 : Log Switch가 가능!
  • 다중화는 성능의 심각한 영향을 준다(I/O 발생)
  • v$log_stats
    • Current (LGWr)
    • Active -> Checkpoint (ARCn이 작업중일경우)
    • Inactive -> 삭제가능
    • Unused -> 초기화(Clear), 생성직후
    • Clearing -> Alter database clear logfile group n; 그룹 초기화
    • Clearing_Current -> I/O 오류가 발생한 상황
  • 실습
    • WS1-2-ch14. Managed Redolog File LAB

- Archive Log

  • Redo 정보를 유지 & 보존
  • 아카이브 과정
    1. 이름에 대한 규칙성을 정하고
    2. 하나이상의 로그파일 위치를 지정한다
    3. 아카이브 로그모드 설정(마운트에가서)
  • 이름의 규칙성을 정하는 파라미터 : log_archive_format

----------------------------------------------------------

- Performing Database Backup

  • Secure Backup
    • End-to-End 기능
    • 중앙화된 백업 관리를 수행할수 있다
    • RMAN Backup의 한창 강화된 기능을 포함
    • 네트워크상의 백업이 가능
    • Resource 문제를 해결
    • 저렴한 비용과 신뢰할수 있는 데이터보호 정책등이 보장된다

  • User Managed Backup
  • Backup이 필요한건지 Backup상태가 어떤지 사용자가 직접 체크한다(스크립트 이용 권고)
  • 일반 TBS 백업시
    • 정보조회를 먼저한다
      • v$datafole
      • v$logfile
      • v$controlfile
    • alter tablespace xxx begin backup -> 백업모드로 전환(Check Point 발생)
    • v$backup으로 backup모드인지 확인
    • cp
    • alter tablespace xxx end backup
Posted by 숏퐁숑
, |

with grant option 과 with admin option에 대해 테스트를 하기 전에

쉽게 이해하실수 있도록 기본적인 셋팅을 하도록 하겠다.

 

C:\> sqlplus "/as sysdba"

 

1. 사용자 생성(USER_1, USER_2)

SQL> create user user_1 identified by user_1 default tablespace users;

사용자가 생성되었습니다.

SQL> create user user_2 identified by user_2 default tablespace users;

사용자가 생성되었습니다.

 

2. 접속 권한 및 간단한 권한 주기

SQL> grant create session, create table, create view to user_1;

권한이 부여되었습니다.

SQL> grant create session, create table to user_2;

권한이 부여되었습니다.

 

이제 with grant option 과 with admin option 을 알아보자.

 

(1) with grant option

 

기본적으로 scott 계정은 다들 가지고 계시니 scott 계정으로 접속한다.

SQL> conn scott/tiger

연결되었습니다.

 

scott이 user_1에게 emp 테이블을 select 할수 있는 권한을 with grant option을 써서 부여 하도록 한다.

SQL> grant select on emp to user_1 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
2 where table_name='EMP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1 SCOTT EMP SCOTT SELECT YES NO

 

 

scott에게 받은 권한을 똑같이 user_2에게 부여한다.

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant select on scott.emp to user_2 with grant option;

권한이 부여되었습니다.

SQL> select * from user_tab_privs
2 where table_name='EMP';

GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- --------------- --------------- --------------- ---- ---
USER_1 SCOTT EMP SCOTT SELECT YES NO
USER_2 SCOTT EMP USER_1 SELECT YES NO

 

USER_TAB_PRIVS 테이블은 누구의 소유이며 권한자 및 권한을 부여 받은 자를 확인 할 수 있다.

 

이제 부여한 권한을 다시 회수 할 것이다. 어떻게 회수가 되는지 확인이 필요하다.

 

SQL> conn scott/tiger
연결되었습니다.
SQL> revoke select on emp from user_1;

권한이 취소되었습니다.

 

SQL> conn user_1/user_1;
연결되었습니다.
SQL> select * from user_tab_privs
2 where table_name='EMP';

선택된 레코드가 없습니다.

 

SQL> conn user_2/user_2;
연결되었습니다.
SQL> select * from user_tab_privs
2 where table_name='EMP';

선택된 레코드가 없습니다.

 

※ scott이 user_1의 권한 revoke 하였지만, user_1이 user_2에게 부여한 권한도 같이 회수가 되는 것을 볼 수 있다.

 

(2) with admin option

 

SQL> conn /as sysdba

연결되었습니다.

 

SQL> grant alter session to user_1 with admin option;

권한이 부여되었습니다.

 

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE PRIVILEGE ADM
---------- ------------------- ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 ALTER SESSION YES
USER_1 CREATE SESSION NO
USER_2 CREATE TABLE NO
USER_2 CREATE SESSION NO

6 개의 행이 선택되었습니다.

 

SQL> conn user_1/user_1
연결되었습니다.
SQL> grant alter session to user_2 with admin option;

권한이 부여되었습니다.

SQL> select * from user_sys_privs where username like 'USER%';

USERNAME PRIVILEGE ADM
----------------------- ------------------ ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 ALTER SESSION YES
USER_1 CREATE SESSION NO

 

SQL> conn user_2/user_2
연결되었습니다.
SQL> select * from user_sys_privs where username like 'USER%';

USERNAME PRIVILEGE ADM
----------------------- ------------------ ---
USER_2 CREATE TABLE NO
USER_2 ALTER SESSION YES
USER_2 CREATE SESSION NO

SQL>

 

위 테이블을 보시면 ADM 컬럼에 YES로 나와있는 것을 볼수 있다.

 

이제 GRANT 권한을 회수한 것처럼 똑같이 해보겠다.

 

SQL> conn /as sysdba

 

SQL> revoke alter session from user_1;

권한이 취소되었습니다.

 

SQL> select * from dba_sys_privs where grantee like 'USER%';

GRANTEE PRIVILEGE ADM
---------- --------------- ---
USER_1 CREATE VIEW NO
USER_1 CREATE TABLE NO
USER_1 CREATE SESSION NO
USER_2 CREATE TABLE NO
USER_2 ALTER SESSION YES
USER_2 CREATE SESSION NO

 

※ dba_sys_privs를 보시면 user_2의 권한은 그대로 남아있고 user_1의 권한 회수 된것을 볼수 있다.

 

결론을 내리자면 with grant option 은 revoke 시 다른사용자에게도 부여한 권한을 같이 회수하지만 with admin option은 특정 사용자의 권한만 회수가 되고 나머지 다른사용자에게 부여된 권한은 회수가 되지 않는다.

 

사용된 테이블 : user_tab_privs

: dba_sys_privs

: user_sys_privs

'프로그램 > ORACLE' 카테고리의 다른 글

Linux 기반의 Oracle10g 설치  (0) 2016.11.30
Backup & Recovery  (0) 2016.11.30
데이터베이스]SEQUENCE(시퀀스)란 무엇인가?  (0) 2016.11.30
view에 사용되는 with check option  (0) 2016.11.30
오라클 함수 정리  (0) 2016.11.30
Posted by 숏퐁숑
, |

최근에 달린 댓글

글 보관함