※ 현재 undo 내용을 보는 명령어
SQL> show parameter undo;
 

※ undo의 특징 : 여러개의 undo tablespace가 있을수 있지만, 사용 할 수 있는것은 한개
 

undo - 자동관리 : auto : 운영
        - 수동관리 : manual : 장애고칠때

- 정하는곳
 : 파라미터파일 - 관련파라미터 : undo_managment = auto  또는  manual
- 언두가 지워지면, auto일때 안켜짐(오라클이 undo파일 찾아다님)
                            manual 일때 켜짐(오라클은 사용자에게 맡기고 신경안씀)
 


※ 언두 에러 났을때 해결
 : DB끄고(undo는 offline안됨) 파라미터파일 manual로 바꾸고 DB올려서, UNDO2번 만들어서 스위칭 시키고, 파라미터 원래대로 auto로 돌린다.
 
 (참고 : 테이블스페이스 안에 테이블(테이블의 호적상 이름 = 세그먼트) → 언두테이블=언두세그먼트)
 



1번에 A사용자가 DML을 일으키는 중 장애가 일어나서 DATAFILE이 지워져서 DB가 죽음.
undo1을 새로 만들어서 스위칭 시키고 기존
undotbs1는 안쓰기 때문에 지우려 한다.
그러나 A사용자가 1번 언두스페이스 사용중이라 undotbs1을 지울 수 없다.
(※ undo tablespace 지우려면 안의 undo segment를 아무도 안쓰고 있어야 한다.)
쓰던 흔적이 남아 있어서 안지워지는 경우가 많다.
강제로 언두 세그먼트를 없애야 한다.
파라미터파일에, 히든파라메터 _offline_rollback_segments=(세그먼트이름,여러개가능)
추가해주고 껐다 켜고 지우기 시도하면 지워진다.

 
 
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습1 시작
undo tablespace 장애
 
1. 현재상황확인
SQL> @df
SQL> show parameter undo;
 
2. (다른창) scott 계정으로 DML 수행
SQL> con scott/tiger
SQL> create table utest01 (no number);
SQL> insert into utest01 values (1);
 
3. sys 계정에서 rollback segment 확인 후 장애 발생
SQL> select s.sid, s.serial#, s.username, r.name "ROLLBACK SEG"
  2  from v$session s, v$transaction t, v$rollname r
  3  where s.taddr=t.addr
  4  and t.xidusn = r.usn;
SQL> save ud.sql
 
SQL> !rm -fr /home/oracle/ordata/testdb/undotbs01.dbf
운영중인 undo 테이블스페이스 삭제 - 장애발생
 
SQL> create undo tablespace undo01
  2  datafile '/home/oracle/oradata/testdb/undo01.dbf' size 10M;
SQL> alter system set undo_tablespace=undo01;
 
SQL> drop tablespace undotbs1;
위에 조회했을때 사용중이던 세그먼트가 있어서 삭제안됨
 
SQL> show parameter undo;
테이블스페이스 새로 만든것으로 바뀌어 있음
 
SQL> shutdown immediate;
 
SQL> shutdown abort;
 
$ vi ~/inittestdb.ora
undo_management=manual
undo_retention=10800
undo_tablespace=UNDO01
_offline_rolback_segments=(_SYSSMU6$)
 
SQL> startup
MOUNT까지 올라감
 
SQL> alter database datafile '/home/oracle/oradata/testdb/undotbs01.dbf' offline drop;
 
SQL> alter database open;
 
SQL> show parameter undo;
 
SQL> drop tablespace undotbs1 including contents and datafiles;
 
SQL> sutdown immediate;
 
$ vi ~/inittestdb.ora
undo_management=auto  → 변경
undo_retention=10800
undo_tablespace=UNDO01
#_offline_rolback_segments=(_SYSSMU6$)  → 주석처리
 
SQL> startup
SQL> show parameter undo;
 
 
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습1 끝
 
 


- NO archive log mode 에서는 할수 있을수도, 없을수도 있다.
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습2 시작
NO archive log mode 에서 undo tablespace의 DATAFILE이 삭제된 장애상황
: no archive log로 바꾸고 작업
: SQL> alter database noarchivelog;

 
1. 현재 파라미터 언두상황
undo_management=auto
undo_tablespace=undotbs1
 
2. 장애발생
SQL> startup
SQL> selet tablespace_name, bytes/1024/1024 MB, file_name
  2  from dba_data_files;
SQL> save dd.sql
 
SQL> archive log list;
 
SQL> !rm -fr /home/oracle/oradata/testdb/undotbs01.dbf
장애발생
 
SQL> create table scott.tt01 (no number) tablespace example;
SQL> insert into scott.tt01 values (1);
SQL> alter system switch logfile;
SQL> /
SQL> /
ORA-03113: end-of-file on communication channel
DB 강제 종료
 
 
3. 장애 확인
SQL> startup
ORA-24324: service handle not initialized
ORA-01041: internal error. hostdef extension doesn't exist
쓰고 있는중에 강제로 DB가 종료되어서 나타나는 현상
 
sqlplus 새로 열면 된다.
SQL> exit
$ sqlplus / as sysdba;
SQL> startup
MOUNT까지 올라감
 
 
4. 파라미터 파일 undo 관련 설정 수동모드로 수정
SQL> shutdown abort;
$ vi ~/inittestdb.ora
undo_management=manual
_offline_rollback_segments=(_SYSSMU1$,_SYSSMU2$,_SYSSMU3$,_SYSSMU4$,_SYSSMU5$,_SYSSMU6$,_SYSSMU7$,_SYSSMU8$,_SYSSMU9$,_SYSSMU10$)
  → 어떤것을 쓰고 있는지모르니까 10개 다 지운다: 언두세그먼트 하나당 기본적으로 10개쓴다.
 
5. 재시작 후 복구
SQL> startup mount;
SQL> select name, status from v$datafile;
SQL> alter database datafile '/home/oracle/oradata/testdb/undotbs01.dbf' offline drop;
SQL> alter database open;
OPEN상태
 
 
6. 신규 undo tablespace 생성 후 반영
SQL> create undo tablespace undo
  2  datafile '/home/oracle/oradata/testdb/undo01.dbf' size 10M;
SQL> shutdown immediate;
$ vi ~/inittestdb.ora
undo_management=auto
undo_tablespace=undo  → 신규 undo로 변경
 
SQL> startup
SQL> show parameter undo;
 
 
7. 장애난 undo tablespace 삭제
 
SQL> drop tablespace undotbs1 including contents and datafiles;
현재 사용중인 세그먼트 있다고 삭제안됨
SQL> select segment_name, owner, tablespace_name, status from dba_rollback_segs;
SQL> shutdown immediate;
 
$ vi ~/inittestdb.ora
undo_management=auto
undo_tablespace=undo
_offline_rollback_segments=(_SYSSMU11$)
 
SQL> startup
 
SQL> drop tablespace undotbs1 including contents and datafiles;
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-실습2 끝
 
Posted by 딩구르
,