Listener, EM Console 시작,종료 방법 ]     

 

 10g DB, Listener, EM Console 시작,종료 방법

 

  1. listener, DB, EM 시작방법
 
# su - oracle
 
리스너 시작
$ lsnrctl start
The command completed successfully(마지막 줄에서 확인 가능)
 
리스너 상태확인
$ lsnrctl status
 
sysdba 권한으로 DB 접속
$ sqlplus "/ as sysdba" 
 
DB 시작
SQL> startup
SQL> exit
 
EM Console 시작
$ emctl start dbconsole
 
 
2. EM, listener, DB 종료방법
 
# su - oracle
 
EM Console 정지
$ emctl stop dbconsole
 
리스너 상태확인
$ lsnrctl status
 
리스너 정지
$ lsnrctl stop
The command completed successfully(마지막 줄에서 확인 가능)
 
sysdba 권한으로 DB 접속
$ sqlplus "/ as sysdba"
 
DB 정지
SQL> shutdown immediate
SQL> exit
 
3. 테이블스페이스 공간 확인
 
$ sqlplus "/ as sysdba"
 
SQL> Select tablespace_name,sum(bytes)/1024/1024 from DBA_DATA_FILES Group by tablespace_name;
 
4. 설치 상태 확인
 
sqlplus 접속만으로 설치 버전 확인 가능
$ sqlplus "/ as sysdba"
 
SQL>select * from v$version;
SQL>select * from v$option;
설치된 oracle dbms option이 출력됨. true로 확인
 

5. 프로세스 확인 방법
DB 상태 확인
$ ps -ef|grep ora_

 
listener 상태 확인
$ ps -ef | grep tns

 
 
웹브라우저에서 EM Console(DB 관리 화면)에 접속하려면
 
10g R1
http://DBserver-IP:5500/em/
 
10g R2
http://DBserver-IP:1158/em/
 

 

저작자 표시
신고

'Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Listener_EM Console  (0) 15:05:15
Oracle - Pro*C  (0) 15:04:46
Oracle - Recovery - Point in Time  (0) 15:04:06
Oracle - Data를 Insert 문장으로 만들기  (0) 15:03:31
Oracle - Export Script  (0) 15:01:40
Oracle - Export  (0) 15:00:25
Posted by 농부지기

[ Oracle - Pro*C ]   

 

 

 Pro*C 

 

 
 
-. 오라클 데이타베이스 내의 테이블에 존재하는 레코드들을 조회,수정 등의 데이타 처리를 하고, 
   C프로그램으로 전환하기 위해 사용함.
-. C와의 차이점 
   -. 외형상의 차이 : 확장자가 .pc로 끝난다.
   -. 기본적으로 C문법을 따르며, C프로그램코드에 DB에 접속하여 레코드들을 처리하는 과정이 추가되어 
      작성된다.
      즉, C로 작성된 프로그램코드에 오라클의 SQL의 DML or DDL명령문이 'EXEC'구문과 결합된 형태가
       추가된 것임을 알 수 있다.
   -. 변수선언에서 C언어에서는 사용하지 않는, .arr과 .len이라는 변수가 컴파일된 C source코드에 
      생성되어 있는 것을 확인할 수 있다.

-. 컴파일 과정
   -. filename.pc -> filename.c -> filename.o -> filename*(생성된 오브젝트 파일을 링크해서 
      실행파일을  만드는 과정이다.)
 
