오라클 블록 사이즈 : 2k, 4k, 8k(기본값), 16k, 32k

SELECT * FROM dba_tablespaces; TABLESPACE_NAME BLOCK_SIZE ALLOCATIO
--------------- ---------- ---------
SYSTEM                8192 SYSTEM
SYSAUX                8192 SYSTEM
USERS                 8192 SYSTEM
EXAMPLE               8192 SYSTEM
UNDO1                 8192 SYSTEM
TEMP                  8192 UNIFORM



# SGA영역 상태정보
SELECT * FROM v$sgastat;


# SGA 메모리 free 확인

SELECT * FROM v$sgastat 
WHERE name = 'free memory';
POOL         NAME              BYTES
------------ ------------ ----------
shared pool  free memory    13726036
large pool   free memory     7897088
java pool    free memory     4194304
SELECT round(sum(bytes)/1024/1024,2) free_mb 
FROM v$sgastat
WHERE name = 'free memory';
FREE_MB
26.25



SELECT * FROMm v$memory_dynamic_components;

기본 블록 크기는 데이터베이스 생성시 결정한다.
dbca를 통해서 데이터베이스 생성시에는 8k로 결정된다. (기본값)
다른 block 크기를 기본 블록으로 설정하려면 수동으로 데이터베이스를 생성하면된다.

SQL> show parameter db_block_size NAME                TYPE        VALUE
------------------- ----------- -------
db_block_size       integer     8192
SQL> show parameter db_cache_size

db_cache_size
: db_block_size 로 설정한 값의 data buffer cache
  기본값으로 설정된 8k 블록은 전부 여기로 모인다.
NAME                TYPE        VALUE
------------------- ----------- -------
db_cache_size       big integer 0
SQL> show parameter %k_cache_size NAME                TYPE        VALUE
------------------- ----------- -------
db_8k_cache_size    big integer 0
 └> Standard Block Size

db_2k_cache_size    big integer 0
db_4k_cache_size    big integer 0
db_16k_cache_size   big integer 0
db_32k_cache_size   big integer 0
 └> non standard block



1. 4k block 메모리 공간 확보

SQL> show parameter db_4k_cache_size
NAME                TYPE        VALUE
------------------- ----------- -------
db_4k_cache_size    big integer 0
alter system set db_4k_cache_size = 10M;  
SQL> show parameter db_4k_cache_size

- 4k 배수단위로 등록 된다.
NAME                TYPE        VALUE
------------------- ----------- -------
db_4k_cache_size    big integer 12M
2. 4k block size tablespace 생성

CREATE TABLESPACE oltp_tbs
DATAFILE '/home/oracle/userdata/oltp_tbs01.dbf'
SIZE 5M AUTOEXTEND ON
BLOCKSIZE 4K
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;


oltp_tbs  tablespase 생성
데이터 파일 위치
5M 빈파일 생성, 자동으로 크기 증
4k block size 설정
extent를 bitmap으로 관리, extent 크기를 1M 단위로 증가
ASSM 자동 세그먼트 공간 관리
SELECT * FROM dba_tablespaces
WHERE tablespace_name = 'OLTP_TBS';
TABLESPACE_NAME : OLTP_TBS
BLOCK_SIZE : 4096
EXTENT_MANAGEMENT : LOCAL
ALLOCATION_TYPE : UNIFORM
SEGMENT_SPACE_MANAGEMENT : AUTO
...
3. TABLE 생성

CREATE TABLE hr.oltp_emp
TABLESPACE oltp_tbs
AS SELECT * FROM hr.employees;
 
SELECT * FROM dba_data_files 
WHERE tablespace_name = 'OLTP_TBS';
FILE_NAME : /home/oracle/userdata/oltp_tbs01.dbf
FILE_ID : 3
TABLESPACE_NAME : OLTP_TBS
...
SELECT * FROM dba_extents
WHERE owner = 'HR'
AND segment_name IN ('OLTP_EMP','EMPLOYEES');


- EMPLOYEES의 BLOCK_ID가 200번부터 시작해서 BLOCKS 8개 = 207번까지 사용

COLUMNS              EMPLOYEES  OLTP_EMP
-------------------- ---------- ----------
EXTENT_ID            0          0
BYTES                65536      1048576
BLOCKS               8          256
FILE_ID              5          3
BLOCK_ID             200        256
SEGMENT_TYPE         TABLE      TABLE
TABLESPACE_NAME      EXAMPLE    OLTP_TBS
...
SELECT * FROM dba_segments
WHERE owner = 'HR'
AND segment_name IN ('OLTP_EMP','EMPLOYEES');


