반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 테이블 복원


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원





4. Recycle Bin 에서 테이블 복원


FLASHBACK TABLE ~ TO BEFORE DROP 


위의 문법을 사용하여 Recycle Bin 에서 객체를 복구할 수 있습니다.


Recycle Bin에 있는 테이블이 이름이나 원래 테이블 이름을 지정할 수 있습니다.

선택적으로 RENAME TO 절을 사용하면 복구할 때 테이블의 이름을 변경하여 복구할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 에 있는 View 및 Query 에 표시된대로 DBA_RECYCLEBIN 또는 USER_RECYCLEBIN View 에서 가져올 수 있습니다.

FLASHBACK TABLE ... TO BEFORE DROP 문을 사용하려면 테이블을 삭제하는것과 동일한 권한이 필요합니다.



아래의 예제는 TB_USER_INFO 테이블을 지우고 새로운 이름으로 복원하는 방법에 대한 예시입니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP
   RENAME TO TB_USER_INFO2 ;


시스템에서 생성한 Recycle Bin 의 이름은 테이블을 여러번 삭제한 경우 매우 유용합니다.

예를 들어 Recycle Bin 에 TB_USER_INFO 테이블의 버전이 5가지가 있으며 4번째 버전을 복구하려고 한다고 가정합니다.

두개의 FLASHBACK TABLE 문을 실행하여 이 작업을 수행하거나 아래의 예제와 같이 휴지통을 Query 한 다음 

시스템에서 만든 이름으로 FLASHBACK 할 수 있습니다.

쿼리에 테이블 생성시간을 포함시키면 OBJECT NAME 을 확인 후 정확한 테이블을 복원할 수 있습니다.



SELECT OBJECT_NAME, ORIGINAL_NAME, CREATETIME FROM RECYCLEBIN ;


BIN$UofUBMjLnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:44:26
BIN$UofUBMjMnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:26
BIN$UofUBMjNnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:45:52
BIN$UofUBMjOnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:08
BIN$UofUBMjPnkDgUOABLqNFXg==$0    TB_USER_INFO    2017-06-22:15:46:17


FLASHBACK TABLE "BIN$UofUBMjOnkDgUOABLqNFXg==$0" TO BEFORE DROP;



Recycle Bin 에서 테이블을 복원할 때 인덱스와 같은 종속된 객체는 원래 이름으로 다시 가져오지 않습니다.

종속된 객체는 시스템에서 생성한 Recycle Bin 의 OBJECT_NAME 을 그대로 유지합니다.

원본 이름으로 복원하려면 종속된 객체의 이름을 수동으로 변경해야 합니다.

종속 객체의 원래 이름을 수동으로 복원하려면 테이블을 복원하기전에 각 종속 객체의 시스템에서 생성한 Recycle Bin 에서 ORIGINAL_NAME을 기록해두어야 합니다.



아래 예시는 TB_USER_INFO 에서 생성한 일부 인덱스의 이름을 원래 이름으로 복원하는 예입니다.

이 예에서는 SCOTT 사용자로 로그인 했다고 가정합니다.


1. 테이블 생성 후 테이블 삭제


CREATE TABLE TB_USER_INFO ( USER_NO VARCHAR2(10 BYTE)
                          , USER_NM VARCHAR2(50 BYTE)
                          , AGE NUMBER
                          , CONSTRAINT "PK_TB_USER_INFO" PRIMARY KEY ( USER_NO )
)
;

DROP TABLE TB_USER_INFO ; 



2. Recycle Bin 에서 복원하기 전에 아래의 쿼리를 실행합니다.


SELECT OBJECT_NAME, ORIGINAL_NAME, TYPE, CREATETIME FROM RECYCLEBIN
ORDER BY CREATETIME;

BIN$UofUBMjZnkDgUOABLqNFXg==$0   TB_USER_INFO      TABLE   2017-06-22:16:04:19
BIN$UofUBMjYnkDgUOABLqNFXg==$0   PK_TB_USER_INFO   INDEX   2017-06-22:16:04:19


3. 테이블을 복원합니다.


FLASHBACK TABLE TB_USER_INFO TO BEFORE DROP ;



4. 아래의 쿼리를 실행하여 TB_USER_INFO 의 인덱스가 시스템에서 생성한 Recycle Bin 에 이름이 있는지 확인합니다.


