Oracle 74일차

[SQLPLUS에서 출력 설정]

set pages 100 -> 한 페이지에 100행씩 출력하도록 함.
col 컬럼명 또는 alias명 format a10 -> 문자 컬럼에 대해서 10바이트로 출력되게 함.
col 컬럼명 또는 alias명 format 9999 -> 숫자 컬럼에 대해서 4자리로 출력되게 함.

[PDB]

1. PDB 접속

ss
alter session set container=orapdb;
show con_name

select name from v$datafile;

2. 새로운 tbs 생성

create tablespace ts_test1 datafile '/oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf' size 10m;

3. 테이블 생성

create table system.pdb_table1(no number) tablespace ts_test1;
insert into system.pdb_table1 values(10);
insert into system.pdb_table1 values(20);
insert into system.pdb_table1 values(30);
commit;

4. 기존 테이블스페이스 용량 증설

alter tablespace ts_test1 add datafile '/oracle19/app/oracle/oradata/ORA19DB/orapdb/ts_test02.dbf' size 10m;

alter database datafile '/oracle19/app/oracle/oradata/ORA19DB/orapdb/ts_test01.dbf' resize 20m;

alter database datafile '/oracle19/app/oracle/oradata/ORA19DB/orapdb/ts_test01.dbf' autoextend on;

5. 테이블스페이스 삭제

drop tablespace ts_test1 including contents and datafiles;

[CDB]

1. CDB 접속

ss
select name, open_mode from v$pdbs;

2. PDB shutdown

alter pluggable database ORAPDB2 close immediate;

3. PDB 삭제

drop pluggable database ORAPDB2 including datafiles;

[유저관리]

1. 공동 사용자
– CDB, PDB에서 같이 사용하는 사용자 (같은 패스워드)
– sys, system 사용자
– c##username 형태의 사용자

2. 로컬 사용자
– 각 PDB에서 사용하는 사용자
– PDB에서 생성 시 로컬 사용자가 됨

PDB유저 생성

1. PDB 접속

ss
alter session set container=orapdb;
select username from dba_users;

2. user 생성

create user scott identified by oracle;
grant create session to scott;

3. scott 유저로 접속

sqlplus scott/oracle@orapdb

CDB유저 생성

1. CDB 접속

select username from dba_users;

2. USER 생성

create user hr identified by oracle;  -- 생성 불가
create user c##hr identified by oracle;

3. c##hr에 접속 권한 부여

-- CDB에만 권한 부여
grant create session to c##hr;
sqlplus c##hr/oracle  -- 가능
sqlplus c##hr/oracle@orapdb  -- 접속 불가

-- 전체에 권한 부여
grant create session to c##hr container=all; 
sqlplus c##hr/oracle  -- 가능
sqlplus c##hr/oracle@orapdb  -- container=all로 권한줘서 접속 가능

[CDB 장애 복구]

PDB FILE은 정상, CDB의 물리전 손상으로 인해 CDB, PDB 접속 불가

0. 전체 백업 진행

rman target /
backup database;

1. 로그스위치 5번

alter system switch logfile;

2. 테이블 생성

create table recover_test500(no number);
insert into recover_test500 values(500);
commit;

select * from system.recover_test500;

3. 장애 발생

select 'rm '||file_name from dba_data_files;
-----------------------------------------------
rm /oracle19/app/oracle/oradata/ORA19DB/system01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/sysaux01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/undotbs01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/users01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/ts_test01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/ts_test02.dbf
----------------------------------------------
shutdown abort

4. 복구

1. 
startup nomount

2. controlfile restore
restore controlfile from '/oracle19/backup/ora19db/c-73391101-20250123-05';

alter database mount;

3. restore
restore database;  -- 이건 CDB, PDB 전체를 restore하는 거라 오래 걸림

-- 아래처럼 하면 장애난 CDB의 datafile만 restore. 그러기 위해서 filenumber 조회
SQL> col name format a50
SQL> select file#, name from v$datafile;

RMAN> restore datafile 1,3,4,7,13,14;

4. recover
recover database;

5. open
alter database open resetlogs;

5. 조회

select * from system.recover_test500;

6. PDB open
CDB 복구를 하면 PDB가 꺼져 있는 상태다

select name, open_mode from v$pdbs;

alter pluggable database ORAPDB open;

[PDB 장애]

PDB file들

1. 백업 진행

RMAN> backup database;

2. 로그 스위치 – CDB에서

alter system switch logfile;

3. PDB 접속

sqlplus system/oracle@orapdb

4. 테이블 생성

create table recover_test600(no number);
insert into recover_test600 values(600);
commit;