- EMPLOYEES의 HEADER_BLOCK은 202번부터 시작한다
COLUMNS              EMPLOYEES  OLTP_EMP
-------------------- ---------- ----------
BLOCKS               8          256
HEADER_BLOCK         202        261
SEGMENT_SUBTYPE      ASSM       ASSM
BUFFER_POOL          DEFAULT    DEFAULT
TABLESPACE_NAME      EXAMPLE    OLTP_TBS
EXTENTS              1          1
...
SELECT * FROM hr.oltp_emp 
WHERE department_id = 20;
1. parse
2. bind
3. execute
4. fetch


책 = table
페이지 = block
문장 = row
색인(본문외 공간) = index
블럭 안에서 단어 위치 = IO



 

<< SYS SESSION >>
  SELECT * FROM dba_data_files;

SQL> show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDO1


# UNDO TABLESPACE 생성
CREATE UNDO TABLESPACE undotbs
DATAFILE '/u01/app/oracle/oradata/ora11g/undotbs01.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL;

SELECT segment_id, segment_name, owner, tablespace_name, status
FROM dba_rollback_segs;
TABLESPACE_NAME
- SYSTEM : 딕셔너리 테이블 갱신조작 시 사용(INSERT, DELETE, UPDATE)
- PUBLIC : USER 사용

SELECT n.name, s.extents, s.rssize, s.xacts, s.status
FROM v$rollname n, v$rollstat s
WHERE n.usn = s.usn;
<< HR SESSION >>
  UPDATE hr.employees SET salary = salary * 1.1 WHERE employee_id = 200;
<< SYS SESSION >>
  << sqldeveloper >>
SELECT n.name, s.extents, s.rssize, s.xacts, s.status
FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;
NAME                   EXTENTS  RSSIZE  XACTS STATUS
---------------------- ------- -------- ----- ---------------
_SYSSMU10_4227184396$        2   122880     1 ONLINE
...

ALTER SYSTEM SET undo_tablespace = undotbs;

show parameter undo
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     900
undo_tablespace                      string      UNDOTBS


SELECT segment_id, segment_name, owner, tablespace_name, status
FROM dba_rollback_segs;

SELECT n.name, s.extents, s.rssize, s.xacts, s.status
FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;
NAME                   EXTENTS  RSSIZE  XACTS STATUS
---------------------- ------- -------- ----- ---------------
_SYSSMU20_1305247116$        4   253952     1 PENDING OFFLINE
...
- PENDING OFFLINE : 새로운 트랜젝션 안받음. undo_retention 보장으로 기본값 900(15분) 유지
<< HR SESSION >>
  DELECT FROM hr.employees WHERE employee_id = 202;
<< SYS SESSION >>
  SELECT n.name, s.extents, s.rssize, s.xacts, s.status
FROM v$rollname n, v$rollstat s WHERE n.usn = s.usn;
NAME                   EXTENTS  RSSIZE  XACTS STATUS
---------------------- ------- -------- ----- ---------------
_SYSSMU10_4227184396$        2   122880     1 ONLINE
...
ㄴ 동일한 세션에서 작업 시 사용된 기존 언두 세그먼트 그대로 사용

SELECT s.username, t.xidusn, t.ubafil, t.ubablk, t.used_ublk
FROM v$session s, v$transaction t WHERE s.saddr = t.ses_addr;
USERNAME       XIDUSN     UBAFIL     UBABLK  USED_UBLK
---------- ---------- ---------- ---------- ----------
HR                 10          6        188          1
XIDUSN      : UNDO SEGMENT ID
UBAFIL      : UNDO DATA FILE ID
UBABLK      : UNDO 블럭번호
USED_UBLK   : 사용하고있는 UNDO BLOCK 수 : 누가 과도하게 DML 작업하고 있는가


# 10분 단위 undo 발생량 정보 확인
SELECT * FROM v$undostat;

SELECT TO_CHAR(BEGIN_TIME, 'yyyy-mm-dd hh24:mi:ss') BEGIN_TIME,     -- 트랜잭션 발생시간
        TO_CHAR (END_TIME, 'yyyy-mm-dd hh24: mi:ss') END_TIME,      -- 트랜잭션 종료시간
        UNDOBLKS                                                    -- 이 구간에 발생한 undo block 수
FROM v$undostat;