SELECT INDEX_NAME FROM USER_INDEXES WHERE TABLE_NAME = 'TB_USER_INFO';
BIN$UofUBMjYnkDgUOABLqNFXg==$0



5. 아래와 같이 인덱스의 원래 이름을 복원합니다.


ALTER INDEX "BIN$UofUBMjYnkDgUOABLqNFXg==$0" RENAME TO PK_TB_USER_INFO;


시스템에서 생성된 이름은 큰따옴표로 감싸줍니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에서 객체제거


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원






3. Recycle Bin 에서 객체제거


Recycle Bin 에서 객체를 복원하지 않고 Recycle Bin 의 객체를 제거하고 저장공간을 확보하려면 PURGE 문을 사용하면됩니다.

이 때 권한은 항목을 삭제하는 것과 동일한 권한이 필요합니다.



PURGE 문을 사용하여 테이블을 제거하면 Recycle Bin이나 테이블의 원래 이름에서 테이블을 알 수 있는 고유한 이름을 사용할 수 있습니다.

Recycle Bin 의 이름은 Recycle Bin 오브젝트에 있는 View 나 Query 에 표시된대로 DBA_RECYCLEBIN or USER_RECYCLEBIN View 에서 가져올 수 있습니다.


아래의 예시는 TB_USER_INFO 테이블을 Recycle Bin에 놓았을 때 BIN$Ulu8B5c+Oz3gUOABLqObkg==$0 의 이름으로 바뀝니다.


PURGE TABLE "BIN$Ulu8B5c+Oz3gUOABLqObkg==$0" ;


아래의 문장을 통해 동일한 결과를 얻을수 있습니다.

( 테이블이 DROP 되어 RECYCLEBIN 에 존재하는 경우 사용 가능합니다. )


PURGE TABLE TB_USER_INFO ;



테이블스페이스에 존재하는 모든 Recycle Bin 의 내용을 지우고 싶은 경우, 또는 지정한 사용자의 테이블스페이스의 객체에 있는 Recycle Bin의 내용을 제거할 수 있습니다.


PURGE TABLESPACE ts_01 ;
PURGE TABLESPACE ts_01 USER scott ;


사용자는 아래의 문장을 사용하여 자신이 가진 객체의 Recycle Bin 을 제거하고 여유공간을 확보할 수 있습니다.


PUREGE RECYCLEBIN ;


SYSDBA 권한이 있는 경우 PURGE RECYCLEBIN 대신 PURGE DBA_RECYCLEBIN 을 입력하면 전체 Recycle Bin 을 제거할 수 있습니다.


위에서는 테이블을 삭제하였는데 PURGE 문을 사용하면 Recycle Bin 에서 Index 를 제거하거나 지정된 테이블스페이스에 있는 모든 오브젝트를 Recycle Bin에서 제거할 수 있습니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 에 있는 객체 조회 및 쿼리방법



실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.



1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원






2. Recycle Bin 에 있는 객체 조회 및 쿼리방법


오라클 데이터베이스는 Recycle Bin 에 있는 오브젝트에 대한 정보를 얻는 2가지 View 를 제공합니다.


USER_RECYCLEBIN

 - 이 View 는 사용자가 자신의 삭제된 객체를 Recycle Bin에 표시하는데 사용할 수 있습니다.

   synonym 으로 RECYCLEBIN 을 사용할 수 있습니다.



DBA_RECYCLEBIN

 - 이 View 는 관리자에게 제공된 것으로 Recycle Bin 에 있는 모든 삭제된 객체를 볼 수 있습니다.



이러한 View 의 한가지 용도는 데이터베이스가 삭제된 객체에 할당한 이름을 식별한 것입니다.


아래 예시 참조


SELECT object_name
, original_name
FROM dba_recyclebin
WHERE owner = 'SCOTT'
;

         OBJECT_NAME                      ORIGINAL_NAME
------------------------------        -----------------------
BIN$Ulu8B5c+Oz3gUOABLqObkg==$0              EMPLOYEES




SQL Plus Command 인 SHOW RECYCLEBIN 을 사용하여 Recycle Bin 의 내용을 조회할 수 있습니다.



SQL> show recyclebin

ORIGINAL NAME             RECYCLEBIN NAME               OBJECT TYPE         DROP TIME
----------------    ------------------------------   ----------------  -------------------
EMPLOYEES          BIN$Ulu8B5c+Oz3gUOABLqObkg==$0         TABLE        2017-06-20:14:00:19





