web-dev-qa-db-ja.com

UNDO TABLESPACEをドロップできません

2つの異なるサーバー上にOracle 11gR1 RACの2つのインスタンスがあり、新しいUNDOテーブルスペースNDOTBS20140508 30Gを作成しました。古いインスタンスを削除したいNDOTBSX02、私は次のようにしました:

CREATE UNDO TABLESPACE UNDOTBS20140508  DATAFILE '+DATA/....../UNDOTBS20140508' SIZE 20G;
ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS20140508;
DROP TABLESPACE UNDOTBSX02 INCLUDING CONTENTS AND DATAFILES;

NDOTBSX02を削除しようとすると、次のエラーが表示されます。

Error starting at line : 13 in command -
DROP TABLESPACE UNDOTBSX02 INCLUDING CONTENTS AND DATAFILES
Error report -
SQL Error: ORA-00604: error occurred at recursive SQL level 1
ORA-06502: PL/SQL: numeric or value error
ORA-06512: at line 57
ORA-30013: undo tablespace 'UNDOTBSX02' is currently in use
00604. 00000 -  "error occurred at recursive SQL level %s"
*Cause:    An error occurred while processing a recursive SQL statement
           (a statement applying to internal dictionary tables).
*Action:   If the situation described in the next error on the stack
           can be corrected, do so; otherwise contact Oracle Support.

保留中のトランザクションについてNDOTBSX02をチェックしましたが、それは空です。それを落とす方法は?

:私はOracle DBAではありませんが、このタスクを実行する必要があります。

7
Mohammad Jolani

上記の提案を試しましたが、一部のSQLで結果が得られなかったり、UNDOテーブルスペースを削除できないなど、機能しませんでした。基本的な問題は、古いUNDO表スペースがまだUNDOとしてOracleに登録されているため、新しいUNDO表スペースに変更する必要があることです。

これが私がやったことであり、うまくいきました:

  1. 新しいUNDO表スペースを作成します。
CREATE SMALLFILE UNDO TABLESPACE "UNDO" 
DATAFILE '+DATA/t2/datafile/undo_01.dbf' SIZE 10G 
REUSE AUTOEXTEND ON NEXT 500M MAXSIZE 10G;
  1. 新しいUNDOを「公式」のUNDO表スペースに切り替えます。
alter system set undo_tablespace='UNDO' scope=both;
  1. 古いUNDO表スペースをドロップします。
DROP TABLESPACE UNDOTBS1 INCLUDING CONTENTS AND DATAFILES;

お役に立てれば。

3
dave

以前の投稿者によって提供された回答は、新しいUNDOテーブルスペースを作成し、システムを新しいUNDOテーブルスペースに切り替えるための構文に関してすべて正しいです。

Oracleドキュメント は、次のステートメントが新しいUNDOテーブルスペースに切り替わることを示しています。

ALTER SYSTEM SET UNDO_TABLESPACE = <name of new UNDO TS>;

例えば@Mohammad Jolaniの場合:

ALTER SYSTEM SET UNDO_TABLESPACE = UNDOTBS20140508;

ただし、この切り替えには次のように記載されているいくつかの制限があります:

スイッチ操作は、古いUNDO表領域のトランザクションがコミットするのを待ちません。古いUNDO表領域に保留中のトランザクションがある場合、古いUNDO表領域はPENDING OFFLINEモード(ステータス)になります。このモードでは、既存のトランザクションを引き続き実行できますが、新しいユーザートランザクションの取り消しレコードをこの取り消しテーブルスペースに格納することはできません。このPENDING OFFLINEモードでは、切り替え操作が正常に完了した後でも、UNDOテーブルスペースが存在する可能性があります。 PENDING OFFLINE UNDO表領域は、別のインスタンスで使用することも、削除することもできません。最終的に、すべてのアクティブなトランザクションがコミットされると、UNDO表領域は自動的にPENDING OFFLINEモードからOFFLINEモードになります。それ以降、他のインスタンスで(Oracle Real Application Cluster環境の)UNDO表領域を使用できます。

したがって、PENDING OFFLINEのundo表領域は、別のインスタンスでは使用できず、削除することもできません。Oracleが完全に切り替えるまで待機する必要があります。現在のUNDOテーブルスペースを完全に。

テーブルスペースのステータスをクエリしてみてください:

select file#, ts#, status, bytes, substr(name, 0, 30) from v$datafile;

古いUNDOテーブルスペースがまだ使用されているか、PENDING OFFLINE状態。

UNDOテーブルスペースを前後に切り替えることもできます。

ALTER SYSTEM SET UNDO_TABLESPACE = '';
このPENDING OFFLINEモードでは、切り替え操作が正常に完了した後でも、UNDOテーブルスペースが存在する可能性があります。 PENDING OFFLINE UNDO表領域は、別のインスタンスで使用することも、削除することもできません。最終的に、すべてのアクティブなトランザクションがコミットされると、UNDO表領域は自動的にPENDING OFFLINEモードからOFFLINEモードになります。それ以降、他のインスタンスで(Oracle Real Application Cluster環境の)UNDO表領域を使用できます。 UNDO TABLESPACEのパラメーター値が ''(2つの単一引用符)に設定されている場合、現在のUNDO表スペースがスイッチアウトされ、次に使用可能なUNDO表スペースがスイッチインされます。使用可能なUNDOテーブルスペースがない場合は、このステートメントを注意して使用してください。 、SYSTEMロールバックセグメントが使用されます。これにより、SYSTEMに関連しないUNDOをSYSTEMロールバックセグメントに書き込もうとすると、ORA-01552エラーが発行されます。

データベースをシャットダウンしない限り、強制的に切り替えることはできません。オラクルがまだ古いUNDO TSを必要としていると考えている場合は、そうしてください。システムはすでに新しいUNDO TSに書き込んでいるので、特別な要件がない限り、何も強制する必要はありません。

1

接続のドロップを開始したくない。これらの接続が何をしているか、それらの接続が切断された場合に何が壊れるかをどのようにして知ることができますか。

セッションが新しいテーブルスペースの使用を開始するのを待つ方がよいでしょう。最終的に、古いUNDO表領域は使用されなくなります。その時あなたはそれを落とすことができます。ディスク領域が必要な場合は、UNDO表領域を縮小してみることができますが、それでうまくいかない可能性があります。また、データベースをシャットダウンするためのダウンタイムを取得し、データベースを制限モードで起動してから、データベースをシャットダウンして無制限に起動する古いUNDO表領域を削除することもできます。

1
Gandolf989

エラーメッセージは、tablespaceが使用されていることを意味します。元に戻すtablespaceは重要なので、tablespaceを使用して、最初にシャットダウンする必要があります。

SELECT a.name,b.status , d.username , d.sid , d.serial#
FROM   v$rollname a,v$rollstat b, v$transaction c , v$session d
WHERE  a.usn = b.usn
AND    a.usn = c.xidusn
AND    c.ses_addr = d.saddr
AND    a.name IN ( 
          SELECT segment_name
          FROM dba_segments 
          WHERE tablespace_name = 'UNDOTBSX02'
         ); 

次に、次を使用して、UNDO表領域のSIDを強制終了します

alter system kill session 'SID,serial'; --change the values of sid and serial by the ones  that being retrived from the previouse command

これでドロップできるはずです。

1
Ahmad Abuhasna

ソー このリンク ソリューションについて。それは私のために働いた!

表領域を削除する前に、対応するロールバックセグメントをオフラインにする必要があります。

また、新しいパラメーター値を有効にするには、データベースを再起動する必要があります。

0
Cindy