-. 실제 컴파일
 -. makefile 위치 
 $ORACLE_HOME에 proc/에 보면 proc.mk파일이 있다.
 
 이중에서 
 1) USERID = uinfo/mation
  -. 오라클 DB에 접속할때 사용할 사용자 아이디와 비밀번호 지정
  
 2) DEST = /home/elfsun/simple/bin
 -. 컴파일후 실행파일을 복사할 디렉토리
 
 3) COMM_OBJ = /home/elfsun/simple/lib/lib1.o\
        /home/elfsun/simple/lib/lib2.o\
        /home/elfsun/simple/lib/lib3.o\
        /home/elfsun/simple/lib/lib4.o
 -. 컴파일시 참조로할 오브젝트 파일들.
 \(백슬레시)로 구분함.
 
 4) all : $(PROGRAM)
 -. 프로그램의 이름을 지정할 수 있다. 이것은 프로그램의 소스 이름이 되며, 컴파일후 생성될 
    실행 파일의 이름이 되기도 한다.
 
 5) install :
 -. 컴파일후 생성된 실행 파일을 복사해주는 작업을 수행
 
 6) clean : 
 -. 컴파일 과정에서 생성되는 C파일과 오브젝트 파일들을 삭제할때 수행
 
 이들중 수행할 각 명령들은 '@'바로 뒤에 작성해 줄 수 있다.
 
 [실제 컴파일 수행 - makefile이름이 proc.mk인 경우]
 
 1) 실제 컴파일을 하기 위해
  $ make -f proc.mk
 
 2) 컴파일한 실행 파일을 ~/bin/ 디렉토리에 복사하기 위해 
  $ make -f proc.mk install
 
 3) 컴파일 후 생성되는 오브젝트 파일과 c파일을 삭제하기 위해
  $ make -f proc.mk clean
  
-. SQLCA관련 변수들...
 -. sqlca.sqlerr[0] : fetch를 사용하여 쿼리된 레코드의 건수를 리컨시켜 주는 역할을 하는 
                      변수이다.
 -. sqlca.sqlwarn : 경고에 대한 정보들을 지니고 있는 변수이다.
 -. sqlca.sqlerrm.sqlerrmc : sql 명령수행중 에러가 발생했을때, 발생한 에러에 대한 내용과 오류 
                            코드번호에 관한 정보를 출력시켜 준다.
    ---------------------------------------
 -. sqlca.sqlcode값        내 용
    ---------------------------------------
    0  sql문이 정상적으로 수행
    
    1403  유일하게 양수값을 갖는 에러코드임.
      조건에 맞는 데이타가 하나도 없을때.
    
    -1405 조회된 값중 null값이 있을때
    ---------------------------------------


-. host변수 선언
 
 -. 호스트변수는 데이타베이스에서 데이타 처리 결과를 저장하기 위해 사용되며, 응용 프로그램내에서는 
    변수로서의 역할을 한다. 따라서 호스트 변수를 선언할 때에는 데이타베이스 내에서 사용되는 칼럼의
    데이타 타입과 그 크기를 고려하여 선언되어야 하며, 프리컴파일 과정을 통해 응용프로그램내에서도
    사용가능한 형태이어야 한다.
 ex)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar username[16], userarea[10];
  int usrno, usrage;
 EXEC SQL END DECLARE SECTION;    
 
 [주의] 
 1) 호스트 변수 선언시에 오라클 예약어를 사용하지 말것.
 2) 호스트 변수에서는 null처리를 해주지 않기 때문에 응용 프로그램에서 반드시 null처리를 해주어야 한다. 
    단, 호스트 변수가 숫자형인 경우에는 예외이다.
   
-. DB접속
 방법1>
 EXEC SQL CONNECT elfsun
  INDENTIFIED BY 1234;
  
 방법2>
 EXEC SQL BEGIN DECLARE SECTION;
  varchar userid[8], passwd[8];
 EXEC SQL END DECALRE SECTION;    
 
 strncpy(userid.arr,"elfsun",6);
 strncpy(passwd.arr,"1234",4);
 
 EXEC SQL CONNECT :userid;
  IDENTIFIED BY :passwd;
 
 -. 일반적으로 방법2를 더 선호함.
 -. 방법2를 쓸때에 변수명 앞에는 반드시 :를 붙여서 사용하고 있는 변수가 호스트 변수임을 
    명시해야 한다.
 
