블로그 이미지
redkite

카테고리

분류 전체보기 (291)
00.SI프로젝트 산출물 (0)
00.센터 운영 문서 (0)
01.DBMS ============.. (0)
01.오라클 (117)
001.DB 관리 (19)
002.DB 마이그레이션 (8)
003.DB 백업 및 복구 (20)
004.DB 보안 (8)
005.DB 설치 (7)
006.DB 스크립트 (0)
007.DB Knowledge Bas.. (38)
008.DB 통계 및 공간 관리 (3)
009.DB Trouble Shoot.. (14)
010.교육자료 (0)
999.테스트 (0)
01.MS-SQL (15)
01.MySQL (30)
01.PostgreSql (0)
01.DB튜닝 (28)
====================.. (0)
02.SERVER ==========.. (0)
02.서버-공통 (11)
02.서버-Linux (58)
02.서버-Unix (12)
02.서버-Windows (2)
====================.. (0)
03.APPLICATION =====.. (11)
====================.. (0)
04.ETC =============.. (0)
04.보안 (5)
====================.. (0)
05.개인자료 (1)
06.캠핑관련 (0)
07.OA관련 (1)
Total
Today
Yesterday

달력

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

공지사항

최근에 올라온 글

테이블에 걸려있는 제약 조건의 확인

  - USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.

  - USER_CONSTRAINTS : 유저가 소유한 모든 제약 조건을 불 수 있다.

SQL> SELECT SUBSTR(A.COLUMN_NAME,1,15) COLUMN_NAME,
            DECODE(B.CONSTRAINT_TYPE, 
                  'P','PRIMARY KEY',
                  'U','UNIQUE KEY',
                  'C','CHECK OR NOT NULL',
                  'R','FOREIGN KEY') CONSTRAINT_TYPE,
            A.CONSTRAINT_NAME CONSTRAINT_NAME
     FROM USER_CONS_COLUMNS A,  USER_CONSTRAINTS B   
     WHERE A.TABLE_NAME = UPPER('&table_name')   
       AND A.TABLE_NAME = B.TABLE_NAME   
       AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME   
     ORDER BY 1;   

-- 테이블 명을 입력 하면 된다. 
table_name의 값을 입력하십시오: emp2
 
 
테이블의 특정 컬럼에 걸려있는 제약 조건의 확인

USER_CONS_COLUMNS : 컬럼에 할당된 제약 조건을 볼 수 있다.

 
SQL> SET LINESIZE 300

SQL> SELECT SUBSTR(TABLE_NAME,1,15) TABLE_NAMES,   
            SUBSTR(COLUMN_NAME,1,15) COLUMN_NAME,   
            SUBSTR(CONSTRAINT_NAME,1,25) CONSTRAINT_NAME   
     FROM USER_CONS_COLUMNS   
     WHERE TABLE_NAME = UPPER('&table_name')   
       AND COLUMN_NAME = UPPER('&column_name');   

table_name의 값을 입력하십시오: emp2
column_name의 값을 입력하십시오: empno
Posted by redkite
, |

As the listener.log file grows, the DBA will want to either remove or rename this log file. If you have ever tried to remove or rename the listener.log file on Windows while the TNS listener process was running you will quickly notice that Windows holds a lock on this file and returns an error: 

C:\> del C:\oracle\ora92\network\log\listener.log 
C:\oracle\ora92\network\log\listener.log 
The process cannot access the file because it is being used by another process.Most DBAs simply stop the TNS listener process, rename (or remove) the file, then restart the TNS listener process. This can, however, cause potention connection errors for users that are attempting to connect while the listener process is down. 
Even under UNIX, problems exist when attempting to rename the listener.log file while the TNS listener process is running. Just like under Windows, the Oracle TNS listener process holds an open handle to the file. Under UNIX, you CAN remove the file, but Oracle will not re-create the file when it attempts to write to it again. The TNS listener will need to be stopped and restarted in order for it to create the new listener.log file. 

Well, here is a solution for renaming (or removing) the listener.log file without having to stop and start the TNS listener process under either Windows or UNIX: 


Windows 
C:\> cd \oracle\ora92\network\log 
C:\oracle\ora92\network\log> lsnrctl set log_status off 
C:\oracle\ora92\network\log> rename listener.log listener.old 
C:\oracle\ora92\network\log> lsnrctl set log_status on 



UNIX 
% cd /u01/app/oracle/product/9.2.0/network/log 
% lsnrctl set log_status off 
% mv listener.log listener.old 
% lsnrctl set log_status on

Posted by redkite
, |
GETTING IP ADDRESS OF ORACLE CLIENT 
=================================== 

PURPOSE 
------- 
Oracle의 SQL을 이용하여 
client host의 IP address를 알아내는 방법을 안내합니다. 

Explanation 
----------- 

Programmer 고객들로부터 가장 자주 문의되는 것 중에 하나가 
source code에서 client host의 IP address를 알아내는 것입니다. 

그런데, Oracle software에서는 Oracle Server 8.1.x, 
즉 Oracle Server 8i부터 가능합니다. 

Oracle 8까지는 Oracle Server나 Net8를 통하여 
IP를 알아내는 것이 불가능하기 때문에 
Oracle 외적인 방법(Network programming)을 구하시는 등 
Oracle과 관련이 없는 방법을 찾아야 하였으나 
8i부터는 sys_context function으로 가능하여 졌습니다. 

SQL> select sys_context('USERENV', 'IP_ADDRESS') as ip from dual; 

sys_context function에 대한 모든 설명은 
각 Oracle Server Release 별 SQL Reference를 보시기 바라며 
여기서는 예를 들기위해 sample source code를 하나 작성하여 보았습니다. 

주의: 
sample source code는 고객의 편의를 위해 교육용 목적으로 작성된 것으로 
여기에 담겨진 개념을 실제 적용하고자 할 때 고객의 면밀한 검토가 필요하며 
sample source code의 관한 문의나 그 사용 등에 대해서는 
지원이 되지 않습니다. 


Example 
------- 

다음의 sample source code에 있는 trigger는 system user로 compile되며 
그 후 각 user가 database에 logon/logoff할 때 
특정 directory/file에 시각, client IP, oracle username, logon/off를 
기록하여 줍니다. 

prompt$ su - [oracle user] 
prompt$ vi $ORACLE_HOME/dbs/init$ORACLE_SID.ora 
또는 
prompt$ vi $ORACLE_BASE/admin/$ORACLE_SID/pfile/init$ORACLE_SID.ora 
... 
# utl_file_dir parameter에 Oracle server가 write permission이 있는 
directory를 설정 
utl_file_dir=/tmp 
:wq 
# instance를 restart 
prompt$ svrmgrl 
SVRMGR> connect internal 
SVRMGR> shutdown 
SVRMGR> startup 
SVRMGR> exit 
# trigger 작성 
prompt$ cd $HOME 
prompt$ vi logonoff_trig.sql 
create or replace trigger logon_trigger after logon on database 
declare 
hFile utl_file.file_type; 
begin 
hFile := utl_file.fopen('/tmp', 'connection.log', 'a'); 
utl_file.putf(hFile, '%s %s %s LOGON', to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), sys_context('USERENV', 'IP_ADDRESS'), sys_context('USERENV', 'SESSION_USER')); 
utl_file.fclose(hFile); 
exception 
when others then 
if utl_file.is_open(hFile) then 
utl_file.fclose(hFile); 
end if; 
end; 

show errors 

