Download presentation
Presentation is loading. Please wait.
1
실전 데이터모델링 & 데이터베이스 설계와 구축
(12.데이터베이스 관리)
2
12. 데이터베이스 관리
3
▶데이터베이스 기동 - 1 데이터베이스 기동 3 단계
NOMOUNT : 인스턴스만 시작된 상태, 주로 오라클 데이터베이스 생성할 때의 상태 MOUNT : 인스턴스에 대한 컨트롤 파일을 시스템이 읽은 상태 OPEN : 인스턴스에 대한 모든 파일을 읽고 모든 유저가 데이터베이스를 사용
4
▶데이터베이스 기동 - 2 1단계: NOMOUNT -데이터베이스의 파라미터 파일을 읽는다.
-Trace 파일 및 Alert 파일을 연다. 생성 정보를 alert<SID>.log 파일에 기록한다. -SGA(System Global Area)를 할당한다. -백그라운드 프로세스 생성 -데이터베이스는 생성된 메모리 구조화 프로세스들과 아직 연결되지 않은 상태이 다. SQL> STARTUP NOMOUNT pfile=C:\oracle\database\initora.ora
5
▶데이터베이스 기동 - 3 2단계: MOUNT -컨트롤 파일의 정보를 읽어서 디스크에 데이터 파일이나 리두로그 파일 등이 올바로 존재하는지 도한 각 파일이 현재 사용가능한지를 점검한다. -데이터베이스의 백업이나 복구 시점에 많이 이용된다. 데이터 파일이나 로그 파일에 문제가 발생하여 데이터베이스가 시작되지 않는다면 이 단계에서 복구 작업을 수행한 이후에 데이터베이스를 기동한다. -데이터 파일명 변경, 리두로그 파일 추가, 삭제, 이름 변경, 아카이브 모드 옵션의 변경, 전체 데이터베이스의 복구, 백업하여 데이터베이스 재생성, 불완전 데이터베이스 복구 등이 가능하다. -MOUNT 단계에서는 일반 사용자가 데이터베이스에 접속할 수 없다. SQL> STARTUP MOUNT
6
▶데이터베이스 기동 - 4 3단계: OPEN -컨트롤 파일에 기술된 모든 데이터 파일 및 리두로그 파일 등을 연다.
-일반 사용자가 데이터베이스를 이용할 수 있는 상태이다. -만약 종료 시점에 테이블 스페이스가 오프라인이었으면 데이터베이스를 기동하여도 해당 테이블 스페이스는 오프라인 상태이다. -인스턴스가 데이터베이스를 연 이후에나 하나 이상의 롤백 세그먼트를 확보한다. SQL> ALTER DATABASE OPEN;
7
▶데이터베이스 기동 - 5 윈도우 환경에서 데이터베이스 기동 방법 - 서비스 관리자에서…
8
▶데이터베이스 기동 - 6 윈도우 환경에서 데이터베이스 기동 방법 - 명령어로…
9
▶데이터베이스 기동 - 7 데이터베이스 기동 시 에러 메시지 ORA-12560 에러 발생
원인: OracleServiceORCL이 정지되어 있는 상태에서 오라클 접속 해결 방법: 관리 도구의 서비스에서 OracleServiceORCL을 시작하거나 명령어로 오라클 데이터베이스를 시작한다.
10
▶데이터베이스 종료 - 1 데이터베이스 종료 4가지 방법
11
▶데이터베이스 종료 - 2 데이터베이스 종료 4가지 방법 NORMAL -정상적인 데이터베이스 종료 방법이다.
-새로운 데이터베이스 연결은 더 이상 허락하지 않는다. -현재 사용자들의 세션이 종료될 때까지 기다린다. -다음 데이터베이스 기동 시 별도의 복구 작업이 필요하지 않다. TRANSACTIONAL -모든 클라이언트가 특정 인스턴스에서 새로운 트랜잭션을 시작할 수 없다. -클라이언트의 진행 중인 트랜잭션이 모두 종료될 때까지 기다린다.
12
▶데이터베이스 종료 - 3 데이터베이스 종료 4가지 방법 IMMEDIATE
-데이터베이스를 관리할 때 가장 많이 사용하는 정지 옵션이다. -현재 커밋되지 않은 SQL 문은 롤백시킨다. 만약 데이터베이스 롤백 정보가 많다면 데이터베이스가 정지하는데 시간이 많이 소요된다. -데이터베이스에 접속한 사용자가 접속을 해제하기를 기다리지 않는다. -잘못된 어플리케이션에 의해 부득이 데이터베이스를 정지시켜야 하는 경우에 사용된다. -다음 데이터베이스 기동 시 별도의 복구 작업이 필요하지 않으나, 해당 시점에 작업하였던 부분이 롤백되었으면 다시 실행하여야 한다. ABORT -트랜잭션에 대해 정리되지 않으므로 일반적으로 사용하지 않는 옵션이다. -현재 연결된 모든 세션을 강제로 종료시킨다. -커밋되지 않은 트랜잭션은 롤백도 되지 않는다. -백업과 복구 작업이 필요한 경우에 사용한다. -다음 데이터베이스 기동 시 별도의 복구 작업이 필요하다.
13
▶데이터베이스 종료 - 4
14
▶유용한 데이터베이스 모니터링 스크립트 교재 514 – 536의 데이터베이스 모니터링 스크립트는 직접 실습해보시기 바랍니다.
15
점검 주기 내 용 매일 매주 매월 ▶데이터베이스 운영 시 정기적으로 점검해야 할 사항 인스턴스 기동 확인 로그 확인 백업확인
Thomas B.Cox의 데이터베이스 운영 시점에서 점검해야 할 사항 점검 주기 내 용 매일 인스턴스 기동 확인 로그 확인 백업확인 아카이브 로그 파일 백업 확인 리소스 존재 확인 매뉴얼 탐독 매주 오브젝트 확인 보안관리 확인 네트워크 확인 Alert 로그 파일 확인 매월 비이상적인 현상 확인 튜닝 대상 확인 I/O 경합 존재 확인 단편화(fragmentation) 현상 확인
16
매일 점검해야 할 항목 - 1 모든 데이터베이스 인스턴스가 기동되었는지 확인한다. Alert 로그를 확인한다.
-BDUMP에 있는 로그 파일을 확인하여 최신 상태의 로그인지 확인한다. -ORA-에러가 존재한다면 데이터베이스 복구 로그에 기록하고 에러에 대해 추적한다. 데이터베이스가 성공적으로 백업되었는지 확인한다. 데이터베이스의 아카이브 로그 파일이 성공적으로 테이프에 백업되었는지 확인한다. 데이터베이스 성능을 위해 충분한 리소스가 존재하는지 확인한다. -테이블 스페이스에 충분한 공간이 있는지 확인한다. -롤백 세그먼트를 확인한다. -고도하게 증가한 세그먼트가 존재하는지 확인한다. -스페이스-바운드 오브젝트를 식별한다. -CPU, 메모리, 디스크 리소스가 충분한지 확인한다.
17
매일 점검해야 할 항목 - 2 데이터베이스를 위해 충분한 리소스가 존재하는지 확인
- 테이블 스페이스에 충분한 공간이 있는지 확인 SELECT TABLESPACE_NAME, SUM(BLOCKS) AS FREE_BLK, TRUNC(SUM(BYTES)) / (1024*1024)) AS FREE_M, MAX(BYTES) / (1024) AS BIG_CHUNK_K, COUNT(*) AS NUM_CHUNKS FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME 데이터베이스를 위해 충분한 리소스가 존재하는지 확인 - 테이블 스페이스에 남아있는 공간의 비율 확인 SELECT TABLESPACE_NAME, MAX_BLOCKS, COUNT_BLOCKS, SUM_FREE_BLOCKS TO_CHAR(100*SUM_FREE_BLOCKS/SUM_ALLOC_BLOCKS, ’99.99’) || ‘%’ AS PCT_FREE FROM (SELECT TABLESPACE_NAME, SUM(BLOCKS) AS SUM_ALLOC_BLOCKS FROM DBA_DATAFILES GROUP BY TABLESPACE_NAME), (SELECT TABLESPACE_NAME AS FS_TS_NAME, MAX(BLOCKS) AS MAX_BLOCKS, COUNT(BLOCKS) AS COUNT_BLOCKS, SUM(BLOCKS) AS SUM_FREE_BLOCKS FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) WHERE TABLESPACE_NAME = FS_TS_NAME
18
매일 점검해야 할 항목 - 3 롤백 세그먼트를 확인한다. -롤백 세그먼트를 사용하기 위해서는 상태가 ONLINE
-각 데이터베이스의 롤백 세그먼트에 대한 이름과 현재 상태에 대해 기술 -V$ROLLSTAT에서 정보를 조회하여 각각의 롤백 세그먼트가 ONLINE, FULL 인지를 조회 -모든 롤백 세그먼트에 대한 스토리지 파라미터와 이름에 대해 DBA_ROLLBACK_SEGS에서 조회 COL TODAY FROMAT A20 NEW_VALUE CURR_TIME COL TODAY NOPRINT SELECT TO_CHAR(SYSDATE, ‘YYYY/MM/DD HH24:MI:SS’) TODAY FROM DUAL; PROMPT ============================================ PROMPT == ROLLBACK SEGMENT STORAGE AND STATUS == PROMPT => DATE : [&CURR_TIME ] SET LINESIZE 120 COL RB_SEG FORMAT A10 COL STATUS FORMAT A10 COL TBS_NM FORMAT A10 COL INI_KB FORMAT 9,999,999 COL NXT_KB FORMAT 9,999,999 COL TOT_KB FORMAT 9,999,999 COL EXT FORMAT COL XT FORMTA 99 SELECT A.SEGMENT_NAME AS RB_SEG, A.STATUS, C.XACTS AS XT, B.INITIAL_EXTENT/1024 AS INI_KB, B.NEXT_EXTENT/1024 AS NXT_KB, B.EXTENTS AS EXT, B.BYTES/1024 AS TOT_KB, A.TABLESPACE_NAME AS TBS_NM FROM DBA_ROLLBACK_SEGS A, DBA_SEGMENTS B, V$ROLLSTAT C WEHRE A.OWNER = B.OWNER AND A.SEGMENT_NAME = B.SEGMENT_NAME AND A.SEGMENT_ID = C.USN ORDER BY A. SEGMENT_NAME;
19
매일 점검해야 할 항목 - 4 과도하게 증가한 세그먼트가 존재하는지 확인한다. 일자별로 스토리지 크기에 대한 정보 수집
BEGIN DBMS_UTITITY.ANALYZE_SCHEMA(‘&OWNER’, ‘ESTIMATE’, NULL, 5); END 현재 EXTENDS 되는 정보를 검색 SELECT E.OWNER, E.SEGMENT_TYPE, E.SEGMENT_NAME, COUNT(*) AS NR_EXTENTS, S.MAX_EXTENTS, TO_CHAR( SUM(E.BYTES) / (1024*1024), ‘999,999.90) AS MB FROM DBA_EXTENTS E, DBA_SEGMENTS S WHERE E.SEGMENT_NAME=S.SEGMENT_NAME GROUP BY E.OWNER, E.SEGMENT_TYPE, E.SEGMENT_NAME, S.MAX_EXTENTS HAVING COUNT(*) > &THRESHOLD OR ((S.MAX_EXTENTS-COUNT(*)) < &&THRESHOLD) ORDER BY COUNT(*) DESC
20
매일 점검해야 할 항목 - 5 스페이스-바운드 오브젝트를 식별한다.
-스페이스-바운드 오브젝트는 테이블 스페이스에서 제공하는 가장 큰 EXTENTS보다 크게 NEXT_EXTENTS가 발생된다. 만약 스페이스-바운드 오브젝트가 존재하면 성능이 저하된다. -ALTER TABLESPACE <tablespace> COALESCE 명령을 사용 -데이터 파일을 테이블 스페이스에 추가하여 사용 SELECT A.TABLE_NAME, A.NEXT_EXTENT, A.TABLESPACE_NAME FROM ALL_TABLES A, (SELECT TABLESPACE_NAME, MAX(BYTES) AS BIG_CHUNK FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME) F WHERE F.TABLESPACE_NAME = A.TABLESPACE_NAME AND A. NEXT_EXTENT > F.BIG_CHUCK
21
매일 점검해야 할 항목 - 6 CPU, 메모리, 디스크 리소스가 충분한지 확인한다.
내용을 모니터링
22
주 단위로 점검해야 할 항목 - 1 잘못된 규칙에 의해 오브젝트가 존재하는지 확인한다.
-존재하는 EXTENDS를 체크한다. 주어진 테이블 스페이스 내에서 모든 오브젝트들은 똑같은 크기로 NEXT_EXTENT가 생성되어야 한다. -모든 테이블은 유일한 PK를 가져야 한다. PK의 누락 여부를 확인한다. -PK가 비활성화되어 있는지 확인한다. -PK의 인덱스는 유일해야 한다. PK의 인덱스가 유일한지 확인한다. -모든 인덱스들이 인덱스 테이블 스페이스를 이용하는지 확인한다. -데이터 타입의 일관성과 다른 오브젝트들의 일관성을 체크한다. 보안 관리가 잘 유지되고 있는지 확인한다. Net8($ORACLE_HOME/NETWORK/log)에 관련된 로그는 에러나 이슈 사항이 없었는지 확인한다. -클라이언트 쪽의 SQLNET.log 파일에 이상이 없는지 확인한다. -서버 쪽의 LISTENER.log 파일에 이상이 없는지 확인한다. 모든 Alert 로그 파일을 보관한다.
23
주 단위로 점검해야 할 항목 - 2 -존재하는 EXTENDS를 체크한다.
주어진 테이블 스페이스 내에서 모든 오브젝트들은 똑같은 크기로 NEXT_EXTENT가 생성된다. NEXT_EXTENT를 확인 SELECT SEGMENT_NAME, SEGMENT_TYPE, DT.TABLESPACE_NAME, DS.NEXT_EXTENT FROM DBA_TABLESPACES DT, DBA_SEGMENT DS WHERE DT.TABLESPACE_NAME = DS.TABLESPACE_NAME AND DT.NEXT_EXTENT !=DS.NEXT_EXTENT AND DS.OWNER = ‘&OWNER’ 존재하는 EXTENTS를 체크한다. SELECT COUNT(*), SEGMENT_NAME, SEGMENT_TYPE, DT.TABLESPACE_NAME FROM DBA_TABLESPACE DT, DBA_EXTENTS DX WHERE DT.TABLESPACE_NAME = DX.TABLESPACE_NAME AND DT.NEXT_EXTENT != DX.BYTES AND DX.OWNER = ‘&OWNER’ GROUP BY SEGMENT_NAME, SEGMENT_TYPE, DT.TABLESPACE_NAME
24
주 단위로 점검해야 할 항목 - 3 모든 테이블은 유일한 PK를 가져야 한다. PK가 누락되어 있는지 확인한다.
SELECT TABLE_NAME FROM ALL_TABLES WHERE OWNER = ‘&OWNER’ MINUS FROM ALL_CONSTRAINTS WHERE OWNER = ‘&&OWNER’ AND CONSTRAINT_TYPE = ‘P’ -PK가 비활성화되어 있는지 확인한다. SELECT OWNER, CONSTRAINT_NAME, TABLE_NAME, STATUS FROM ALL_CONSTRIANTS WHERE OWNER = ‘&OWNER’ AND STATUS = ‘DISABLED’ AND CONSTRIANT_TYPE = ‘P’
25
주 단위로 점검해야 할 항목 - 4 -모든 PK의 인덱스는 유일해야 한다. PK의 인덱스가 유일한지 확인한다.
SELECT INDEX_NAME, TABLE_NAME, UNIQUENESS FROM ALL_INDEXES WHERE INDEX_NAME LIKE ‘&PKNAME%’ AND OWNER = ‘&OWNER’ AND UNIQUENESS = ‘NONUNIQUENESS’ -모든 인덱스들은 인덱스 스페이스를 이용해야 한다. 테이블이 변경되고 인덱스가 변경되는 과정에서 인덱스가 인덱스 테이블 스페이스에 존재하지 않고 테이블 스페이스에 존재하는 경우가 발생한다. 이러한 인덱스를 조사하여 테이블 스페이스로 옮기는 작업을 한다. SELECT ‘ALTER INDEX’ || INDEX_NAME || ‘REBUILD’, ‘TABLESPACE INDEXES STORAGE (INITIAL 256K NEXT 256K);’ FROM ALL_INDEXES WHERE (TABLESPACE_NAME != ‘INDEXES’ OR NEXT_EXTENT != (256 * 1024) ) AND OWNER = ‘&OWNER’
26
주 단위로 점검해야 할 항목 - 5 -데이터 타입의 일관성을 체크한다. -오브젝트의 일관성을 체크한다.
SELECT TABLE_NAME, COULUM_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE FROM ALL_TAB_COLUMNS -- 테스트 환경 WHERE OWNER = ‘&OWNER’ MINUS FROM -- 운영 환경 ORDER BY TABLE_NAME, COLUMN_NAME -오브젝트의 일관성을 체크한다. SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS -- 테스트 환경 MINUS FROM --운영 환경
27
월 단위로 점검해야 할 항목 데이터베이스의 비정상적인 현상이 발생하는지 확인한다.
-이전에 수집했던 세그먼트 정보와 비교하여 비정상적인 성장률을 보인 세그먼트를 조사하여 수정한다. 튜닝해야 할 부분이 있는지 확인한다. -캐시 적중률(Cache Hit Ratio), 래치 경합(Latch contention), 그리고 메모리 관리와 관련된 다른 부분들에 대해 튜닝해야 할 항목이 있는지 조사한다. I/O 경합이 존재하는지 확인한다. -데이터베이스 파일에서 발생하는 I/O를 조사하여 이전 자료와 비교하여 증가한 부분이 있는지 조사한다. 단편화 현상(Fragmentation)이 존재하는지 확인한다. -로우 체이닝 등 단편화 현상이 발생하였는지 조사한다.
28
데이터베이스 문제 발생 및 해결 방법 - 1 롤백 세그먼트 EXTENT 에러
-예상했던 롤백 세그먼트의 크기보다 더 많은 작업량이 발생하거나 다른 트랜잭션이 롤백 세그먼트를 할당 받지 못했을 경우 에러가 발생한다. 1. 롤백 세그먼트의 상태 확인 SELECT SEGMENT_NAME, EXTENTS, BYTES/(1024*1024) FROM DBA_SEGMENTS WHERE SEGMENT_TYPE = ‘ROLLBACK’; SELECT R.NAME “ROLLBACK SEGMENT NAME”, L.SIG “ORACLE PID”, P.SID “SYSTEM PID”, NVL(P.USERNAME, ‘NO TRANSACTION’), P.TERMINAL FROM V$LOCK L, V$SESSION P, V$ROLLNAME R WHERE L.SID = P.SID(+) AND TRUNC(L.ID1(+)/65536) = R.USN AND L.TYPE(+) = ‘TX’ AND L.LMODE(+) = 6 ORDER BY 1; 2. 특정 롤백 세그먼트에 EXTENTION이 많이 발생하여 이를 해제 ALTER ROLLBACK SEGMENT <rollbackseg_name> SHRINK;
29
데이터베이스 문제 발생 및 해결 방법 - 2 3. 롤백 세그먼트 추가
① 롤백 세그먼트 테이블 스페이스 크기 조정(RESIZE) ALTER DATABASE DATAFIEL ‘데이터 파일명’ RESIZE 300M; ②롤백 세그먼트 데이터 파일을 추가로 생성(ADD) ALTER TABLESPACE ‘테이블 스페이스명’ ADD DATAFILE ‘데이터파일명’; 4. 롤백 세그먼트 조정 -트랜잭션의 사용에 의해 한번 크기가 늘어나면 기본적으로 롤백 세그먼트를 지우고 다시 만들기까지는 크기가 줄어들지 않는다. -optimal 크기를 지정하게 되면, 롤백 세그먼트에서 새로운 EXTENT를 요구하는 시점에, 현재 할당된 롤백 세그먼트의 크기와 optimal에 지정된 크기를 비교한다. -optimal 크기보다 큰 경우, 할당된 EXTENT 중 활성화된 트랜잭션이 사용하지 않는 EXTENT들을 릴리즈 시켜, 롤백 테이블 스페이스 공간으로 환원된다. -optimal 크기가 지나치게 작다면, 트랜잭션이 커밋 되자마자 롤백 세그먼트내의 정보는 잃게 될 것이다. ① optimal을 지정할 때 20개 정도의 EXTENTS 정도의 크기로 지정하는 것이 적당 ②롤백 세그먼트를 많이 필요로 하는 배치 작업의 경우 set transaction use rollback segment rollback_segment_name 구문을 사용 - 특정 롤백 세그먼트를 사용하고 나머지 롤백 세그먼트들은 OLTP 작업에 사용
30
데이터베이스 문제 발생 및 해결 방법 - 3 SNAPSHOT TOO OLD 에러(ORA-1555)
-하나의 트랜잭션에서 필요한 롤백 세그먼트가 다른 트랜잭션에 의해 덮어 쓰여졌을 경우 자신에게 필요한 정보가 없어졌을 때 발생한다. ① 배치 작업 시 과도하게 롤백 세그먼트를 사용할 경우 발생 ② 데이터베이스에 변경을 가하는 트랜잭션이 많고, 롤백 세그먼트도 작고, 개수도 적은 경우에 발생 해결 방법 1. 긴 트랜잭션을 발생시켰다면 롤백 세그먼트를 사용하지 않는 시간대로 배치 작업을 돌림 해결 방법 2. 별도의 큰 롤백 세그먼트를 생성하여 트랜잭션이 사용하도록 함 ① 큰 롤백 세그먼트 생성 CREATE ROLLBACK SEGMENT vldb_rbs STORAGE(INITIAL 100M NEXT 5M) TABLESPACE VLDB_RBS; ②평상시에는 OFFLINE 상태 유지 ALTER ROLLBACK SEGMENT vldb_rbs OFFLINE; ③배치 작업 수행 시 ONLINE 상태로 변경 ALTER ROLLBACK SEGMENT vldb_rbs ONLINE; ④각 작업 문장이나 세션에서 롤백 세그먼트 지정 SET TRANSACTION USE ROLLBACK SEGEMNT VLDB_RBS; ⑤작업 후 OFFLINE으로 변경함
31
데이터베이스 문제 발생 및 해결 방법 - 4 테이블 스페이스 EXTENT 에러
-테이블 스페이스 에러는 잘못된 용량 상정, 테스트로 인한 지나치게 많은 데이터로 인해 발생 -테이블이나 인덱스의 테이블 스페이스를 잘못 지정하여 특정 테이블 스페이스에 데이터가 계속 누적될 경우 발생 1. 테이블 스페이스 여유 공간 조회 SELECT TABLESPACE_NAME, MAX(BYTES), SUM(BYTES) FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=UPPER(“&TBS”) GROUP BY TABLESPACE_NAME; 2. 테이블 스페이스를 사용하는 오브젝트 조회 SELECT SEGMENT_NAME, BYTES FROM DBA_SEGMENTS WHERE TABLESPACE_NAME = “TS-NAME” 3. 테이블 스페이스를 추가하거나 크기 변경 ① 테이블 스페이스 크기 조정(RESIZE) ALTER DATABASE DATAFIEL ‘데이터 파일명’ RESIZE 300M; ②데이터 파일을 추가로 생성(ADD) ALTER TABLESPACE ‘테이블 스페이스명’ ADD DATAFILE ‘데이터파일명’;
32
데이터베이스 문제 발생 및 해결 방법 - 5 잠금 문제
-테이블에 잠금이 설정되어 DML 작업과 DDL 작업이 수행되지 못하는 경우, 해당 프로세스를 종료시키면 된다. -어플리케이션 기동 시 메시지 없이 지속적으로 기다리는 현상(WATING)이 발생한다면, 데이터베이스 잠금 설정을 확인한다. 1. 현재 걸려있는 잠금을 조회한다. SELECT A.SID, A.SERIAL# FROM V$SESSION A, V$LOCK B, DBA_OBJECTS C WHERE A. SID = B. SID AND B.ID1 = C.OBJECT_ID AND B.TYPE=“TM” AND C.OBJECT_NAME=“테이블명”; 2. 세션을 종료한다. ALTER SYSTEM KILL SESSION “SID, SERIAL #”;
Similar presentations