5. 장애 발생

select 'rm '||file_name from dba_data_files;  -- PDB로 넘어왔기 때문에 PDB에 대한 datafile이 조회됨.
---------------------------------------------------------
rm /oracle19/app/oracle/oradata/ORA19DB/orapdb/system01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/orapdb/sysaux01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/orapdb/undotbs01.dbf
rm /oracle19/app/oracle/oradata/ORA19DB/orapdb/users01.dbf
---------------------------------------------------------
-- shutdown인데 PDB라서 아래처럼 CDB에서
alter pluggable database ORAPDB close immediate;

6. open 시도 (CDB에서)

alter pluggable database ORAPDB open;  -- 실패

select name, open_mode from v$pdbs;  -- instance와 controlfile을 공유하기 때문에 PDB는 mount단계 아래로는 내려가지 않는다.

7. 복구

1. restore
RMAN> restore pluggable database ORAPDB;
-- 이렇게 치면 알아서 9,10,11,12번 파일 restore함.

-- 아래처럼 해도 될거임 아마도...?(내 생각)
select file#, name from v$datafile;
-- 9,10,11,12
restore datafile 9,10,11,12;

2. recover
recover pluggable database ORAPDB;

8. open

RMAN> alter pluggable database ORAPDB open;

9. 조회

select * from system.recover_test600;  -- PDB에 접속해서 확인해야됨. RMAN에선 확인 안되더라

[파티션 테이블]

대용량 테이블성능 저하를 방지하고 관리를 수월하게 하고자 파티션 테이블 사용.
서로 다른 파티션에 데이터를 저장함으로써 노드 간의 디스크 경합을 최소화하여 성능을 향상시킨다.
-> datafile 분리 또는 디스크 분리 가능.

** 장점
– 개별 partition 단위의 관리 가능.
– 조인 시 partition 간의 병렬 처리 및 partition 내에서의 병렬 처리 가능.
– 데이터의 액세스 범위를 줄여 성능을 향상시키고 테이블의 파티션 단위로 디스크의 I/O를 분산해 부하를 감소.
– 디스크 장애 시 해당 파티션만 영향을 받으므로 데이터의 훼손 가능성이 감소하고 가용성이 향상.

** 대상 테이블 선정
– 크기 10GB 이상인 테이블
– 거래내역이나 로그 등 데이터 관리 주기 테이블
– 대량의 배치 작업의 결과 출력이나 조회의 대상이 되는 테이블
– 대량의 정렬이 자주 발생되는 테이블
– 기타 업무 여건 상 필요한 경우

** 종류
1) RANGE : 년, 월, 분기 등 특정 컬럼의 범위에 따라 파티션을 분할하는 방식.

실습

1. 테이블 사이즈 확인

-- 테이블 사이즈 큰 순서대로 출력
select owner, segment_name, partition_name, tablespace_name, bytes/1024/1024
from dba_segments
where owner in ('SCOTT','HR','SH','OE')
and segment_type='TABLE'
order by 5 desc;

2. 대상 선정
TABLE : OE.ORDERS
PARTITION KEY : ORDER_DATE
RANGE : YEAR

select to_char(order_date, 'YYYY'), count(order_id)
from OE.ORDERS
group by to_char(order_date, 'YYYY');

3. 파티션 생성1

CREATE TABLE OE.ORDERS_PT
(
    ORDER_ID        NUMBER(12),
    ORDER_DATE      TIMESTAMP(6),
    ORDER_MODE      VARCHAR2(8),
    CUSTOMER_ID     NUMBER(6),
    ORDER_STATUS    NUMBER(2),
    ORDER_TOTAL     NUMBER(8,2),
    SALES_REP_ID    NUMBER(6),
    PROMOTION_ID    NUMBER(6)
)
TABLESPACE USERS
PARTITION BY RANGE(ORDER_DATE) (
PARTITION P2004 VALUES LESS THAN(to_date('2005/01/01', 'YYYY/MM/DD')),
PARTITION P2005 VALUES LESS THAN(to_date('2006/01/01', 'YYYY/MM/DD')),
PARTITION P2006 VALUES LESS THAN(to_date('2007/01/01', 'YYYY/MM/DD')),
PARTITION P2007 VALUES LESS THAN(to_date('2008/01/01', 'YYYY/MM/DD')),
PARTITION P2008 VALUES LESS THAN(to_date('2009/01/01', 'YYYY/MM/DD')),
PARTITION PMAX VALUES LESS THAN(MAXVALUE));

INSERT INTO OE.ORDERS_PT SELECT * FROM OE.ORDERS;

Leave a Comment