[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;