ASMM(Automatic Shared Memory Management) (10g)
- SGA_TARGET 값을 설정하면 SGA 영역을 자동관리한다.
- SGA_TARGET 값은 SGA_MAX_SIZE 값보다는 작거나 같게 설정하면 된다.
- SGA_TARGET 값은 db 운영중에 조정을 할 수 있다.
- MMAN이 Memory Advisor 사용하여 작동한다.
- spfile을 사용 권한


자동관리영역
shared pool
large pool
java pool
data buffer cache defualt 공간


SQL> show parameter sga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
sga_max_size                         big integer 680M
sga_target                           big integer 0      -- (11g,자동관리 설정 중) 
...


SELECT * FROM v$parameter WHERE name in ('sga_target', 'sga_max_size');


SELECT * FROM v$sga_dynamic_components;

last_oper_type :
SHRINK 줄이다
GROW 늘리다
STATIC 고정


[oracle@oracle ~]$ ps -ef | grep ora_mman
oracle   17556     1  0 11:54 ?        00:00:01 ora_mman_ora11g


- SGA_TARGET 설정되어 있더라도 수동으로 관리해야하는 SGA 영역
    - DB_KEEP_CACHE_SIZE
    - DB_RECYCLE_CACHE_SIZE
    - DB_nK_CASHE_SIZE (n=2,4,8,16,32)
    - LOG_BUFFER

- SGA_TARGET 설정되어 있더라도 수동으로 동적 SGA 파라미터의 크기 조정
- 새로운 값이 현재 크기보다 큰 경우 즉시 구성 요소 크기로 조정된다.
- 새로운 값이 현재 크기보다 작은 경우 최소크기가 변경된다.

- 현재보다 줄이고 싶다면 수동 0설정-> 수동 값 설정 하여 기준을 조정 





PGA(Program Global Area)
- 서버프로세스 또는 백그라운드 프로세스의 데이터 및 제어 정보를 포함하고있는 메모리 영역
- PGA는 서버프로세스 또는 백그라운드 프로세스를 시작할 때 오라클 데이터베이스에서 생성되는 비공유메모리

- PGA 영역에 있는 SQL 작업영역 관리는 8i까지는 수동관리
    - sort_area_size (정렬)
    - hash_area_size (hash group by, hash join)
    - bitmap_merge_area_size (0과 1로 인덱스 만들때 사용)
    - create_bitmap_area_size (0과 1로 인덱스 만들때 사용)


SQL> show parameter area
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
bitmap_merge_area_size               integer     1048576
create_bitmap_area_size              integer     8388608
hash_area_size                       integer     2097152
sort_area_retained_size              integer     0
sort_area_size                       integer     1048576
workarea_size_policy                 string      AUTO


SELECT * FROM v$parameter WHERE name in ('sort_area_size',
                                        'hash_area_size',
                                        'bitmap_merge_area_size',
                                        'create_bitmap_area_size');





■ 자동 PGA 메모리 관리 (9i)
- pga_aggregate_target 파라미터 기반으로 SQL 작업영역에 할당되는 PGA 메모리 양이 동적으로 조정된다.
    - sort_area_size
    - hash_area_size
    - bitmap_merge_area_size
    - create_bitmap_area_size
- workarea_size_policy = Auto로 되어 있으면 자동 PGA 메모리 관리


SQL> show parameter workarea
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
workarea_size_policy                 string      AUTO


SQL> show parameter pga
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
pga_aggregate_target                 big integer 0
>> 0지만 0이 아니다. 값이 있다. 11g 버전


SELECT * FROM v$parameter WHERE name in ('sort_area_size',
                                        'hash_area_size',
                                        'bitmap_merge_area_size',
                                        'create_bitmap_area_size',
                                        'workarea_size_policy');

- PGA 수동관리
    ALTER SYSTEM SET workarea_size_policy = MANUAL;

- PGA 세션 레벨에서 수동관리
    ALTER SESSION SET workarea_size_policy = MANUAL;
    ALTER SESSION SET sort_area_size = 1M;





AMM (Automatic Memory Menagement) (11g)
- AMM 기능은 PGA 및 SGA의 크기조정을 작업로드에 따라 자동으로 수행한다.
- AMM 기능을 사용하려면 memory_target 값을 설정해야 한다.
- 오라클이 사용할 수 있는 최대 메모리 설정은 memory_max_target 값으로 설정하면 된다.