SELECT TO_CHAR (BEGIN_TIME, 'yyyy-mm-dd') BEGIN_TIME, SUM(UNDOBLKS)
FROM v$undostat
GROUP BY TO_CHAR(BEGIN_TIME, 'yyyy-mm-dd');
ㄴ 일자별 체크






<< SYS SESSION >>
  ■ USER 관리

CREATE USER  ora1 IDENTIFIED BY oracle;
> CREATE USER  유저명 IDENTIFIED BY  비밀번호;    -- 기본 생성 방식

예) CREATE TABLE test (id number); 생성 시 segment의 기본 tablespace는 ?
SELECT * FROM dba_users WHERE username = 'ORA1';
DEFAULT_TABLESPACE   : USERS
TEMPORARY_TABLESPACE : TEMP

유저 생성시 default tablespace가 지정되어 있지 않으면 system tablespace가 되는 문제점때문에
10g버전부터 데이터베이스 생성시에 데이터베이스 레벨에서 default tablespace가 생성되어 있다.


# 데이터베이스 레벨에 기본값으로 설정된 정보 확인
SELECT * FROM database_properties;
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   USERS
...


# USER 생성 시 TABLESPACE의 DEFAULT 값을 설정하는 습관을 갖자.
CREATE USER ora2 IDENTIFIED BY oracle
DEFUALT TABLESPACE example  -- 수동으로 DEFUALT TABLESPACE 지정
TEMPORARY TABLESPACE temp   -- 수동으로 DEFUALT TEMPORARY TABLESPACE 지정
QUOTA 1M ON example;        -- example 공간을 최대 1M 사용할 수 있는 권한 부여

SELECT * FROM dba_users WHERE username = 'ORA2';
DEFAULT_TABLESPACE   : EXAMPLE
TEMPORARY_TABLESPACE : TEMP

CREATE TABLESPACE user_tbs
DATAFILE '/u01/app/oracle/oradata/ora11g/user_tbs01.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL
SEGMENT SPACE MANAGEMENT AUTO;

CREATE TEMPORARY TABLESPACE user_temp
TEMPFILE '/u01/app/oracle/oradata/ora11g/user_temp01.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT MANUAL;

SELECT * FROM dba_tablespaces;
SELECT * FROM dba_data_files;
SELECT * FROM dba_temp_files;
SELECT * FROM dba_users WHERE username IN ('ORA1', 'ORA2');

SELECT * FROM database_properties;
>> DEFAULT_TEMP_TABLESPACE, DEFAULT_PERMANENT_TABLESPACE 기본값 확인


ALTER DATABASE DEFAULT TABLESPACE user_tbs;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE user_temp;

SELECT * FROM database_properties;
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE        USER_TEMP
DEFAULT_PERMANENT_TABLESPACE   USER_TBS

SELECT * FROM dba_users WHERE username IN  ('ORA1', 'ORA2');
USERNAME   DEFAULT_TABLESPACE  TEMPORARY_TABLESPACE
---------- ------------------- ---------------------
ORA1       USER_TBS            USER_TEMP
ORA2       EXAMPLE             USER_TEMP
ㄴ DEFAULT 값으로 사용중이던 TEMP -> USER_TEMP 로 따라 바뀐다.



CREATE TEMPORARY TABLESPACE temp10
TEMPFILE '/u01/app/oracle/oradata/ora11g/temp10.dbf' SIZE 10M
AUTOEXTEND ON
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT MANUAL;

SELECT * FROM database_properties;
SELECT * FROM dba_tablespaces;
SELECT * FROM dba_temp_files;
SELECT * FROM dba_data_files;

CREATE USER ora3 IDENTIFIED BY oracle
DEFAULT TABLESPACE example      -- example로 기본지정한다.
TEMPORARY TABLESPACE temp10     -- temp10으로 기본지정한다.
QUOTA 1M ON example;            -- example이라는 tablespace의 공간을 사용할 수 있는 권한 부여 최대 1M

SELECT * FROM dba_users WHERE username IN ('ORA1', 'ORA2', 'ORA3');
USERNAME   DEFAULT_TABLESPACE  TEMPORARY_TABLESPACE
---------- ------------------- ---------------------
ORA1       USER_TBS            USER_TEMP
ORA2       EXAMPLE             USER_TEMP
ORA3       EXAMPLE             TEMP10

SELECT * FROM database_properties;
DEFAULT_TEMP_TABLESPACE         USER_TEMP
DEFAULT_PERMANENT_TABLESPACE USER_TBS


