ORA-00202๋?
ORA-00202 ์๋ฌ๋ Oracle ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ปจํธ๋กค ํ์ผ(Control File)์ ์ ๊ทผํ๋ ค๊ณ ํ ๋ ํด๋น ํ์ผ์ ์ฌ์ฉํ ์ ์๋ ์ํ์ผ ๋ ๋ฐ์ํ๋ ์๋ฌ์
๋๋ค. ์ปจํธ๋กค ํ์ผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฌผ๋ฆฌ์ ๊ตฌ์กฐ ์ ๋ณด(๋ฐ์ดํฐ ํ์ผ ์์น, ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ ์์น, ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ด๋ฆ, SCN ์ ๋ณด ๋ฑ)๋ฅผ ๋ด๊ณ ์๋ ๋งค์ฐ ์ค์ํ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก, ์ด ํ์ผ ์์ด๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์์ ์ผ๋ก ๊ธฐ๋ํ๊ฑฐ๋ ์ด์ํ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ฌ ๋ฉ์์ง๋ ORA-00202: control file: '/u01/oradata/ORCL/control01.ctl' ํํ๋ก ์ถ๋ ฅ๋๋ฉฐ, ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ปจํธ๋กค ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ํจ๊ป ํ์ํด์ค๋๋ค.
์ฃผ์ ๋ฐ์ ์์ธ
1. ์ปจํธ๋กค ํ์ผ์ ๋ฌผ๋ฆฌ์ ์์ ๋๋ ์ญ์
๊ฐ์ฅ ๋น๋ฒํ๊ฒ ๋ฐ์ํ๋ ์์ธ์ผ๋ก, ์ด์ ์ค ๋์คํฌ ์ฅ์ , ์ค์๋ก ์ธํ ํ์ผ ์ญ์ , ํ์ผ ์์คํ ์์ ๋ฑ์ผ๋ก ์ปจํธ๋กค ํ์ผ ์์ฒด๊ฐ ๋ฌผ๋ฆฌ์ ์ผ๋ก ์ฌ๋ผ์ง๊ฑฐ๋ ์ฝ์ ์ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค. ํนํ ์ผ๊ฐ ๋ฐฐ์น ์์ ์ค ๋์คํฌ ํ(Disk Full) ์ํ๊ฐ ๋ฐ์ํ๊ฑฐ๋, ์๋ชป๋ ์ ์คํฌ๋ฆฝํธ๊ฐ ์คํ๋์ด ํ์ผ์ด ์ญ์ ๋๋ ์ฌ๋ก๊ฐ ์ค๋ฌด์์ ์์ฃผ ๋ชฉ๊ฒฉ๋ฉ๋๋ค.
2. ํ์ผ ์ ๊ทผ ๊ถํ(Permission) ๋ฌธ์
Oracle ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ OS ๊ณ์ (์ผ๋ฐ์ ์ผ๋ก oracle)์ด ์ปจํธ๋กค ํ์ผ์ ๋ํ ์ฝ๊ธฐ/์ฐ๊ธฐ ๊ถํ์ ๊ฐ์ง๊ณ ์์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค. ํ์ผ ์์คํ
๋ง์ดํธ ์ต์
์ด ๋ณ๊ฒฝ๋๊ฑฐ๋, ๋ณด์ ์ ์ฑ
์ ์ํด ๊ถํ์ด ์์ ๋ ๊ฒฝ์ฐ, ๋๋ ๋ค๋ฅธ ๊ณ์ ์ผ๋ก ํ์ผ์ ์์ฑํ๊ฑฐ๋ ๋ณต์ฌํ ๊ฒฝ์ฐ์ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
3. ์๋ชป๋ ์ด๊ธฐํ ํ๋ผ๋ฏธํฐ(CONTROL_FILES) ์ค์
init.ora ๋๋ spfile์ ์ค์ ๋ CONTROL_FILES ํ๋ผ๋ฏธํฐ๊ฐ ์ค์ ์ปจํธ๋กค ํ์ผ์ ๊ฒฝ๋ก์ ์ผ์นํ์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ง์ด๊ทธ๋ ์ด์
, ์คํ ๋ฆฌ์ง ๋ณ๊ฒฝ, ๋๋ ํ์ผ ์ด๋ ํ ํ๋ผ๋ฏธํฐ ํ์ผ์ ์
๋ฐ์ดํธํ์ง ์์ ๊ฒฝ์ฐ์ ํนํ ์์ฃผ ๋ฐ์ํ๋ฉฐ, ์ด ๊ฒฝ์ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ธฐ๋ ์ ์ฆ์ ORA-00202๊ฐ ๋ฐ์ํฉ๋๋ค.
ํด๊ฒฐ ๋ฐฉ๋ฒ
์์ธ 1: ์ปจํธ๋กค ํ์ผ ์์ ๋๋ ์ญ์ ์ ๋ณต๊ตฌ
Step 1: ํ์ฌ ์ปจํธ๋กค ํ์ผ ์์น ๋ฐ ์ํ ํ์ธ
-- ํ์ฌ ํ๋ผ๋ฏธํฐ์ ์ค์ ๋ ์ปจํธ๋กค ํ์ผ ๊ฒฝ๋ก ํ์ธ
SHOW PARAMETER control_files;
-- v$controlfile ๋ทฐ๋ก ์ํ ํ์ธ (DB๊ฐ mount ์ํ์ผ ๋)
SELECT name, status, is_recovery_dest_file
FROM v$controlfile;
Step 2: ๋ฉํฐํ๋ ์ฑ๋ ์ปจํธ๋กค ํ์ผ์ด ์๋ ๊ฒฝ์ฐ, ์ ์ ํ์ผ๋ก ๋ณต์ฌ
Oracle์ ์ปจํธ๋กค ํ์ผ์ ๋ค์คํ(Multiplexing)ํ์ฌ ์ฌ๋ฌ ๊ฒฝ๋ก์ ๋์ผํ ํ์ผ์ ์ ์งํ๋๋ก ๊ถ์ฅํฉ๋๋ค. ํ๋์ ์ปจํธ๋กค ํ์ผ์ด ์ ์์ด๋ผ๋ฉด OS ๋ ๋ฒจ์์ ๋ณต์ฌํ์ฌ ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
-- ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์
ง๋ค์ด
SHUTDOWN ABORT;
# OS ๋ ๋ฒจ์์ ์ ์ ์ปจํธ๋กค ํ์ผ์ ์์๋ ์์น๋ก ๋ณต์ฌ
cp /u01/oradata/ORCL/control02.ctl /u01/oradata/ORCL/control01.ctl
# ํ์ผ ๊ถํ ๋ฐ ์์ ์ ํ์ธ ๋ฐ ์์
chown oracle:oinstall /u01/oradata/ORCL/control01.ctl
chmod 640 /u01/oradata/ORCL/control01.ctl
-- ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ๊ธฐ๋
STARTUP;
Step 3: RMAN ๋ฐฑ์
์์ ์ปจํธ๋กค ํ์ผ ๋ณต๊ตฌ
-- RMAN์ผ๋ก ์ปจํธ๋กค ํ์ผ ๋ณต๊ตฌ (NOMOUNT ์ํ์์)
STARTUP NOMOUNT;
rman target /
-- RMAN์์ ์๋ ๋ฐฑ์
์ผ๋ก ์ปจํธ๋กค ํ์ผ ๋ณต๊ตฌ
RESTORE CONTROLFILE FROM AUTOBACKUP;
-- ํน์ ๋ฐฑ์
์กฐ๊ฐ์์ ๋ณต๊ตฌํ๋ ๊ฒฝ์ฐ
RESTORE CONTROLFILE FROM '/backup/rman/ctl_backup_20240101.bkp';
-- ๋ณต๊ตฌ ํ ๋ง์ดํธ ๋ฐ ๋ณต๊ตฌ ์งํ
ALTER DATABASE MOUNT;
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
์์ธ 2: ํ์ผ ์ ๊ทผ ๊ถํ ๋ฌธ์ ํด๊ฒฐ
# OS ๋ ๋ฒจ์์ ์ปจํธ๋กค ํ์ผ ๊ถํ ํ์ธ
ls -la /u01/oradata/ORCL/control*.ctl
# oracle ๊ณ์ ์ผ๋ก ์์ ์ ๋ณ๊ฒฝ
chown oracle:oinstall /u01/oradata/ORCL/control01.ctl
chown oracle:oinstall /u01/oradata/ORCL/control02.ctl
# ์ ์ ํ ๊ถํ ๋ถ์ฌ (oracle ๊ณ์ ์ฝ๊ธฐ/์ฐ๊ธฐ)
chmod 640 /u01/oradata/ORCL/control01.ctl
chmod 640 /u01/oradata/ORCL/control02.ctl
๊ถํ ์์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฌ๊ธฐ๋์ผ๋ก ์ ์ ๋์ ํ์ธ:
STARTUP FORCE;
-- ์ ์ ๊ธฐ๋ ํ ์ปจํธ๋กค ํ์ผ ์ํ ์ฌํ์ธ
SELECT name, status FROM v$controlfile;
์์ธ 3: CONTROL_FILES ํ๋ผ๋ฏธํฐ ๋ถ์ผ์น ํด๊ฒฐ
SPFILE ์ฌ์ฉ ์ ํ๋ผ๋ฏธํฐ ์์ :
-- ํ์ฌ ์ค์ ๋ ์ปจํธ๋กค ํ์ผ ๊ฒฝ๋ก ํ์ธ
SHOW PARAMETER control_files;
-- NOMOUNT ์ํ๋ก ๊ธฐ๋ ํ SPFILE ์์
STARTUP NOMOUNT;
-- ์ค์ ํ์ผ์ด ์กด์ฌํ๋ ๊ฒฝ๋ก๋ก ํ๋ผ๋ฏธํฐ ์์
ALTER SYSTEM SET control_files =
'/u01/oradata/ORCL/control01.ctl',
'/u02/oradata/ORCL/control02.ctl'
SCOPE=SPFILE;
-- ๋ณ๊ฒฝ ์ฌํญ ์ ์ฉ์ ์ํด ์ฌ๊ธฐ๋
SHUTDOWN IMMEDIATE;
STARTUP;
PFILE ์ฌ์ฉ ์ ์๋ ์์ :
# init.ora ํ์ผ ์ง์ ํธ์ง
vi /u01/app/oracle/product/19.3.0/db_1/dbs/initORCL.ora
-- init.ora ๋ด ์๋ ํญ๋ชฉ์ ์ค์ ๊ฒฝ๋ก๋ก ์์
-- ์์ ์ :
-- control_files = '/old/path/control01.ctl'
-- ์์ ํ:
-- control_files = ('/u01/oradata/ORCL/control01.ctl','/u02/oradata/ORCL/control02.ctl')
-- PFILE๋ก ๊ธฐ๋
STARTUP PFILE='/u01/app/oracle/product/19.3.0/db_1/dbs/initORCL.ora';
์ ๊ท ์ปจํธ๋กค ํ์ผ ์ฌ์์ฑ (์ตํ ์๋จ):
๋ฐฑ์
๋ ์๊ณ ๋ณต๊ตฌ๊ฐ ๋ถ๊ฐ๋ฅํ ์ํฉ์ด๋ผ๋ฉด, ์ปจํธ๋กค ํ์ผ์ ์๋ก ์์ฑํด์ผ ํฉ๋๋ค.
-- NOMOUNT ์ํ์์ CREATE CONTROLFILE ์คํ
STARTUP NOMOUNT;
CREATE CONTROLFILE REUSE DATABASE "ORCL" RESETLOGS NOARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/oradata/ORCL/redo01.log' SIZE 50M,
GROUP 2 '/u01/oradata/ORCL/redo02.log' SIZE 50M,
GROUP 3 '/u01/oradata/ORCL/redo03.ctl' SIZE 50M
DATAFILE
'/u01/oradata/ORCL/system01.dbf',
'/u01/oradata/ORCL/sysaux01.dbf',
'/u01/oradata/ORCL/undotbs01.dbf',
'/u01/oradata/ORCL/users01.dbf'
CHARACTER SET AL32UTF8;
-- ์ดํ ๋ณต๊ตฌ ์งํ
RECOVER DATABASE;
ALTER DATABASE OPEN RESETLOGS;
โ ๏ธ ์ฃผ์:
CREATE CONTROLFILE์ ํ์ฌ ๋ฐ์ดํฐ ํ์ผ ๋ชฉ๋ก๊ณผ ๋ฆฌ๋ ๋ก๊ทธ ํ์ผ ๋ชฉ๋ก์ ์ ํํ ์๊ณ ์์ด์ผ ํฉ๋๋ค. ์๋ชป๋ ์ ๋ณด๋ก ์์ฑํ๋ฉด ์ถ๊ฐ์ ์ธ ๋ฐ์ดํฐ ์์ค์ด ๋ฐ์ํ ์ ์์ต๋๋ค.
์๋ฐฉ ๋ฐฉ๋ฒ
1. ์ปจํธ๋กค ํ์ผ ๋ค์คํ(Multiplexing) ๋ฐ ์ ๊ธฐ ๋ฐฑ์ ์๋ํ
์ปจํธ๋กค ํ์ผ์ ๋ฐ๋์ ์๋ก ๋ค๋ฅธ ๋์คํฌ ๋๋ ์คํ ๋ฆฌ์ง ๊ฒฝ๋ก์ 2๊ฐ ์ด์ ๋ค์คํํ์ฌ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ํ๋์ ๋์คํฌ๊ฐ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋ ๋ค๋ฅธ ๊ฒฝ๋ก์ ์ปจํธ๋กค ํ์ผ๋ก ์ฆ์ ๋ณต๊ตฌ๊ฐ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑํฉ๋๋ค. ๋ํ RMAN์ CONFIGURE CONTROLFILE AUTOBACKUP ON ์ค์ ์ ํตํด ๋ฐฑ์
์ด ์ํ๋ ๋๋ง๋ค ์ปจํธ๋กค ํ์ผ์ ์๋์ผ๋ก ๋ฐฑ์
ํ๋๋ก ์ค์ ํ๋ ๊ฒ์ด ํ์์
๋๋ค.
-- ์ปจํธ๋กค ํ์ผ ์๋ ๋ฐฑ์
ํ์ฑํ
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/ctl_%F';
-- ํ์ฌ ์๋ ๋ฐฑ์
์ค์ ํ์ธ
SHOW CONTROLFILE AUTOBACKUP;
-- ์๋์ผ๋ก ์ปจํธ๋กค ํ์ผ ๋ฐฑ์
(ํธ๋ ์ด์ค๋ก๋ ์ ์ฅ ๊ฐ๋ฅ)
ALTER DATABASE BACKUP CONTROLFILE TO '/backup/manual/control_backup.ctl';
ALTER DATABASE BACKUP CONTROLFILE TO TRACE AS '/backup/trace/controlfile_trace.sql';
2. ๋ชจ๋ํฐ๋ง ๋ฐ ์ ๊ธฐ ์ํ ์ ๊ฒ ์คํฌ๋ฆฝํธ ์ด์
์ด์ ํ๊ฒฝ์์๋ ์ปจํธ๋กค ํ์ผ์ ์ํ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ ๊ฒํ๋ ๋ชจ๋ํฐ๋ง ์คํฌ๋ฆฝํธ๋ฅผ ํฌ๋ก ์ก(cron job)์ผ๋ก ๋ฑ๋กํ์ฌ ์ด์ ์งํ๋ฅผ ์ฌ์ ์ ๊ฐ์งํด์ผ ํฉ๋๋ค. ๋ฌธ์ ๊ฐ ๋ฐ์ํ๊ธฐ ์ ์ ๋์คํฌ ์ฌ์ฉ๋, ํ์ผ ์กด์ฌ ์ฌ๋ถ, ํ์ผ ๊ถํ ๋ณ๊ฒฝ ๋ฑ์ ์๋์ผ๋ก ๊ฐ์งํ๊ณ ์๋์ ๋ฐ์กํ๋ ์ฒด๊ณ๋ฅผ ๊ฐ์ถ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
-- ์ปจํธ๋กค ํ์ผ ์ํ ์ ๊ฒ ์ฟผ๋ฆฌ (์ ๊ธฐ ์คํ ๊ถ์ฅ)
SELECT
name AS controlfile_path,
status AS status,
is_recovery_dest_file AS in_fra,
block_size AS block_size,
file_size_blks * block_size / 1024 AS size_kb
FROM v$controlfile;
-- alert log์์ ์ปจํธ๋กค ํ์ผ ๊ด๋ จ ์๋ฌ ํ์ธ
SELECT originating_timestamp, message_text
FROM v$diag_alert_ext
WHERE message_text LIKE '%control%'
AND originating_timestamp > SYSDATE - 1
ORDER BY originating_timestamp DESC;
#!/bin/bash
# ์ปจํธ๋กค ํ์ผ ์กด์ฌ ์ฌ๋ถ ๋ชจ๋ํฐ๋ง ์ ์คํฌ๋ฆฝํธ (cron ๋ฑ๋ก ๊ถ์ฅ)
CTLFILES=("/u01/oradata/ORCL/control01.ctl" "/u02/oradata/ORCL/control02.ctl")
for f in "${CTLFILES[@]}"; do
if [ ! -f "$f" ]; then
echo "ALERT: Control file missing - $f" | mail -s "ORA-00202 RISK" dba@company.com
fi
done
๊ด๋ จ ์๋ฌ
- ORA-00200: ์ปจํธ๋กค ํ์ผ์ ์์ฑํ ์ ์์ ๋ ๋ฐ์ํ๋ฉฐ, ์ฃผ๋ก ๋์คํฌ ๊ณต๊ฐ ๋ถ์กฑ์ด๋ ๊ถํ ๋ฌธ์ ์ ์ฐ๊ด๋ฉ๋๋ค.
- ORA-00201: ์ปจํธ๋กค ํ์ผ ๋ฒ์ ์ด Oracle ์ํํธ์จ์ด ๋ฒ์ ๊ณผ ํธํ๋์ง ์์ ๋ ๋ฐ์ํฉ๋๋ค.
- ORA-00203: ์๋ชป๋ ์ปจํธ๋กค ํ์ผ์ ์ฌ์ฉํ๊ณ ์์ ๋ ๋ฐ์ํ๋ฉฐ, ์๋ก ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ปจ