-. CURSOR이용 : 쿼리문으로 조회되는 레코드가 한 건 이상일때 사용함.

 형식> 
 1) EXEC SQL PREPARE statement FROM variable;  (쿼리하고자 하는 sql문장 정의)
 2) EXEC SQL DECLARE cursor_name CURSOR FOR statement; ( 사용할 커서 선언 )
 3) EXEC SQL OPEN cursor_name;   ( 선언한 커서 열기 )  
 4) EXEC SQL FETCH cursor_name INTO :host_variable1, :host_variable2, :host_variable3, ....;  
                                 ( 열어둔 커서 실행 )
 5) EXEC SQL CLOSE cursor_name;  ( 열었던 커서 닫음 )
 

 1) EXEC SQL PREPARE statement FROM variable;  (쿼리하고자 하는 sql문장 정의)
  ex)
  char SqlCmd[100];    (변수 SqlCmd를 선언)
  memset(SqlCmd,0x00,sizeof(SqlCmd));  ( memset함수를 이용하여 초기화 작업함)
  sprintf(SqlCmd,"SELECT usrno, usrname, usrarea FROM forumlist");  (쿼리문을 SqlCmd에 대입함)
  EXEC SQL PREPARE st_1 from :SqlCmd; (EXEC..문장을 이용하여 쿼리할 구조를 정의함)
 2) EXEC SQL DECLARE cursor_name CURSOR FOR statement; ( 사용할 커서 선언 )
  형식1>
  EXEC SQL DECLARE cursor_name CURSOR FOR statement;
  형식2>
  EXEC SQL DECLARE cursor_name CURSOR FOR select 문장;
  
  -. cursor_name : 사용할 커서명
  ex)
  EXEC SQL DECLARE CUR_1 CURSOR FOR ST_1; (ST_1은 PREPARE에서 정의한것과 동일해야 함)
  EXEC SQL DECLARE CUR_1 CURSOR FOR select usrno, username, userarea From forumlist;

 3) EXEC SQL OPEN cursor_name;   ( 선언한 커서 열기 ) 
  ex)
  EXEC SQL OPEN CUR_1;
  
 4) EXEC SQL FETCH cursor_name INTO :host_variable1, :host_variable2, :host_variable3, ....;  
                      ( 열어둔 커서 실행 )
  ex)
  EXEC SQL BEGIN DECLARE SECTION;
   varchar usrname[16], usrarea[10];
   int usrno;
  EXEC SQL END DECLARE SECTION;
   ......
   
  EXEC SQL FETCH CUR_1 INTO :usrno, :usrname, :userarea;
  
  -. 여기서 사용하는 조회된 칼럼들과 1대1로 대응되어야 한다.
  또한 사용될 호스트 변수들은 이미 이전에 선언이 되어 있어야만 사용이 가능하다. 
  칼럼의 데이타 타입과 크기가 일치해야함에도 주의.

 5) EXEC SQL CLOSE cursor_name;  ( 열었던 커서 닫음 )
  ex) 
  EXEC SQL CLOSE CUR_1;

-. 오류 처리
 1) whenever sqlerror 구문 
  형식)
  ① EXEC SQL WHENEVER SQLERROR GOTO stop_st;
  
  ② EXEC SQL WHENEVER SQLERROR GOTO STOP;
  
  ③ EXEC SQL WHENEVER SQLERROR GOTO CONTINUE;
   
  -. 위 문장들은 SQL문장의 수행 결과 리턴되는 sqlca.sqlcode의 값이 음수로서, 에러를 발생시키는 경우, 더이상
  프로그램을 진행시키지 않도록 stop_st루틴(①번에 해당)으로 분기하여 프로그램의 에러처리를 하도록 하는 문장임.
  stop_st대신 STOP나 CONTINUE를 쓰기도 한다.
  
  -. 또한 실행시켰던 SQL문장들이 레코드의 값 자체의 변경과 관련이 있는 문장들, 즉 INSERT, DELETE, UPDATE와 같은
  SQL문장들이었다면, 'EXEC SQL ROLLBACK WORK'명령을 이용하여 그 트렌잭션을 취소시키는 과정을 추가해 주어야 한다.
  
 2) whenever not found 구문
  형식)
  EXEC SQL WHENEVER NOT FOUND GOTO stop_st;
  
  EXEC SQL WHENEVER NOT FOUND STOP;
  
  EXEC SQL WHENEVER NOT FOUND CONTINUE;
  
  -. 위 문장들은 SQL문장 실행 결과 sqlca.sqlcode값이 1403으로 조건에 맞는 레코드 건수가 
     하나도 없는 경우이다.
  