다른 객체를 쿼리할 수 있는것처럼 Recycle Bin 에 있는 객체를 쿼리할 수 있습니다.

그러나 Recycle Bin 에서 식별된대로 객체의 이름을 지정해야 합니다.



SELECT * FROM "BIN$Ulu8B5c+Oz3gUOABLqObkg==$0";



다음에는 Recycle Bin 에 있는 객체를 제거하는 방법에 대해 알아보겠습니다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 drop 된 테이블 복원 ( Flashback ) Recycle Bin 이란 무엇인가


실수로 삭제하지 않아야 할 테이블을 삭제했을 경우 당혹스러울 때가 있는데 오라클에서는 drop 된 테이블도 복원할 수 있는 기능이 있습니다.

바로 Flashback 이라는 기능인데 테이블을 drop 할 때 데이터베이스는 테이블과 연관된 공간을 바로 제거하지는 않습니다.

데이터베이스는 테이블의 이름을 변경하여 관련 오브젝트를 Recycle Bin에 넣습니다.


위에서 말한대로 사용자가 실수로 테이블을 drop 했을 때 복구할 수 있습니다.

이 기능을 Flashback Drop 이라고하며 FLASHBACK TABLE 문을 사용하여 테이블을 복원 가능합니다.

FLASHBACK TABLE 문을 사용하기 전에 Recycle Bin의 작동 방식과 관리방법을 이해하도록 하겠습니다.



FlashBack 에 대한 내용은 4가지 주제로 구성됩니다.


1. Recycle Bin 이란 무엇인가?

2. Recycle Bin 에 있는 객체 조회 및 쿼리방법

3. Recycle Bin 에 있는 객체 제거

4. Recycle Bin 에서 테이블 복원





1. Recycle Bin 이란 무엇인가?


Recycle Bin 은 실제로 삭제된 객체(Table, Index 등)의 정보가 들어있는 데이터 사전 테이블입니다.

삭제된 테이블 및 인덱스, PK 등 관련된 객체는 제거되지 않고 여전히 공간을 차지하고 있습니다.


Recycle Bin 에서 특별히 제거 될 때까지 또는 사용자가 테이블 스페이스 제한으로 인해 데이터베이스에서 제거할 때까지 사용자공간에 계속 쌓여있습니다.


각각의 사용자들은 자신의 Recycle Bin이 있는것으로 보면 됩니다.

사용자가 SYSDBA 권한이 없으면 사용자가 휴지통에 액세스 할 수 있는 객체는 자신이 소유한 객체에만 권한이 있습니다.

자신이 소유한 객체의 Recycle Bin 을 확인하는 방법은 아래 문법을 사용하면 됩니다.



SELECT * FROM RECYCLEBIN;



데이터를 포함하여 테이블스페이스를 삭제할 때, 테이블스페이스의 객체는 Recycle Bin에 저장되지 않으며 

데이터베이스는 테이블스페이스에있는 객체의 Recycle Bin에있는 항목을 제거합니다.


또한 데이터베이스는 데이터를 포함하지 않고 테이블스페이스를 삭제할 때 

테이블스페이스의 오브젝트에 대한 Recycle Bin 항목을 제거하고, 그렇지 않으면 테이블스페이스를 비워둡니다.


  • 사용자를 삭제하면 해당 사용자에 속한 모든 객체가 Recycle Bin 에 저장되지 않고 Recycle Bin의 모든 객체가 제거됩니다.
  • 클러스터를 삭제하면 멤버의 테이블이 Recycle Bin 에 저장되지 않고 Recycle Bin 의 이전 멤버 테이블이 제거됩니다.
  • type 을 삭제하면 하위타입과 같은 종속된 오브젝트가 Recycle Bin 에 배치되지 않고 Recycle Bin 에 있는 이전의 종속된 오브젝트가 제거됩니다.



Recycle Bin 에서의 이름생성 규칙


삭제된 테이블을 Recycle Bin으로 이동하면 테이블과 관련 개체의 이름은 시스템이 생성하게 됩니다.

여러 테이블의 이름이 같을 경우 이름이 충돌되는 내용이 발생할 수 있습니다.

위와 같은 상황은 아래와 같을 때 발생할 수 있습니다.


  • 사용자가 테이블을 삭제하고 같은 이름으로 다시 생성한 후 다시 삭제한 경우
  • 두명의 사용자가 같은 이름의 테이블을 가지고 있을 때 두 사용자가 테이블을 삭제한 경우


