[oracle@ts-oracle1 ~]$ cd /oradata/datafile/
[oracle@ts-oracle1 datafile]$ ls -alrt
total 48031972
drwxr-xr-x 5 oracle oinstall 4096 Jan 2 10:55 ..
-rw-r----- 1 oracle oinstall 1216356352 Jan 3 16:52 system01.dbf
-rw-r----- 1 oracle oinstall 29087506432 Jan 3 16:54 sysaux01.dbf
-rw-r----- 1 oracle oinstall 10737426432 Jan 3 16:54 ITSM_DATA01.dbf
-rw-r----- 1 oracle oinstall 58990592 Jan 3 16:54 users01.dbf
-rw-r----- 1 oracle oinstall 3160285184 Jan 3 16:54 ITSM_IND01.dbf
-rw-r----- 1 oracle oinstall 3221233664 Jan 3 16:54 LOB01.dbf
-rw-r----- 1 oracle oinstall 1073750016 Jan 3 16:54 USERS_DATA01.dbf
-rw-r----- 1 oracle oinstall 524296192 Jan 3 16:54 USERS_IND01.dbf
drwxr-xr-x 2 oracle oinstall 4096 Jan 3 16:54 .
-rw-r----- 1 oracle oinstall 104865792 Jan 3 16:54 undotbs02.dbf
4. DB mount 단계까지 open
SQL> startup nomount;
SQL> alter database mount;
5. 변경된 데이터파일 경로 DB에 등록 SQL> alter database rename file '/[원래경로파일]' to '/[이동할경로파일]';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/system01.dbf' to '/oradata/datafile/system01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/sysaux01.dbf' to '/oradata/datafile/sysaux01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/ITSM_DATA01.dbf' to '/oradata/datafile/ITSM_DATA01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/users01.dbf' to '/oradata/datafile/users01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/ITSM_IND01.dbf' to '/oradata/datafile/ITSM_IND01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/LOB01.dbf' to '/oradata/datafile/LOB01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/USERS_DATA01.dbf' to '/oradata/datafile/USERS_DATA01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/USERS_IND01.dbf' to '/oradata/datafile/USERS_IND01.dbf';
SQL> alter database rename file '/app/oracle/oradata/18c/TSORA18/undotbs02.dbf' to '/oradata/datafile/undotbs02.dbf';
6. DB open
SQL> alter database open;
7. 데이터 파일 확인
SQL> select name, status from v$datafile;
NAME STATUS
-------------------------------------------------- -------
/oradata/datafile/system01.dbf SYSTEM
/oradata/datafile/ITSM_IND01.dbf ONLINE
/oradata/datafile/sysaux01.dbf ONLINE
/oradata/datafile/ITSM_DATA01.dbf ONLINE
/oradata/datafile/users01.dbf ONLINE
/oradata/datafile/LOB01.dbf ONLINE
/oradata/datafile/USERS_DATA01.dbf ONLINE
/oradata/datafile/USERS_IND01.dbf ONLINE
/oradata/datafile/undotbs02.dbf ONLINE
9 rows selected.
현재 snapshot을 찍는 같은 job이 2개 돌고있는데 이게 같은 시간에 돌면서 PK(snap_id) 충돌이 나 에러가 떨어진 것으로 유추됨
2023-01-03T17:00:08.132008+09:00
Errors in file /app/oracle/diag/rdbms/tsora18/TSORA18/trace/TSORA18_j001_9137.trc:
ORA-12012: error on auto execute of job 61
ORA-00001: unique constraint (PERFSTAT.STATS$DATABASE_INSTANCE_PK) violated
ORA-06512: at "PERFSTAT.STATSPACK", line 4936
ORA-06512: at "PERFSTAT.STATSPACK", line 105
ORA-06512: at line 1
/u01/app/oracle/oradata/ORCL 디렉토리에 위치한 redo log file을 3개의 그룹과 2개의 멤버 파일로 서로 다른 디스크의 마운트 디렉토리인 disk1와 disk2에 다중화하고 그룹의 번호는 1,2,3으로 설정한다.
현재 Redo log file 정보
SELECT a.thread# "Thread#"
, a.group# "Group#"
, b.member "Logfile"
, a.bytes/1024/1024 "Size (MB)"
, a.status
, a.sequence#
FROM v$log a
, v$logfile b
WHERE a.group#=b.group#
ORDER BY 1, 2, 3;
Thread# Group# Logfile Size (MB) STATUS SEQUENCE#
---------- ---------- --------------------------------------------- ---------- ---------------- ----------
1 1 /u01/app/oracle/oradata/ORCL/redo01.log 200 INACTIVE 20
1 1 /u01/app/oracle/oradata/ORCL/redo01_2.log 200 INACTIVE 20
1 3 /u01/app/oracle/oradata/ORCL/redo03.log 200 CURRENT 21
1 3 /u01/app/oracle/oradata/ORCL/redo03_2.log 200 CURRENT 21
1 4 /u01/app/oracle/oradata/ORCL/redo04.log 200 INACTIVE 19
1 4 /u01/app/oracle/oradata/ORCL/redo04_2.log 200 INACTIVE 19
6 rows selected.
그룹 삭제
그룹 1, 2, 3으로 운영할 것이므로 기존에 있던 그룹 1, 3은 삭제한다.
SQL> ALTER DATABASE DROP LOGFILE GROUP 1;
Database altered.
SQL> ALTER DATABASE DROP LOGFILE GROUP 3;
ALTER DATABASE DROP LOGFILE GROUP 3
*
ERROR at line 1:
ORA-01623: log 3 is current log for instance orcl (thread 1) - cannot drop
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/ORCL/redo03.log'
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/ORCL/redo03_2.log'
로그스위치 수행
현재 그룹 3이 사용 중이므로 그룹 삭제가 되지 않는다.
로그스위치를 통해 상태를 변경한다.
SQL> alter system switch logfile;
System altered.
그룹 4가 현재 상태가 되었고 그룹 3은 ACTIVE 상태가 되었다.
Thread# Group# Logfile Size (MB) STATUS SEQUENCE#
---------- ---------- --------------------------------------------- ---------- ---------------- ----------
1 3 /u01/app/oracle/oradata/ORCL/redo03.log 200 ACTIVE 21
1 3 /u01/app/oracle/oradata/ORCL/redo03_2.log 200 ACTIVE 21
1 4 /u01/app/oracle/oradata/ORCL/redo04.log 200 CURRENT 22
1 4 /u01/app/oracle/oradata/ORCL/redo04_2.log 200 CURRENT 22
체크포인트 수행
체크포인트를 발생하여 그룹 3의 status를 Active에서 Inactive 상태로 변경시킨다.
SQL> alter system checkpoint;
System altered.
Redo log file 상태를 확인하면 그룹 3이 ACTIVE 에서 INACTIVE 상태로 변경된 것을 확인할 수 있다.
다시 그룹 3을 삭제하려고 하지만 로그 파일은 최소 2개는 필요하다는 에러가 떨어지게 된다.
SQL> ALTER DATABASE DROP LOGFILE GROUP 3;
ALTER DATABASE DROP LOGFILE GROUP 3
*
ERROR at line 1:
ORA-01567: dropping log 3 would leave less than 2 log files for instance orcl (thread 1)
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/ORCL/redo03.log'
ORA-00312: online log 3 thread 1: '/u01/app/oracle/oradata/ORCL/redo03_2.log'
그룹 5 생성
새로 그룹과 멤버를 생성해 준다. 임시로 생성하는 것으로 나중에 삭제할 것이다.
SQL> ALTER DATABASE ADD LOGFILE GROUP 5
2 ('/u01/app/oracle/oradata/ORCL/redo05.log', '/u01/app/oracle/oradata/ORCL/redo05_2.log') SIZE 200M;
Database altered.
로그 스위치 및 체크포인트 수행
SQL> alter system switch logfile;
System altered.
SQL> alter system checkpoint;
System altered.
- 장애시 복구를 위한 DML 문장 저장 (데이터 파일에 쓰여지지 않은 커밋된 데이터를 복구하기 위해서 사용)
- LGWR은 그룹 내의 모든 리두 로그 파일에 동시에 동일한 정보를 기록
- 최소 2개 이상의 리두 로그 그룹이 필요
- 리두로그 그룹내 멤버는 서로 다른 디스크에 저장 권고
- 각 그룹내 리두로그 멤버는 이중화 권고
*리두로그 파일 그룹 크기를 증가시키거나 감소시키려면 새로운 리두로그 파일 그룹을 추가 후 이전 리두로그 파일 그룹을 삭제
STATUS : 로그 상태
V$LOG 에서 확인 가능
Status
설명
UNUSED
온라인 리두 로그가 기록된 적이 없음 새로 추가된 Redo log일 경우
CURRENT
현재 리두 로그 리두 로그가 활성화된 상태
ACTIVE
로그가 Active 상태지만 현재 리두로그는 아닌 상태 Check Point 이전 상태 crash recovery에 필요 블록복구에 사용 중일 수 있음 보관할 수도 있고 안할 수도 있음
CLEARING
ALTER DATABASE CLEAR LOGFILE 명령문 이후에 빈 로그로 다시 생성됨 로그가 지워지면 UNUSED 상태로 변경됨
CLEARING_CURRENT
닫힌 스레드에서 현재 로그를 지우는 중인 상태
INACTIVE
인스턴스 복구에 더이상 필요 없는 상태 Check Point 완료 이후의 상태 media reovery에 사용 중일 수 있음 보관할 수도 있고 안할 수도 있음
Redo log 그룹 내 멤버 이중화
Redo log File 정보
리두로그 그룹 3개, 리두로그 파일이 그룹 내 단일 구성으로 되어있는 것을 확인
SELECT a.thread# "Thread#"
, a.group# "Group#"
, b.member "Logfile"
, a.bytes/1024/1024 "Size (MB)"
, a.status
, a.sequence#
FROM v$log a
, v$logfile b
WHERE a.group#=b.group#
ORDER BY 1, 2, 3
리두로그 멤버 추가
SQL> alter database add logfile member '/u01/app/oracle/oradata/ORCL/redo01_2.log' to group 1;
Database altered.
SQL> alter database add logfile member '/u01/app/oracle/oradata/ORCL/redo02_2.log' to group 2;
Database altered.
SQL> alter database add logfile member '/u01/app/oracle/oradata/ORCL/redo03_2.log' to group 3;
Database altered.
Redo log File 정보 재확인
SELECT a.thread# "Thread#"
, a.group# "Group#"
, b.member "Logfile"
, a.bytes/1024/1024 "Size (MB)"
, a.status
, a.sequence#
FROM v$log a
, v$logfile b
WHERE a.group#=b.group#
ORDER BY 1, 2, 3
Log switch 발생
SQL> ALTER SYSTEM SWITCH LOGFILE;
System altered.
Redo log File 정보 재확인
SELECT a.thread# "Thread#"
, a.group# "Group#"
, b.member "Logfile"
, a.bytes/1024/1024 "Size (MB)"
, a.status
, a.sequence#
FROM v$log a
, v$logfile b
WHERE a.group#=b.group#
ORDER BY 1, 2, 3
리두로그 그룹 2를 사용하고 있었는데 로그스위치로 인하여 그룹2의 상태는 ACTIVE 상태가 된다.
Log switch 두번 더 발생
다시 그룹2가 CURRENT 상태가 되고 나머지 그룹1, 3은 ACTIVE 상태가 된다.
Check point 발생
SQL> ALTER SYSTEM CHECKPOINT;
System altered.
Redo log File 정보 재확인
SELECT a.thread# "Thread#"
, a.group# "Group#"
, b.member "Logfile"
, a.bytes/1024/1024 "Size (MB)"
, a.status
, a.sequence#
FROM v$log a
, v$logfile b
WHERE a.group#=b.group#
ORDER BY 1, 2, 3
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence 11
Next log sequence to archive 13
Current log sequence 13
spfile 사용 유무 확인
spfile 사용 중인것으로 확인
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/19.0.0
/dbhome_1/dbs/spfileorcl.ora
아카이브 저장 경로 확인
현재 아카이브 저장 경로가 log_archive_dest로 지정되어 있다.
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string /u01/app/oracle/product/19.0.0
/dbhome_1/dbs/arch
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
log_archive_dest_17 string
아카이브 로그 모드 변경 아카이브 로그 저장 경로를 지정하고 아카이브 로그 파일 포맷을 지정한다.
아카이브 저장 경로를 log_archive_dest 에서 log_archive_dest_1로 변경한다.
scope=spfile 이므로 DB를 재시작한다.
*log_archive_dest_n 파라미터 설정시 'location= [해당 디렉토리]' 로 설정해야 한다.
location을 빼고 설정하면 DB를 재시작할 경우 에러가 떨어지게 된다.
(해당 에러 : ORA-16024: parameter LOG_ARCHIVE_DEST_1 cannot be parsed)
SQL> alter system set log_archive_dest = '' scope = spfile;
System altered.
SQL> alter system set log_archive_dest_1='location=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch' scope=spfile;
System altered.
SQL> shutdown immediate;
SQL> startup;
아카이브 저장 경로 확인
아카이브 저장 경로가 log_archive_dest_1로 변경되었고 디렉토리도 변경된 것을 확인할 수 있다.
SQL> show parameter log_archive
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_config string
log_archive_dest string
log_archive_dest_1 string location=/u01/app/oracle/produ
ct/19.0.0/dbhome_1/dbs/arch
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
아카이브 로그 강제 생성
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
SQL> /
System altered.
아카이브 로그 파일 경로에 파일이 생성된 것을 확인할 수 있다.
기존 아카이브 로그 파일
[oracle@oracle ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
[oracle@oracle arch]$ ll
합계 6004
-rw-r-----. 1 oracle oinstall 1024 12월 6 15:49 1_10_1122384552.arc
-rw-r-----. 1 oracle oinstall 4096 12월 6 15:49 1_11_1122384552.arc
-rw-r-----. 1 oracle oinstall 3652096 12월 19 10:46 1_12_1122384552.arc
-rw-r-----. 1 oracle oinstall 2484224 12월 6 15:49 1_9_1122384552.arc
새로 생성된 아카이브 로그 파일
[oracle@oracle arch]$ ll
합계 12904
-rw-r-----. 1 oracle oinstall 1024 12월 6 15:49 1_10_1122384552.arc
-rw-r-----. 1 oracle oinstall 4096 12월 6 15:49 1_11_1122384552.arc
-rw-r-----. 1 oracle oinstall 3652096 12월 19 10:46 1_12_1122384552.arc
-rw-r-----. 1 oracle oinstall 7055360 12월 19 11:01 1_13_1122384552.arc
-rw-r-----. 1 oracle oinstall 1024 12월 19 11:01 1_14_1122384552.arc
-rw-r-----. 1 oracle oinstall 4096 12월 19 11:01 1_15_1122384552.arc
-rw-r-----. 1 oracle oinstall 2484224 12월 6 15:49 1_9_1122384552.arc
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/19.0.0
/dbhome_1/dbs/spfileorcl.ora
파라미터 변경 명령어
alter system set [변경하고 싶은 파라미터]=[변경 값] scope=[both | memory | spfile];
[SCOPE = BOTH | MEMORY | SPFILE]
- BOTH : 현재 Instance와 spfile의 내용을 모두 수정하여 추후 DB가 재시작 되어도 적용
- MEMORY : 현재 Instance 내에서만 적용
- SPFILE : 현재 Instance에는 적용되지 않고, 추후 DB가 다시 시작될 때 적용
ex.아카이브 로그 포맷 변경시
SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence 7
Current log sequence 9
spfile 사용 유무 확인
spfile 사용 중인것으로 확인
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
spfile string /u01/app/oracle/product/19.0.0
/dbhome_1/dbs/spfileorcl.ora
현재 instance 상태
SQL> select status from v$instance;
STATUS
------------
OPEN
아카이브 저장 경로 확인
현재 아카이브 저장 경로가 지정되어 있지 않다.
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
...
SQL> alter system set log_archive_dest='/u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch' scope=spfile;
System altered.
SQL> alter system set log_archive_format='%t_%s_%r.arc' scope=spfile;
System altered.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 1073737800 bytes
Fixed Size 8904776 bytes
Variable Size 620756992 bytes
Database Buffers 440401920 bytes
Redo Buffers 3674112 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database open;
Database altered.
아카이브 모드 확인
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
Oldest online log sequence 7
Next log sequence to archive 9
Current log sequence 9
아카이브 로그 경로 지정 확인
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest string /u01/app/oracle/product/19.0.0
/dbhome_1/dbs/arch
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
아카이브 로그 강제 생성
SQL> alter system switch logfile;
System altered.
SQL> /
System altered.
SQL> /
System altered.
SQL>
아카이브 로그 파일 경로에 파일이 생성된 것을 확인할 수 있다.
[oracle@oracle ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/dbs/arch
[oracle@oracle arch]$ ls -alrt
합계 2436
drwxr-xr-x. 3 oracle oinstall 106 12월 6 15:48 ..
-rw-r-----. 1 oracle oinstall 2484224 12월 6 15:49 1_9_1122384552.arc
-rw-r-----. 1 oracle oinstall 1024 12월 6 15:49 1_10_1122384552.arc
drwxr-xr-x. 2 oracle oinstall 86 12월 6 15:49 .
-rw-r-----. 1 oracle oinstall 4096 12월 6 15:49 1_11_1122384552.arc
+) 계속 설정을 유지하고 싶으면 /home/[oracle 계정 ID]/.bash_profile 에서 맨 아래줄에
export NLS_LANG=american_america.ko16mswin949 를 추가한다.
다시 접속하면 글자가 깨지지 않는 것을 확인할 수 있다.
[oracle@oracle ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Dec 2 14:05:17 2022
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
SQL>
SQL>
SQL> exit
Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.3.0.0.0
[oracle@oracle ~]$