Backup/Noarchive Log Mode

240111 Backup / Noarchive Log Mode _ undo01.dbf 원상복구

잇꼬 2024. 1. 11. 19:18
728x90
반응형
SMALL

(상황)

undo01.dbf → undotbs.dbf 로 변경하려고 시도 했다가 다시 원상복구 한 상황

 

#) 백업본이 있는지 확인.

=> 만일을 대비해서 backup file은 있어야 한다..!

SQL> !
[oracle1@oracle ~]$ cd backup/noarch/20240110/
[oracle1@oracle 20240110]$ ls
control01.ctl  redo02.log  redo08.log    system01.dbf  users01.dbf
example01.dbf  redo03.log  redo09.log    temp01.dbf
redo01.log     redo07.log  sysaux01.dbf  undo01.dbf

 

#) instance 상태 확인하려고 하는데 확인이 되지 않는다.

=> 급하게 lsnrctl status 확인.

SQL> select status from v$instance;
select status from v$instance
*
ERROR at line 1:
ORA-01034: ORACLE not available
Process ID: 0
Session ID: 0 Serial number: 0

역시나.. 리스너가 open 되어 있지 않는다. 

전에도 리스너가 open 되어 있지 않아 startup해서 open한 적이 있어 진행한 적이 있었다. 

얘는 리스너의 괄호가 안닫혀서 오류가 난 것이다. 

 

#) listener 있는 곳으로 가서 수정해서 start 해준다!

[oracle1@oracle ~]$ cd $ORACLE_HOME/network/admin
[oracle1@oracle admin]$ ls
listener.bak  listener.ora  samples  shrept.lst  tnsnames.ora
[oracle1@oracle admin]$ vi listener.ora

 

#) 변경해줄 위치

[oracle1@oracle ~]$ cd /u01/app/oracle/oradata/ora11g/
[oracle1@oracle ora11g]$ ls
control01.ctl  redo02.log  redo08.log    system01.dbf    users01.dbf
example01.dbf  redo03.log  redo09.log    temp_new01.dbf
redo01.log     redo07.log  sysaux01.dbf  undo01.dbf
[oracle1@oracle ora11g]$ cd
[oracle1@oracle ~]$ exit
exit

 

#) undo01.dbf 삭제

SQL> ! rm /u01/app/oracle/oradata/ora11g/undo01.dbf


#) checkpoint 발생시켜준다!

SQL> alter system checkpoint;
alter system checkpoint
*
ERROR at line 1:
ORA-03113: end-of-file on communication channel
Process ID: 4337
Session ID: 137 Serial number: 37



#) DB 올려준다! 

=> 당연히 오류가 발생할 것이다..! 

SQL> startup
ORA-24324: service handle not initialized
ORA-01041: internal error. hostdef extension doesn't exist


#) 다시 접속을 해주면서 DB를 올려준다

SQL> conn / as sysdba
Connected to an idle instance.
SQL> startup
ORACLE instance started.

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             440402980 bytes
Database Buffers          264241152 bytes
Redo Buffers                5419008 bytes
Database mounted. => mount 단계까지 밖에 올라오지 않는다!

=> undo01.dbf 파일을 삭제했기 때문이다.

ORA-01157: cannot identify/lock data file 9 - see DBWR trace file
ORA-01110: data file 9: '/u01/app/oracle/oradata/ora11g/undo01.dbf'

 

#) data file 중  undo01.dbf 이 OFFLINE 으로 변경해주자!

SQL> select name, status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
/u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
/u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
/u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
/u01/app/oracle/oradata/ora11g/undo01.dbf          ONLINE


#) drop 파일 번호로 drop 해주자.

SQL> alter database datafile 9 offline for drop;

Database altered.



#) undo01.dbf 파일 확인 

SQL> select name, status from v$datafile;

NAME                                               STATUS
-------------------------------------------------- -------
/u01/app/oracle/oradata/ora11g/system01.dbf        SYSTEM
/u01/app/oracle/oradata/ora11g/sysaux01.dbf        ONLINE
/u01/app/oracle/oradata/ora11g/users01.dbf         ONLINE
/u01/app/oracle/oradata/ora11g/example01.dbf       ONLINE
/u01/app/oracle/oradata/ora11g/undo01.dbf          RECOVER

 

#) DB open 해주자

SQL> alter database open;

Database altered.

 

 

#) 제대로 올라왔는지 hr계정에 있는 table 조회해보기.

SQL> select count(*) from hr.employees;

  COUNT(*)
----------
       107



#) undotbs 생성해주자!

=> 엥..? 뭐지..? 시나리오대로라면.. 되어야 하는데 왜 못보던 오류니..?

