sql >> データベース >  >> RDS >> Oracle

Oracleで一時表領域を縮小する方法は?

    おやまあー!一時表スペースのサイズを確認してください!または...Oracleで一時表スペースを縮小する方法。

    はい、クエリを実行して、一時テーブルスペースの大きさを確認しました。

    SQL> SELECT tablespace_name, file_name, bytes
    2  FROM dba_temp_files WHERE tablespace_name like 'TEMP%';
    
    TABLESPACE_NAME   FILE_NAME                                 BYTES
    ----------------- -------------------------------- --------------
    TEMP              /the/full/path/to/temp01.dbf     13,917,200,000
    

    最初に尋ねなければならない質問は、一時表領域が非常に大きい理由です。これに対する答えは頭からわかるかもしれません。間違ったソートで実行した大きなクエリが原因である可能性があります(私はそれを複数回実行しました)。他の例外的な状況が原因である可能性があります。その場合、クリーンアップするために必要なのは、一時テーブルスペースを縮小して人生を進めることだけです。

    しかし、あなたが知らない場合はどうなりますか?縮小することを決定する前に、大きなテーブルスペースの原因を調査する必要がある場合があります。これが定期的に発生する場合は、データベースにそれだけのスペースが必要である可能性があります。

    動的パフォーマンスビュー

    V$TEMPSEG_USAGE
    

    原因を特定するのに非常に役立ちます。

    たぶん、あなたは原因を気にせず、それを縮小する必要があるだけかもしれません。これはあなたの仕事の3日目です。データベース内のデータはわずか200MiBifデータであり、一時テーブルスペースは13GiBです-縮小して次に進みます。再び大きくなる場合は、原因を調査します。その間、そのディスクボリュームのスペースが不足しているため、スペースを戻す必要があります。

    縮小してみましょう。実行しているOracleのバージョンと、一時表領域の設定方法に少し依存します。
    Oracleは、恐ろしい間違いをしないように最善を尽くします。そのため、コマンドを試してみます。新しい方法で縮小します。

    まず、データファイルを縮小してみましょう。それができれば、スペースを取り戻すことができ、明日成長した理由を心配することができます。

    SQL>
    SQL> alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M; 
    alter database tempfile '/the/full/path/to/temp01.dbf' resize 256M
    *   
    ERROR at line 1:
    ORA-03297: file contains used data beyond requested RESIZE value
    

    エラーメッセージに応じて、ファイルの現在のサイトよりも小さいさまざまなサイズでこれを試してみることをお勧めします。私はこれで限られた成功しか収めていません。 Oracleは、一時テーブルスペースがファイルの先頭にあり、指定したサイズよりも小さい場合にのみファイルを縮小します。一部の古いOracleドキュメント(これは修正されています)には、コマンドを発行でき、エラーメッセージに縮小できるサイズが示されていると記載されています。私がDBAとして働き始めた頃には、これは真実ではありませんでした。コマンドを何度も推測して再実行し、機能するかどうかを確認する必要がありました。

    大丈夫。それはうまくいきませんでした。これはどうですか。

    SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;
    

    あなたが11g(10gのメイビーも)にいるなら、これはそれです!動作する場合は、前のコマンドに戻って、もう一度試してみてください。

    しかし、それが失敗した場合はどうなりますか。一時表領域がデータベースのインストール時に設定されたデフォルトの一時表領域である場合は、さらに多くの作業が必要になる場合があります。この時点で、私は通常、そのスペースを本当に戻す必要があるかどうかを再評価します。結局のところ、ディスク容量は1GiBで$X.XXしかかかりません。通常、私は生産時間中にこのような変更を加えたくありません。それは2AMAGAINで働くことを意味します! (私は午前2時に働くことに本当に反対しているわけではありません-それだけです...私も寝るのが好きです。そして妻は午前2時に私を家に連れて行くのが好きです...午前4時にダウンタウンの通りを歩き回って私が駐車した場所を思い出そうとはしません車は3時間前です。その「在宅勤務」について聞いたことがあります。途中でインターネットに接続できなくなるのではないかと心配しています。朝に人々が現れる前に、ダウンタウンに急いで修理する必要があります。データベース。)

    わかりました...深刻な問題に戻ります...縮小する一時テーブルスペースがデフォルトの一時テーブルスペースである場合は、最初に新しい一時テーブルスペースを作成し、それをデフォルトの一時テーブルスペースとして設定してから、古いデフォルトの一時テーブルスペースを削除して再作成する必要があります。それ。 Afterwordsdropは、作成された2番目の一時テーブルです。

    SQL> CREATE TEMPORARY TABLESPACE temp2
    2  TEMPFILE '/the/full/path/to/temp2_01.dbf' SIZE 5M REUSE
    3  AUTOEXTEND ON NEXT 1M MAXSIZE unlimited
    4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
    
    Tablespace created.
    
    SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp2;
    
    Database altered.
    
    SQL> DROP TABLESPACE temp INCLUDING CONTENTS AND DATAFILES;
    
    Tablespace dropped.
    
    
    SQL> CREATE TEMPORARY TABLESPACE temp
    2  TEMPFILE '/the/full/path/to/temp01.dbf' SIZE 256M REUSE
    3  AUTOEXTEND ON NEXT 128M MAXSIZE unlimited
    4  EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M;
    
    Tablespace created.
    
    SQL> ALTER DATABASE DEFAULT TEMPORARY TABLESPACE temp;
    
    Database altered.
    
    SQL> DROP TABLESPACE temp2 INCLUDING CONTENTS AND DATAFILES;
    
    Tablespace dropped.
    

    うまくいけば、これらのいずれかが役立つでしょう!



    1. SqlConnection SqlCommand SqlDataReader IDisposable

    2. MySQLで値が整数であるかどうかを確認するにはどうすればよいですか?

    3. GROUP BYはどのように機能しますか?

    4. SQLでは常に小数点以下の桁数を表示しますか?