create or replace trigger logout_trigger before logoff on database 
declare 
hFile utl_file.file_type; 
begin 
hFile := utl_file.fopen('/tmp', 'connection.log', 'a'); 
utl_file.putf(hFile, '%s %s %s LOGOFF', to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS'), sys_context('USERENV', 'IP_ADDRESS'), sys_context('USERENV', 'SESSION_USER')); 
utl_file.fclose(hFile); 
exception 
when others then 
if utl_file.is_open(hFile) then 
utl_file.fclose(hFile); 
end if; 
end; 

show errors 
:wq 
prompt$ sqlplus system/manager 
SQL> @logonoff_trig 
SQL> exit 
prompt$ sqlplus system/manager 
SQL> exit 
prompt$ sqlplus username/password 
SQL> exit 
prompt$ cat /tmp/connection.log 
2002-04-02 20:29:39 152.69.41.15 SYSTEM LOGOFF 
2002-04-02 20:29:58 152.69.41.15 SYSTEM LOGON 
2002-04-02 20:29:59 152.69.41.15 SYSTEM LOGOFF 
2002-04-02 20:29:58 152.69.41.15 USERNAME LOGON 
2002-04-02 20:29:59 152.69.41.15 USERNAME LOGOFF 


Reference Documents 
------------------- 
Oracle Server Documentation 
SQL Reference


Posted by redkite
, |

테이블설계시고려해야할점을오라클기준으로나열해봤습니다. 

1.코드성필드는문자열타입으로정의하는게좋습니다.(CHAR,VARCHAR2) 

2.문자열타입인CHAR타입과VARCHAR2타입은반드시구분해서정의해야합니다. 
똑같은문자열타입이지만용도도조금다르고내부메카니즘도다릅니다. CHAR타입인경우는입력시무조건정의한자리수만큼공간을확보합니다. 예를들어testchar(10)필드에'a'라는문자를입력하면한글자만들어가는게아니라a에스페이스9자리가 딸려들어갑니다.데이터구조상으로볼때미리공간을확보하기때문에해당필드에UPDATE가걸릴때이미확보된 공간내에서I/O가일어나기에속도가빠릅니다.이론적으로조회속도도VARCHAR보다좋습니다만조회시 스페이스가붙어나온다는것과Where조건에서Trim을해야한다는단점이있습니다. VARCHAR타입은저장시입력된데이터의길이만큼저장합니다.리소스절약이나데이터조회시는편하지만 I/O측면에서볼때는CHAR타입보다떨어집니다. CHAR타입은길이가딱정해진필트에대해서정의하는게좋고...(예,남녀구분,정상,반품구분등등구분자타입) VARCHAR타입은길이가유동적인필드에적합합니다.(명칭류..) 

3.숫자형필드는NOTNULL로지정하는게좋습니다. 
숫자형필드는수치연산이나SUM()을낼때널값이들어가면연산오류나원하는결과가안나오는수가있음으로 입력시사람이입력을안하더라도디폴트값0을넣어주는게정신건강상좋습니다. 

4.날짜형태의필드는DATE타입으로지정하는게좋습니다. 
CHAR타입으로선언해서엉뚱한데이터가들어가는경우을미연에방지할수있고날짜계산등에DATE타입이 매우편리합니다.

5.조회시주로사용되는필드는NOTNULL로지정하는게좋습니다. 
조회조건에들어가는필드가널값인경우는데이터가조회가안되는걸미연에방지할수있습니다. 

6.특정필드에중요한제약조건이있다면테이블설계시해당필드에제약조건을걸어둡니다. 
DB단에서제약조건을걸어두면설령프로그램에데이터를잘못입력해도DB단에서오류를막아줄수 있음으로중요한제약조건이있다면해당필드에제약조건을걸어둡니다.(예,숫자필드에0이상만입력가능한 제약조건이라던지,특정값만들어오는제약조건이라던지,시스템날짜이하로는입력이안되는제약조건등등..) 

Posted by redkite
, |

SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE, R_CONSTRAINT_NAME, SEARCH_CONDITION
FROM USER_CONSTRAINTS;
-----------------------------------
SELECT TABLE_NAME, CONSTRAINT_NAME, CONSTRAINT_TYPE, STATUS, VALIDATED, DEFERRABLE, DEFERRED
FROM USER_CONSTRAINTS;
-----------------------------------
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
FROM USER_CONS_COLUMNS;
-----------------------------------
SELECT A.TABLE_NAME, B.COLUMN_NAME, A.CONSTRAINT_NAME,
A.CONSTRAINT_TYPE, A.R_CONSTRAINT_NAME, A.SEARCH_CONDITION
FROM USER_CONSTRAINTS A, USER_CONS_COLUMNS B
WHERE A.CONSTRAINT_NAME = B.CONSTRAINT_NAME;
-----------------------------------
SELECT T.TABLE_NAME, T.CONSTRAINT_NAME, C.COLUMN_NAME,
T.DEFERRABLE, T.DEFERRED, T.VALIDATED
FROM DBA_CONSTRAINTS T, DBA_CONS_COLUMNS C
WHERE T.CONSTRAINT_NAME = C.CONSTRAINT_NAME
AND T.OWNER LIKE '%&OWNER%'
AND T.TABLE_NAME LIKE '%&TABLE_NAME%';
-----------------------------------
SELECT OBJECT_NAME, OBJECT_TYPE, OBJECT_ID, DATA_OBJECT_ID, CREATED, TIMESTAMP, LAST_DDL_TIME
FROM USER_OBJECTS
ORDER BY OBJECT_TYPE;
----------------------------------
SELECT VIEW_NAME, TEXT
FROM USER_VIEWS;
-----------------------------------
SELECT *
FROM USER_SEQUENCES;
-----------------------------------
SELECT SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM USER_SYNONYMS;
-----------------------------------
SELECT TABLESPACE_NAME, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,
PCT_INCREASE, MIN_EXTLEN, STATUS, CONTENTS, ALLOCATION_TYPE
FROM DBA_TABLESPACES;
----------------------------------
롤백세그먼트의 일반적인 정보
SELECT SEGMENT_NAME, OWNER, TABLESPACE_NAME,
INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, STATUS
FROM DBA_ROLLBACK_SEGS;
----------------------------------
현재 인스턴트가 사용하고 있는 롤백세그먼트에 대한 통계 검색
SELECT N.NAME, S.EXTENTS, S.RSSIZE, S.OPTSIZE, S.HWMSIZE, S.XACTS, S.STATUS
FROM V$ROLLNAME N, V$ROLLSTAT S
WHERE N.USN = S.USN;
----------------------------------
롤백세그먼트에 대한 경합
SELECT N.NAME, ROUND(100*S.WAITS/S.GETS)
FROM V$ROLLNAME N, V$ROLLSTAT S
WHERE N.USN = S.USN;
----------------------------------
블록킹 트랜잭션
SELECT S.SID, S.SERIAL#, T.START_TIME, T.XIDUSN, S.USERNAME
FROM V$SESSION S, V$TRANSACTION T, V$ROLLSTAT R
WHERE S.SADDR = T.SES_ADDR
AND T.XIDUSN = R.USN
AND ((R.CUREXT = T.START_UEXT-1)
OR ((R.CUREXT = R.EXTENTS-1) AND T.START_UEXT = 0));
----------------------------------
인덱스에 대한 유효성 확인
SELECT BLOCKS, BTREE_SPACE, USED_SPACE, PCT_USED, LF_ROWS, DEL_LF_ROWS
FROM INDEX_STATS;
----------------------------------
SELECT USERNAME, USER_ID, DEFAULT_TABLESPACE, TEMPORARY_TABLESPACE, PROFILE
FROM DBA_USERS;
----------------------------------
SELECT TABLESPACE_NAME, BYTES, MAX_BYTES, BLOCKS, MAX_BLOCKS
FROM USER_TS_QUOTAS;
-----------------------------------
SELECT TABLESPACE_NAME, FILE_ID, FILE_NAME, BYTES,
AUTOEXTENSIBLE, INCREMENT_BY, MAXBYTES
FROM DBA_DATA_FILES;
-----------------------------------
SELECT FILE#, STATUS, RFILE#, BYTES, BLOCKS, CREATE_BYTES, BLOCK_SIZE, NAME
FROM V$DATAFILE;
-----------------------------------
SELECT FILE#, STATUS
FROM V$BACKUP;
-----------------------------------
SELECT *
FROM DBA_FREE_SPACE
ORDER BY BLOCK_ID;
-----------------------------------
SELECT A.TABLESPACE_NAME, A.BYTES, A.STATUS, B.STATUS, B.ENABLED, B.NAME
FROM DBA_DATA_FILES A, V$DATAFILE B
WHERE A.FILE_ID = B.FILE# AND A.TABLESPACE_NAME LIKE '%&TABLESPACE_NAME%';
-----------------------------------
SELECT TABLESPACE_NAME, EXTENTS_COALESCED, TOTAL_BYTES, BYTES_COALESCED
FROM DBA_FREE_SPACE_COALESCED;
-----------------------------------
SELECT A.TABLESPACE_NAME "TABLESPACE",
B.FILE_NAME "FILE",
B.BYTES "TOTAL SIZE",
C.BYTES "SIZE LEFT"
FROM DBA_TABLESPACES A, DBA_DATA_FILES B, DBA_FREE_SPACE C
WHERE A.TABLESPACE_NAME = B.TABLESPACE_NAME AND
A.TABLESPACE_NAME = C.TABLESPACE_NAME AND
A.TABLESPACE_NAME LIKE '%&TABLESPACE_NAME%';
-----------------------------------
SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME, BYTES, BLOCKS, EXTENTS, INITIAL_EXTENT, NEXT_EXTENT
FROM USER_SEGMENTS;
-----------------------------------
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS, INDEX_TYPE, TABLESPACE_NAME
FROM USER_INDEXES;
-----------------------------------
SELECT LINE, POSITION, TEXT
FROM USER_ERRORS
ORDER BY SEQUENCE;
-----------------------------------
SELECT *
FROM USER_SOURCE;
-----------------------------------
SELECT SEGMENT_NAME, PARTITION_NAME, TABLESPACE_NAME, EXTENT_ID, BYTES, BLOCKS
FROM USER_EXTENTS
ORDER BY SEGMENT_NAME, EXTENT_ID;
-----------------------------------
SELECT TABLESPACE_NAME, SEGMENT_NAME, FILE_ID, EXTENT_ID, BLOCK_ID, BLOCKS
FROM DBA_EXTENTS
ORDER BY EXTENT_ID;
-----------------------------------
SELECT OPERATION, OPTIONS, OBJECT_NAME, ID, PARENT_ID, POSITION
FROM PLAN_TABLE
ORDER BY ID;
-----------------------------------
SELECT NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE, CHAIN_CNT, AVG_ROW_LEN
FROM USER_TABLES;
-----------------------------------
SELECT COLUMN_NAME, NUM_DISTINCT, LOW_VALUE, HIGH_VALUE, DENSITY
FROM USER_TAB_COLUMNS;
-----------------------------------
SELECT TABLE_NAME, TABLE_TYPE_NAME, PARENT_TABLE_NAME, PARENT_TABLE_COLUMN
FROM USER_NESTED_TABLES;
-----------------------------------
SELECT *
FROM DBA_PROFILES;
-----------------------------------
SELECT *
FROM USER_RESOURCE_LIMITS;
-----------------------------------
SELECT *
FROM USER_PASSWORD_LIMITS;
-----------------------------------
SELECT *
FROM V$OPTION;
-----------------------------------
SELECT *
FROM V$PARAMETER;
-----------------------------------
SELECT DISTINCT OBJECT_TYPE
FROM DBA_OBJECTS;
-----------------------------------
SELECT OWNER, OBJECT_NAME, SUBOBJECT_NAME, OBJECT_TYPE, CREATED
FROM DBA_OBJECTS
WHERE OWNER LIKE '%&OWNER%'
AND OBJECT_TYPE LIKE '%&OBJECT_TYPE%'
ORDER BY OBJECT_NAME;
-----------------------------------
SELECT OWNER, TABLE_NAME, TABLESPACE_NAME
FROM DBA_TABLES
WHERE TABLE_NAME LIKE '%&TABLE_NAME%'
ORDER BY OWNER, TABLE_NAME;
-----------------------------------
SELECT VIEW_NAME, TEXT
FROM DBA_VIEWS
WHERE VIEW_NAME LIKE '%&VIEW_NAME%';
-----------------------------------
SELECT *
FROM DBA_SYS_PRIVS
WHERE GRANTEE LIKE '%&ROLE%';
-----------------------------------
SELECT OWNER, SYNONYM_NAME, TABLE_OWNER, TABLE_NAME
FROM DBA_SYNONYMS
ORDER BY 2, 1, 3;
-----------------------------------
<클러스터>
클러스터의 일반적인 정보(블록파라미터..)
SELECT * FROM DBA_CLUSTERS
WHERE OWNER LIKE '%&OWNER%';
클러스터 테이블 및 클러스터 키 조회
SELECT OWNER, CLUSTER_NAME, CLU_COLUMN_NAME, TABLE_NAME
FROM DBA_CLU_COLUMNS
WHERE OWNER LIKE '%&OWNER%';
SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE
FROM DBA_TAB_COLUMNS
WHERE OWNER LIKE '%&OWNER%';
-----------------------------------
IOT 조회
SELECT T.TABLE_NAME AS "IOT", O.TABLE_NAME AS "OVERFLOW",
I.INDEX_NAME AS "INDEX", O.TABLESPACE_NAME AS "OVERFLOW TBS",
I.TABLESPACE_NAME AS "INDEX TBS", I.PCT_THRESHOLD
FROM DBA_TABLES T, DBA_TABLES O, DBA_INDEXES I
WHERE T.OWNER = O.OWNER
AND T.TABLE_NAME = O.IOT_NAME
AND T.OWNER = I.OWNER
AND T.TABLE_NAME = I.TABLE_NAME
AND T.OWNER LIKE '%&OWNER%';
-----------------------------------
SELECT USERNAME, TIMESTAMP, ACTION_NAME
FROM DBA_AUDIT_TRAIL;
-----------------------------------
SELECT USERID, OBJ$NAME, SES$ACTIONS, TIMESTAMP#
FROM SYS.AUD$
WHERE OBJ$NAME LIKE '%&OBJECT_NAME%';
-----------------------------------
SELECT SESSIONID, STATEMENT, TIMESTAMP#, USERID, TERMINAL, ACTION#,
OBJ$CREATOR, OBJ$NAME, SES$ACTIONS, COMMENT$TEXT, SPARE1
FROM SYS.AUD$;

Posted by redkite
, |

다음의 내용들은 개인적인 권장하는 사항들이다.

오라클 10g의 경우 엔진 설치를 위한 디렉토리 공간을 20GB 이상 주는 것을 권장한다.

오라클의 adump, bdump, udump, 리스너 로그, 아카이브 로그 등을 백업할 수 있으면

백업하는 것을 권장한다. 하지만 대부분의 경우 백업의 필요성이 절실하지 않기 때문에

삭제한다.

 

각종 로그의 자동관리를 위하여 첨부한 파일과 같이 CRONTAB에 등록하여 관리하면 편리하다.
각각의 로그관리에 대한 정책이 필요하다.

 

정책 예시)
1. alert 로그       : 월별로 로그를 관리. 영구 보관하는 것이 좋다.
                      compress 명령으로 압축하여 보관.
