Database/Oracle
-
[Oracle] Compress2024.02.29
-
[Oracle] Transaction과 Record2024.02.21
-
RMAN2023.11.12
-
[Oracle] 자주 쓰는 명령어2023.11.10
-
[Oracle] 관리자 계정(system, sys) 비밀번호 변경2023.03.16
-
[Oracle] 이전 명령어 방향키로 출력2023.03.15
-
[Oracle] Sequence2023.03.13
-
[Oracle] Listener & Oracel DB2023.03.12
-
[Oracle] SCN, Checkpoint2023.03.12
-
[Oracle] 구조2023.03.09
[Oracle] Compress
● 서버 스토리지 부족 시 TBL 압축을 위해 Compress 옵션 사용 (단, DML이 잦으면 역효과일 수 있음)
● Relation Data 처리를 위한 알고리즘으로 DB Block 내 다수의 column의 중복된 값을 제거하여 compression을 수행
● 새로운 data를 bulk insert, bulk load 또는 insert, update 시 compression 사용 가능
● Compress된 block은 compression과 관련된 meta data를 symbol table에 저장함
ㄴ uncompressed table과 가장 큰 차이
ㄴ symbol table : block의 상단에 위치
※ 사용 전 테이블의 속성을 파악하여 DML 이력 확인 권고
SQL> SELECT INSERTS, UPDATES, DELETES FROM DBA_TAB_MODIFICATIONS WHERE TABLE_NAME = 'TEST';
INSERTS UPDATES DELETES
---------- ---------- ----------
0 12657 0
Basic Compression
Direct path I/O 로 생성된 block만 압축함
하나의 segment에 여러 형태의 block이 혼재할 수 있음
ㄴ Compressed block (Direct Path I/O)
Uncompressed block (Conventional Path I/O)
Command
ALTER TABLE TEST_NOCOMP MOVE NOCOMPRESS;
ALTER TABLE TEST_BASIC MOVE COMPRESS BASIC;
ALTER TABLE TEST_OLTP MOVE COMPRESS FOR OLTP;
MOVE : 이전에 저장되어 있던 DATA들도 압축
MOVE 생략 시 이후에 들어오는 DATA들에 한하여 압축
SQL> INSERT /*+append*/ INTO ... VALUES ...
SQL> COMMIT;
OLTP Compression
Online Transaction Processing
= 그냥 트랜잭션
'Database > Oracle' 카테고리의 다른 글
[Oracle] Transaction과 Record (0) | 2024.02.21 |
---|---|
RMAN (0) | 2023.11.12 |
[Oracle] 자주 쓰는 명령어 (0) | 2023.11.10 |
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Transaction과 Record
Transaction
: DB의 데이터를 조작하는 작업의 단위
병행 제어 및 회복 작업 시 처리되는 작업의 논리적 단위
사용자가 시스템에 대한 서비스 요구 시 시스템이 응답하기 위한 상태 변환 과정의 작업 단위
Commit or Not
트랜잭션 상태
- Active : 트랜잭션 실행 중
- Failed : 트랜잭션 실행에 오류가 발생하여 중단
- Aborted : 트랜잭션이 비정상적으로 종료되어 Rollback 연산을 수행한 상태
- Partially Committed : 트랜잭션의 마지막 연산까지 실패했지만, Commit 실행 직전의 상태
- Committed : 트랜잭션이 성공적으로 종료되어 Commit 실행 후의 상태
ACID 원칙을 보장해야 함
ㄴ 지킬수록 동시성은 떨어짐
ㄴ ∴ 각 Level별 Transaction Lock Level 존재
Lock
Row Lock
: Table이 row에 lock을 거는 것
- Shared Lock : select 시 잠금
- Exclusive Lock : write 시 잠금
1. 동시에 여러 Tx가 한 row에 Shared Lock을 걸 수 없음
= 여러 Tx가 동시에 row를 읽을 수 없음
2. Shared Lock이 걸려있는 row에 다른 Tx가 Exclusive Lock을 걸 수 없음
= 다른 Tx가 row를 읽는 동안 다른 Tx는 수정 및 삭제 불가능
3. Exclusive Lock이 걸려있는 동안 다른 Tx는 Shared/Exclusive 즉 모든 Lock을 걸 수 없음
Record Lock
: DB의 Index Record에 걸리는 Lock
- Shared Lock : select 시 잠금
- Exclusive Lock : write 시 잠금
Gap Lock
Index Record의 Gap 사이에 걸리는 Lock
record Table에서 인덱스와 인덱스 사이에 존재
= record가 없는 부분에 걸리는 Lock
┌ 새로운 row의 추가 방지
Record Lock Vs. Gap Lock
ㄴ이미 있는 row가 변경되지 않게
*Index
Data의 Record에 빠르게 접근하기 위해 <키, 값, 주소> 로 구성된 데이터 구조
Record
- Table 형태의 데이터 타입
- 여러 개의 Data Type을 갖는 변수들의 집합
- 논리적 단위
- 필드 집합 처리
- ( ≒ C언어의 Struct)
- 테이블과 다르게 개별 필드 이름 부여 가능
- 선언 시 초기화 가능
- 레코드가 가질 수 있는 row의 수는 1개
선언 방식에 따라 커서형, 사용자 정의형, 테이블형 레코드로 나뉨
1. 사용자 정의형 레코드
: 선언한 레코드 변수를 통해 내부의 속성들에 접근
테이블의 컬럼에 해당하는 것을 필드라고 한다.
TYPE 레코드명 IS RECORD (
필드명1 필드1 타입[ [NOT NULL] := 디폴트값 ],
필드명2 필드2 타입[ [NOT NULL] := 디폴트값 ]
...
);
레코드변수명 레코드명;
예시 1)
DECLARE
TYPE dept_rect IS RECORD( -- dep 레코드 타입 선언
department_id NUMBER := 1, --혹은 departments.department_id%TYPE
department_name VARCHAR2(80), --혹은 departments.department_name%TYPE
parent_id NUMBER(6),
manager_id NUMBER(6));
vr_dept_rect dept_rect; -- 위에서 선언된 타입으로 레코드 변수 선언
BEGIN
DBMS_OUTPUT.PUT_LINE(vr_dept_rect.department_id);
END;
예시 2)
DECLARE
TYPE emp_type IS RECORD( -- emp_type 레코드 타입 선언
emp_no NUMBER(4) NOT NULL := 0,
ename emp.ename%TYPE,
JOB VARCHAR2(9)
);
v_emp emp_type; -- 위에서 선언된 타입으로 레코드 변수 선언
BEGIN
v_emp.empno := 9000;
v_emp.ename :='hong';
v_emp.job := 'dr';
DBMS_OUTPUT.PUT_LINE('empno' = ' || v_emp.empno);
DBMS_OUTPUT.PUT_LINE('ename' = ' || v_emp.ename);
DBMS_OUTPUT.PUT_LINE('job' = ' || v_emp.job);
END;
/**************************** 실행 결과
EMPNO = 9000
ENAME = HONG
JOB = DR
*************************************/
2. 테이블형 레코드
: 특정 테이블의 모든 컬럼을 받을때 사용하는 레코드 타입이다. %TYPE 대신 %ROWTYPE으로 선언
레코드 변수명 테이블명.%ROWTYPE;
예시 1)
DECLARE
vr_dept_rect departments%ROWTYPE;
BEGIN
SELECT * into vr_dept_rect from departments where department_id = 10;
DBMS_OUTPUT.PUT_LINE(vr_dept_rect.department_id);
END;
3. 커서형 레코드
: Cursor를 레코드 변수로 받는 것
커서명%ROWTYPE;
DECLARE
CURSOR cur_dep IS
SELECT * from departments;
vr_dep cur_dep%ROWTYPE;
BEGIN
OPEN cur_dep;
LOOP
FETCH cur_dep INTO vr_dep;
EXIT WHEN cur_dep%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(vr_dep.department_id);
DBMS_OUTPUT.PUT_LINE(vr_dep.department_name);
END LOOP;
DBMS_OUTPUT.PUT_LINE(cur_dep%ROWCOUNT);
--DBMS_OUTPUT.PUT_LINE(vr_dep%ROWCOUNT);
END;
'Database > Oracle' 카테고리의 다른 글
[Oracle] Compress (0) | 2024.02.29 |
---|---|
RMAN (0) | 2023.11.12 |
[Oracle] 자주 쓰는 명령어 (0) | 2023.11.10 |
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
RMAN
-- sqlplus 접속
sqlplus / as sysdba
ALTER SYSTEM SET log_archive_dest='/ARC_STR' SCOPE=SPFILE;
ALTER SYSTEM SET log_archive_format='ARCH_STR_%r_%t_%s.ARC' SCOPE=SPFILE;
-- 아카이브 로그 모드 변경
shutdown immediate;
startup mount;
alter database archivelog;
archive log list;
alter database open
-- rman 접속
rman target /
-- DB 전체 정보
report schema;
-- DB 파일 상태 점검
validate database;
-- FRA 설정으로 인한 오류
-- ORA-19625: error identifying file /FRA/STR/archivelog/2022_12_16/o1_mf_1_22_ksrogsbd_.arc
-- ORA-27037: unable to obtain file status
rman target /
change archivelog all crosscheck;
-- rman 설정 변경
-- 2일 전의 백업까지
rman target /
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/RMANBKP/control/control_%F';
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/RMANBKP/control/snapcontrol_STR.f';
-- rman 설정 원복
CONFIGURE RETENTION POLICY CLEAR;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK CLEAR;
CONFIGURE SNAPSHOT CONTROLFILE NAME CLEAR;
-- rman 설정 확인
show all;
rman 백업
oracle 계정
********************************************************/
rman target /
-- %T (YYYYMMDD) 년월일 포멧
-- %U 시스템 생성 고유 파일 이름 8자리
-- 전체 백업
backup database;
backup database format '/RMANBKP/STRDB2_full_n_bkp_%T_%U';
-- 전체 백업 + 압축
backup as compressed backupset database format '/RMANBKP/STRDB2_full_c_bkp_%T_%U';
-- 백업 상태 확인
list backup;
list backup summary;
host 'ls -lh /RMANBKP';
export NLS_DATE_FORMAT="YYYY/MM/DD(DY) HH24:MM:SS"
'Database > Oracle' 카테고리의 다른 글
[Oracle] Compress (0) | 2024.02.29 |
---|---|
[Oracle] Transaction과 Record (0) | 2024.02.21 |
[Oracle] 자주 쓰는 명령어 (0) | 2023.11.10 |
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] 자주 쓰는 명령어
현재 DB 상태 확인
-- STARTED (NO MOUNT) -> MOUNTED (MOUNT) -> OPEN (OPEN)
SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
STARTED
SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
MOUNTED
SQL > SELECT STATUS FROM V$INSTANCE;
STATUS
------------------------------------
OPEN
SID 확인
SQL> SELECT INSTANCE FROM v$thread;
Database read only mode
SQL> shutdown immediate;
SQL> alter database open read only;
Database status 확인
SQL> select name, open_mode from v$database;
Database Primary/Standby 확인
SQL> select database_role from v$database;
Control file 상태 확인
SQL> SELECT controlfile_type FROM V$database;
redo group 확인
SQL> select * from v$logfile;
'Database > Oracle' 카테고리의 다른 글
[Oracle] Transaction과 Record (0) | 2024.02.21 |
---|---|
RMAN (0) | 2023.11.12 |
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] 관리자 계정(system, sys) 비밀번호 변경
ERROR: ORA-01017 : invalid username/password; logon denied
위와 같은 오류 발생으로 sys 계정 연결 불가 시 아래 쿼리로 비밀번호 변경
[oracle@kim ~]$ lsnrctl start
[oracle@kim ~]$ sqlplus / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Database mounted.
Database opened.
SQL> alter user sys identified by [비밀번호];
User altered.
'Database > Oracle' 카테고리의 다른 글
RMAN (0) | 2023.11.12 |
---|---|
[Oracle] 자주 쓰는 명령어 (0) | 2023.11.10 |
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] Listener & Oracel DB (0) | 2023.03.12 |
[Oracle] 이전 명령어 방향키로 출력
// root 계정 접속
$ yum -y install epel-release
$ yum list install rlwrap
$ yum -y install rlwrap
// oracle 설치 계정 접속
$ vi .bashrc
alias sqlplus="rlwrap sqlplus" <- 추가
$ source .bashrc
'Database > Oracle' 카테고리의 다른 글
[Oracle] 자주 쓰는 명령어 (0) | 2023.11.10 |
---|---|
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] Listener & Oracel DB (0) | 2023.03.12 |
[Oracle] SCN, Checkpoint (0) | 2023.03.12 |
[Oracle] Sequence
Sequence ?
자동으로 순차적으로 증가하는 순번을 반환하는 데이터베이스 객체
아래와 같은 방법으로 컬럼의 값을 증가 할 수 있음
1. MAX(컬럼) + 1
2. 시퀀스 = DB에 ROW가 추가 될 때마다 자동으로 +1
1. Sequence 생성
CREAT SEQUENCE [스키마명].[시퀀스명]
INCREMENT BY [증감숫자] -- 양수 = 증가 / 음수 = 감소 / default 1
START WITH [시작번호] -- defalut 값은 증가일 때 Minvalue / 감소일 때 Maxvalue
[NOMINVALUE or MINVALUE] [최솟값]
[NOMAXVALUE or MAXVALUE] [최대값]
-- NOMINVALUE : 디폴트값 설정, 증가일때 1, 감소일때 -1028
-- MINVALUE : 최소값 설정, 시작숫자와 작거나 같아야하고 MAXVALUE보다 작아야함
-- NOMAXVALUE : 디폴트값 설정, 증가일때 1027, 감소일때 -1
-- MAXVALUE : 최대값 설정, 시작숫자와 같거나 커야하고 MINVALUE보다 커야함
[CYCLE or NOCYCLE] -- 최대값 도달 시 최솟값부터 시작 or not
[CACHE or NOCACHE] -- 메모리에 시퀀스 값을 미리 할당 or not
[ORDER or NOORDER] -- 요청 순으로 값 생성 or not
+ CACHE 설정 시 속도 빠름 / 동시 사용자가 많을 경우 유리
+ ORDER 설정 시 시스템 부하 있을 수 있음
--예) 1부터 1씩 증가하여 9999까지 부여
CREATE SEQUENCE TEST_SEQ --시퀀스이름 TEST_SEQ
INCREMENT BY 1 --증가 값 1
START WITH 1 --시작 1
MINVALUE 1 --최소값 1
MAXVALUE 9999 --최대값 9999
NOCYCLE --순환X
CACHE; --메모리에 시퀀스값 미리할당
--예) 1000부터 1씩 감소하여 1까지 부여
CREATE SEQUENCE TEST_SEQ
INCREMENT BY -1
START WITH 1000
MINVALUE 1
MAXVALUE 1000
NOCYCLE
NOCACHE;
2. Sequence 조회
--전체 sequence 조회
SELECT * FROM SEQ;
SELECT * FROM USER_SEQUENCES;
--현재 sequence 조회
SELECT TEST_SEQ.CURRVAL
FROM dual;
--현재 sequence의 다음 값
--이때, 현 SELECT문으로 시퀀스 값 추가 증가 됨
SELECT TEST_SEQ.NEXTVAL
FROM dual;
+ CURRVAL은 여러번 실행해도 순번은 증가 X + NEXTVAL을 한번 실행한 세션에서만 사용 가능하다. 위의 쿼리만 사용 시 아래 에러 발생 ORA-08002 : emp_seq.CURRVAL은 이 세션에서는 정의 되어있지않습니다 |
* NEXTVAL 및 CURRVAL을 사용할 수 있는 경우 - 서브쿼리가 아닌 SELECT문 - INSERT문의 SELECT절 - INSERT문의 VALUE절 - UPDATE문의 SET절 * NEXTVAL 및 CURRVAL을 사용할 수 없는 경우 - VIEW의 SELECT절 - DISTINCT 키워드가 있는 SELECT문 - GROUP BY, HAVING, ORDER BY절이 있는 SELECT문 - SELECT, DELETE, UPDATE의 서브쿼리 - CREATE TABLE, ALTER TABLE 명령의 DEFAULT값 |
3. Sequence 수정
시퀀스는 DDL문으로, ALTER문으로 수정
ALTER SEQUENCE TEST_SEQ INCREMENT BY 2 --증가값을 2로 변경
ALTER SEQUENCE TEST_SEQ MAXVALUE 99999 --최대값을 9999에서 999로 변경
※ STARTWITH (시작값) 변경 불가
4. Sequence 삭제
DROP SEQUENCE TEST_SEQ
참고 https://mine-it-record.tistory.com/62 https://coding-factory.tistory.com/420 https://gent.tistory.com/393
'Database > Oracle' 카테고리의 다른 글
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
---|---|
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Listener & Oracel DB (0) | 2023.03.12 |
[Oracle] SCN, Checkpoint (0) | 2023.03.12 |
[Oracle] 구조 (0) | 2023.03.09 |
[Oracle] Listener & Oracel DB
Listener 리스너
- 클라이언트에서 오라클 서버로 연결하기 위한 오라클 네트워크 관리자
- 기본 포트 번호 1521 (다른 번호 사용 가능)
- listener.ora 파일에 텍스트 형식으로 기록
listener.ora 파일?
|
--리스너 관리모드
$ lsnrctl
--리스너 시작
$ lsnrctl start
--리스너 중지
$ lsnrctl stop
--리스너 재시작
$ lsnrctrl reload
※ 리눅스 환경에서는 정확한 경로에 접근해서 해당 프로그램을 실행해야 한다. lsnrctl 프로그램의 정확한 위치는 오라클홈 밑의 bin 디렉터리에 있다.
ex) '/app/oracle/a/bin'
연결 과정
1. user가 리스너로 연결 요청 (tnsnames.ora 파일 확인 & 리스너의 주소와 포트번호 등 확인)
2. 리스너가 Server process에 연결 요청 (자신이 연결 할 포트번호 등을 listener.ora에서 확인)
3. Server process에서 PGA 메모리 할당(Program Global Area - Process들이 개별적으로 사용하는 메모리 공간)
4. Server process에서 User process에게 Resend 패킷 전송
5. 연결
tnsnames.ora 파일?
|
LISTENER_CDB1 = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102(PORT = 1521))
CDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.102)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cdb1)
)
)
|
listener.ora 파일 수정
$vi $ORACLE_HOME/network/admin/listener.ora
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 설정했던 host name 또는 host IP)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
리스너가 DB를 못 찾을 경우 listener.ora에 아래 내용 추가
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = DB명)
(ORACLE_HOME = ORACLE_HOME 경로)
(SID_NAME = DB명)
)
)
Oracel
+ 먼저 아래 명령어 입력으로 Oracle DB 생성
$dbca
> startup
입력 시 문자가 제대로 출력되지 않는다면 아래 내용으로 문자셋 설정 편집
$ vi .bash_profile
--Oracle 접속
$ sqlplus '/as sysdba'
--인스턴스 시작
> startup
--인스턴스 중지
shutdown
'Database > Oracle' 카테고리의 다른 글
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
---|---|
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] SCN, Checkpoint (0) | 2023.03.12 |
[Oracle] 구조 (0) | 2023.03.09 |
[Oracle] SCN, Checkpoint
SCN (System Change Number)
- DB의 변경이 발생한 시점 / Commit이 발생하면 트랜잭션은 고유한 번호를 받음
이때 발생한 번호로 트랜잭션 관리* & 장애 발생 시 복구 키로 이용
*트랜잭션 관리 : 읽기 일관성, 사용자들에게 가장 최근에 커밋된 데이터 보여줌
- Data file, Control file, Redo Log File의 동기화 정보를 맞춤
- Data file : 실제 데이터가 저장되는 디스크 상의 물리적 파일 - Control file : DB의 제어 정보를 가지고 있는 파일 (파일이 손상되면 mount, open 불가 -> 2개 이상으로 백업하여 각각 다른 디스크에 보관 권고) - Redo Log File : DB에서 생긴 모든 변화를 기록한 파일 장애 복구에 가장 핵심 / 작업 내용 유실 X |
- SCN이 다르다면 DB가 정상적으로 올라오지 않음
∵ Oracle이 startup 된 후 Mount -> Open 시점에 컨트롤파일과 데이터파일의 SCN을 비교해서 DB를 올릴지 판단 함
-- 현재 SCN 확인
SQL> select current_scn from v$database;
Checkpoint
- Commit 된 데이터를 어디까지 저장했는지 확인하기 위해 만들어 놓은 개념 (인스턴스 복구를 시작해야 하는 SCN)
ex) SCN이 100번까지 commit 되었고, checkpoint 정보가 90번이라면 SCN 90번 트랜잭션까지 데이터 파일에 저장된 것
- DBWR이 현재 Buffer Cache 데이터를 디스크로 백업
- Datafile의 복구를 결정하는 기초적인 정보
- 체크포인트를 통해 정기적으로 기록함으로써 롤 포워드(Redo) 시간을 단축 ( 복구 시간 단축 )
- 디스크에 기록된 만큼의 Redo Log 데이타는 삭제
- Control file과 Data file의 Check point 정보를 비교하고 서로 정보가 다르다면, Online Redo/Archived Redo Log를 참조하여 복구
- 체크포인트 발생 시 CKPT가 Control file과 Data file Header에 Checkpoint 기록
- 체크 포인트 발생 → CKPT 에서 DBWn 에 체크포인트 발생 사실 통지 → DBWn 은 블록을 디스크에 기록
1. Database / Global Checkpoint
- DB 버퍼 캐시에 있는 모든 dirty buffe의 내용을 데이터 파일로 저장
- 저장된 가장 큰 SCN의 번호(Checkpoint SCN)를 Control file과 Data file Header에 기록
2. Thred Checkpoint / Logical Checkpoint
- Log Switch 발생 시 생성
- RAC 환경일 경우 각 노드별로 다르게 발생, Single Instance일 경우 Database Check point와 같은 역할
3. Datafile Checkpoint
- 특정 data file에만 발생
- 해당 Tablespace를 오프라인 한다거나, Begin backup 수행 시 발생
- Control fil과 Data file Header에 기록
4. Mini Checkpoint
- Drop Table과 같이 특정한 DDL 발생 시 특정 블록에만 발생
5. Recovery Checkpoint
- 데이터 파일에 장애 발생 시 백업된 데이터파일 복원 후 Redo Change Vector를 적용 시킨 후 recovery 된 블록을 데이터 파일에 저장 시 발생
-- checkpoint_change# : 가장 마지막 checkpoint의 SCN
SQL> select checkpoint_change# from v$datafile ;
'Database > Oracle' 카테고리의 다른 글
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
---|---|
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] Listener & Oracel DB (0) | 2023.03.12 |
[Oracle] 구조 (0) | 2023.03.09 |
[Oracle] 구조
오라클 서버 (Oracle Server)
: 메모리와 디스크에 생성되는 구조
└- 인스턴스 (Instance)
: 메모리 부분에 생성되는 구조
└- SGA (System Global Area)
: 실제 작업들이 수행되는 공간
└- Database Buffer Cache
: 데이터의 조회와 변경 등 실제 작업이 일어나는 공간
└- Redo Log Buffer
: 변경 내용을 기록하는 메모리 공간
└- Shared Pool
: 어떤 대상을 공유해서 사용하기 위한 공간
└- Library Cache
: Soft Parse시 사용, SQL과 실행계획 등이 저장된 공간
└- Data Dictionary Cache
: 구문분석이나 실행계획을 세울때 사용하는 Dictionary들이 Cache 되어진 공간
└- Server Result Cache
: 결과값을 Cache 해 두는 공간
└- Large Pool
└- Java Pool
└- Streams Pool
└- Fixed SGA
└- 백그라운드 프로세스 (Background Process)
: Oracle Server 가 잘 운영되도록 하는 역할
└- DBWR
: 데이터 파일로 저장하는 역할
└- LGWR
: Redo Log Buffer에 있는 내용을 Redo Log File로 저장하는 역할
└- PMON
: 모든 서버 프로세스들 감시
└- SMON
: Instance Clean Up 역할
: Instance Recovery 과정에서 누락된 Transaction Recovery 역할
: 비정상 종료된 Transaction이 사용 중이던 Temporary segment 를 Clean up 역할
: Dictionary Managed Tablespace 에서 Free extents들을 모아주는 역할
└- CKPT
: DBWR에게 Checkpoint 신호를 전달
└- ETC
└- PGA (Program Global Area)
: Process들이 개별적으로 사용하는 메모리 공간
└- SQL Work Area
: Sort 관련 작업을 수행하는 공간
└- Private SQL Area
└- 데이터베이스 (Database)
: 디스크 (Disk) 에 위치한 파일들의 세트
└- 데이터 파일 (Data File)
: 데이터 (Data) 를 저장하는 공간
└- 컨트롤 파일 (Control File)
: DB 운영 정보 저장
└- 리두 로그 파일 (Redo log File)
: 변경 내용을 기록하는 파일 공간
출처 오라클 구조 (Oracle Structure) 를 Tree 형식으로 쉽고 간단하게 알아보자~(?) (tistory.com)
1. 메모리
1.1 공유 메모리 영역 SGA(System Global Area)
- 운영체제가 제공해준 것. 여러 프로세스가 동시에 엑세스할 수 있는 메모리 영역
- 인스턴스가 복구 될 때마다 메모리에 할당 됨
- Lock을 걸어 베타적 제어*를 하지 않으면 데이터에 손상을 입을 수 있음
*베타적 제어 : 프로세스가 공유 데이터를 변경하고 있는 도중에 다른 프로세스가 해당 공유 데이터를 읽거나 변경하지 못하도록 하는 것
Buffer Cache : 디스크파일로부터 데이터 블록을 담는 캐시 영역.
자주 사용하는 데이터를 더 빠르게 가져오기 위해 존재. LRU 알고리즘 *사용
Buffer Cache 상태
pinned : 지금 사용 중인 상태. 다른 사람이 사용을 못하는 lock 상태
unused : startup 이후 한번도 사용하지 않은 상태
free : 변경된 내용이 Disk에 백업이 완료된 상태
dirty : 내용이 수정되었지만 아직 Disk에 백업이 되지 않은 상태. 백업이 되면 다시 free 상태가 됨.
*LRU (Lease Recently Used) 알고리즘 : 가장 최근에 사용하지 않은 데이터부터 캐시아웃
ex) 1 -> 2-> 3 순차 호출
3 → | 2 → | 1 |
2번 캐시 호출
2 → | 3 → | 1 |
캐시에 4를 새로 씀 / LRU인 1 제거
4 → | 2 → | 3 → |
Cache와 Buffer
Cache : 속도가 다른 두 장치간의 속도 차이를 줄여주기 위한 장치.
데이터 저장소로 이용되므로 데이터를 저장하여 추후에도 계속 사용 가능
Buffer : 데이터를 전송하는 상호간의 장치에서 저속의 장치가 작업을 하는 동안 고속의 장치가 기다려야 하는 현상을 줄여주는 장치. (데이터를 읽어오기 위해 디스크까지 가지 않아도 됨)
데이터 손실 방지 & 사용된 데이터는 삭제 됨
1.2 프로세스 고유 메모리 영역 PGA(Process Global Area)
- 서버 프로세스가 가진 자신만의 메모리 영역. DB에 접속하는 모든 유저에게 할당되는 각각의 서버 프로세스가 독자적으로 사용하는 오라클 메모리 영역.
- SQL의 작업 공간. 정렬 작업을 수행(sort) → PGA 메모리 용량 부족 시 TEMPORARY TABLESPACE를 사용
하나의 유저 프로세스에 하나의 서버 프로세스가 할당되며, 하나의 서버 프로세스는 하나의 PGA를 생성
PGA 구조
정렬 공간 Sort Area |
유저 프로세서 세션 정보 User Session Data |
파싱 정보가 기록된 주소 Cursor State |
변수 저장 공간 Stack Space |
1.3 RAC (Real Application Cluster)
- 하나의 Database에 여러개의 Instance를 구성하는 방식 = 하나의 Instance에 장애가 발생하여도 DB운영에 지장X
- n개의 Instance에서 동일한 datafile을 공유하여 엑세스
- CPU나 메모리 등의 자원은 공유X
- SPFILE* 권장
*SPFILE (서버파라미터 파일)
- 바이너리 형식
- PFILE을 사용해 수동으로 생성되거나, DB 생성 시 사용하는 DBCA에 의해 자동으로 생성됨
- NOMOUNT 단계 이상이라면 다시 SPFILE을 쓰기 때문에 제거하거나 이동하면 안됨
spfile$SID.ora
ALTER SYSTEM SET [파라미터명 = 값] [SCOPE]
- 수정 시 인스턴스 재기동 불필요
*SCOPE 옵션
MEMORY - 변경 즉시 적용 / 재시작 시 원래 설정 값으로 돌아감
SPFILE - SPFILE에만 변경 적용 / 현재 상태에는 영향X
BOTH - 변경 즉시 SPFILE에도 적용 / 재시작 시 변경 내용 반영
cf) PFILE (파라미터 파일)
- 텍스트 형식으로 변경 가능
- 파일 수정 시 인스턴스 재 기동으로 적용
- DB 생성이나 장애 발생 시 사용
--pfile
$ cd /ORA19/app/.../dbs
$ vi Init$SID.ora
+ RAC Ping 현상: Instance 1에서 변경 완료 된 데이터를 Instance 2 로 가져오기 위해 디스크에 저장 후 해당 데이터를 Instance 2 로 복사해오는 작업
'Database > Oracle' 카테고리의 다른 글
[Oracle] 관리자 계정(system, sys) 비밀번호 변경 (0) | 2023.03.16 |
---|---|
[Oracle] 이전 명령어 방향키로 출력 (0) | 2023.03.15 |
[Oracle] Sequence (0) | 2023.03.13 |
[Oracle] Listener & Oracel DB (0) | 2023.03.12 |
[Oracle] SCN, Checkpoint (0) | 2023.03.12 |