Recycle Bin 의 이름변경규칙은 다음과 같습니다.


    BIN$unique_id$version


이름작성규칙

  • unique_id 는 Recycle Bin 의 전역적으로 unique한 26자의 식별자로, 모든 데이터베이스에서 unique 한 Recycle Bin 의 이름으로 만듭니다.
  • version 은 데이터베이스에 의해 할당된 버전의 번호입니다.




Recycle Bin 활성화 및 비활성화



Recycle Bin 초기화 파라메터를 사용하여 Recycle Bin을 활성화 시키거나 비활성화 시키도록 설정할 수 있습니다.


Recycle Bin이 활성화되는 경우

 - 삭제된 테이블과 관계된 객체들은 Recycle Bin에 저장됩니다.


Recycle Bin이 비활성화되는 경우

 - 삭제된 테이블과 관계된 객체들은 Recycle Bin에 저장되지 않습니다.

   단순히 Drop 된 테이블이기 때문에 다른수단을 사용하여 복구해야 합니다.

   ( ex : 기존에 백업해놓은 곳에서 복구 )

   



Recycle Bin 의 Default 값은 활성화로 되어있습니다.


Recycle Bin 비활성화 하는 방법

( 아래문장 중 하나를 실행하시면 됩니다. )

ALTER SESSION SET recyclebin = OFF;
ALTER SYSTEM  SET recyclebin = OFF;


Recycle Bin 활성화 하는 방법

( 아래문장 중 하나를 실행하시면 됩니다. )

ALTER SESSION SET recyclebin = ON;
ALTER SYSTEM  SET recyclebin = ON;


ALTER SYSTEM 또는 ALTER SESSION 으로 Recycle Bin 을 활성화 및 비활성화하면 즉시 적용됩니다.

Recycle Bin 을 비활성화해도 이미 Recycle Bin 에 있는 객체가 제거되거나 영향을 미치지 않습니다.


다른 초기화 파라메터와 마찬가지로 텍스트 초기화 파일인 initSID.ora 에서 recyclebin 의 파라메터 초기값을 설정할 수 있습니다.


recyclebin=on
recyclebin=off



이상으로 Recycle Bin 에 대해 알아보았습니다.

다음에 뒷 부분에 대해서 포스팅하도록 하겠습니다.



반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 SQL 튜닝 by Nested Loops Join



오라클의 조인은 크게 조인방식과 조인형식으로 나누어집니다.



조인 방식

  • 중첩 루프 조인 ( Nested Loops Join )
  • 소트 머지 조인 ( Sort Merge Join )
  • 해쉬 조인 ( Hash Join )



조인 형식


  • 기본 조인
  • 아우터 조인
  • 세미 조인
  • 카테시안 조인
  • 부정 조인



여기서 얘기해 볼 내용은 실행계획을 볼 때 많이 보이는 Nested Loops Join 에 대해서 얘기해보려고 합니다.


일단 실행계획을 알아보기 전에 먼저 알아야 할 부분은 Driving 테이블과 Inner 테이블이 어떤 테이블인지 알아야합니다.


Driving 테이블 : 2개 테이블 중 Join 을 실행 시 먼저 Access 하는 테이블

Inner 테이블    : 2개 테이블 중 Join 을 실행 시 나중에 Access 하는 테이블


2개의 테이블을 예시로 들었지만 3개, 4개, 그 이상의 테이블을 조인시에도 먼저 Access 되는 테이블은 Driving 테이블 나중에 Access 되는 테이블은 Inner 테이블이 됩니다.

( 아무리 테이블이 많이 조인되어도 하나씩 풀어보면 2개의 테이블간 조인이 이루어지기 때문입니다. )




Nested Loops Join 의 수행방식을 알아보겠습니다.



SELECT DEPT_NM
     , EMP_NM
     , SALARY
  FROM EMP T1
 INNER JOIN DEPT T2
 WHERE T1.SALARY >= 100000
   AND T2.LOC = 'SEOUL'



Index 생성 내역

DEPT 테이블 : CREATE INDEX IX_DEPT ON DEPT ( LOC )
EMP 테이블 : CREATE INDEX IX_EMP ON EMP ( DEPT_NO )



