728x90

DBA_DATA_FILES에서 DATAFILE 파일 조회

SELECT 
    TABLESPACE_NAME,
    FILE_NAME,
    BYTES/1024/1024 AS "SIZE(MB)",
    AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE AUTOEXTENSIBLE = 'YES';

DBA_TEMP_FILES에서 TEMPFILE 파일 조회

SELECT 
    TABLESPACE_NAME,
    FILE_NAME,
    BYTES/1024/1024 AS "SIZE(MB)",
    AUTOEXTENSIBLE
FROM DBA_TEMP_FILES
WHERE AUTOEXTENSIBLE = 'YES';

데이터 파일과 템프 파일 테이블 합쳐서 AUTOEXTENSIBLE이 YES인 것만 출력하기

SELECT 
    'ALTER DATABASE DATAFILE '''||FILE_NAME||''' AUTOEXTEND OFF;'
FROM DBA_DATA_FILES
WHERE AUTOEXTENSIBLE = 'YES'
UNION ALL
SELECT 
    'ALTER DATABASE TEMPFILE '''||FILE_NAME||''' AUTOEXTEND OFF;'
FROM DBA_TEMP_FILES
WHERE AUTOEXTENSIBLE = 'YES';

데이터 파일 템프 파일 AUTOEXTEND 설정 끄기

 

ALTER DATABASE DATAFILE '경로' AUTOEXTEND OFF;

 

파라미터 변경

cd $ORACLE_HOME/dbs

-- 파라미터 백업
cp spfileSTR.ora spfileSTR.ora_20220706

ORACLE INSTANCE 가 START UP 시에 SPFILE과 PFILE을 읽어 들어 파라미터 값을 적용시킨다. SPFILE이 있으면 SPFILE을 읽게 되며, SPFILE가 존재하지 않으면 PFILE을 읽게 된다. 기본적으로 pfile은 initdXXXX.ora로 정의되어 있고 spfile은 spfileXXXX.ora로 지정되어 있다. 여기서 XXXX는 SID값이다.

-- pfile 생성 
create pfile from spfile;

spfile을 기본으로 pfile을 생성했다. 여기서 주의할 점은 pfile은 아스키 값이고 spfile은 바이너리 파일이다. 그래서 pfile은 직접 편집기로 수정해도 되지만, spfile은 명령어로 값을 변경하던지 pfile을 변경한 뒤 spfile로 만들어야 한다.

show parameter db_files
alter system set db_files=2000 scope=spfile;

디비를 내렸다 다시 올려야 db_files 파라미터 변경된다. 운영 시스템에서 절때 하면 안 된다!!!

SELECT 
    NAME,
    VALUE, 
    ISSYS_MODIFIABLE 
FROM V$PARAMETER
WHERE NAME = 'db_files';

V$PARAMETER 테이블에서도 db_files 파라미터가 변경된 것을 확인할 수 있다.

테이블 스페이스 구성 작업 후 PROFILE 설정 꼭 해줘야 한다. 설정하지 않으면 비밀번호 틀렸다고 시스템 계정이 접속이 안될 수도 있다.

SELECT 
    USERNAME, 
    ACCOUNT_STATUS, 
    DEFAULT_TABLESPACE, 
    TEMPORARY_TABLESPACE,
    PROFILE
FROM DBA_USERS;

디비 처음 설치했을 때 생성되는 계정들과 PROFILE이 DEFAULT값으로 설정돼있는 것을 확인할 수 있다.

SELECT 
    * 
FROM DBA_PROFILES
WHERE PROFILE = 'DEFAULT'
AND LIMIT <> 'UNLIMITED';

위의 테이블을 조회하면 DEFAULT 값이 상세하게 나온다.

ALTER PROFILE DEFAULT 
LIMIT 
FAILED_LOGIN_ATTEMPTS UNLIMITED
PASSWORD_LIFE_TIME    UNLIMITED
PASSWORD_LOCK_TIME    UNLIMITED
PASSWORD_GRACE_TIME   UNLIMITED;

UNLIMITED가 아닌 5개의 값이 나오는데 4개의 값만 UNLIMITED로 바꾼다. 엑셀 파일로 백업을 진행하고 설정을 변경한다. 항상 백업을 진행하고 설정을 바꿔야 한다.

  • FAILED_LOGIN_ATTEMPTS 부정확한 password 허용 횟수 변경
  • PASSWORD_LIFE_TIME 패스워드 유효기간
  • PASSWORD_LOCK_TIME 암호 잠김 시간
  • PASSWORD_GRACE_TIME 암호 변경 메시지 출력 일자

테이블 스페이스 생성

CREATE TABLESPACE TS_STR_D
DATAFILE '/oracle/app/oracle/oradata/STR/TS_STR_D_001.DBF' SIZE 1G
AUTOEXTEND OFF;

CREATE TABLESPACE TS_STR_I
DATAFILE '/oracle/app/oracle/oradata/STR/TS_STR_I_001.DBF' SIZE 1G
AUTOEXTEND OFF;

이름 규칙은 보통 테이블 스페이스명(TBS, TS) + DB 계정명 + 테이블(D), 인덱스(I)로 보통 사용한다.

DB계정 생성과 DB계정 권한

-- DB계정 생성
CREATE USER STR
IDENTIFIED BY "oracle"
DEFAULT TABLESPACE TS_STR_D;

-- DB계정 권한
GRANT CONNECT, RESOURCE TO STR;

DB계정 상태 & 권한 확인

-- DB계정 상태
SELECT 
    USERNAME, 
    ACCOUNT_STATUS, 
    DEFAULT_TABLESPACE, 
    PROFILE
FROM DBA_USERS
WHERE USERNAME = 'STR';

-- 권한 확인
SELECT 
   * 
FROM DBA_ROLE_PRIVS
WHERE GRANTEE = 'STR';

테이블 생성 예시

-- 샘플 테이블 생성
CREATE TABLE STR.CUST
(
  CUST_NAME   VARCHAR2(20),
  MOB_NUMBER  VARCHAR2(20)
)
TABLESPACE TS_STR_D;

테이블, DB 계정, 테이블 스페이스 삭제

-- 테이블 삭제
DROP TABLE STR.CUST;

-- 휴지통 비우기(완전 삭제)
PURGE DBA_RECYCLEBIN;

-- DB계정 삭제
DROP USER STR CASCADE;

-- 테이블스페이스 삭제
DROP TABLESPACE TS_STR_D INCLUDING CONTENTS AND DATAFILES;
DROP TABLESPACE TS_STR_I INCLUDING CONTENTS AND DATAFILES;

참고

https://www.youtube.com/watch?v=bIRjupXHTvw&t=1041s 

 

728x90
728x90

테이블 스페이스란

테이블 공간을 의미하며 데이터 공간이라고 말한다.

스토리지

데이터베이스의 데이터가 저장되는 공간

블록

블록은 오라클 데이터 베이스에 저장되는 논리적인 최소 단위이다. 블록 사이즈의 기본값은 8k 8192byte이다.

show parameter db_block_size

익스텐트

익스텐트는 여러 개의 블록들이 모여있는 집합이다. 하나의 익스텐트는 여러 개의 블록을 가질 수 있다.

세그먼트

세그먼트는 한개 이상의 익스텐트를 가지고 있다. 여러 개의 익스텐트가 모인 집합을 의미한다.

테이블 스페이스

여러 개의 세그먼트가 모이면 테이블 스페이스라고 한다. 테이블 스페이스는 논리적인 가장 큰 집합이다.

오라클 DB 기본 값 구성

오라클 DB를 기본 값으로 구성하면 5개의 테이블 스페이스와 데이터 파일이 만들어진다.

내 로컬 경로는 /opt/oracle/oradata/XE/이다.

SELECT
	TABLESPACE_NAME,
	FILE_NAME,
	BYTES/1024/1024 AS "SIZE(MB)"
FROM DBA_DATA_FILES
UNION ALL
SELECT
	TABLESPACE_NAME,
	FILE_NAME,
	BYTES/1024/1024
FROM DBA_TEMP_FILES
ORDER BY 1;
  1. SYSTEM : /oracle/app/oracle/oradata/DB이름/system01.dbf
    • 오라클 내부의 중요한 데이터를 저장하는 데이터 딕셔너리 테이블이 저장되는 장소
  2. SYSAUX : /oracle/app/oracle/oradata/DB이름/sysaux01.dbf
    • 대표적으로 AWR이 저장되는 장소이다. 그 외의 다른 것도 있다.
  3. USERS : /oracle/app/oracle/oradata/DB이름/users01.dbf
    • 오라클의 기본 계정의 데이터가 저장되어 있는 공간이다.
  4. UNDOTBS1 : /oracle/app/oracle/oradata/DB이름/undotbs01.dbf
    • 데이터 읽기 일관성이나 데이터 변경 작업을 했을 때 필요한 장소이다.
  5. TEMP : /oracle/app/oracle/oradata/DB이름/temp01.dbf
    • 메모리에 맞지 않는 여러 정렬 작업을 동시에 할 수 있는 아주 중요한 임시 공간이다.

DBA_SEGMENTS를 이용해 내부 테이블 인덱스를 조회

SELECT
    OWNER,
    SEGMENT_NAME,
    SEGMENT_TYPE,
    SEGMENT_SUBTYPE,
    TABLESPACE_NAME,
    BYTES,
    BLOCKS,
    EXTENTS
FROM DBA_SEGMENTS
WHERE SEGMENT_NAME IN ('WRH$_SQL_PLAN','WRH$_SQL_PLAN_PK','IDL_UB1$')
ORDER BY 1,2;

 

세그먼트 서브 타입 MSSM

Manual Segment Space Management으로 수동으로 세그먼트를 관리한다.

세그먼트 서브 타입 ASSM(Default)

Automatic Segment Space Management으로 자동으로 세그먼트를 관리한다.

옛날에는 MSSM을 사용하였지만 요즘엔 ASSM으로 많이 사용한다.

테이블 스페이스 데이터 파일 사이즈 변경

ALTER DATABASE DATAFILE '파일명' RESIZE 1G;

테이블 스페이스 데이터 파일 추가

ALTER DATABASE ADD DATAFILE  '파일명' SIZE 1G;

테이블 스페이스 생성

CREATE TABLESPACE 이름 DATAFILE '파일명' SIZE 1G AUTOEXTEND OFF;

테이블 스페이스를 MSSM으로 구성

CREATE TABLESPACE 이름 DATAFILE '파일명' SIZE 1G SEGMENT SPACE MANAGEMENT MANUAL;

테이블 스페이스를 ASSM으로 구성

CREATE TABLESPACE 이름 DATAFILE '파일명' SIZE 1G SEGMENT SPACE MANAGEMENT AUTO;

테이블 스페이스 상태 정보 확인

SELECT
    TABLESPACE_NAME,
    BLOCK_SIZE,
    SEGMENT_SPACE_MANAGEMENT
FROM DBA_TABLESPACES 

보통 DB 관리는 80% 사용을 할 때 데이터 파일을 늘려준다.

참고

https://www.youtube.com/watch?v=aTfu6zx2b28&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=1 

 

728x90
728x90

listener 포트 변경

포트를 변경하는 이유는 한대의 디비 서버에 여러 개의 디비를 구성할 때가 종종 있다. 한대의 디비 서버에 여러 개의 인스턴스를 구성하려면 리스너도 여러 개가 필요하기 때문에 여러 개의 포트도 필요하다.

spfile 백업파일 생성

cp spfileSTR.ora spfileSTR.ora_20221125

작업을 진행하기 전 우선 spfileSTR.ora 파일을 백업을 한다.

listener, tnsnames 파일 백업

cp listener.ora listener.ora_20220907
cp tnsnames.ora tnsnames.ora_20220907

포트 변경

vi listener.ora
vi tnsnames.ora

vi 편집기로 listener.ora과 tnsnames.ora를 열어서 포트번호를 1521에서 1522로 변경한다.

리스너 서비스 시작

lsnrctl start

파라미터 변경

show parameter local_listener

alter system set local_listener='(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1522))
)' scope=both;

alter system register;

local_listener 파라미터도 변경해야 한다.

Listener 포트 변경(1522 -> 1521)

위와 동일한데 파라미터 변경에서 조금 코드 차이가 있다.

show parameter local_listener

alter system set local_listener='LISTENER_STR' scope=both;

alter system register;

Warning 메시지 제거

vi listener.ora
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF

싱글 디비 같은 경우는 오라클 노티피케이션 서비스가 특별히 필요 없기 때문에 WARNING: Subscription for node down event still pending 메시지 제거해도 된다. vi 편집기로 listener.ora 파일을 열고 파일 제일 마지막에 SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF를 추가한다.

lsnrctl reload

Multi Listener 설정(1521, 1522, 1523 포트 3개 사용)

vi listener.ora
LIST_STR1 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1521))
    )
  )

LIST_STR2 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1522))
    )
  )

LIST_STR3 =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1523))
    )
  )

SUBSCRIBE_FOR_NODE_DOWN_EVENT_LIST_STR1=OFF
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LIST_STR2=OFF
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LIST_STR3=OFF
vi tnsnames.ora
STR =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1521))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1522))
    (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.111)(PORT = 1523))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = STR)
    )
  )

리스너 서비스 시작

lsnrctl start LIST_STR1
lsnrctl start LIST_STR2
lsnrctl start LIST_STR3

파라미터 변경

show parameter local_listener

alter system set local_listener='(ADDRESS_LIST=
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1521))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1522))
(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.111)(PORT=1523))
)' scope=both;

alter system register;

포트 확인

ps -efl | grep tnslsnr
netstat -plnt | grep tns
728x90
728x90

Audit Dump 위치 확인

show parameter audit_file_dest

ls | wc -l

파일 개수 확인하는 명령어

Background & User Dump Log 위치 확인

show parameter background_dump_dest
show parameter user_dump_dest

Alert Log, Trace Log 위치 확인 쿼리문

select value from v$diag_info;

cd /opt/oracle/diag/rdbms/xe/XE/trace
cd /opt/oracle/diag/rdbms/xe/XE/alert

오라클 로그 파일 자동 삭제 Shell 스크립트

vi delete_oracle_log.sh

vi로 delete_oracle_log.sh 쉘 파일을 만든다.

#!/bin/bash

# Audit Log (보관주기 6개월)
find /opt/oracle/admin/XE/adump/*.aud -mtime +180 -exec rm {} \\;

# Background & User Dump Log (보관주기 3개월)
find /opt/oracle/homes/OraDBHome21c/XE/rdbms/log/*.trc -mtime +90 -exec rm {} \\;

# Alert Log (보관주기 3개월)
find /opt/oracle/diag/rdbms/xe/XE/alert/*.xml -mtime +90 -exec rm {} \\;

# Trace Log (보관주기 3개월)
find /opt/oracle/diag/rdbms/xe/XE/trace/*.trc -mtime +90 -exec rm {} \\;
find /opt/oracle/diag/rdbms/xe/XE/trace/*.trm -mtime +90 -exec rm {} \\;
chmod 755 delete_oracle_log.sh

chmod 명령어로 쉘을 실행할 수 있는 권한을 준다.

crontab -e
## Oracle Log Delete
01 0 1 * * /delete_oracle_log 만든 경로/delete_oracle_log.sh
crontab -l

크론텝으로 매월 1일 00:01에 실행하도록 설정한다.

크론텝 시간

분 시 일(*:매일, 5:5일) 달(*:매달, 5:5월) 요일(0은 일요일, 6은 토요일)
0 5 * * * : 매일 5시 0분에 실행.
5 * * * * : 매시 5분이 될 때마다 실행. 즉, 한 시간 간격으로 실행.
* * * * * : 1분에 한 번씩 실행.
0 5 1 * * : 매달 1일 새벽 5시에 실행.

*/5 * * * * : 5분마다 한 번씩
0 */5 * * * : 5시간마다 한 번씩

0 5,11 * * * : 새벽 5시와 밤 11시.
0 5,11 * * 0,3 : 매주 일요일과 수요일 새벽 5시와 밤 11시.

리스너 로그 파일 자동 정리(압축 및 삭제) Shell 스크립트

vi delete_listener_log.sh

vi로 delete_listener_log.sh 쉘 파일을 만든다.

ls -lh

용량을 나타내는 명령어이다.

#!/bin/bash
export ORACLE_SID=XE
export ORACLE_HOME=/opt/oracle/homes/OraDBHome21c/XE
export PATH=$ORACLE_HOME/bin:$PATH
export DATE=`date -d '1 month ago' +%Y%m` 

cd /opt/oracle/diag/rdbms/xe/XE/trace

cp listener.log listener.log_${DATE}
zip listener.log_${DATE}.zip listener.log_${DATE}

cat /dev/null > /opt/oracle/diag/rdbms/xe/XE/trace/listener.log
rm -rf /opt/oracle/diag/rdbms/xe/XE/trace/listener.log_${DATE}
chmod 755 delete_listener_log.sh

chmod 명령어로 쉘을 실행할 수 있는 권한을 준다.

crontab -e
## Listener Backup & Delete
01 0 1 * * /home/oracle/scripts/delete_listener_log.sh
crontab -l

크론텝으로 매월 1일 00:01에 실행한다.

adrci 삭제

수동으로 삭제하는 방법 중에 adrci로 삭제하는 방법이 있다.

-- adrci 설정 확인
show homes

--  adrci Home Path 변경
set HOMEPATH diag/rdbms/xe/XE

-- Alert Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type ALERT

-- Trace Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type TRACE 

-- CDUMP Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type CDUMP 

-- HM Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type HM

-- INCIDENT Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type INCIDENT

참고

https://www.youtube.com/watch?v=-7PfFVLYdwQ&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=11 

 

728x90
728x90

SQL 툴에서 SYS계정의 SYSDBA로 접속해야 한다.

SELECT * 
FROM SYS.X$DBGALERTEXT;

Alert log의 내용 결과를 나타내 주는 테이블이다.

Alert Log 확인

SELECT 
    HOST_ID, 
    HOST_ADDRESS,
    TO_CHAR(ORIGINATING_TIMESTAMP, 'YY/MM/DD(DY) HH24:MI:SS') AS "ALTERT_DATE",
    MESSAGE_TEXT
FROM  SYS.X$DBGALERTEXT
WHERE ORIGINATING_TIMESTAMP >= TRUNC(SYSDATE) -7
ORDER BY RECORD_ID;

날짜 포맷을 연월일 요일 시분초로 변경한 쿼리문이다. TRUNC는 어떤 식으로 사용돼 나면 아래와 같은 쿼리로 많이 사용한다.

-- 시간 확인
ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';

SELECT SYSDATE FROM DUAL
UNION ALL
SELECT SYSDATE -1 FROM DUAL
UNION ALL
SELECT TRUNC(SYSDATE) -1 FROM DUAL;

WHERE ORIGINATING_TIMESTAMP >= TRUNC(SYSDATE)은 오늘 00시부터 모든 Alert log가 다 나오게 된다.

SELECT 
    '<html><font color=orange><b>'||HOST_ID||'</font></html>' AS "HOST_ID",
    '<html><bgcolor=blue><font color=white>'  ||HOST_ADDRESS  ||'</font></html>' AS "HOST_ADDRESS",
    '<html><bgcolor=yellow><font color=black>'||TO_CHAR(ORIGINATING_TIMESTAMP, 'YY/MM/DD(DY) HH24:MI:SS') AS "ALTERT_DATE",
    '<html><bgcolor=red><font color=white>'   || MESSAGE_TEXT ||'</font></html>' AS "ALTERLOG"
FROM  SYS.X$DBGALERTEXT
--WHERE ORIGINATING_TIMESTAMP >= SYSDATE  - INTERVAL '10' MINUTE
--WHERE ORIGINATING_TIMESTAMP >= SYSDATE  - INTERVAL '30' MINUTE
--WHERE ORIGINATING_TIMESTAMP >= SYSDATE  - INTERVAL '1' HOUR
WHERE ORIGINATING_TIMESTAMP >= TRUNC(SYSDATE) -20
AND   MESSAGE_TEXT LIKE '%ORA-%'
ORDER BY RECORD_ID;

SQL 디벨로퍼에서는 html code를 작성하면 안에 있는 데이터에 대한 색상을 표현할 수 있다.

Alert log 관리 꿀팁

adrci(Automatic Diagnostic Repository)로 디비 진단할 때 많이 사용하는 명령어이다.

adrci

오라클 계정에서 adrci를 입력한다.

adrci 설정 확인

show homes

Diagnostic 위치가 나온다.

adrci Home Path 변경

set HOMEPATH diag/rdbms/str/STR
-- Alert Log 삭제(분) (30*24*60) 30일 
purge -age 43200 -type ALERT

-- Alert Log 삭제(분) (60*24*60) 60일  
purge -age 86400 -type ALERT

-- Alert Log 삭제(분) (90*24*60) 90일 
purge -age 129600 -type ALERT

원하는 보관 주기에 맞춰서 사용하면 된다. 이렇게 해야 X$DBGALERTEXT fixed 테이블에 데이터를 줄일 수 있는 꿀팁이다.

참고

https://www.youtube.com/watch?v=q5J9Z5fKeFE 

 

728x90
728x90

테이블 데이터 복구 프로세스

원본 테이블은 새로운 데이터가 계속 들어올 수 있기 때문에 백업 테이블을 이용해 복구해야 된다.

데이터 복구를 위해 백업 테이블을 만드는 방법(CTAS)

CREATE TABLE SYS.TEST_221122_0709
AS
SELECT * FROM SYS.TEST
AS OF TIMESTAMP TO_TIMESTAMP('2022/11/22 07:09', 'YYYY/MM/DD HH24:MI');

TEST 테이블 만들고 10분 정도 지나고 복구 TEST 해야 잘 된다.

전체 테이블 복구

CREATE TABLE SYS.TEST 
(
  ENAME       VARCHAR2(20 BYTE), 
	MOB_NUMBER  VARCHAR2(20 BYTE)
) 
TABLESPACE SYSTEM;

INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일일','010-0000-0001');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일이','010-0000-0002');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일삼','010-0000-0003');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일사','010-0000-0004');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일오','010-0000-0005');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일육','010-0000-0006');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일칠','010-0000-0007');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일팔','010-0000-0008');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일구','010-0000-0009');
INSERT INTO SYS.TEST (ENAME,MOB_NUMBER) VALUES('김일십','010-0000-0010');
COMMIT;

SYS.TEST 테이블을 만들고 테스트 데이터를 INSERT 한 후 COMMIT 한다.

DELETE FROM SYS.TEST;
COMMIT;

SYS.TEST 테이블의 데이터를 지우고 COMMIT 한다.

-- TEST_221122_0709 테이블 5분 전 데이터 테이블 생성
CREATE TABLE SYS.TEST_221122_0709
AS 
SELECT * 
FROM SYS.TEST 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);

CTAS를 이용해 5분 전의 데이터 테이블을 생성한다.

SELECT * FROM SYS.TEST_221122_0709;

SYS.TEST_221122_0709 테이블을 조회하면 테이블에 5분 전 데이터가 삽입이 된 것을 볼 수 있다.

SELECT /*insert*/ * FROM SYS.TEST_221122_0709;

위의 SQL문을 입력하면 INSERT문이 자동으로 만들어진다. 테이블 이름을 SYS.TEST_221122_0709에서 SYS.TEST로 변경 후 INSERT문을 실행시키고 COMMIT을 하면 데이터 복구가 잘 수행되었다.

CREATE TABLE SYS.TEST_221122_0709
AS 
SELECT * 
FROM SYS.TEST 
AS OF TIMESTAMP TO_TIMESTAMP('2022/11/22 07:09','YYYY/MM/DD HH24:MI');

위의 SQL문은 내가 원하는 정확한 시점으로 데이터를 복구하는 쿼리문이다.

일부 삭제된 데이터 복구

위와 동일하게 진행하면 된다.

UNDO 파라미터

undo_retention은 읽기 일관성을 위한 데이터 보유 기간을 설정하는 것이다. 디폴드 값은 900으로 15분이다. 보통 12시간 43200, 24시간 86400 적용하는 편이다.

파라미터 변경

alter system set undo_retention=86400 scope=spfile;

위의 SQL문으로 파라미터를 변경 후 DB를 내렸다 다시 올려주면 적용된다.

undo_retention을 유지하려면 꼭 UNDO 테이블 스페이스의 데이터 파일도 같이 늘려주어야 한다.

UNDO 데이터 파일 만들기

ALTER TABLESPACE UNDOTBS1 
ADD DATAFILE '/oracle/app/oracle/oradata/DB이름/undotbs02.dbf'
SIZE 1024M;

UNDO 데이터 파일 크기 변경

ALTER TABLESPACE DATAFILE '/oracle/app/oracle/oradata/DB이름/undotbs02.dbf'
RESIZE 2048M;

업계에서 보통 undo_retention은 24시간에서 UNDO 테이블 스페이스 공간은 200에서 300기가로 적용한다.

UNDO 상태 정보

SELECT 
    TABLESPACE_NAME, 
    STATUS, 
    ROUND(SUM(BYTES/1024/1024)) AS "SIZE(MB)"
FROM DBA_UNDO_EXTENTS
GROUP BY TABLESPACE_NAME, STATUS
ORDER BY 1,2;

UNDO 상태는 active, unexpired, expired가 있다. UNDO 공간에 문제가 발생할 때 자주 사용하는 쿼리이므로 알고 있으면 좋다.

UNDO 상태 정보(UNDO 전체 크기)

SELECT 
    TABLESPACE_NAME,
    FILE_NAME,
    BYTES/1024/1024 "SIZE(MB)"
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME = 'UNDOTBS1'
ORDER BY 1, 2;

UNDO 사용량이 높은 SQL

SELECT 
    MAXQUERYID AS "SQL_ID", 
    SUM((ACTIVEBLKS*8)/1024) AS "ACTIVE_BLOCK", 
    MAX((UNEXPIREDBLKS*8)/1024)  
FROM V$UNDOSTAT
WHERE MAXQUERYID IS NOT NULL
GROUP BY MAXQUERYID
ORDER BY 2 DESC;

SQL TEXT 분석

SELECT 
    SQL_ID, 
    PARSING_SCHEMA_NAME, 
    SERVICE, 
    SQL_FULLTEXT
FROM V$SQL
WHERE SQL_ID = '위의 undo 사용량 높은 SQL_ID값';

시간 계산 꿀팁

ALTER SESSION SET NLS_DATE_FORMAT='YYYY/MM/DD HH24:MI:SS';

-- +시간 계산하기
SELECT '현재시간' AS "시간구분",SYSDATE FROM DUAL
UNION ALL
SELECT '+1초', SYSDATE+(INTERVAL '1' SECOND) FROM DUAL
UNION ALL
SELECT '+1분', SYSDATE+(INTERVAL '1' MINUTE) FROM DUAL
UNION ALL
SELECT '+1시간', SYSDATE+(INTERVAL '1' HOUR) FROM DUAL
UNION ALL
SELECT '+1일', SYSDATE+(INTERVAL '1' DAY) FROM DUAL
UNION ALL
SELECT '+1개월', SYSDATE+(INTERVAL '1' MONTH) FROM DUAL;

-- -시간 계산하기
SELECT '현재시간' AS "시간구분",SYSDATE FROM DUAL
UNION ALL
SELECT '-1초', SYSDATE-(INTERVAL '1' SECOND) FROM DUAL
UNION ALL
SELECT '-1분', SYSDATE-(INTERVAL '1' MINUTE) FROM DUAL
UNION ALL
SELECT '-1시간', SYSDATE-(INTERVAL '1' HOUR) FROM DUAL
UNION ALL
SELECT '-1일', SYSDATE-(INTERVAL '1' DAY) FROM DUAL
UNION ALL
SELECT '-1개월', SYSDATE-(INTERVAL '1' MONTH) FROM DUAL;

실무에서 많이 쓰인다고 한다 잘 알아두도록 하자.

참고

https://www.youtube.com/watch?v=uGoxhq9jZeA&list=PLKaW9UT2TL3Lpqrh_lJ8PHyHpR7NgdrPP&index=7 

 

728x90
728x90

Listener 정보

기본 포트 1521을 사용한다.

Listener 기본 옵션

lsnrctl start 
lsnrctl stop
lsnrctl reload
lsnrctl status

reload는 재시작, status는 상태 정보를 볼 때 많이 사용한다.

더 많은 옵션을 보고 싶을 때는 아래의 명령어로 확인할 수 있다.

lsnrctl help

오라클과 리스너가 등록되는데 시간이 좀 걸린다. 꿀 팁으로 sqlplus에서 아래의 명령어를 입력하면 바로 등록이 된다.

alter system register;
728x90
728x90

sqlplus sysdba 계정으로 로그인

sqlplus / as sysdba
sqlplus /nolog
sys / as sysdba

오라클 시작 단계

startup nomount
select status from v$instance;

nomount는 파라미터 파일 오라클에서는 sp 파일이라 부르는데 이걸 읽어서 오라클 메모리로 올리는 단계이다.

alter database mount;

mount는 오라클의 컨트롤 파일을 이용해 물리적인 파일들을 연결하는 단계이다.

alter database open;

오라클 시작

startup
startup force

force는 빠른 속도로 shutdown abort를 하고 한 번에 startup까지 가능하다. 사고가 터졌을 때 많이 사용하는 명령어이다.

오라클 종료

shutdown [normal]

normal은 DB에 접속된 세션이 종료될 때까지 대기하고 진행 중인 트렌젝션이 있다면 끝날 때까지 기다린다.

shutdown transactional

transactional DB에 접속된 세션을 종료하고 진행중인 트렌젝션이 있다면 끝날 때까지 기다린다.

normal과 transactional의 차이는 normal은 세션이 종료될 때까지 대기하고 transactional은 접속된 세션을 종료시킨다.

shutdown abort

데이터베이스를 강제로 종료시킨다.

shutdown immediate

가장 많이 사용하는 명령어이다. 디비에 연결된 세션, 트렌젝션을 모두 종료한다.

728x90

+ Recent posts