-. ProC내에서의 select 문장
 ex1)
 -------------------------------------------------------------
 EXEC SQL BEGIN DECALRE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 
 EXEC SQL SELECT usrno, usrname, usrarea
  INTO : usro, :usrname, :usrarea
  FROM forumlist
  WHERE usrno=5;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 EXEC SQL COMMIT WORK;
 
 printf("\n 회원의 고유번호 =%d",usrno);
 printf("\n 회원의 이름  =%d",usrname.arr);
 printf("\n 회원의 이름(크기) =%d BYTE", usrname.len);
 printf("\n 회원의 거주지역 =%s", usrarea.arr);
 printf("\n 회원의 거주지역(크기) =%d BYTE", usrarea.len);
 
 stop_st :
 printf("\n 에러메시지 =%s", sqlca.sqlerrm.sqlerrmc);
 -------------------------------------------------------------
 -. into 구문은 쿼리 결과에 만족하는 데이타를 검색해 와서 into구문 뒤의 변수에 각각 할당한다.
 -. 호스트 변수명 앞에 (:)을 붙여 줌으로써 조회할 테이블이 칼럼명과 구분을 지어 준다.
 
 ex2)
 -------------------------------------------------------------
 EXEC SQL BEGIN DECALRE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
  char SqlCmdp100];
 EXEC SQL END DECLARE SECTION;
 
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(Sqlcmd,"select usrno, usrname, usrarea from forumlist");
 EXEC SQL PREPARE ST_1 FROM :SqlCmd;
 EXEC SQL DECLARE CUR_1 FOR ST_1;
 EXEC SQL OPEN CUR_1;
 EXEC SQL FETCH SUR_1 INTO :usrno, :usrname, :usrarea;
 if (sqlca.sqlcode < && sqlca.sqlcode != -1405)
 {
  printf("\n 에러메시지 = %s", sqlca.sqlerrm.sqlerrmc);
  printf("\n 레코드 조회시 에러 발생!");
  EXEC SQL CLOSE CUR_1;
  EXEC SQL ROLLBACK WORK;
  exit();
 } /* error */
 else if(sqlca.sqlcode == 1403)
 {
  printf("\n 에러메시지 ="%s", sqlca.sqlerrm.sqlerrmc);
  printf('\n 조건에 맞는 데이타가 없슴다!");
  EXEC SQL CLOSE CUR_1;
  EXEC SQL ROLLBACK WORK;
  exit();
 } /* not exist */
 while(sqlca.sqlcode ==0)
 {
  printf("\n 회원의 고유번호 =%d",usrno);
  printf("\n 회원의 이름  =%d",usrname.arr);
  printf("\n 회원의 이름(크기) =%d BYTE",usrname.len);
  printf("\n 회원의 거주지역 =%s", usrarea.arr);
  printf("\n 회원의 거주지역(크기) =%d BYTE", usrarea.len);
  EXEC SQL FETCH CUR_1 INTO :usrno, :usrname, :usrarea;
 } /* while */
 printf("\n 오라클 메시지 = %s",sqlca.sqlerrm.sqlerrmc);
 printf("\n 레코드가 성공적으로 조회되었습니다.");
 EXEC SQL CLOSE CUR_1;
 EXEC SQL COMMIT WORK;
 -------------------------------------------------------------
 
-. PROC속의 UPDATE문장
 -----------------------------------------------------------------------------
 ex1)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar username[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION; 
 
 EXEC SQL SELECT usrno, username, usrarea
  into :usrno, :usrname, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경전 회원[%d]번의 거주지역 =[%s]",usrno,usrarea.arr);
 EXEC SQL COMMIT WORK;
 strcpy(userarea.arr,"SEOUL");
 usrarea.len =5;
 
 EXEC SQL UPDATE FORUMLIST
  SET usrarea =:usrarea
  WHERE usrno =3;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 EXEC SQL COMMIT WORK;
 printf("\n 오라클 메시지 =%s",sqlca.sqlerrm.sqlerrmc);
 
 EXEC SQL SELECT usrno,usrarea
  INTO :usrno, :usrarea
  FROM forumlist
  WHERE usrno=3;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경후의 회원 [%d]번의 거주지역 =[%s]", usrno.usrarea.arr);
 EXEC SQL COMMIT WORK;
 exit();
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 에러발생 =%s",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 
 -----------------------------------------------------------------------------
 ex2) 
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrname[16], usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 
 EXEC SQL select usrno,username,usrarea
  into :usrno, :usrname, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경전의 [%d]번째 회원의 거주지역 =[%s]", usrno, usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"UPDATE FORUMLIST set usrarea=%s \ (한 문장이 끝나지 않았기 때문에 \(역슬래시)를
  사용함)
    where usrno=3","seoul");
 EXEC SQL EXCUTE IMMEDIATE :SqlCmd;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 EXEC SQL select usrno, usrarea
  into :usrno, :usrarea
  from forumlist
  where usrno=3;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 변경후의 [%d]번째 회원의 거주지역 =[%s]", usrno,usrarea.arr);
 EXEC SQL COMMIT WORK;
 exit();
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 에러 메시지 =%s", sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. 위의 update문을 약간 수정하면
  sprintf(SqlCmd,"update forumlist set userarea=%s where usrno=%d","seoul",3);로 해도 됨.

-. ProC속의 Insert문장
 -----------------------------------------------------------------------------
 ex1)
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrname[16], usrarea[10], usrkindcode[4];
  int usrno ;
 EXEC SQL END DECLARE SECTION;
 int tot;
 
 tot =0;
 usrno=10;
 strncpy(usrname.arr,"LEE-Y-S",Strlen("LEE-Y-S"));
 strncpy(usrarea.arr,"seoul",strlen("seoul"));
 strncpy(usrkindcode,"1004",strlen("1004"));
 
 EXEC SQL INSERT INTO FORUMLIST(usrno, usrname, usrarea, usrkindcode)
  values(:usrno, :usrname, :usrarea, :usrkindcode);
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 printf("\n insert success!!");
 printf("\n 오라클 메시지 = %s", sqlca.sqlerrm.sqlerrmc);
 
 EXEC SQL SELECT COUNT(*)
  INTO :TOT
  FROM FORUMLIST
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 =%d", tot);
 EXEC SQL COMMIT WORK;
 
 EXEC SQL SELECT usrno, usrarea
  INTO :usrno, :usrarea
  FROM FORUMLIST
  WHERE usrno=10;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n 추가된 회원 [%d]번의 거주지역 =[%s]", usrno, usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 stop_st;
 EXEC SQL ROLLBACK WORK;
 printf("\n 오라클 에러=%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 ex1은 insert문장에 함께 기술해 줄 호스트 변수들을 선언해 주었지만...
 ex2에서는 선언하지 않았다.
 ex2의 첨에 있는 usrarea는 그 다음에 수행할 select명령에 필요한 선언 문장이다.
 -----------------------------------------------------------------------------
 ex2)
 EXEC SQL BEGIN DECLEARE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 int tot;
 
 tot=0;
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"insert into forumlist(usrno, usrname, usrarea, \
   usrkindcode) values(%d, %s, %s, %s)", \
   10,"lee-k-y","seoul","1004");
 EXEC SQL EXECUTE IMMEDIATE :SqlCmd;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n Insert Success!");
 
 EXEC SQL SELECT count(*)
  into :tot;
  from forumlist
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 = %d",tot);
 EXEC SQL COMMIT WORK;
 
 EXEC SQL SELECT usrno, usrarea
  into :usrno, :usrarea
  from forumlist
  where usrno=10;
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 printf("\ 추가된 회원 [%d]번의 거주지역 =[%s]",usrarea.arr);
 EXEC SQL COMMIT WORK;
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n 오라클 에러 = %d", sqlca.sqlerrm,sqlerrmc);
 -----------------------------------------------------------------------------