1. Driving 테이블의 Index Scan 후 테이블 엑세스

    Driving 테이블이 DEPT 테이블로 선정이 되었다면 인덱스 스캔이 이루어져 LOC 이 SEOUL 인 항목의 값을 INDEX 에서 값을 엑세스합니다.

    그 후 엑세스 된 ROWID 값을 받아서 DEPT 테이블의 ROWID 값으로 DEPT_NO 값을 찾게됩니다.


2. INNER 테이블인 EMP 테이블의 IX_EMP 인덱스 스캔

    1에서 찾은 DEPT_NO 의 값을 찾아서 EMP 테이블의 IX_EMP 인덱스를 엑세스하여 DEPT_NO 의 값을 찾습니다.

    Driving 테이블과 마찬가지로 DEPT_NO 에 해당하는 ROWID 를 찾게됩니다.

 


3. EMP 테이블 스캔

    2에서 찾은 IX_EMP 인덱스의 ROWID 의 값으로 EMP 테이블의 DEPT_NO 를 랜덤엑세스합니다.


4. EMP 테이블의 조건 수행

    3 에서 추출된 데이터를 대상으로 EMP 테이블의 조건절에 해당하는 SALARY >= 100000 인 데이터를 확인하여 추출합니다.


5. 반복 수행

    1~4단계에 해당하는 과정을 반복수행하여 LOC = 'SEOUL' 인 데이터가 없을 때까지 반복 수행합니다.



이런 경우 실행계획은 아래와 같이 이루어집니다.


NESTED LOOPS
    TABLE ACCESS ( BY INDEX ROWID) OF 'DEPT' (TABLE)
          INDEX ( RANGE SCAN ) OF 'IX_DEPT' (INDEX)
    TABLE ACCESS ( BY INDEX ROWID) OF 'EMP' (TABLE)
          INDEX ( RANGE SCAN ) OF 'IX_EMP' (INDEX)


이렇게 실행계획이 나오면 NESTED LOOPS 밑에서 첫번째 나오는 테이블이 DRIVING 테이블, 두번째 나오는 테이블이 INNER 테이블이 됩니다.






반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

오라클 테이블 생성 ( not null enable )




테이블 생성 시 not null enable 이라고 되어 있는것이 있다.

not null 이면 not null 이지 enable 은 뭔가?


아래 예제를 살펴보자



SQL> CREATE TABLE T1 (USER_NO VARCHAR2(14 BYTE) not null enable);

Table created.

SQL> CREATE TABLE T2 (USER_NO VARCHAR2(14 BYTE) not null disable);

Table created.

SQL> select table_name, constraint_name, constraint_type, status
  2  from user_constraints;

TABLE_NAME                     CONSTRAINT_NAME                C STATUS
------------------------------ ------------------------------ - --------
T1                             SYS_C007492                    C ENABLED
T2                             SYS_C007493                    C DISABLED

SQL> insert into T1 (USER_NO) values (null);
insert into T1 (USER_NO) values (null)
*
ERROR at line 1:
ORA-01400: cannot insert NULL into ("SCOTT"."T1"."USER_NO")
        ( NULL 을 삽입할 수 없습니다. )


SQL> insert into T2 (USER_NO) values (null);

1 row created.

SQL> commit;

Commit complete.






NOT NULL ENABLE : NULL 값 입력 불가

NOT NULL DISABLE : NULL 값 입력 가능


결국 NOT NULL 만 써도 ENABLE 은 기본값인 것을 알 수 있다.





반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

테이블 logging 옵션 10초만에 변경!



테이블이 매일 TRUNCATE 후 INSERT 되는데 INSERT 할 때 굳이 Redo LOG 를 쌓아야 하나 의문이 들었다.


Redo 로그를 쌓는다는 것은 I/O 가 발생하게 된다는 건데 DB 는 I/O 가 발생하게 되면 그만큼 속도가 느려지게 된다.


Redo 로그를 그럼 안쌓기 위한 방법은??


바로 테이블에 NOLOGGING 옵션을 부여하면 됩니다.


이미 생성된 테이블은 어떻게 하나?


ALTER TABLE EMP NOLOGGING ;


위와 같은 설정을 하면 Redo LOG 가 남지 않고 INSERT 를 할 수 있게 됩니다.


또 다른 방법으로는 /*+ APPEND */ 힌트를 주어서 INSERT 하면 Redo LOG 를 남기지 않아요! 



INSERT /*+ APPEND */INTO EMP
SELECT * FROM EMP_TEST;