2. adump audit 파일 : 180일 정도 유지, 매일 180일이 지난 trc파일을 삭제
3. bdump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
4. udump trace 파일 : 90일 정도 유지, 매일 90일이 지난 trc파일을 삭제
5. 리스너 로그      : 리스너를 로깅하도록 설정했을 경우 월별로 로그를 관리.

                      180일이 지난 파일은 삭제. compress 명령으로 압축하여 보관.
6. 아카이브로그 파일 : 기본적으로 1주일에 1번 이상 FULL BACKUP을 받을 경우
   백업 툴에서 아카이브로그를 관리해 주지 않을 경우 등록하여 사용
   7일전 아카이브로그 파일 삭제.

 

쉘 예시)

쉘 스크립트 작성 시 오타에 주의할 것. 반드시 테스트 후 적용할 것
#######################################################
#### alert.log                                     ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate
cat /dev/null > $ORACLE_BASE/admin/TESTDB/bdump/alert_TESTDB.log
compress -vf $ORACLE_BASE/TESTDB/bdump/alert_TESTDB.log.$nDate

 

#######################################################
#### listener.log                                  ####
#### (매월 1일 실행할 수 있도록 cron job 등록 )    ####
#######################################################

nDate=`date +%Y%m%d`
cp $ORACLE_HOME/network/admin/listener.log $ORACLE_HOME/network/admin/listener.log.$nDate
cat /dev/null > $ORACLE_HOME/network/admin/listener.log
compress -vf $ORACLE_HOME/network/admin/listener.log.$nDate

 

#######################################################
#### audit                                         ####

#######################################################
# 180일이 지난 *.aud를 찾아 삭제
find $ORACLE_BASE/admin/TESTDB/adump \( -ctime +180 -name '*.aud' \) -exec rm -f {} \;

 

#######################################################
#### .trc                                          ####
# 90일이 지난 *.trc를 찾아 삭제                    ####
#######################################################
find $ORACLE_BASE/admin/TESTDB/bdump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;
find $ORACLE_BASE/admin/TESTDB/udump \( -ctime +90 -name '*.trc' \) -exec rm -f {} \;

 

#######################################################
#### archive log                                   ####
#######################################################
# 7일이 지난 *.arc를 찾아 삭제
find /archive_log \( -ctime +7 -name '*.arc' \) -exec rm -f {} \;

 

Posted by redkite
, |

오라클의 OBJECT들 중 INVALID나 DISABLED된 것을 체크하는 스크립트이다.

SET PAGESIZE 1000 LINESIZE 120
COLUMN OBJECT_DV   FORMAT A10
COLUMN OWNER       FORMAT A15
COLUMN TABLE_NAME  FORMAT A30
COLUMN OBJECT_TYPE FORMAT A20
COLUMN NAME        FORMAT A30
COLUMN STATUS      FORMAT A10

 

SELECT * FROM
(
SELECT 'CONSTRAINT'    OBJECT_DV        ,
       OWNER                            ,
       TABLE_NAME      OBJECT_NAME      ,
       CONSTRAINT_TYPE OBJECT_TYPE      ,
       CONSTRAINT_NAME NAME             ,
       STATUS
  FROM SYS.DBA_CONSTRAINTS
 WHERE STATUS = 'DISABLED'
UNION ALL
SELECT 'TRIGGER'    OBJECT_DV           ,
       OWNER                            ,
       TABLE_NAME   OBJECT_NAME         ,
       'TRIGGER'    OBJECT_TYPE         ,
       TRIGGER_NAME NAME                ,
       STATUS
  FROM SYS.DBA_TRIGGERS
 WHERE STATUS = 'DISABLED'
UNION ALL
SELECT 'OBJECT'    OBJECT_DV            ,
       OWNER                            ,
       'OBJECT'    OBJECT_NAME          ,
       OBJECT_TYPE OBJECT_TYPE          ,
       OBJECT_NAME NAME                 ,
       STATUS
  FROM SYS.DBA_OBJECTS
 WHERE STATUS      = 'INVALID'
UNION ALL
SELECT 'INDEX'           OBJECT_DV      ,
       OWNER             OWNER          ,
       INDEX_NAME        OBJECT_NAME    ,
       'INDEX'           OBJECT_TYPE    ,
       INDEX_NAME        NAME           ,
       STATUS
  FROM SYS.DBA_INDEXES
 WHERE STATUS IN ('UNUSABLE','INVALID')
UNION ALL
SELECT 'PART IDX'        OBJECT_DV      ,
       INDEX_OWNER       OWNER          ,
       INDEX_NAME        OBJECT_NAME    ,
       'PART INDEX'      OBJECT_TYPE    ,
       PARTITION_NAME    NAME           ,
       STATUS
  FROM SYS.DBA_IND_PARTITIONS
 WHERE STATUS IN ('UNUSABLE','INVALID')
)
 WHERE OWNER NOT IN ('SYS','SYSTEM');

 

Posted by redkite
, |

1. 컬럼 추가
SQL> ALTER TABLE 테이블
                   ADD (컬럼1 VARCHAR2(03)     NULL,
                        컬럼2 NUMBER(05)       NULL);

 

2. 컬럼TYPE 및 LENGTH 변경
SQL> ALTER TABLE 테이블
                    MODIFY (컬럼1 VARCHAR2(05)      NULL,
                            컬럼2 NUMBER(08)    NOT NULL);

 

3. 컬럼 DEFAULT 변경
SQL> ALTER TABLE 테이블
           MODIFY (컬럼1 VARCHAR2(05)  DEFAULT 'N' NOT NULL,
                   컬럼2 NUMBER(08)    DEFAULT 0   NOT NULL,

                   컬럼3 DATE          DEFAULT SYSDATE NOT NULL);

4. 컬럼 삭제(8i~)
SQL> ALTER TABLE 테이블 DROP COLUMN 컬럼1;    -- 1개 컬럼
SQL> ALTER TABLE 테이블 DROP (컬럼1, 컬럼2);  -- 2개 컬럼 이상

 

5. 사용하지 않는 컬럼으로 표시(8i~)

SQL> ALTER TABLE 테이블 SET UNUSED COLUMN 컬럼1;   -- 1개 컬럼
SQL> ALTER TABLE 테이블 SET UNUSED (컬럼1, 컬럼2); -- 2개 컬럼 이상

 

6. 사용하지 않는 column으로 표시된 컬럼 삭제(8i~)
SQL> ALTER TABLE 테이블 DROP UNUSED COLUMNS CHECKPOINT 1000;

 

7. 컬럼 RENAME 방법
   - ~ 8i          : TABLE 재생성
   - 9iR1(9.0.1) ~ : DBMS_REDEFINITION을 이용(Bulletin No: 12279 참조)
   - 9iR2(9.2.0) ~ : SQL> ALTER TABLE 테이블 RENAME COLUMN old_컬럼 TO new_컬럼;

 

8. 여러 테이블에서 사용하는 컬럼의 길이를 변경하고자 할 경우

SQL> SELECT  'ALTER TABLE '||TABLE_NAME||' MODIFY ('||COLUMN_NAME||' '||DATA_TYPE||'(7));'
       FROM  USER_TAB_COLUMNS
      WHERE  COLUMN_NAME LIKE '%컬럼%';