ALTER DATABASE DEFAULT TABLESPACE users;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;

SELECT * FROM database_properties;
PROPERTY_NAME                  PROPERTY_VALUE
------------------------------ ------------------------------
DEFAULT_TEMP_TABLESPACE        TEMP
DEFAULT_PERMANENT_TABLESPACE   USERS

SELECT * FROM dba_users WHERE username IN ('ORA1', 'ORA2', 'ORA3');
USERNAME   DEFAULT_TABLESPACE  TEMPORARY_TABLESPACE
---------- ------------------- ---------------------
ORA1       USERS               TEMP
ORA2       EXAMPLE             TEMP
ORA3       EXAMPLE             TEMP10


ALTER DATABASE DEFAULT TABLESPACE user_tbs;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE user_temp;

SELECT * FROM database_properties;
DEFAULT_TEMP_TABLESPACE         USER_TEMP
DEFAULT_PERMANENT_TABLESPACE USER_TBS

SELECT * FROM dba_users WHERE username IN ('ORA1', 'ORA2', 'ORA3');
USERNAME   DEFAULT_TABLESPACE  TEMPORARY_TABLESPACE
---------- ------------------- ---------------------
ORA1       USER_TBS            USER_TEMP
ORA2       EXAMPLE             USER_TEMP
ORA3       EXAMPLE             TEMP10



GRANT CREATE SESSION, CREATE TABLE TO  ora1, ora2, ora3;

SELECT * FROM dba_sys_privs WHERE grantee IN ('ORA1', 'ORA2', 'ORA3');
GRANTEE    PRIVILEGE            ADMIN_OPTION
---------- -------------------- -------------
ORA2       CREATE SESSION       NO
ORA1       CREATE SESSION       NO
ORA1       CREATE TABLE         NO
ORA3       CREATE TABLE         NO
ORA3       CREATE SESSION       NO
ORA2       CREATE TABLE         NO
<< ORA1 SESSION >>
  SELECT * FROM session_privs;
PRIVILEGE
----------------------------------------
CREATE SESSION
CREATE TABLE

CREATE TABLE test (id number, name varchar2(30), day date);

SELECT table_name, tablespace_name FROM user_tables;
TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------
TEST                           USER_TBS

SELECT * FROM user_users;

INSERT INTO test(id, name, day) VALUES (1, 'james', sysdate);
ORA-01950: no privileges on tablespace 'USER_TBS'
>> USER_TBS tablespace에 대한 quota 값을 받지 않아서 발생
    - table은 딕셔너리에 설계정보만 저장된 상태이다.
    - 인서트 시 quota 값 확인해야하는데 없이 테이블을 만들었다.

SELECT * FROM user_ts_quotas;
no rows selected
>> quota값을 받은적이 없다.
<< SYS SESSION >>
  ALTER USER ora1 QUOTA 1M ON user_tbs;
ALTER USER ora1 QUOTA 1M IN example;

SELECT * FROM dba_ts_quotas WHERE username = 'ORA1';
TABLESPACE_NAME USERNAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS DROPPED
USER_TBS     ORA1     0     1048576     0     128         NO
EXAMPLE         ORA1     0     1048576     0     128         NO
<< ORA1 SESSION >>
  SELECT * FROM user_ts_quotas;
TABLESPACE_NAME      USERNAME        BYTES  MAX_BYTES     BLOCKS MAX_BLOCKS DROPPED
-------------------- ---------- ---------- ---------- ---------- ---------- --------
USER_TBS             ORA1                0    1048576          0        128 NO
EXAMPLE              ORA1                0    1048576          0        128 NO

INSERT INTO test(id, name, day) VALUES (1, 'james', sysdate);

COMMIT;

SELECT * FROM test;
        ID NAME                           DAY
---------- ------------------------------ ---------
         1 james                          19-DEC-23

CREATE TABLE emp(id number, name varchar2(30), day date) TABLESPACE example;

INSERT INTO emp (id, name, day) VALUES (1, 'james', sysdate);

COMMIT;

SELECT * FROM emp ;
        ID NAME                           DAY
---------- ------------------------------ ---------
         1 james                          19-DEC-23
<< SYS SESSION >>
  SELECT * FROM ora1.test;
        ID NAME                           DAY
---------- ------------------------------ ---------
         1 james                          19-DEC-23

SELECT * FROM ora1.emp;
        ID NAME                           DAY
---------- ------------------------------ ---------
         1 james                          19-DEC-23