SQL> CREATE UNDO TABLESPACE undotbs DATAFILE '/u01/app/oracle/oradata/ora11g/undotbs01.dbf' SIZE 10M AUTOEXTEND ON;
CREATE UNDO TABLESPACE undotbs DATAFILE '/u01/app/oracle/oradata/ora11g/undotbs01.dbf' SIZE 10M AUTOEXTEND ON
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 9 cannot be read at this time
ORA-01110: data file 9: '/u01/app/oracle/oradata/ora11g/undo01.dbf'

=> ORA-00604 : 순환 SQL 레벨 1에 오류가 발생? 

=> ORA-00376 : data file 읽을수 없다..?

=> ORA-01110 : data file 9의 문제..? drop 했으니 문제지..!!

 

#) 코드가 잘못 되었나..? 다시 써본다

=> 그래도 동일한 오류번호이다.. 그러지마라.. 나 운다.. 
SQL> create undo tablespace undotbs
  2  datafile '/u01/app/oracle/oradata/ora11g/undotbs01.dbf' size 10m;
create undo tablespace undotbs
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 9 cannot be read at this time
ORA-01110: data file 9: '/u01/app/oracle/oradata/ora11g/undo01.dbf'



#) 괜히 undo file을 바라본다..
SQL> show parameter undo


 

#)  OS 로 나가서 확인해보자.. 모든..! 

SQL> !
[oracle1@oracle ~]$ cd /u01/app/oracle/oradata/ora11g/
[oracle1@oracle ora11g]$ ls
control01.ctl  redo01.log  redo03.log  redo08.log  sysaux01.dbf  temp_new01.dbf
example01.dbf  redo02.log  redo07.log  redo09.log  system01.dbf  users01.dbf

=> 삭제되었는데.. 경로가 잘못 되었는가..?
[oracle1@oracle ora11g]$ pwd
/u01/app/oracle/oradata/ora11g

 

#) 다시 oracle 로 접속..
[oracle1@oracle ora11g]$ sqlplus / as sysdba

#) 다시 undo 를 바라본다.. 뭐가 잘못이니..?
SQL> show parameter undo


SQL> !

#) OS 에 있는 initora11g.ora를 열어본다..!
[oracle1@oracle ora11g]$ cd $ORACLE_HOME/dbs
[oracle1@oracle dbs]$ vi initora11g.ora => 뭐가 없다..

#) oracle 접속

[oracle1@oracle dbs]$ exit
exit

#) 시간을 지났으니 다시 undo 생성하는 거를 도전..! 

SQL> CREATE UNDO TABLESPACE undo1
DATAFILE '/u01/app/oracle/oradata/ora11g/undo1.dbf' SIZE 10M AUTOEXTEND ON;  2
CREATE UNDO TABLESPACE undo1 
*
ERROR at line 1:
ORA-01543: tablespace 'UNDO1' already exists

=> 아이쿠..! unod1이 아닌데..


#) undotbs 생성
SQL> CREATE UNDO TABLESPACE undotbs
DATAFILE '/u01/app/oracle/oradata/ora11g/undotbs01.dbf' SIZE 10M AUTOEXTEND ON;  2
CREATE UNDO TABLESPACE undotbs
*
ERROR at line 1:
ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 9 cannot be read at this time
ORA-01110: data file 9: '/u01/app/oracle/oradata/ora11g/undo01.dbf'

=> 하.. 그러지 말자..

 


#) 안되겠다! undo1 다시 백업해야겠다..!

=> pfile 로 startup 하기!

SQL> startup pfile='$ORACLE_HOME/dbs/initora11g.ora'
ORA-01081: cannot start already-running ORACLE - shut it down first

=> shutdown부터.. 해야지!!

 

#) 정상적인 종료하고 startup pfile로 열기!

=> 시나리오대로 진행만 하면 돼..!

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.


SQL> startup pfile='$ORACLE_HOME/dbs/initora11g.ora'
ORACLE instance started.

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             440402980 bytes
Database Buffers          264241152 bytes
Redo Buffers                5419008 bytes
ORA-00214: control file '/u01/app/oracle/oradata/ora11g/control01.ctl' version
1740 inconsistent with file
'/u01/app/oracle/fast_recovery_area/ora11g/control02.ctl' version 1222

=> 없으니까 control file까지 말썽이구나..


#) OS 로 나와서 없는 파일 다시 확인하자!

SQL> !
[oracle1@oracle ora11g]$ ls
control01.ctl  redo01.log  redo03.log  redo08.log  sysaux01.dbf  temp_new01.dbf
example01.dbf  redo02.log  redo07.log  redo09.log  system01.dbf  users01.dbf
[oracle1@oracle ora11g]$ exit
exit