Posted by redkite
, |
SELECT
        A.OWNER,
        A.TABLE_COUNT,
        A.VIEW_COUNT,
        B.PK_COUNT,
        A.INDEX_COUNT,
        B.UK_COUNT,
        B.FK_COUNT,
        B.CK_COUNT,
        A.SYNONYM_COUNT,
        A.SEQUENCE_COUNT,
        A.FUNCTION_COUNT,
        A.PROCEDURE_COUNT,
        A.PACKAGE_COUNT,  
        A.PACKAGE_BODY_COUNT,
        A.TRIGGER_COUNT,
        A.LOB_COUNT,
        A.TABLE_PARTITION_COUNT,
        A.INDEX_PARTITION_COUNT,
        A.CLUSTER_COUNT,   
        A.LIBRARY_COUNT,   
        A.DIRECTORY_COUNT,   
        A.JAVA_SOURCE_COUNT,   
        A.JAVA_CLASS_COUNT,
        A.JAVA_RESOURCE_COUNT,
        A.JAVA_DATA_COUNT,
        A.INDEXTYPE_COUNT,
        A.OPERATOR_COUNT,
        A.TYPE_COUNT,
        A.TYPE_BODY_COUNT,
        A.RESOURCE_PLAN_COUNT,
        A.CONSUMER_GROUP_COUNT,
        A.MATERIALIZED_VIEW_COUNT,
        A.TABLE_SUBPARTITION_COUNT,
        A.INDEX_SUBPARTITION_COUNT,
        A.LOB_PARTITION_COUNT,
        A.LOB_SUBPARTITION_COUNT,
        A.DIMENSION_COUNT,
        A.CONTEXT_COUNT,  
        A.RULE_SET_COUNT,  
        A.XML_SCHEMA_COUNT,
        A.SECURITY_PROFILE_COUNT,
        A.RULE_COUNT,
        A.CAPTURE_COUNT,
        A.APPLY_COUNT,
        A.EVALUATION_CONTEXT_COUNT,
        A.PROGRAM_COUNT,
        A.JOB_COUNT,
        A.JOB_CLASS_COUNT,
        A.SCHEDULE_COUNT,
        A.WINDOW_COUNT,
        A.WINDOW_GROUP_COUNT,
        A.CHAIN_COUNT,
        A.NEXT_OBJECT_COUNT,
        A.QUEUE_COUNT,
        A.FILE_GROUP_COUNT
 FROM
 (SELECT /*+ ALL_ROWS */
         U.NAME                      AS OWNER,
         SUM(DECODE(O.TYPE#,  0, 1)) AS NEXT_OBJECT_COUNT,
         SUM(DECODE(O.TYPE#,  1, 1)) AS INDEX_COUNT,
         SUM(DECODE(O.TYPE#,  2, 1)) AS TABLE_COUNT,
         SUM(DECODE(O.TYPE#,  3, 1)) AS CLUSTER_COUNT,
         SUM(DECODE(O.TYPE#,  4, 1)) AS VIEW_COUNT,
         SUM(DECODE(O.TYPE#,  5, 1)) AS SYNONYM_COUNT,
         SUM(DECODE(O.TYPE#,  6, 1)) AS SEQUENCE_COUNT,
         SUM(DECODE(O.TYPE#,  7, 1)) AS PROCEDURE_COUNT,
         SUM(DECODE(O.TYPE#,  8, 1)) AS FUNCTION_COUNT,
         SUM(DECODE(O.TYPE#,  9, 1)) AS PACKAGE_COUNT, 
         SUM(DECODE(O.TYPE#, 11, 1)) AS PACKAGE_BODY_COUNT,
         SUM(DECODE(O.TYPE#, 12, 1)) AS TRIGGER_COUNT,
         SUM(DECODE(O.TYPE#, 13, 1)) AS TYPE_COUNT,
         SUM(DECODE(O.TYPE#, 14, 1)) AS TYPE_BODY_COUNT,
         SUM(DECODE(O.TYPE#, 19, 1)) AS TABLE_PARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 20, 1)) AS INDEX_PARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 21, 1)) AS LOB_COUNT,
         SUM(DECODE(O.TYPE#, 22, 1)) AS LIBRARY_COUNT,
         SUM(DECODE(O.TYPE#, 23, 1)) AS DIRECTORY_COUNT,
         SUM(DECODE(O.TYPE#, 24, 1)) AS QUEUE_COUNT,
         SUM(DECODE(O.TYPE#, 28, 1)) AS JAVA_SOURCE_COUNT,
         SUM(DECODE(O.TYPE#, 29, 1)) AS JAVA_CLASS_COUNT,
         SUM(DECODE(O.TYPE#, 30, 1)) AS JAVA_RESOURCE_COUNT,
         SUM(DECODE(O.TYPE#, 32, 1)) AS INDEXTYPE_COUNT,
         SUM(DECODE(O.TYPE#, 33, 1)) AS OPERATOR_COUNT,
         SUM(DECODE(O.TYPE#, 34, 1)) AS TABLE_SUBPARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 35, 1)) AS INDEX_SUBPARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 40, 1)) AS LOB_PARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 41, 1)) AS LOB_SUBPARTITION_COUNT,
         SUM(DECODE(O.TYPE#, 42, NVL((SELECT DISTINCT 'REWRITE EQUIVALENCE'
                                        FROM SYS.SUM$ S
                                       WHERE S.OBJ#=O.OBJ#
                                         AND bitand(S.XPFLAGS, 8388608) = 8388608),
                                      1))) AS MATERIALIZED_VIEW_COUNT,
         SUM(DECODE(O.TYPE#, 43, 1)) AS DIMENSION_COUNT,
         SUM(DECODE(O.TYPE#, 44, 1)) AS CONTEXT_COUNT,
         SUM(DECODE(O.TYPE#, 46, 1)) AS RULE_SET_COUNT,
         SUM(DECODE(O.TYPE#, 47, 1)) AS RESOURCE_PLAN_COUNT,
         SUM(DECODE(O.TYPE#, 48, 1)) AS CONSUMER_GROUP_COUNT,
         SUM(DECODE(O.TYPE#, 55, 1)) AS XML_SCHEMA_COUNT,
         SUM(DECODE(O.TYPE#, 56, 1)) AS JAVA_DATA_COUNT,
         SUM(DECODE(O.TYPE#, 57, 1)) AS SECURITY_PROFILE_COUNT, 
         SUM(DECODE(O.TYPE#, 59, 1)) AS RULE_COUNT, 
         SUM(DECODE(O.TYPE#, 60, 1)) AS CAPTURE_COUNT, 
         SUM(DECODE(O.TYPE#, 61, 1)) AS APPLY_COUNT,
         SUM(DECODE(O.TYPE#, 62, 1)) AS EVALUATION_CONTEXT_COUNT,
         SUM(DECODE(O.TYPE#, 66, 1)) AS JOB_COUNT,
         SUM(DECODE(O.TYPE#, 67, 1)) AS PROGRAM_COUNT,
         SUM(DECODE(O.TYPE#, 68, 1)) AS JOB_CLASS_COUNT,
         SUM(DECODE(O.TYPE#, 69, 1)) AS WINDOW_COUNT,
         SUM(DECODE(O.TYPE#, 72, 1)) AS WINDOW_GROUP_COUNT,
         SUM(DECODE(O.TYPE#, 74, 1)) AS SCHEDULE_COUNT,
         SUM(DECODE(O.TYPE#, 79, 1)) AS CHAIN_COUNT,
         SUM(DECODE(O.TYPE#, 81, 1)) AS FILE_GROUP_COUNT
    FROM SYS.OBJ$ O, SYS.USER$ U
   WHERE O.OWNER# = U.USER# 
     AND U.NAME NOT IN ('SYS','SYSTEM','BIZMAX','DBSNMP','OUTLN','WMSYS','ORDSYS','TSMSYS',
                        'ORDPLUGINS','RMAN','MDSYS','CTXSYS','WKSYS','WKPROXY','ODM',
                        'ODM_MTR','OLAPSYS','PERFSTAT','ORANGE','WASJMS','SYSMAN',
                        'TMAX','DBMSTOOL','MIBWINE' )
   GROUP BY U.NAME ) A,
  (SELECT /*+ ALL_ROWS */
         OWNER                       AS OWNER,
         SUM(DECODE(C.CONSTRAINT_TYPE, 'P', 1)) AS PK_COUNT,
         SUM(DECODE(C.CONSTRAINT_TYPE, 'U', 1)) AS UK_COUNT,
         SUM(DECODE(C.CONSTRAINT_TYPE, 'R', 1)) AS FK_COUNT,
         SUM(DECODE(C.CONSTRAINT_TYPE, 'C', 1)) AS CK_COUNT 
    FROM SYS.DBA_CONSTRAINTS C
   WHERE C.OWNER NOT IN ('SYS','SYSTEM','BIZMAX','DBSNMP','OUTLN','WMSYS','ORDSYS','TSMSYS',
                         'ORDPLUGINS','RMAN','MDSYS','CTXSYS','WKSYS','WKPROXY','ODM',
                         'ODM_MTR','OLAPSYS','PERFSTAT','ORANGE','WASJMS','SYSMAN',
                         'TMAX','DBMSTOOL','MIBWINE' )
     AND C.GENERATED = 'USER NAME'
   GROUP BY C.OWNER ) B
   WHERE A.OWNER = B.OWNER(+);

 

Posted by redkite
, |

LOB 컬럼을 가진 테이블에 대한 명령어를 정리해 보았다.

1. LOB 컬럼을 포함한 테이블 생성
   -----------------------------
   SQL> CREATE TABLE 테이블명 (
               일반컬럼명    VARCHAR2(255) NOT NULL,
               LOB컬럼명     CLOB NULL,
               CONSTRAINT PK인덱스명 PRIMARY KEY (일반컬럼명)
               USING INDEX TABLESPACE 인덱스테이블스페이스명
        )
        TABLESPACE 데이터테이블스페이스명
        LOB(LOB컬럼명) STORE AS LD_테이블명_CLOB
           (TABLESPACE LOB데이터테이블스페이스명 DISABLE STORAGE IN ROW
                 INDEX LI_테이블명_CLOB (TABLESPACE LOB인덱스테이블스페이스명))
        ;

2. LOB 컬럼 추가
   -------------
   SQL> alter table 테이블명  add (컬럼명 BLOB)
              lob(컬럼명) STORE AS LD_테이블명_BLOB (TABLESPACE 데이터LOB테이블스페이스명
                          INDEX LI_테이블명_BLOB (TABLESPACE 인덱스LOB테이블스페이스명));

3. LOB MOVE
   -----------
   - 인덱스 REBUILD 필요
   SQL> alter table 테이블명 move lob(컬럼명) store as (tablespace 테이블스페이스명);
   SQL> alter table 테이블명 move lob(컬럼명) STORE AS LD_테이블명_BLOB

              (TABLESPACE 데이터LOB테이블스페이스명
               INDEX LI_테이블명_BLOB (TABLESPACE 인덱스LOB테이블스페이스명));
   SQL> alter index 인덱스명 rebuild tablespace 테이블스페이스명

              nologging parallel(degree 8);
   SQL> alter index 인덱스명 logging noparallel;

4. LOB RENAME
   ----------
   - LOB DATA는  Rename됨
   - LOB INDEX는 Rename되지 않음
   - 인덱스 rebuild 필요
   SQL> alter table 테이블명 move lob(컬럼명) store as (tablespace 테이블스페이스명);
   SQL> alter table 테이블명 move lob(컬럼명) STORE AS LD_테이블명_BLOB

              (TABLESPACE 데이터LOB테이블스페이스명
               INDEX LI_테이블명_BLOB (TABLESPACE 인덱스LOB테이블스페이스명));
   SQL> alter index 인덱스명 rebuild tablespace 테이블스페이스명

              nologging parallel(degree 8);
   SQL> alter index 인덱스명 logging noparallel;

5. LOB 을 포함한 파티션 테이블 생성
   --------------------------------
   - LOB컬럼을 파티션키로 사용할 수 없다.

   SQL> CREATE TABLE 테이블명
        (
               일반컬럼명    VARCHAR2(8) NOT NULL,
               LOB컬럼명     BLOB NULL,
        )
        PARTITION BY RANGE(일반컬럼명)
        (
          PARTITION PT_테이블명_200803 VALUES LESS THAN ('20080399')
                    TABLESPACE 데이터테이블스페이스명
                    LOB(LOB컬럼명) STORE AS LD_PT_테이블명_200803_BLOB
                       (TABLESPACE LOB데이터테이블스페이스명 DISABLE STORAGE IN ROW
                        INDEX LI_PT_테이블명_200803_BLOB

                              (TABLESPACE LOB인덱스테이블스페이스명)),
          PARTITION PT_테이블명_200804 VALUES LESS THAN ('20080499')
                    TABLESPACE 데이터테이블스페이스명
                    LOB(LOB컬럼명) STORE AS LD_PT_테이블명_200804_BLOB
                       (TABLESPACE LOB데이터테이블스페이스명 DISABLE STORAGE IN ROW
                        INDEX LI_PT_테이블명_200804_BLOB

                              (TABLESPACE LOB인덱스테이블스페이스명)),
          PARTITION PT_테이블명_999999 VALUES LESS THAN ('99999999')
                    TABLESPACE 데이터테이블스페이스명
                    LOB(LOB컬럼명) STORE AS LD_PT_테이블명_999999_BLOB
                       (TABLESPACE LOB데이터테이블스페이스명 DISABLE STORAGE IN ROW
                        INDEX LI_PT_테이블명_999999_BLOB

                              (TABLESPACE LOB인덱스테이블스페이스명))
        );

6. LOB 을 포함한 파티션 테이블 SPLIT
   ---------------------------------
   - 인덱스 rebuild 필요
   SQL> ALTER TABLE 테이블명 SPLIT PARTITION PT_테이블명_999999 AT ('20080599')
        INTO (PARTITION PT_테이블명_200805 TABLESPACE TS_GPDRM06 
                    LOB(LOB컬럼명) STORE AS LD_PT_테이블명_200806_BLOB
                       (TABLESPACE 데이터LOB테이블스페이스명 DISABLE STORAGE IN ROW
                        INDEX LI_PT_테이블명_200806_BLOB

                              (TABLESPACE 인덱스LOB테이블스페이스명)),
              PARTITION PT_테이블명_999999 TABLESPACE 데이터테이블스페이스명
                    LOB(LOB컬럼명) STORE AS LD_PT_테이블명_999999_BLOB
                       (TABLESPACE 데이터LOB테이블스페이스명 DISABLE STORAGE IN ROW
                        INDEX LI_PT_테이블명_999999_BLOB

                              (TABLESPACE 인덱스LOB테이블스페이스명))
        );

7. LOB SEGMENT 조회
   SQL> select * from dba_lobs;
   SQL> select * from dba_segments;

참고) 오라클10g의 경우 테이블 purge옵션을 주지 않고 drop했을 경우
         LOB세그먼트가 남아 있어 같은 LOB세그먼트로 생성시 동일 객체
         이름이 존재한다는 에러 발생.
         drop table 테이블명 purge; 또는 purge recyclebin;으로 삭제 후 생성.

 

Posted by redkite
, |

이관 및 시스템을 구축하다보면

테이블의 컬럼에 시퀀스를 사용하였는데 테이블에 들어있는 MAX값이

시퀀스의 Last값과 차이가 있을 때 중복이 발생하거나 시퀀스의 Last값을 줄여 놓아야

할 필요가 있을 때가 있다. 다음과 같이 사용하면 시퀀스를 Drop하지 않고도 시퀀스의

Last값을 조정할 수 있다.(Alter Sequence 명령이 있다면 좋을텐데...)

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

1. 시퀀스Last값과 컬럼MAX값의 갭이 크지 않으면서 시퀀스Last값을 증가시킬

    필요가 있을 경우 다음과 같이 nextval을 증가시킨다.
    SQL> select 시퀀스명.nextval

                from dual connect by level <= (12514  -       10001);
                                                           -----          -----
                                                        컬럼MAX값    시퀀스Last값


2. 시퀀스Last값과 컬럼MAX값의 갭이 크다면 increment값으로 증가/감소 시키기

2-1. 시퀀스 정보 조회
      SQL> select * from user_sequences

               where sequence_name ='시퀀스명';

 

2-2. 차이값 구하기
     SQL> select 컬럼MAX값 - 시퀀스Last값 from dual;

     -- 결과

     1671677-169
     -----------
            -19882

 

3. 차이값만큼 increment를 setting
   SQL> alter sequence 시퀀스명 increment by -19882;

 

4. increment를 setting한 만큼의 값으로 Nextval을 이용하여 증가시킴
   SQL> select 시퀀스명.nextval from dual;

 

5. increment를 다시 원래의 증가값으로 setting
   SQL> alter sequence 시퀀스명 increment by 1;

 

Posted by redkite
, |

- 업무 파티션을 하고자 할 경우 각 업무별로 장애가 발생하지 않는 평시에
  RACDB1으로 접속하여 사용할 것인지 RACDB2로 접속하여 사용할 것인지를 결정하여야 함.
- 업무파티션의 기준은 각각의 노드에서 테이블 단위의 DML(INSERT,UPDATE,DELETE)이
  최소화되도록 설계하여야 함.

 

1. 리스너 설정(listener.ora)
   -----------------------
   # Local Listener를 사용하도록 설정(RACDB1)

   LISTENER_HOSTNAME1 =
     (DESCRIPTION_LIST =
       (DESCRIPTION =
         (ADDRESS = (PROTOCOL = TCP)(HOST = VIP_HOSTNAME1)(PORT = 1521)(IP=FIRST))
         (ADDRESS = (PROTOCOL = TCP)(HOST = HOSTNAME1)    (PORT = 1521)(IP=FIRST))
         (ADDRESS = (PROTOCOL = IPC)(KEY = extproc))
       )
     )
   
   SID_LIST_LISTENER_HOSTNAME1 =
     (SID_LIST =
       (SID_DESC =
         (SID_NAME = PLSExtProc)
         (ORACLE_HOME = /oracle/app/oracle/product/10.2.0/db_1)
         (PROGRAM = extproc)
       )
     )

 

2. TNS(tnsnames.ora) 설정 필요 - JDBC OCI 방식
   ----------------------------------------------

    # JDBC OCI 방식으로 설정하여 사용하고자 할 경우 TNS설정이 필요하며
    # RACDB에 접속하는 방식은 SQL*Net을 사용하게 됨
    # (SELECT인 것만 FAILOVER할 수 있도록 설정한 예, 주로 많이 사용하는 설정)

   TNS_RACDB1 = (DESCRIPTION=
                 (LOAD_BALANCE=OFF)
                 (FAILOVER=ON)
                 (ADDRESS=(PROTOCOL=TCP)(HOST=VIP_HOSTNAME1)(PORT=1521))
                 (ADDRESS=(PROTOCOL=TCP)(HOST=VIP_HOSTNAME2)(PORT=1521))
                 (CONNECT_DATA = (SERVER = DEDICATED)
                                 (SERVICE_NAME = RACDB)
                                 (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC))
                 )
             )
   
   TNS_RACDB2 = (DESCRIPTION=
                 (LOAD_BALANCE=OFF)
                 (FAILOVER=ON)
                 (ADDRESS=(PROTOCOL=TCP)(HOST=VIP_HOSTNAME2)(PORT=1521))
                 (ADDRESS=(PROTOCOL=TCP)(HOST=VIP_HOSTNAME1)(PORT=1521))
                 (CONNECT_DATA = (SERVER = DEDICATED)
                                 (SERVICE_NAME = RACDB)
                                 (FAILOVER_MODE=(TYPE=SELECT)(METHOD=BASIC))
                 )
             )

 

     1]  RACDB1에 접속하고자 하는 설정
          jdbc:oracle:oci:@TNS_RACDB1

 

     2  RACDB2 접속하고자 하는 설정
          jdbc:oracle:oci:@TNS_RACDB2


3. TNS(tnsnames.ora) 설정 필요없음 - JDBC thin 방식
   -----------------------------------------------

   1] RACDB1에 접속하고자 하는 설정
      jdbc:oracle:thin:@(DESCRIPTION=
                           (FAIL_OVER=ON)
                           (LOAD_BALANCE=OFF)
                           (ADDRESS=(PROTOCOL=TCP)(HOST=100.100.52.111)(PORT=1521)) # RACDB1 Virtual-IP 사용
                           (ADDRESS=(PROTOCOL=TCP)(HOST=100.100.52.112)(PORT=1521)) # RACDB2 Virtual-IP 사용
                           (CONNECT_DATA=(SERVICE_NAME=RACDB)))

 

   2] RACDB2에 접속하고자 하는 설정
      jdbc:oracle:thin:@(DESCRIPTION=
                           (FAIL_OVER=ON)
                           (LOAD_BALANCE=OFF)
                           (ADDRESS=(PROTOCOL=TCP)(HOST=100.100.52.112)(PORT=1521)) # RACDB2 Virtual-IP 사용
                           (ADDRESS=(PROTOCOL=TCP)(HOST=100.100.52.111)(PORT=1521)) # RACDB1 Virtual-IP 사용
                           (CONNECT_DATA=(SERVICE_NAME=RACDB)))

Posted by redkite
, |

*. REDO LOG group은 3개 이상 권장, member는 2개 권장

   (member는 물리적으로 서로 다른 위치에 분산 권장)
*. 평상시 REDO LOG 스위치가 약 20분 이상 유지할 수 있는 Size 권장
   (alert_TESTDB.log에서 지속적으로 모니터링해서 필요시 REDO LOG 크기를 증가시킬 것)

*. 체크포인트 간격 조절(initTESTDB.ora파라미터에서) fast_start_mttr_target = 600

*. DB Startup 상태에서 작업 가능


1. sqlplus 접속(Internal로 접속)
   $> sqlplus '/ as sysdba'
   OR
   $> sqlplus system/manager

 

2. currunt REDO LOG 조회

   SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         43  104857600          2 YES INACTIVE               8485439 01-SEP-03
         2          1         44  104857600          2 YES INACTIVE               8585874 02-SEP-03
         3          1         45  104857600          2 NO  CURRENT                8756665 03-SEP-03

   STATUS가 Inactive인 경우만 작업 가능

 

3. REDO LOG file을 switch
   SQL> alter system switch logfile;
   SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         46  104857600          2 NO  CURRENT                8988801 03-SEP-03
         2          1         44  104857600          2 YES INACTIVE               8585874 02-SEP-03
         3          1         45  104857600          2 YES ACTIVE                 8756665 03-SEP-03

   SQL> alter system switch logfile;
   SQL> select * from v$log;
    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIM
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- ---------
         1          1         46  104857600          2 YES ACTIVE                 8988801 03-SEP-03
         2          1         47  104857600          2 NO  CURRENT                8990631 03-SEP-03
         3          1         45  104857600          2 YES INACTIVE               8756665 03-SEP-03

 

4. acitive 한 REDO LOG group을 inactive로 변경
   SQL> alter system checkpoint;

 

5. REDO LOG Drop
   SQL> alter database drop logfile group 2;

6. REDO LOG logfile 삭제
   SQL> !rm /oradata1/redo2a.dbf;
   SQL> !rm /oradata2/redo2b.dbf;

 

7. REDO LOG logfile 추가
   1) 멤버가 없는 경우
      SQL> alter database add logfile group 2 '/oradata/redo2.dbf' size 100M;

   2) 멤버가 있는 경우
      SQL> alter database add logfile member  '/oradata/redo2b.dbf' to group 2;

      SQL> alter database add logfile
                 group 2 ('/oradata1/redo2a','/oradata2/redo2b') size 100M reuse;
   3) 여러개의 REDO LOG 추가할 경우
      SQL> alter database add logfile
                 group 4 ('/oradata1/redo4a','/oradata2/redo4b') size 100M,
                 group 5 ('/oradata1/redo5a','/oradata2/redo5b') size 100M,
                 group 6 ('/oradata1/redo6a','/oradata2/redo6b') size 100M;

 

Posted by redkite
, |

테이블스페이스(TABLESPACE)

-------------------------
 - 오라클 서버가 데이터를 저장하는 논리적인 구조
 - 테이블스페이스는 1개 또는 여러 개의 데이터파일을 가진 논리적인 데이터 저장 구조

 - LMT(Locally Managed Tablespace)

 - DMT(Dictionary Managed Tablespace)

 - Next Extent크기는 64KB, 1MB, 8MB, 64MB 순으로 사용됨
 - AUTOALLOCATE의 경우

   처음 테이블의 EXTENT는 64KB부터 시작, 1MB가 될 때까지 64KB단위로 증가,

   1MB가 된 이후부터는 1MB단위로 증가, 이후부터는 64MB가 되었을 때 8MB,
   1GB가 되었을 때 64MB단위로 증가


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

테이블스페이스 생성

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

 

1. 데이터파일 raw device인 경우(9i~)


    SQL> CREATE TABLESPACE       테이블스페이스명
         datafile  '/dev/vg_data01/rlvol_test' [size  99M]
         EXTENT MANAGEMENT LOCAL     -- Default is LOCAL

                                     -- (LOCAL/DICTIONARY Managed Tablespace)
         [AUTOALLOCATE] or [UNIFORM SIZE 1M]  -- Auto Extent Size or Uniform Extent Size

                                              -- (initial이 지정되었을 경우 initial Size)
         SEGMENT SPACE MANAGEMENT AUTO        -- freelist 및 pctused 등을 자동으로 관리

         ;                                    -- (AUTO/MANUAL)

 

2. 데이터파일 file system인 경우
    SQL> CREATE TABLESPACE 테이블스페이스명
         datafile   '/data01/데이터파일명'  size  100M
         AUTOEXTEND ON  NEXT 10M

         MAXSIZE 4000M MINIMUM EXTENT 1M -- datafile에 대한 option 임
         EXTENT MANAGEMENT LOCAL         -- Default is LOCAL (LOCAL or DICTIONARY)
         [AUTOALLOCATE] or [UNIFORM SIZE 1M] -- Auto Extent Size or Uniform Extent Size

                                             -- (initial이 지정되었을 경우 initial Size)
         SEGMENT SPACE MANAGEMENT AUTO       -- freelist 및 pctused 등을 자동으로 관리

                                             -- (AUTO/MANUAL)

 

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

테이블스페이스 관리

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

 

1. COALESCE

    SQL> alter tablespace 테이블스페이스명 coalesce ;

         - ORACLE 7, 8, 8i, 9i DICTIONARY Management Tablespace일 경우 사용

           (Locally Managed Tablespace는 coalesce가 필요 없음)
         - For each datafile in the tablespace,
           this clause coalesces all contiguous free extents

           into larger contiguous extents. 

 

2. RENAME

    SQL> ALTER TABLESPACE 구테이블스페이스명 RENAME TO 신규테이블스페이스명;

         - 9i이하에서는 지원하지 않음, 10g부터 지원
         - 사용자의 DEFAULT TABLESPACE 함께 변경됨
           SQL> SELECT * FROM DBA_USERS;
           SQL> ALTER USER 사용자명 DEFAULT TABLESPACE 테이블스페이스명;

 

3. Read/Write

    SQL> alter tablespace 테이블스페이스명 read only ;

         - read only 테이블스페이스는 온라인(HOT) 백업에서 제외됨

   SQL> alter tablespace 테이블스페이스명 read write ;

 

4. Online/Offline

   SQL> alter tablespace 테이블스페이스명 online;

   SQL> alter tablespace 테이블스페이스명 offline;

 

5. Drop

   SQL> drop tablespace 테이블스페이스명;

   SQL> drop tablespace 테이블스페이스명 including contents cascade;

   SQL> drop tablespace 테이블스페이스명 including contents cascade constraints;
   SQL> DROP TABLESPACE TBS1 INCLUDING CONTENTS AND DATAFILES;

        - (9i~) 데이타파일도 함께 삭제

 

6. LMT to DMT/DMT to LMT

   - 8.1.5는 LMT에서 DMT로 변환만이 가능
   - 8.1.6 이상부터 LMT와 DMT 상호변환 가능
   - 테이블스페이스의 Segment Management가 Auto로 되어 있거나 Compress되어 있으면
     테이블스페이스 마이그레이션이 되지 않음
   SQL> EXECUTE DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_FROM_LOCAL('테이블스페이스명');

   SQL> EXEC DBMS_SPACE_ADMIN.TABLESPACE_MIGRATE_TO_LOCAL('테이블스페이스명');

 

7. 온라인(HOT) 백업

   SQL> ALTER TABLESPACE 테이블스페이스명 BEGIN BACKUP;
        테이블스페이스에 속하는 데이터파일들 cp 명령어 또는 dd 명령어로 복사
   SQL> ALTER TABLESPACE 테이블스페이스명 END   BACKUP;

 

8. 데이터파일이 손상되었을 때 데이터파일 offline drop 후 복구
   SQL> alter database datafile '/data01/데이터파일명' offline drop;

   - 해당 테이블스페이스 온라인 백업 불가

 

9. 데이터파일에 사용하는 세그먼트가 없을 경우 해당 데이터파일 DROP 가능
   SQL> alter tablespace drop datafile '/data01/데이터파일명';

 

10. 사용량/사용율 조회

    SQL> SELECT A.TABLESPACE_NAME,
                SUM(A.BYTES)/1024                                       AS "TOTAL(KB)",
                SUM(A.BYTES)/1024 - NVL(SUM(SZ_KB),0)                   AS "USED(KB)",
                NVL(SUM(SZ_KB),0)                                       AS "FREE(KB)",
                NVL(( 1. - SUM(SZ_KB)/(SUM(A.BYTES)/1024.) ) * 100,100) AS "USED RATIO(%)"
           FROM DBA_DATA_FILES A,
                ( SELECT FILE_ID  ,
                         SUM(BYTES)/1024. AS SZ_KB
                    FROM DBA_FREE_SPACE
                   GROUP BY FILE_ID
                ) B
          WHERE A.FILE_ID = B.FILE_ID(+)
          GROUP BY A.TABLESPACE_NAME;

 

Posted by redkite
, |

[Oracle] DB 관리 쿼리

 

#### system 계정으로 로그인해서

# 테이블스페이스 이름 보기
select ts#,rfile#,name from v$datafile order by ts#

# user별 테이블스페이스 정보 보기
select username,password,default_tablespace,temporary_tablespace from dba_users

# 테이블스페이스 만들기
create tablespace spaceName
datafile '/oracle/oradata/data.dbf' size 200m
default storage
(initial 1m next 1m
minextents 1 maxextents unlimited pctincrease 0);

# 테이블 스페이스 자동증가 on
alter database datafile '/oracle/oradata/data.dbf' autoextend on;

# 사용자 만들기
create user userName identified by password default tablespace spaceName temporary tablespace tempSpaceName

# 권한 만들기
create role roleName;
grant create session, create table, create view, create synonym to roleName;

# 권한 부여
grant roleName to userName

# Resource 부여
grant resource to userName

# import
imp userid=system/manager file=xxx.dmp fromuser=aaa touser=aaa full=n commit=y ignore=y log=logfile.log

#### 해당 user로 로그인해서

# data space 사용량 조회
select table_name,tablespace_name from user_tables;
select index_name,table_name,tablespace_name from user_tables;
select segment_name,tablespace_name,sum(bytes) from user_extents
where segment_type='TABLE' group by segment_name,tablespace_name;
select segment_name, sum(bytes) from user_extents
where segment_type='TABLE' group by segment_name

Posted by redkite
, |

### 로그파일 추가시

1. 먼저 Dummy 그룹 추가
alter database add logfile group 3 '/data/oradata/redoo4.log' size 50m;


2. 변경할 그룹 inactive 상태로 만들기
alter system switch logfile;


3. Inactive 상태가 됐는지 확인
select * from v$log;
select * from v$logfile;


4. 그룹 삭제
alter database drop logfile group 1;


5. 로그 그룹 추가
alter database add logfile group 1 ('/data/oradata/redo01a.log','/data/oradata/redo01b.log','/data/oradata/redo01c.log','/data/oradata/redo01d.log','/data/oradata/redo01e.log') size 524288000;
alter database add logfile group 2 ('/oracle/oradata/ESMDB/redo02a.log','/oracle/oradata/ESMDB/redo02b.log','/oracle/oradata/ESMDB/redo02c.log','/oracle/oradata/ESMDB/redo02d.log','/oracle/oradata/ESMDB/redo02e.log') size 524288000;

Posted by redkite
, |

▶ SYSMAN 이란?
SYSMAN
By default during the installation of Oracle Enterprise Manager, one Super Administrator account is created with the user name of SYSMAN. The SYSMAN account should be used to perform infrequent system-wide, global configuration tasks such as setting up the environment. Other administrator accounts can be created for daily administration work. The SYSMAN account is:
Owner of the Management Repository schema
Default Enterprise Manager Super Administrator
User name used to log in to Enterprise Manager the first time
10g 설치시 EM이 설치되는데 EM의 최고권리자 계정으로 생성되는 계정입니다.
. Reopsitory 스키마의 관리를 하는 계정입니다.
. EM의 최고권리자입니다.
. EM 으로 가장 처음 로그인 가능한 유저입니다.


▶ DBSNMP 이란?
. grid control 에서 각 DB의 연결정보 등을 담당하는 계정입니다.
. DBSNMP를lock 시킬경우 Grid Control 및 EM 사용 못합니다.


▶ MGMT_VIEW 이란?
. SYSMAN/EM 관련계정입니다.
3가지 모두 EM과 관리된 계정들로EM을 사용하신다면 lock 하시면 안되고
EM을 사용안하신다면 보안성때문에 lock을 하는 싸이트도 있습니다.

Posted by redkite
, |

1. 프로세스 모니터링

1) 서버 프로세스
SELECT sid, serial#, username, status "Status of Session", server "ServerType", osuser, machine, program, process FROM v$session;
2) 사용자 프로세스
SELECT sid, serial#, osuser, process, machine, program, to_char(logon_time, 'yyyy/mm/dd hh:mi:ss') as Logon_Time FROM v$session WHERE (upper(server) <> 'PSEUDO' AND UPPER(program) NOT LIKE 'oracle.exe%') and serial# <> 1;

2. SGA 모니터링

1) Data Buffer Cache 구조
SELECT id, name, block_size, buffers FROM v$buffer_pool;

2) 히트율
SELECT phy.value "Physical Read",cur.value+con.value "Buffer Cache Read", (1-((phy.value) / (cur.value+con.value)))*100 "히트율" FROM v$sysstat cur, v$sysstat con, v$sysstat phy WHERE cur.name = 'db block gets' and con.name = 'consistent gets' and phy.name = 'physical reads';
3) Wait Status 확인
SELECT (SELECT total_waits FROM v$system_event WHERE event = 'free buffer waits') "Free Buffer Waits", (SELECT total_waits FROM v$system_event WHERE event = 'buffer busy waits') "Buffer Busy Waits" FROM dual;
4) 메모리 사용상태(세션별)
SELECT A.process, A.username, B.block_gets, B.consistent_gets, B.physical_reads FROM v$sess_io B, v$session A WHERE B.sid = A.sid;

3. 로그 버퍼 히트율 모니터링

SELECT S1.value "Redo Alloc Retries", S2.value "Redo Entries", S1.value / S2.value * 100 "히트율" FROM v$sysstat S1, v$sysstat S2 WHERE S1.name = 'redo buffer allocation retries' AND S2.name = 'redo entries';

4. Shared Pool 모니터링

1) 히트율
SELECT Gets, Gethits, Gethitratio*100 "히트율"FROM v$Librarycache WHERE namespace = 'SQL AREA';

2) Reload 상태
SELECT SUM(pins) "Executions(PINS)", SUM(reloads) "Cache Misses(RELOADS) " , SUM(reloads) / SUM(pins)*100 "Reload" FROM v$Librarycache;
3) Reserved Pool(응답상태)
SELECT requests, request_misses, request_failures, free_space, avg_free_size, max_free_size, used_space,avg_used_size FROM v$shared_pool_reserved;
4) Parsing SQL문 상태
SELECT cpu_time, elapsed_time,executions, loads, invalidations, version_count, parse_calls, sorts, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN (2,3,6,7) AND rownum <= 200 ORDER BY sql_text DESC;
5) 파싱 SQL문(메모리순)
SELECT buffer_gets, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN(2,3,6,7) ORDER BY buffer_gets DESC;
6) 파싱 SQL문(I/O순)
SELECT disk_reads, sql_text FROM v$sqlarea WHERE sql_text NOT LIKE '%$%' AND command_type IN(2,3,6,7) ORDER BY disk_reads DESC;
7) Shard Pool 히트율
SELECT SUM(gets) " Gets", SUM(getmisses) "Cache Get Misses", SUM(getmisses)/SUM(gets)*100 "히트율" FROM v$rowcache;

5. Large Pool 메모리 상태

SELECT pool, name, bytes FROM v$sgastat WHERE pool = 'large pool';

6. 프로세스 상태

1) DBWR 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%DB%';
2) DBWR 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'free buffer waits';

3) CKPT 정보

SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%CKPT%';
4) CKPT 대기상태
SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event LIKE 'log file switch (checkpoint%';
5) LGWR 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%LGWR%';
6) LGWR 대기상태
SELECT sid, event, seconds_in_wait, state FROM v$session_wait WHERE event = 'log buffer space%';
7) PMON 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%PMON%';
8) PMON 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'pmon timer';
9) SMON 정보
SELECT spid, program, username, serial#, terminal FROM v$process WHERE program LIKE '%SMON%';
10) SMON 대기상태
SELECT event, total_waits, total_timeouts, time_waited, average_wait FROM v$system_event WHERE event = 'smon timer';

7. 데이터 파일 상태

1) Data-File 구조
SELECT B.file_id "File #", B.file_name, B.tablespace_name, B.bytes "Bytes", ((B.bytes - sum(nvl(A.bytes,0)))) "Used Space", (SUM(NVL(A.bytes,0))) "Free Space", (SUM(NVL(A.bytes,0)) / (B.bytes)) * 100 "FreeSpace Ratio" FROM sys.dba_free_space A, sys.dba_data_files B WHERE A.file_id(+) = B.file_id GROUP BY B.tablespace_name, B.file_id, B.file_name, B.bytes ORDER BY B.file_id;
2) Disk I/O 상태
select name, phyrds, phywrts FROM v$datafile DF, v$filestat FS WHERE DF.file# = FS.file#;
3) Object 종류
SELECT A.owner, A.object_id, A.object_name, B.partition_name, B.tablespace_name, B.bytes, B.blocks, B.extents, B.initial_extent, B.next_extent, B.min_extents, B.max_extents, B.pct_increase, B.freelists, B.relative_fno, B.buffer_pool, A.created, A.status FROM dba_objects A, dba_segments B WHERE A.owner = 'SCOTT' AND A.object_type = 'TABLE' ORDER BY A.object_name;
4) 롤백세그먼트 경합상태
SELECT SUM(waits) "Waits", SUM(gets) "Gets", 100 * SUM(waits)/SUM(gets) "히트율" FROM v$rollstat;
5) 롤백세그먼트 대기상태
SELECT (SELECT count FROM v$waitstat WHERE class = 'undo header') "Undo Header", (SELECT count FROM v$waitstat WHERE class = 'undo block') "Undo Block", (SELECT count FROM v$waitstat WHERE class = 'system undo header') "System Undo Header", (SELECT count FROM v$waitstat WHERE class = 'system undo block') "System Undo block" FROM dual;

6) Temp 세그먼트 경함상태
SELECT username, user, contents, segtype, extents, blocks FROM v$sort_usage;
7) Lock 상태(Holder & Waiter)
SELECT LPAD(' ',DECODE(request,0,0,1))||sid sess, id1, id2, lmode, request, type FROM v$lock WHERE id1 IN (SELECT id1 FROM v$lock WHERE lmode = 0) ORDER BY id1, request;
8) Lock 상태(Waiters)
SELECT LPAD(' ',DECODE(C.request,0,0,1))||C.sid sess, B.username, B.program, C.type, A.sql_text SQL FROM v$sqlarea A,v$session B, v$lock C, v$access D WHERE C.id1 IN (SELECT id1 FROM v$lock WHERE lmode = 0 OR lmode = 6) AND A.address(+) = B.sql_address AND A.hash_value(+) = B.sql_hash_value AND B.sid = D.sid AND B.sid = C.sid AND D.sid = C.sid AND D.owner != 'SYS' ORDER BY C.id1, C.request;
9) DB 사용자
SELECT username, default_tablespace, temporary_tablespace, account_status, expiry_date, lock_date, profile FROM dba_users;

8. Control 파일 구조

SELECT * FROM v$controlfile;

9. 리두로그 파일확인

1) 파일 구조
SELECT A.group# col1, bytes / 1024 col2, members col3, member col4 , A.status col5, sequence# FROM v$log A, v$logfile B WHERE A.group# = B.group#;
2) 대기 상태
SELECT event, total_waits, time_waited, average_wait FROM v$system_event WHERE event LIKE 'log file switch completion%';

10. 아카이브로그 확인

1) 로그 설정 상태
SELECT value FROM v$parameter WHERE name = 'log_archive_start';

2) 아카이브 파일
SELECT name, sequence#, first_change#, first_time, next_change#, next_time, archived, status FROM v$archived_log;

11. 파라메터 확인

SELECT name, type, value, isdefault FROM v$parameter;

Posted by redkite
, |

ALTER PROFILE "DEFAULT" LIMIT
SESSIONS_PER_USER UNLIMITED
CPU_PER_SESSION UNLIMITED
CPU_PER_CALL UNLIMITED
CONNECT_TIME UNLIMITED
IDLE_TIME UNLIMITED
LOGICAL_READS_PER_SESSION UNLIMITED
LOGICAL_READS_PER_CALL UNLIMITED
COMPOSITE_LIMIT UNLIMITED
PRIVATE_SGA UNLIMITED
FAILED_LOGIN_ATTEMPTS 10
PASSWORD_LIFE_TIME UNLIMITED
PASSWORD_REUSE_TIME UNLIMITED
PASSWORD_REUSE_MAX UNLIMITED
PASSWORD_LOCK_TIME UNLIMITED
PASSWORD_GRACE_TIME UNLIMITED
PASSWORD_VERIFY_FUNCTION NULL;

비밀번호 관리

암호관리란?

더 뛰어난 데이터베이스 보안을 위해서 관리자가 프로파일로 오라클 암호를 관리 제어 할 수 있는 기능을 말합니다.

암호관리의 기능

- 계정 잠금(Accont locking) : 계정잠금 이란 사용자가 지정된 시도 횟수 내에 시스템에 로그인하지 못한 경우 자동적으로 계정을 잠그는 기능을 말합니다.

- 암호의 노화(aging)와 기간 만료(expire) : 암호가 수명을 갖도록 하여 그 기간이 지나면 암호를 변경 하도록 설정하는 기능 입니다.

- 암호의 현재까지의 기록(Password history) : 암호를 검사하여 지정된 시간 동안이나 지정된 횟수 이상 사용되지 않도록 설정 할 수 있습니다.

- 암호의 복잡성 검증(Password complexity verification) : 추측된 암호를 사용하지 못하도록 암호를 충분히 복잡하게 설정 할 수 있는 기능 입니다.

암호관리를 사용하는 방법

- 프로파일을 사용자에게 지정하여 암호관리를 설정 합니다.

- CREATE USER나 ALTER USER 명령을 사용하여 계정을 잠그거나 잠금을 해제하고 기간을 만료 할 수 있습니다.

- 인스턴스의 RESOURCE_LIMIT가 FALSE로 설정되어 있더라도 암호제한은 항상 시행 됩니다.

- 자원 제한 설정과 비슷하게 CREATE나 ALTER USER 명령을 사용하여 암호 설정을 제한하도록 프로파일을 생성하여 사용자에게 지정할 수 있습니다.

- SESSIONS_PER_USER 같은 다른 제한들은 초기화 파라미터나 ALTER SYSTEM 명령으로 자원 제한이 enable되어 있을 때에만 시행되는 반면, 프로파일의 암호 설정은 항상 시행 됩니다.

- 암호 관리가 enable되면 사용자 계정은 CREATE USER나 ALTER USER 명령을 사용하여 잠그거나 잠금을 해제할 수 있습니다.

암호 설정 방법

아래와 같이 프로파일을 생성 하고 그 프로파일을 암호설정을 적용할 유저에게 부여하면 됩니다.

 

SQL> CREATE PROFILE scott_password

LIMIT FAILED_LOGIN_ATTEMPTS 3 ---> 로그인 실패 횟수

PASSWORD_LIFE_TIME 30 ---> 기간만료일

PASSWORD_REUSE_TIME 30 ---> 암호가 재사용 될 때까지의 날 수

PASSWORD_VERIFY_FUNCTION verify_function ---> 복합성 검사를 수행할 PL/SQL

PASSWORD_GRACE_TIME 5 ; ---> 유예기간

 

암호 설정 관련 파라미터

Parameter

설 명

FAILED_LOGIN_ATTEMPTS
[계정잠금]

계정을 잠그기 전까지 로그인 시도하다 실패한 횟수.

오라클 서버는 FAILED_LOGIN_ATTEMPTS 값에 도달하면 자동적으로 계정을 잠근다.

계정은 지정된 시간(PASSWORD_LOCK_TIME)이 지난 후 자동적으로 잠금이 해제되거나 데이터베이스 관리자가 ALTER USER 명령으로 잠금을 해제해야 한다.

데이터베이스 계정은 ALTER USER 명령을 사용하여 명시적으로 잠글수도 있는데 이렇게 하면 계정은 자동적으로 잠금 해제되지 않는다

PASSWORD_LOCK_TIME
[계정잠금]

암호가 기간 만료되어 계정이 잠겨진 채로 남아 있었던 날 수

PASSWORD_LIFE_TIME
[노화와 기간만료]

날 수로 표시한 암호의 수명으로 이 기간이 지나면 기간 만료됨

PASSWORD_GRACE_TIME
[노화와 기간만료]

암호가 기간 만료된 후 첫번째 성공적인 로그인부터 암호 변경을 할 때까지의 유예기간

PASSWORD_REUSE_TIME
[현재까지의 기록]

암호가 재사용 될 때까지의 날 수

PASSWORD_REUSE_MAX
[현재까지의 기록]

암호가 재사용 될 수 있는 최대 회수

PASSWORD_VERIFY_FUNCTION
[복합성 검증]

암호를 할당 하기 전 복합성 검사를 수행할 PL/SQL 함수

암호 노화(Aging) 기간 만료

- PASSWORD_LIFE_TIME 파라미터는 패스워드의 수명을 설정 합니다. 이 기간이 지나면 암호를 변경해야 합니다.

- 데이터베이스 관리자는 유예 기간(PASSWORD_GRACE_TIME)을 지정할 수 있습니다. 이 기간은 암호가 기간 만료된 후 데이터베이스에 처음 접속한 때부터 시작 됩니다.

- 유예 기간이 끝날 때까지는 사용자가 매번 접속하려 할 때마다 경고 메시지가 발생 하며, 사용자는 유예 기간 내에 암호를 변경해야 합니다. 암호가 변경되지 않으면 계정은 잠깁니다.

- 암호를 기간 만료된 것으로 명시적으로 설정하면 사용자의 계정 상태는 EXPIRED로 변경됩니다. 이렇게 되면, 사용자가 로그인 할 때 계정은 유예 기간으로 넘어 갑니다.

암호의 현재까지의 기록

- 암호의 현재까지의 기록은 사용자가 지정된 기간 동안 암호를 재사용하지 못하게 합니다. 아래의 한 가지 방법으로 구현할 수 있습니다.

- PASSWORD_REUSE_TIME : 주어진 날 수 동안 암호를 재사용할 수 없도록 지정.

- PASSWORD_REUSE_MAX : 예전에 사용한 암호와 동일한 것을 사용하지 못하도록 시행.

Password Verification Function VERIFY_FUNCTION

- 사용자에게 암호를 할당하기 전에 암호의 유효성을 검증 할 수 있습니다.

- 암호의 최소길이는 네문자 입니다.

- 암호는 사용자 이름과 같아서는 안된다.

- 암호는 최소한 하나의 알파벳,하나의 수자,그리고 하나의 특수 문자를 가져야한다.

- 암호는 예전에 사용했던 암호와 최소한 세문자는 달라야한다.

- utlpwdmg.sql 스크립트에 의해 VERIFY_FUNCTION이라는 디폴트 PL/SQL 함수 형태로 제공되며 반드시 SYS 스키마에서 실행되어야 합니다.

- 디폴트 profile의 PASSWORD_VERIFY_FUNCTION 기능을 사용하지 않으려면 아래의 명령어를 실행하면 됩니다.

 

SQL> ALTER PROFILE DEFAULT LIMIT PASSWORD_VERIFY_FUNCTION NULL;

 

계정 잠금과 암호 제어(Controlling Account Lock and Password)

ALTER USER 명령을 사용하여 암호를 변경하고 계정을 잠글 수 있습니다. 이와 같은 작업이 필요한 경우는 다음과 같습니다.

  • - 사용자가 암호를 잃어버려서 암호를 재설정하고자 할 때
  • - 시스템에 의해 잠겨진 사용자 계정을 풀 때
  • - 계정을 명시적으로 잠글 때
  • - 수동으로 암호를 만료되게 할 때, 사용자 암호를 재설정할 때 유용합니다.

암호 만료후 재설정 문법

 

ALTER USER user

[ IDENTIFIED {BY password | EXTERNALLY } ]

[ PASSWORD EXPIRE ]

[ ACCOUNT { LOCK | UNLOCK } ] ;

 

암호 만료후 재설정 예제

 

SQL> ALTER USER scott

IDENTIFIED BY puhaha

PASSWORD EXPIRE ;

 

사용자가 로그인한 상태라면 암호 변경, 만료, 잠금은 현재의 세션에는 영향을 주지 않습니다. 사용자 계정이 잠겨져 있는데 접속하려 하면 아래와 같은 메세지가 출력 됩니다

 

ERROR:

ORA-28000: the account is locked

Warning: You are no longer connected to ORACL

 

Posted by redkite
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함