조금이라도 속도를 높여봅시다!

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

DBA_HIST 를 활용하여 설정분석


DBA_HIST 테이블을 활용하면 DB에 남은 로그를 분석할 수 있다.


내가 주로 사용하는 것은 DBA_HIST_ACTIVE_SESS_HISTORY 테이블인데 

말그대로 ACTIVE SESSION HISTORY 를 보여준다.


사용용도는 이 테이블에서 SQL_ID 로 SQLTEXT 를 찾을 수 있다.


DBA_HIST_TEXT 테이블을 찾아보면 DB 에서 실행된 SQL 문을 확인 할 수 있다.


그 외 DBA_HIST 관련 테이블은 아래 리스트에서 확인 가능하다.



TABLE_NAME

COMMENTS

DBA_HIST_DATABASE_INSTANCE

Database Instance Information

DBA_HIST_SNAPSHOT

Snapshot Information

DBA_HIST_SNAP_ERROR

Snapshot Error Information

DBA_HIST_BASELINE

Baseline Metadata Information

DBA_HIST_WR_CONTROL

Workload Repository Control Information

DBA_HIST_DATAFILE

Names of Datafiles

DBA_HIST_FILESTATXS

Datafile Historical Statistics Information

DBA_HIST_TEMPFILE

Names of Temporary Datafiles

DBA_HIST_TEMPSTATXS

Temporary Datafile Historical Statistics Information

DBA_HIST_COMP_IOSTAT

I/O stats aggregated on component level

DBA_HIST_SQLSTAT

SQL Historical Statistics Information

DBA_HIST_SQLTEXT

SQL Text

DBA_HIST_SQL_SUMMARY

Summary of SQL Statistics

DBA_HIST_SQL_PLAN

SQL Plan Information

DBA_HIST_SQL_BIND_METADATA

SQL Bind Metadata Information

DBA_HIST_SQLBIND

SQL Bind Information

DBA_HIST_OPTIMIZER_ENV

Optimizer Environment Information

DBA_HIST_EVENT_NAME

Event Names

DBA_HIST_SYSTEM_EVENT

System Event Historical Statistics Information

DBA_HIST_BG_EVENT_SUMMARY

Summary of Background Event Historical Statistics Information

DBA_HIST_WAITSTAT

Wait Historical Statistics Information

DBA_HIST_ENQUEUE_STAT

Enqueue Historical Statistics Information

DBA_HIST_LATCH_NAME

Latch Names

DBA_HIST_LATCH

Latch Historical Statistics Information

DBA_HIST_LATCH_CHILDREN

Latch Children Historical Statistics Information

DBA_HIST_LATCH_PARENT

Latch Parent Historical Historical Statistics Information

DBA_HIST_LATCH_MISSES_SUMMARY

Latch Misses Summary Historical Statistics Information

DBA_HIST_LIBRARYCACHE

Library Cache Historical Statistics Information

DBA_HIST_DB_CACHE_ADVICE

DB Cache Advice History Information

DBA_HIST_BUFFER_POOL_STAT

Buffer Pool Historical Statistics Information

DBA_HIST_ROWCACHE_SUMMARY

Row Cache Historical Statistics Information Summary

DBA_HIST_SGA

SGA Historical Statistics Information

DBA_HIST_SGASTAT

SGA Pool Historical Statistics Information

DBA_HIST_PGASTAT

PGA Historical Statistics Information

DBA_HIST_PROCESS_MEM_SUMMARY

Process Memory Historical Summary Information

DBA_HIST_RESOURCE_LIMIT

Resource Limit Historical Statistics Information

DBA_HIST_SHARED_POOL_ADVICE

Shared Pool Advice History

DBA_HIST_STREAMS_POOL_ADVICE

Streams Pool Advice History

DBA_HIST_SQL_WORKAREA_HSTGRM

SQL Workarea Histogram History

DBA_HIST_PGA_TARGET_ADVICE

PGA Target Advice History

DBA_HIST_SGA_TARGET_ADVICE

SGA Target Advice History

DBA_HIST_INSTANCE_RECOVERY

Instance Recovery Historical Statistics Information

DBA_HIST_JAVA_POOL_ADVICE

Java Pool Advice History

DBA_HIST_THREAD

Thread Historical Statistics Information

DBA_HIST_STAT_NAME

Statistic Names

DBA_HIST_SYSSTAT