#) 다시 정상적으로 종료하려는데 이마져도 힘들겠지만.. 종료는 된다.

SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> exit => OS 로 아예 나오기
Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
[oracle1@oracle ora11g]$ cd


#) backup 파일 있는 위치로 이동 

[oracle1@oracle ~]$ cd backup/noarch/
[oracle1@oracle noarch]$ ls
20240110       example01.dbf  redo03.log  redo09.log    temp01.dbf
20240111       redo01.log     redo07.log  sysaux01.dbf  undo01.dbf
control01.ctl  redo02.log     redo08.log  system01.dbf  users01.dbf
[oracle1@oracle noarch]$ pwd
/home/oracle1/backup/noarch

 

#) 옮겨야 하는 곳을 확인해서 cp해주자..! 이 방법뿐이다 

[oracle1@oracle noarch]$ cp -av undo01.dbf /u01/app/oracle/oradata/ora11g/
‘undo01.dbf’ -> ‘/u01/app/oracle/oradata/ora11g/undo01.dbf’
[oracle1@oracle noarch]$ cd /u01/app/oracle/oradata/ora11g/
[oracle1@oracle ora11g]$ ls
control01.ctl  redo02.log  redo08.log    system01.dbf    users01.dbf
example01.dbf  redo03.log  redo09.log    temp_new01.dbf
redo01.log     redo07.log  sysaux01.dbf  undo01.dbf


#) 여기서 oracle 접속하자.

[oracle1@oracle ora11g]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu Jan 11 03:29:50 2024

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to an idle instance.



#) DB startup 해보자..! (제발..)

SQL> startup
ORACLE instance started.

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             440402980 bytes
Database Buffers          264241152 bytes
Redo Buffers                5419008 bytes
Database mounted.
Database opened.

 

#) data file 상태 확인

=> undo01.dbf 상태 제일 중요 

SQL> select name, status from v$datafile;

NAME
--------------------------------------------------------------------------------
STATUS
-------
/u01/app/oracle/oradata/ora11g/undo01.dbf
RECOVER => 왜!! ONLINE 이 아냐ㅠㅠ



#) ALTER로 해보자.. 침착하게..

SQL> alter database datafile '/u01/app/oracle/oradata/ora11g/undo01.dbf ' online;
alter database datafile '/u01/app/oracle/oradata/ora11g/undo01.dbf ' online
*
ERROR at line 1:
ORA-01516: nonexistent log file, data file, or temporary file
"/u01/app/oracle/oradata/ora11g/undo01.dbf "

=> ORA-01516 : 존재하지 않는 로그 파일, 데이터 피일, 임시 파일로 변경하려고 하나 알려지지 않거나 지원하지 않는 파일이라고..?


 #) 심플하게 써야 하뉘..?

SQL> alter tablespace undo1 online;
alter tablespace undo1 online
*
ERROR at line 1:
ORA-01190: control file or data file 9 is from before the last RESETLOGS
ORA-01110: data file 9: '/u01/app/oracle/oradata/ora11g/undo01.dbf'

=> 다른 오류넹..? 아하

=> 컨트롤 파일 또는 데이터 파일 이 마지막 resetlogs 보다 이전 상태이다..?

 

#) DB 정상적인 종료를 다시한다..!

SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.


#) DB를 mount 단계까지 올려보자..!

SQL> startup mount
ORACLE instance started.

Total System Global Area  711430144 bytes
Fixed Size                  1367004 bytes
Variable Size             440402980 bytes
Database Buffers          264241152 bytes
Redo Buffers                5419008 bytes
Database mounted.


#) resetlogs 로 open을 해보자! 

SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01139: RESETLOGS option only valid after an incomplete database recovery

=> 이또한 오류.. ㅎㅎ

=> recovery 하란다.. 그랫! 해줘야지!


#) recover 해야 하는 파일 올려준다.(해탈..)

SQL> RECOVER DATAFILE '/u01/app/oracle/oradata/ora11g/undo01.dbf';
Media recovery complete.

=> 된다..!!

 

#) 얼른 DB 올려!! 

SQL> alter database open;



#) data file 확인하자! 

=> OFFLINE 모드야!!

SQL> select name, status from v$datafile;



#) online 로 후다닥 올려!!

SQL> alter tablespace undo1 online;


#) 다시 data file 확인해야지! 

SQL> select name, status from v$datafile;

 

#) 드디어.. 다했다..!

=> 휴.. 다행이다.. 원상복구도 장애복구처럼 일이구나.. ㅎ

 

(혹시 모르니 DB를 정상적으로 종료했다가 다시 open 하자..!)

728x90
반응형
LIST