-. Proc내에서의 delete문장.
 
 -----------------------------------------------------------------------------
 ex1) 
 EXEC SQL BEGIGN DECLRAE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 int tot;
 
 tot=0;
 EXEC SQL DELETE FORUMLIST WHERE USRNO=10;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 printf("\n Delete 문장 성공!!");
 
 EXEC SQL SELECT count(*)
  into :tot;
  from forumlist
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수 =%d",tot);
 EXEC SQL COMMIT WORK;
 
 stop_st:
 EXEC SQL ROLLBACK WORK;
 printf("\n Oracle Error =%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. 어떠한 호스트 변수도 사용하지 않음.
 
 -----------------------------------------------------------------------------
 ex2) 
 EXEC SQL BEGIN DECLARE SECTION;
  varchar usrarea[10];
  int usrno;
 EXEC SQL END DECLARE SECTION;
 char SqlCmd[100];
 int tot;
 tot=0;
 memset(SqlCmd,0x00,sizeof(SqlCmd));
 sprintf(SqlCmd,"Delete forumlist where usrno=%d",10);
 EXEC SQL EXCUTE IMMEDIATE :SqlCmd;
 
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 EXEC SQL COMMIT WORK;
 
 prinf("\n Delete Success!!");
 
 EXEC SQL SELECT COUNT(*)
  INTO :TOT;
  FROM FORUMLIST
 EXEC SQL WHENEVER SQLERROR GOTO stop_st;
 
 printf("\n forumlist 테이블에 존재하는 총 회원 수=%d",tot);
 EXEC SQL COMMIT WORK;
 
 stop_st;
 EXEC SQL ROLLBACK WORK;
 printf("\n Oracle Error : =%d",sqlca.sqlerrm.sqlerrmc);
 -----------------------------------------------------------------------------
 -. where절에서 회원의 고유번호값을 지정해주었다.는 점이 ex1과 다른점이다.
 -. delete 부분을 다음과 같이 수정해도 된다.
  usrnum=10;
  sqlprintf(SqlCmd,"delete forumlist where usrno=%d",usrnum);
  이처럼 변수를 먼저 선언해준 후 값을 대입해서 삭제 하는 방법도 있다.