SQL> show parameter target
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
memory_target                        big integer 680M
memory_max_target                    big integer 680M    -- 여유있게 활용
pga_aggregate_target                 big integer 0
sga_target                           big integer 0
...


# 자동관리
SELECT * FROM v$parameter WHERE name in ('sort_area_size',      -- PGA 영역
                                        'hash_area_size',
                                        'bitmap_merge_area_size',
                                        'create_bitmap_area_size',
                                        'workarea_size_policy',
                                        'pga_aggregate_target',
                                        
                                        'shared_pool_size',     -- SGA 영역
                                        'db_cache_size',
                                        'large_pool_size',
                                        'java_pool_size',
                                        'streams_pool_size',
                                        'sga_max_size',
                                        'sga_target',
                                        
                                        'memory_target',        -- PGA + SGA
                                        'memory_max_target');


# 무조건 수동관리
SELECT * FROM v$parameter WHERE name in ('db_keep_cache_size',
                                        'db_recycle_cache_size',
                                        'db_2k_cache_size',
                                        'db_4k_cache_size',
                                        'db_8k_cache_size',
                                        'db_16k_cache_size',
                                        'db_32k_cache_size',
                                        'log_buffer');

- memory_target 값이 설정되어 있더라도 sga_target, pga_aggregate_target 을 수동으로 설정할 수 있다.
- memory_target 값을 설정하면 기본적으로 SGA(60%), PGA(40%)


# 현재 메모리 구성 요소
SELECT * FROM v$memory_dynamic_components;

# 지금까지 발생한 resize 작업에 대한 정보
SELECT * FROM v$memory_resize_ops;

# 현재 메모리 크기조정 작업 진행 상황
SELECT * FROM v$memory_current_resize_ops;





■ Background Process ■
- DBWn (Database Writer)
- LGWR (Log Writer)
- CKPT (Checkpoint process)
- SMON (System Monitor)
- PMON (Process Minitor)
...




DBWn (Database Writer)
- data buffer cache에 내용을 데이터 파일에 기록한다.
- data buffer cache에 있는 수정된 (dirty) buffer를 데이터 파일에 기록한다.
- dbwr 작동되는 시점
    - free buffer를 찾지 못했을 경우(free buffer wait event)
    - checkpoint event 발생할 때

SQL> ! ps -ef | grep ora_dbw
oracle   17558     1  0 11:54 ?        00:00:03 ora_dbw0_ora11g
...

SQL> show parameter db_writer_processes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_writer_processes                  integer     1



# 다중화 설정 (TEST)

SELECT * FROM v$parameter WHERE name = 'db_writer_processes';

ALTER SYSTEM SET db_writer_processes = 2 scope = spfile;

SQL> shutdown immediate

SQL> startup

SQL> ! ps -ef | grep dbw
oracle    2511     1  0 00:00 ?        00:00:00 ora_dbw0_ora11g
oracle    2513     1  0 00:00 ?        00:00:00 ora_dbw1_ora11g

SQL> show parameter db_writer_processes
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_writer_processes                  integer     2

SELECT * FROM v$parameter WHERE name = 'db_writer_processes';






LGWR (Log Writer)
- Redo log buffer에 있는 redo entry를 redo log file에 기록한다.
- LGWR 작동 시점
    - commit 수행할 경우
    - redo log buffer가 1/3 찼을 경우
    - 1MB 이상의 redo entry가 들어오면
    - 3초마다
    - DBWR 가 기록하기 전에


SQL> ! ps -ef | grep lgwr
oracle    2515     1  0 00:00 ?        00:00:00 ora_lgwr_ora11g
...

SELECT * FROM v$logfile;        ---> control file에서 관리

SELECT * FROM v$log;         ---> control file에서 관리





CKPT (Checkpoint process)
- checkpoint event 발생시점에 DBWR에 알려준다.
- checkpoint 정보를 데이터 파일 헤더를 갱신
- checkpoint 정보를 컨트롤 파일 갱신



