OS환경 : Oracle Linux 6.8 (64bit)
DB 환경 : Oracle Database 11.2.0.4
에러 : ORA-01552 + dba_rollback_segs NEEDS RECOVERY 해결
emp 테이블에 데이터를 insert 하다가 오류를 만남.
|
1
2
3
4
5
6
|
SQL> INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902,
TO_DATE('17-12-1980', 'DD-MM-YYYY'), 800, NULL, 20);
*
ERROR at line 1:
ORA-01552: cannot use system rollback segment for non-system tablespace 'USERS2'
|
(문서 ID 1919142.1)
ORA-1552: cannot use system rollback segment for non-system tablespace '%s'
에러 원인: non-시스템 테이블스페이스를 포함하는 업무작업에 시스템 롤백
세그먼트를 사용하려고 시도한것 입니다. 만약 해당 시스템이 클론
데이터베이스일 경우 시스템 테이블스페이스 밖에 임의의 데어터의
수정을 시도했을때 일어납니다. 오직 시스템 롤백 세그먼트만이 클론
데이터베이스에서 온라인이 가능합니다.
액션: 하나 혹은 여러개의 전용/공용 세그먼트를 만들어준후 데이터 베이스를
재시작합니다. 프라이베이트 롤백 세그먼트를 얻기 위하여 아마 INIT.ORA 파라메터
rollback_segments의 수정이 필요할것입니다. 만약 TSPITR 를 사용한 클론
데이터베이스일 경우 해당 동작은 허용되지 않습니다.
undo tablespace 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1968273193$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2_448866274$ UNDOTBS1 OFFLINE
_SYSSMU3_3368905956$ UNDOTBS1 OFFLINE
_SYSSMU4_674679975$ UNDOTBS1 OFFLINE
_SYSSMU5_2911911356$ UNDOTBS1 OFFLINE
_SYSSMU6_352842569$ UNDOTBS1 OFFLINE
_SYSSMU7_4088294245$ UNDOTBS1 OFFLINE
_SYSSMU8_2474966820$ UNDOTBS1 OFFLINE
_SYSSMU9_702768780$ UNDOTBS1 OFFLINE
_SYSSMU10_366725892$ UNDOTBS1 OFFLINE
11 rows selected.
|
_SYSSMU1_1968273193$ 가 status가 NEED RECOVERY 상태이고 나머지 segment들이 offline 상태인것을 확인
online 시도
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
SQL> alter tablespace undotbs1 online;
Tablespace altered.
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1968273193$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2_448866274$ UNDOTBS1 OFFLINE
_SYSSMU3_3368905956$ UNDOTBS1 OFFLINE
_SYSSMU4_674679975$ UNDOTBS1 OFFLINE
_SYSSMU5_2911911356$ UNDOTBS1 OFFLINE
_SYSSMU6_352842569$ UNDOTBS1 OFFLINE
_SYSSMU7_4088294245$ UNDOTBS1 OFFLINE
_SYSSMU8_2474966820$ UNDOTBS1 OFFLINE
_SYSSMU9_702768780$ UNDOTBS1 OFFLINE
_SYSSMU10_366725892$ UNDOTBS1 OFFLINE
21 rows selected.
|
변경되지 않음
UNDOTBS2 생성
|
1
2
3
4
|
SQL> create undo tablespace UNDOTBS2
datafile '/oracle/app/oracle/oradata/orcl/undotbs02.dbf' size 200m autoextend on;
Tablespace created.
|
UNDOTBS2 를 기본 undo tablespace로 지정
|
1
2
3
|
SQL> alter system set undo_tablespace=UNDOTBS2 SCOPE=BOTH;
System altered.
|
새로 만든 undo tablespace 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1968273193$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2_448866274$ UNDOTBS1 OFFLINE
_SYSSMU3_3368905956$ UNDOTBS1 OFFLINE
_SYSSMU4_674679975$ UNDOTBS1 OFFLINE
_SYSSMU5_2911911356$ UNDOTBS1 OFFLINE
_SYSSMU6_352842569$ UNDOTBS1 OFFLINE
_SYSSMU7_4088294245$ UNDOTBS1 OFFLINE
_SYSSMU8_2474966820$ UNDOTBS1 OFFLINE
_SYSSMU9_702768780$ UNDOTBS1 OFFLINE
_SYSSMU10_366725892$ UNDOTBS1 OFFLINE
_SYSSMU11_2537689203$ UNDOTBS2 OFFLINE
_SYSSMU12_807680646$ UNDOTBS2 OFFLINE
_SYSSMU13_2004296324$ UNDOTBS2 OFFLINE
_SYSSMU14_1117439626$ UNDOTBS2 OFFLINE
_SYSSMU15_3621255694$ UNDOTBS2 OFFLINE
_SYSSMU16_4000800200$ UNDOTBS2 OFFLINE
_SYSSMU17_2636616834$ UNDOTBS2 OFFLINE
_SYSSMU18_1690515686$ UNDOTBS2 OFFLINE
_SYSSMU19_1066767748$ UNDOTBS2 OFFLINE
_SYSSMU20_2369856428$ UNDOTBS2 OFFLINE
|
online 시도
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
SQL> alter tablespace undotbs2 online;
Tablespace altered.
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU1_1968273193$ UNDOTBS1 NEEDS RECOVERY
_SYSSMU2_448866274$ UNDOTBS1 OFFLINE
_SYSSMU3_3368905956$ UNDOTBS1 OFFLINE
_SYSSMU4_674679975$ UNDOTBS1 OFFLINE
_SYSSMU5_2911911356$ UNDOTBS1 OFFLINE
_SYSSMU6_352842569$ UNDOTBS1 OFFLINE
_SYSSMU7_4088294245$ UNDOTBS1 OFFLINE
_SYSSMU8_2474966820$ UNDOTBS1 OFFLINE
_SYSSMU9_702768780$ UNDOTBS1 OFFLINE
_SYSSMU10_366725892$ UNDOTBS1 OFFLINE
_SYSSMU11_2537689203$ UNDOTBS2 OFFLINE
_SYSSMU12_807680646$ UNDOTBS2 OFFLINE
_SYSSMU13_2004296324$ UNDOTBS2 OFFLINE
_SYSSMU14_1117439626$ UNDOTBS2 OFFLINE
_SYSSMU15_3621255694$ UNDOTBS2 OFFLINE
_SYSSMU16_4000800200$ UNDOTBS2 OFFLINE
_SYSSMU17_2636616834$ UNDOTBS2 OFFLINE
_SYSSMU18_1690515686$ UNDOTBS2 OFFLINE
_SYSSMU19_1066767748$ UNDOTBS2 OFFLINE
_SYSSMU20_2369856428$ UNDOTBS2 OFFLINE
|
변경되지 않음
해결 방법 : 히든 파라미터 이용 후 작업 진행(테스트 환경에서만 사용)
***아래 히든파라미터 사용은 운영DB에서 사용하면 위험함, 본문과 같은 에러 발생시 SR을 열어 진행하는것을 권고함
테스트환경에서 임시 방편으로만 사용하길 바람*** => MOS 확인 가능한 경우 참고 : 1579215.1
1. spfile 로 pfile 생성
|
1
2
3
|
SQL> create pfile from spfile;
File created.
|
2. pfile 열어서 수정
|
1
2
3
4
5
6
|
$ cd $ORACLE_HOME/dbs
$ vi initorcl.ora
제일 밑에 아래 문장 입력
*._corrupted_rollback_segments='_SYSSMU1_1968273193$' <- 위에 NEEDS RECOVERY 로 표시된 것들만 작성여러개면 ,로 구분
*._offline_rollback_segments='_SYSSMU1_1968273193$' <- 위에 NEEDS RECOVERY 로 표시된 것들만 작성여러개면 ,로 구분
#*.undo_management=AUTO <- undo_management 파라미터 AUTO로 되어있는걸 주석처리
|
3. pfile로 spfile 생성
|
1
2
3
|
SQL> create spfile from pfile;
File created.
|
4. restrict mode로 startup
|
1
2
3
4
5
6
7
8
9
10
|
SQL> startup restrict;
ORACLE instance started.
Total System Global Area 839282688 bytes
Fixed Size 2257880 bytes
Variable Size 616565800 bytes
Database Buffers 218103808 bytes
Redo Buffers 2355200 bytes
Database mounted.
Database opened.
|
5. 위에 NEEDS RECOVERY 로 표시된 것들만 삭제
|
1
2
3
4
5
6
7
|
SQL> drop rollback segment "_SYSSMU1_1968273193$"; <- 여러개면 drop rollback segment 문장 여러번 입력
drop rollback segment "_SYSSMU1_1968273193$"
*
ERROR at line 1:
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kdBlkCheckError], [3], [128], [38508], [], [], [], [], [], [], [], []
|
잘 삭제 될 수도 있고
위와 같이 에러가 발생 할 수 도 있는데 실제 확인해보면 삭제되어 있음
6. undo tablespace 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU2_448866274$ UNDOTBS1 OFFLINE
_SYSSMU3_3368905956$ UNDOTBS1 OFFLINE
_SYSSMU4_674679975$ UNDOTBS1 OFFLINE
_SYSSMU5_2911911356$ UNDOTBS1 OFFLINE
_SYSSMU6_352842569$ UNDOTBS1 OFFLINE
_SYSSMU7_4088294245$ UNDOTBS1 OFFLINE
_SYSSMU8_2474966820$ UNDOTBS1 OFFLINE
_SYSSMU9_702768780$ UNDOTBS1 OFFLINE
_SYSSMU10_366725892$ UNDOTBS1 OFFLINE
_SYSSMU11_2537689203$ UNDOTBS2 OFFLINE
_SYSSMU12_807680646$ UNDOTBS2 OFFLINE
_SYSSMU13_2004296324$ UNDOTBS2 OFFLINE
_SYSSMU14_1117439626$ UNDOTBS2 OFFLINE
_SYSSMU15_3621255694$ UNDOTBS2 OFFLINE
_SYSSMU16_4000800200$ UNDOTBS2 OFFLINE
_SYSSMU17_2636616834$ UNDOTBS2 OFFLINE
_SYSSMU18_1690515686$ UNDOTBS2 OFFLINE
_SYSSMU19_1066767748$ UNDOTBS2 OFFLINE
_SYSSMU20_2369856428$ UNDOTBS2 OFFLINE
|
NEEDS RECOVERY로 되어있던 segment 삭제된것을 확인
7. 1번 undo tablespace(undotbs1) 삭제
|
1
2
3
|
SQL> drop tablespace undotbs1 including contents and datafiles;
Tablespace dropped.
|
8. DB 종료
|
1
2
3
4
|
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
|
9. pfile에 작성했던 내용 원복(히든파라미터 삭제 및 undo_menagement=AUTO 주석 해제)
|
1
2
3
4
5
|
$ cd $ORACLE_HOME/dbs
$ vi initorcl.ora
*._corrupted_rollback_segments='_SYSSMU1_1968273193$' <- 삭제
*._offline_rollback_segments='_SYSSMU1_1968273193$' <- 삭제
*.undo_management=AUTO <- 주석 해제
|
10. pfile로 spfile 생성
|
1
2
3
|
SQL> create spfile from pfile;
File created.
|
11. DB 정상 기동 후 확인
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
SQL> startup
Total System Global Area 839282688 bytes
Fixed Size 2257880 bytes
Variable Size 616565800 bytes
Database Buffers 218103808 bytes
Redo Buffers 2355200 bytes
Database mounted.
Database opened.
SQL> select segment_name, tablespace_name, status from dba_rollback_segs;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ----------------
SYSTEM SYSTEM ONLINE
_SYSSMU2_3591705079$ UNDOTBS2 ONLINE
_SYSSMU3_1804564213$ UNDOTBS2 ONLINE
_SYSSMU4_1390701974$ UNDOTBS2 ONLINE
_SYSSMU5_2619049222$ UNDOTBS2 ONLINE
_SYSSMU6_4126997615$ UNDOTBS2 ONLINE
_SYSSMU7_895185006$ UNDOTBS2 ONLINE
_SYSSMU8_944358489$ UNDOTBS2 ONLINE
_SYSSMU9_582459079$ UNDOTBS2 ONLINE
_SYSSMU10_1186970945$ UNDOTBS2 ONLINE
_SYSSMU21_1970430449$ UNDOTBS2 ONLINE
11 rows selected.
|
정상적으로 ONLINE 상태인것을 확인
제일 처음으로 돌아가서 test 계정에 emp 테이블에 데이터 insert 시도
|
1
2
3
4
5
6
7
|
SQL> conn test/test
SQL> INSERT INTO EMP VALUES
(7369, 'SMITH', 'CLERK', 7902,
TO_DATE('17-12-1980', 'DD-MM-YYYY'), 800, NULL, 20);
1 row created.
|
정상적으로 insert 가 되는것을 확인가능함
원인 : 특정 undo segment 문제
특정 undo segment 문제
참조 : Doc. 1919142.1, 1579215.1
http://alivekim.tistory.com/2
'ORACLE > Trouble Shooting' 카테고리의 다른 글
| crsctl stat res -t 명령어로 조회 시 ora.diskmon OFFLINE (0) | 2018.03.09 |
|---|---|
| CRS-4013: This command is not supported in a single-node configuration. (10) | 2018.03.09 |
| ORA-12919: Can not drop the default permanent tablespace 해결 방법 (0) | 2018.03.07 |
| 오라클 11g R2 설치 시 INVALID BLOCK TYPE 에러 (0) | 2018.02.28 |
| ORA-39070: Unable to open the log file. (0) | 2018.02.28 |