System Historical Statistics Information

DBA_HIST_SYS_TIME_MODEL

System Time Model Historical Statistics Information

DBA_HIST_OSSTAT_NAME

Operating System Statistic Names

DBA_HIST_OSSTAT

Operating System Historical Statistics Information

DBA_HIST_PARAMETER_NAME

Parameter Names

DBA_HIST_PARAMETER

Parameter Historical Statistics Information

DBA_HIST_UNDOSTAT

Undo Historical Statistics Information

DBA_HIST_SEG_STAT

 Historical Statistics Information

DBA_HIST_SEG_STAT_OBJ

Segment Names

DBA_HIST_METRIC_NAME

Segment Names

DBA_HIST_SYSMETRIC_HISTORY

System Metrics History

DBA_HIST_SYSMETRIC_SUMMARY

System Metrics History

DBA_HIST_SESSMETRIC_HISTORY

System Metrics History

DBA_HIST_FILEMETRIC_HISTORY

File Metrics History

DBA_HIST_WAITCLASSMET_HISTORY

Wait Class Metric History

DBA_HIST_DLM_MISC

Distributed Lock Manager Miscellaneous Historical Statistics Information

DBA_HIST_CR_BLOCK_SERVER

Consistent Read Block Server Historical Statistics

DBA_HIST_CURRENT_BLOCK_SERVER

Current Block Server Historical Statistics

DBA_HIST_INST_CACHE_TRANSFER

Instance Cache Transfer Historical Statistics

DBA_HIST_ACTIVE_SESS_HISTORY

Active Session Historical Statistics Information

DBA_HIST_TABLESPACE_STAT

Tablespace Historical Statistics Information

DBA_HIST_LOG

Log Historical Statistics Information

DBA_HIST_MTTR_TARGET_ADVICE

Mean-Time-To-Recover Target Advice History

DBA_HIST_TBSPC_SPACE_USAGE

Tablespace Usage Historical Statistics Information

DBA_HIST_SERVICE_NAME

Service Names

DBA_HIST_SERVICE_STAT

Historical Service Statistics

DBA_HIST_SERVICE_WAIT_CLASS

Historical Service Wait Class Statistics

DBA_HIST_SESS_TIME_STATS

CPU and I/O time for interesting (STREAMS) sessions

DBA_HIST_STREAMS_CAPTURE

STREAMS Capture Historical Statistics Information

DBA_HIST_STREAMS_APPLY_SUM

STREAMS Apply Historical Statistics Information

DBA_HIST_BUFFERED_QUEUES

STREAMS Buffered Queues Historical Statistics Information

DBA_HIST_BUFFERED_SUBSCRIBERS

STREAMS Buffered Queue Subscribers Historical Statistics Information

DBA_HIST_RULE_SET

Rule sets historical statistics information

DBA_HISTOGRAMS

Synonym for DBA_TAB_HISTOGRAMS

[출처] DBA_HIST 시리즈|작성자 시와처


반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

tnsnames.ora 파일 어디에 있을까!


모 회사에 입사한 지 얼마 안된 신입사원.

DB 접속정보가 들어있는 파일을 사수에게 받았는데 tnsnames.ora 파일을 어디에 복사해야 할까요?


[보기]

1. 오라클 클라이언트 설치 폴더

2. 토드 설치 폴더 ( SQL Developer 등 DBMS 접속할 수 있는 제품의 설치 폴더 )


정답은?


.

.

.

.

.

.

.

.

.

.

.

.

.

.

.

.


1,2 번 둘 다 맞습니다!


왜냐하면, 접속하려는 DBMS 를 접속할 수 있는 제품에서 tnsnames.ora 파일이 어디에 있는지 설정하면 되니깐요~


각 제품별로 tnsnames.ora 파일이 어디에 있는지 알려주기만 하면 등록된 DB 접속정보를 불러올 수 있습니다!


( 일반적인 위치는 오라클 클라이언트가 설치된 $ORACLE_HOME\network\admin\tnsnames.ora 여기에 담아둡니다~ )


그럼 정말 tnsnames.ora 파일의 위치만 알려주면 각 제품들이 잘 찾아가는지 경로가 다른 2개의 파일을 가지고 확인해 보겠습니다.



1. 오라클 설치폴더\tnsnames.ora ( HELLO_ORACLE )

2. C:\tnsnams.ora ( TIGER )











