ablog

不器用で落着きのない技術者のメモ

UNDO表領域を再作成してクリアした手順

Oracle に接続する。

$ sqlplus / as sysdba

新しいUNDO表領域を一時的に作成する。

SQL> CREATE UNDO TABLESPACE UNDOTBS2 DATAFILE '/u02/oradata/orcl/undotbs02_01.dbf' SIZE 4G;

新しく作ったUNDO領域に切り替える。

SQL> ALTER SYSTEM SET UNDO_TABLESPACE = 'UNDOTBS2';

元のUNDO表領域を削除する。

SQL> ALTER TABLESPACE UNDOTBS1 OFFLINE NORMAL;
SQL> shutdown immediate;
SQL> startup
SQL> DROP TABLESPACE UNDOTBS1;
DROP TABLESPACE UNDOTBS1
*
ERROR at line 1:
ORA-01548: active rollback segment '_SYSSMU2$' found, terminate dropping
tablespace

ありゃ、怒られた。
ぐぐって、
http://arjudba.blogspot.com/2008/08/ora-01548-active-rollback-segment.html
を参考に以下の手順を実行してみた。

PFILE を作成する。

$ sqlplus / as sysdba
SQL> create pfile='/home/oracle/pfile.tmp' from spfile;
SQL> exit

PFILE を編集する。

$ cd /home/oracle
$ vi pfile.tmp
*.undo_management='manual'
_offline_rollback_segments=(_SYSSMU2$) # ORA-01548 で怒られたロールバックセグメントを指定する

編集したPFILEでデータベースをオープンする。

$ sqlplus / as sysdba
SQL> shutdown immediate
SQL> startup mount pfile='/home/oracle/pfile.tmp';
SQL> alter database open;

ロールバックセグメントを削除する。

SQL> drop rollback segment "_SYSSMU2$";
*
ERROR at line 1:
ORA-00607: Internal error occurred while making a change to a data block
ORA-00600: internal error code, arguments: [kddummy_blkchk], [2], [25],
[38508], [], [], [], []

お、なんかエラーが。。。そのまま進む。

UNDO表領域を削除する。

SQL> drop tablespace UNDOTBS1 including contents;

Tablespace dropped.

ふ〜、やっと削除できた。

UNDO領域を作成する。

SQL> CREATE SMALLFILE UNDO TABLESPACE UNDOTBS1
	 DATAFILE '/u02/oradata/orcl/undotbs01.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs02.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs03.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs04.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs05.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs06.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs07.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;
SQL> ALTER TABLESPACE UNDOTBS1
	ADD DATAFILE '/u02/oradata/orcl/undotbs08.dbf' SIZE 4096M REUSE AUTOEXTEND OFF;

インスタンスを再起動する。

SQL> shutdown immediate
SQL> startup

UNDO領域を作成したほうに切り替える。

SQL> ALTER SYSTEM SET UNDO_TABLESPACE = 'UNDOTBS1';

一時的に作成したUNDO表領域を削除する。

SQL> drop tablespace UNDOTBS2 including contents;

トランザクションが終了したら、ロールバックセグメントは解放されるはずだけど、なんかおかしなことになっていたみたい。