-. 트랜잭션의 제어
 
 -. EXEC SQL COMMIT WORK;
     : DML 명령인 INSERT, DELETE ,UPDATE 문장을 수행한 경우에 유용하다.
     : DDL 명령은 자동 COMMIT 되므로 사용안해도 됨.
 
 -. EXEC SQL ROLLBACK WORK;    
     
-----------------------------------------------------------------------------------------------
? memset :

 

저작자 표시
신고

'Oracle > Object & Utility' 카테고리의 다른 글

Oracle - Listener_EM Console  (0) 15:05:15
Oracle - Pro*C  (0) 15:04:46
Oracle - Recovery - Point in Time  (0) 15:04:06
Oracle - Data를 Insert 문장으로 만들기  (0) 15:03:31
Oracle - Export Script  (0) 15:01:40
Oracle - Export  (0) 15:00:25
Posted by 농부지기

[ Oracle - Recovery - Point in Time ]

 

저작자 표시
신고

'Oracle > Object & Utility' 카테고리의 다른 글

 
Oracle 8i Point-in-Time Recovery는 Archive log mode인 경우 아래의 상황에서 적용할 수 있다.
 
1. 실수로 Table을 delete 혹은 drop 했을 때
2. Datafile Resize 실패로 인한 DB 장애 발생시
 