■ checkpoint
- data buffer cache에 있는 dirty buffer (block) (수정된 블록)을 정기적을 디스크에 기록하므로 시스템이나 데이터베이스에 failure가 발생한 경우 데이터가 손실되지 않도록 한다.
- instance recorvery에 필요한 시간을 줄인다. 즉 마지막 체크포인트 다음에 나오는 리두 로그파일에 redo entry에 대해서만 recovery를 수행하면 된다.
- 체크포인트 정보에는 체크포인트 시간, SCN, recovery를 시작할 리두로그 파일의 위치, 로그에 대한 정보를 가지고 있다.
- 체크포인트가 발생하는 경우
    shutdown normal | transactional | immediate
    ALTER SYSTEM CHECKPOINT;    -- 수동으로 checkpoint 발생
    ALTER TABLESPACE user OFFLINE NORMAL;
    ALTER TABLESPACE user READ ONLY;
    ALTER TABLESPACE user BEGIN BACKUP;
    ALTER TABLESPACE user END BACKUP;
    DROP TABLE hr.emp;
    TRUNCATE TABLE hr.emp;
    paralle query (SELECT /*+ full(e) paralle(e, 2) */ from hr.emp e;
    log switch 발생 시(ALTER SYSTEM SWITCH LOG FILE;)
    fast_start_mttr_target을 설정한 경우


# log_checkpoints_to_alert = TRUE 설정을하면 체크포인트 정보를 alert_SID.log에 기록한다.

SQL> show parameter log_checkpoints_to_alert
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_checkpoints_to_alert             boolean     FALSE


SQL> ! ps -ef | grep ckpt
oracle    8965     1  0 01:32 ?        00:00:00 ora_ckpt_ora11g





SMON (System Monitor)
- Instance recovery(Instance fail 시 인스턴스 복구하는 역할)
- coalesces free space(디스크 조각 모음)
- 임시 블록 세그먼트들을 재사용할 수 있도록 하는 역할

SQL> ! ps -ef | grep smon
oracle    8967     1  0 01:32 ?        00:00:00 ora_smon_ora11g





PMON (Process Minitor)
- user process가 실패할 경우 프로세스 recovery 수행
    - 데이터버퍼캐시 정리
    - 사용하고있는 리소스 해지
    - 트랜잭션에 대해서 자동 rollback
    - lock 해제
- listener에게 db정보를 등록시키는 작업을 수행

SQL> ! ps -ef | grep pmon
oracle    8940     1  0 01:32 ?        00:00:00 ora_pmon_ora11g





Control file
- 작은 binary file
- database 이름, 식별자, 생성시간
- data file, redo log file 이름, 위치 정보
- 현재 online redo log file의 sequence 번호
- checkpoint 정보, scn 정보
- backup
- archivelog mode, noarchivelog mode (운영중에는 카피(백업)불가)
- control file은 다중화 하자.
- mount 단계에서 실행, 초기 파라미터에서 관리

SELECT * FROM v$database;

SELECT * FROM v$parameter WHERE name = 'control_files';

SQL> show parameter control_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/ora11g/control01.ctl,
                                                 /u01/app/oracle/fast_recovery_area/ora11g/control02.ctl

# db 정상작동 체크
SQL> show sga
SELECT * FROM v$database;
SELECT * FROM v$instance;



# control file 다중화 (TEST)

초기 파라미터 파일이 서버 파라미터 파일로 운영하고있다. (SPFILE)

SQL> show parameter spfile
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /u01/app/oracle/product/11.2.0.4/db_1/dbs/spfileora11g.ora


[oracle@oracle dbs]$ cat spfileora11g.ora
...
*.control_files='/u01/app/oracle/oradata/ora11g/control01.ctl','/u01/app/oracle/fast_recovery_area/ora11g/control02.ctl'
...


SQL> show parameter control_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/ora11g/control01.ctl,
                                                 /u01/app/oracle/fast_recovery_area/ora11g/control02.ctl


1. sqldeveloper에서 실행
ALTER SYSTEM SET control_files = '/u01/app/oracle/oradata/ora11g/control01.ctl',
                                 '/u01/app/oracle/fast_recovery_area/ora11g/control02.ctl',
                                 '/home/oracle/backup/control03.ctl' SCOPE=SPFILE;


2. 데이터베이스를 정상적인 종료☆
SQL> shutdown immediate
SQL> !


3. 기존 control file을 다른 위치에 복사
[oracle@oracle ~]$ cp -v /u01/app/oracle/oradata/ora11g/control01.ctl /home/oracle/backup/control03.ctl


4. 오라클로 접속한 후 db 시작
SQL> startup

SQL> show parameter control_file
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time        integer     7
control_files                        string      /u01/app/oracle/oradata/ora11g/control01.ctl, 
                                                 /u01/app/oracle/fast_recovery_area/ora11g/control02.ctl, 
                                                 /home/oracle/backup/control03.ctl


>>> 백업해둔게 없기 때문에 control file 고장나면 DB 재설치해야한다.