1. 토드 tnsnames.ora


토드는 일단 제품 내에서 설정하는 것이 아니라 내 컴퓨터의 환경변수에서 설정을 해주어야 합니다.


1. 내 컴퓨터에서 마우스 우클릭 > 속성

2. 고급시스템 설정 클릭

3. 고급탭 > 환경변수 클릭

4. 시스템변수 등록 ( 새로 만들기 클릭해서 작성해주시면 됩니다. )

   변수 이름 : TNS_ADMIN

   변수 값   : tnsnames.ora 파일이 있는 위치

               ( 저의 경우 오라클 클라이언트가 설치된 폴더입니다.  

                  - C:\오라클설치폴더\client_1\network\admin  )




일단 1번 폴더에 위치한 tnsnames.ora 파일을 설정한 결과입니다.








아래는 2번 폴더에서 위치한 설정값으로 확인한 결과입니다.









위에서 문제 낸 것과 같이 내가 가진 tnsnames.ora 파일이 어디에 있느냐는 본인이 설정한 내용을 정직하게 따라가는 것을 확인할 수 있습니다.



2. SQL Developer tnsnames.ora


이번에는 무료툴인 SQL Developer 에서는 어디에서 설정하는지 확인해보겠습니다.


1. 메뉴바 > 도구 > 환경설정





2. 데이터베이스 > 고급 > Tnsnames 디렉토리 설정




3. 새로 만들기 > 접속 유형 TNS > 네트워크 별칭에서 선택





SQL Developer 는 제품 내 환경설정에서 바꾸면 됩니다!




3. PLSQL Developer tnsnames.ora


마지막으로 비슷한 제품인 PLSQL Developer 입니다.



1. Help > About 





2. i 아이콘 클릭




3. TNS File 에 파일이 존재하는 위치 설정




4. Logon 시 Database 선택박스에서 tnsnames.ora 에 등록된 이름을 찾을 수 있습니다.






다른 제품은 추후 사용하게 되는대로 tnsnames.ora 파일을 설정하는 곳을 찾아서 추가하도록 하겠습니다.


궁금한 내용 있으면 댓글 달아주세요~


감사합니다. ^^


반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형

 

 

오라클 테이블 권한 부여 ( GRANT/REVOKE )

 

테이블 소유자가 테이블에 권한을 가지지 않은 다른 사용자에게 권한을 부여할 때 필요합니다.

 


권한부여방법

 

GRANT SELECT ON [TABLE NAME] TO [USER];
GRANT INSERT ON [TABLE NAME] TO [USER];
GRANT DELETE ON [TABLE NAME] TO [USER];
GRANT UPDATE ON [TABLE NAME] TO [USER];

-- 또는
GRANT SELECT, INSERT, DELETE, UPDATE ON [TABLE NAME] TO [USER] ;


 

예를 들면 매출정보를 다른 계열사에서 조회할 필요가 있을 때 DB 를 접근할 수 있는 권한을 줘야 하는데, 내 계정을 알려주면 모든 테이블을 조회할 수 있으니 신규사용자를 등록하여 특정 테이블만 조회할 수 있는 권한을 부여하여 다른 테이블의 접근을 제어할 수 있습니다.

 

이런경우 내 데이터에 변경이 일어나면 안되므로, SELECT 권한만 부여하면 됩니다.

 

GRANT 명령 실행 시 바로 적용되므로, COMMIT 이나 ROLLBACK 이 되지 않습니다.

 

그럼 반대로 부여한 권한을 회수하려면 어떻게 해야 할까요?

 

바로, REVOKE 명령어를 사용하면 됩니다.

 

 

권한부여취소

 

REVOKE SELECT ON [TABLE NAME] FROM [USER];
REVOKE INSERT ON [TABLE NAME] FROM [USER];
REVOKE DELETE ON [TABLE NAME] FROM [USER];
REVOKE UPDATE ON [TABLE NAME] FROM [USER];

-- 또는
REVOKE SELECT, INSERT, DELETE, UPDATE ON [TABLE NAME] FROM [USER] ;


 

이렇게 테이블에 권한을 부여하고 회수하는 방법을 알아봤습니다.

 

읽어주셔서 감사합니다.

반응형
블로그 이미지

나남나여

일상 제품리뷰와 맛집/여행/사진을 좋아하고 IT 관련 프로그래밍 초급 & 고급 정보를 공유하는 블로그

,
반응형