Delete, Drop, Datafile Resize 장애 시점: Wed Nov 19 15:19:39 2004
 
*Datafile Resize 장애의 예 
Wed Nov 19 15:19:39 2004
/* OracleOEM */ ALTER DATABASE DATAFILE 'D:\ORADATA\ORCL\KANG01.DBF' RESIZE  4096M 
Wed Nov 19 15:20:46 2004
Completed: /* OracleOEM */ ALTER DATABASE DATAFILE 'D:\ORADAT
Wed Nov 19 15:23:50 2004
KCF: write/open error block=0xabc36 omline=1
     file=7 D:\ORADATA\ORCL\KANG01.DBF
     error=27069 txt: 'OSD-04026: 부적당한 매개변수가 보내졌습니다 (OS 703542)'
Automatic datafile offline due to write error on
file 7: D:\ORADATA\ORCL\KANG01.DBF
 

다음의 시나리오는 Full backup(DB를 shutdown 상태에서 받은 Datafiles, Redo log files, controlfiles)이 존재하지 않고
Hot backup(datafile)만 존재하는 상황에서 복구하는 방법이다.

 
**********************  현재 DB에서 작업 **********************
0. DB에 접속한다.
C:\> svrmgrl
SVRMGR> connect internal
or
C:\> sqlplus internal
 
1. 현재 DB 모드가 Archive log mode인지 확인한다.
SVRMGR> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            D:\ORADATA\ARCHIVE
Oldest online log sequence     440
Next log sequence to archive   442
Current log sequence           442
 
2. 현재 controlfile을 trace로 생성한다.
SVRMGR> alter database backup controlfile to trace;
 
3. trace가 어느 경로에 생성 되는지 확인한다.
SVRMGR> show parameter user_dump_dest
 
4. 위에서 확인한 경로에서 가장 최근에 생성된 trc 파일을 열고 수정한다.
NORESETLOGS -> RESETLOGS로 변경(Hotbackup 받은 Datafile로 복구할때)

CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 254
    MAXINSTANCES 1
    MAXLOGHISTORY 678
LOGFILE
  GROUP 1 'D:\ORADATA\ORCL\REDO01.LOG' SIZE 10M reuse,     * --> reuse 추가
  GROUP 2 'D:\ORADATA\ORCL\REDO02.LOG' SIZE 10M reuse,     * --> reuse 추가
  GROUP 3 'D:\ORADATA\ORCL\REDO03.LOG' SIZE 10M reuse      * --> reuse 추가
DATAFILE
  'D:\ORADATA\ORCL\SYSTEM01.DBF',
  'D:\ORADATA\ORCL\RBS01.DBF',
  'D:\ORADATA\ORCL\KANG01.DBF',
  'D:\ORADATA\ORCL\USERS01.DBF',
  'D:\ORADATA\ORCL\TEMP01.DBF',
  'D:\ORADATA\ORCL\TOOLS01.DBF',
  'D:\ORADATA\ORCL\INDX01.DBF'
;
 
5. 현재 DB shutdown
SVRMGR> shutdown immediate
 
6. 현재 DB Cold Backup
장애가 발생한 현재 DB를 모두 백업
(D드라이브의 여유가 충분 하다면 D:\ORADATA 폴더 이름을 D:\ORADATA_20041119 로 변경함)
 
 
**********************  과거 DB에서 작업 **********************
7. 이전에 받은 Hot backup을 복원한다. (cold backup을 restore할 경우 controlfile 재생성은 skip한다.)
백업장치, 혹은 Disk에서 D:\ORADATA로 copy
 
