sql >> Databáze >  >> RDS >> Oracle

Jak zmenšit dočasný tabulkový prostor v oracle?

Bože můj! Podívejte se na velikost mého dočasného tabulkového prostoru! Nebo... jak zmenšit dočasné tabulkové prostory v Oracle.

Ano, spustil jsem dotaz, abych zjistil, jak velký je můj dočasný tabulkový prostor:

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

První otázka, kterou si musíte položit, je, proč je dočasný tabulkový prostor tak velký. Odpověď na to možná znáte z hlavy. Může to být způsobeno velkým dotazem, že jste právě spustili řazení, které bylo chybné (udělal jsem to více než jednou.) Může to být způsobeno nějakou jinou výjimečnou okolností. Pokud je to tak, pak vše, co k vyčištění potřebujete udělat, je zmenšit dočasný tabulkový prostor a jít v životě dál.

Ale co když to nevíte? Než se rozhodnete zmenšit, možná budete muset prozkoumat příčiny velkého tabulkového prostoru. Pokud k tomu dochází pravidelně, je možné, že vaše databáze potřebuje tolik místa.

Zobrazení dynamického výkonu

V$TEMPSEG_USAGE

může být velmi užitečné při určování příčiny.

Možná vás jen nezajímá příčina a potřebujete ji zmenšit. Toto je váš třetí den v práci. Data v databázi jsou pouze 200MiBif dat a dočasný tabulkový prostor je 13GiB - Stačí jej zmenšit a jít dál. Pokud znovu naroste, budeme hledat příčinu. Mezitím mám na tomto disku dostatek místa a potřebuji místo zpět.

Pojďme se podívat na jeho zmenšení. Bude to trochu záležet na tom, jakou verzi Oracle používáte a jak byl dočasný tabulkový prostor nastaven.
Oracle udělá to nejlepší, aby vás uchránil od jakýchkoli strašlivých chyb, takže příkazy prostě vyzkoušíme a pokud ne práci budeme zmenšovat novým způsobem.

Nejprve zkusme zmenšit datový soubor. Pokud to dokážeme, dostaneme zpět prostor a můžeme si dělat starosti s tím, proč to rostlo zítra.

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

V závislosti na chybové zprávě to možná budete chtít zkusit s různými velikostmi, které jsou menší než aktuální umístění souboru. S tím jsem měl omezený úspěch. Oracle zmenší soubor pouze v případě, že je dočasný tabulkový prostor v záhlaví souboru a pokud je menší než vámi určená velikost. Nějaká stará dokumentace Oracle (to opravili) říkala, že můžete zadat příkaz a chybová zpráva vám řekne, na jakou velikost se můžete zmenšit. V době, kdy jsem začal pracovat jako DBA, to nebyla pravda. Jen jste museli uhodnout a znovu spustit příkaz několikrát a zjistit, zda to fungovalo.

V pořádku. To nefungovalo. Co třeba tohle.

SQL> alter tablespace YOUR_TEMP_TABLESPACE_NAME shrink space keep 256M;

Pokud máte 11 g (možná také 10 g), je to ono! Pokud to funguje, možná se budete chtít vrátit k předchozímu příkazu a zkusit to znovu.

Ale co když to selže. Pokud je dočasný tabulkový prostor výchozím dočasným, který byl nastaven při instalaci databáze, možná budete muset udělat mnohem více práce. V tuto chvíli obvykle přehodnocuji, zda opravdu potřebuji ten prostor zpět. Veškerý diskový prostor stojí pouze XX, XX $ za GiB. Obvykle nechci provádět takové změny během výrobních hodin. To znamená pracovat ve 2AMAGAIN! (Ne že bych opravdu něco namítal proti práci ve 2:00 - to je jen to, že... No, já taky rád spím. A moje žena mě ráda má doma ve 2:00... ve 4:00 se nepotuluji po ulicích města a snažím se vzpomenout si, kde jsem zaparkoval auto o 3 hodiny dříve. Slyšel jsem o tom „telecommutingu“. Jen se obávám, že se dostanu do poloviny a pak se mi nezdaří připojení k internetu – pak musím spěchat do centra, abych to všechno napravil, než se lidé ráno objeví. databáze.)

Ok... Zpátky k tomu vážnému...Pokud je dočasný tabulkový prostor, který chcete zmenšit, váš výchozí dočasný tabulkový prostor, budete muset nejprve vytvořit nový dočasný tabulkový prostor, nastavit jej jako výchozí dočasný tabulkový prostor, poté zahodit svůj starý výchozí dočasný tabulkový prostor a znovu vytvořit to. Afterwordsdrop druhou vytvořenou dočasnou tabulku.

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.

Doufejme, že jedna z těchto věcí pomůže!



  1. Jak funguje LOG2() v MariaDB

  2. Jak Access komunikuje se zdroji dat ODBC? Část 2

  3. Děláte tyto chyby při používání SQL CURSOR?

  4. Připojení Pythonu k databázi MySQL pomocí konektoru MySQL a příkladu PyMySQL