8. DB에 접속한다.
C:\> svrmgrl
SVRMGR> connect internal
or
C:\> sqlplus internal
 
9. DB를 nomount 시킴
SVRMGR> startup nomount
 
10. Controlfile 재생성
SVRMGR>
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS ARCHIVELOG
    MAXLOGFILES 32
    MAXLOGMEMBERS 2
    MAXDATAFILES 254
    MAXINSTANCES 1
    MAXLOGHISTORY 678
LOGFILE
  GROUP 1 'D:\ORADATA\ORCL\REDO01.LOG' SIZE 10M reuse,
  GROUP 2 'D:\ORADATA\ORCL\REDO02.LOG' SIZE 10M reuse,
  GROUP 3 'D:\ORADATA\ORCL\REDO03.LOG' SIZE 10M reuse
DATAFILE
  'D:\ORADATA\ORCL\SYSTEM01.DBF',
  'D:\ORADATA\ORCL\RBS01.DBF',
  'D:\ORADATA\ORCL\KANG01.DBF',
  'D:\ORADATA\ORCL\USERS01.DBF',
  'D:\ORADATA\ORCL\TEMP01.DBF',
  'D:\ORADATA\ORCL\TOOLS01.DBF',
  'D:\ORADATA\ORCL\INDX01.DBF'
;
 
11. Point-in-Time Recovery 수행
SVRMGR> set autorecovery on
SVRMGR> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL TIME '2004-11-19:15:19:36';   --> 장애발생 이전 시점으로 복구한다.
...
SVRMGR> alter database open resetlogs;   --> recovery에서 until 옵션을 사용할 경우. 즉 Incomplete recovery시 resetlogs 옵션 사용한다.
 
12. 장애가 발생한 Tablespace에 포함된 table 혹은 drop,delete 작업을 수행한 table을 export함.
D:\> exp kang/kang file=kang.dmp log=kang_exp.log tables=emp,dept,bonus,dummy
 
13. export가 완료된 뒤 과거 DB shutdown하고 삭제
SVRMGR> shutdown abort
 
탐색기로 D:\ORADATA 하위 디렉토리 모두 삭제
 
14. 현재 DB 복원
D:\ORADATA_20041117 --> D:\ORADATA 로 폴더이름 변경
 
 
**********************  현재 DB에서 작업 **********************
15. 현재 DB mont
SVRMGR> startup mount
ORACLE instance started.
Total System Global Area                        653465628 bytes
Fixed Size                                          75804 bytes
Variable Size                                   337760256 bytes
Database Buffers                                314572800 bytes
Redo Buffers                                      1056768 bytes
Database mounted.
 
16. 장애가 발생한 Datafile 삭제 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> alter database datafile 'D:\ORADATA\ORCL\KANG01.DBF' offline drop;
Statement processed.
SVRMGR> alter database open;
Statement processed.
 
17. 장애가 발생한 Tablespace 삭제 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> drop tablespace KANG including contents;
Statement processed.
 
18. 같은 이름의 Tablespace 생성 (Tablespace에 장애가 발생한 경우만 진행한다.)
SVRMGR> create tablespace KANG datafile 'D:\ORADATA\ORCL\KANG01.DBF' size 3000m;
Statement processed.
 
19. 12번에서 생성된 OLD DB의 export파일을 이용하여 import 작업 수행
D:\>imp kang/kang file=kang.dmp fromuser=kang commit=y log=kang_imp.log
 
20. DATA 복원 완료.

Oracle - Listener_EM Console  (0) 15:05:15
Oracle - Pro*C  (0) 15:04:46
Oracle - Recovery - Point in Time  (0) 15:04:06
Oracle - Data를 Insert 문장으로 만들기  (0) 15:03:31
Oracle - Export Script  (0) 15:01:40
Oracle - Export  (0) 15:00:25
Posted by 농부지기
이전 1 2 3 4 5 ... 91 다음


티스토리 툴바