2010-06-14 14 views
5

Mam tabelę LOB. Obecnie posiada 9 GB z 12 GB dostępnych. I, o ile wiem, usuwanie rekordów nie odzyskuje miejsca w przestrzeni tabel. (Było to dzięki prostej metodzie monitorowania pamięci - kwerendy skierowane do user_extents, co jest o wszystkim dozwolone jako non-DBA) Martwię się o obsługę dalszego przetwarzania.Jak odzyskać miejsce do przechowywania usuniętych obiektów LOB

Moją obawą jest po prostu brak miejsca - mamy około 9 GB z 12 GB dostępnych dla obszaru tabel i chcę dowiedzieć się, jak odzyskać miejsce przed pytaniem o więcej.

Kolumny LOB są przechowywane w osobnym obszarze tabel, ale "małe wiersze" są dozwolone.

To jest Oracle 11.1, a dane znajdują się w kolumnie CLOB i BLOB w tej samej tabeli. Segmenty indeksów LOB (SYS_IL ...) są małe, cała pamięć znajduje się w segmentach danych (SYS_LOB ...)

Próbowaliśmy oczyścić i połączyć się i nigdzie nie doszło - ta sama liczba bajtów w user_extents.

"Alter table xxx move" będzie działał, ale musielibyśmy mieć gdzieś miejsce, aby przenieść go do tego, co ma dość miejsca na zmienione dane. Musielibyśmy to zrobić poza godzinami pracy i oczywiście odbudować indeksy, ale to dość łatwe.

Kopiowanie dobrych danych i obcięcie, a następnie kopiowanie, również będzie działać. Ale to właśnie robi polecenie "zmień stół".

Czy brakuje mi łatwych sposobów na zmniejszenie rozmiarów i odzyskanie pamięci? Czy też "alter table xxx move" to najlepsze podejście? Czy to nie jest problem, a Oracle odzyska przestrzeń z usuniętych wierszy lobów, kiedy tego potrzebuje?

+0

„która jest o wszystko wolno mi jako nie-DBA” Nie mógł nie zauważyć tego, a warto powiedzieć, że nie każdy ma problem techniczny techniczna odpowiedź. Jeśli jesteś osobą odpowiedzialną za martwienie się o te rzeczy, powinieneś otrzymać uprawnienia DBA lub przynajmniej uprawnienie systemowe SELECT DOWOLNEGO DYSCYJONEGO. Jeśli nie, powinieneś eskalować coś takiego, zanim wpłynie to na innych użytkowników. – durette

Odpowiedz

1

Ogólnie rzecz biorąc, po przydzieleniu zakresu do tabeli pozostaje on przydzielony. Puste miejsce w tabeli można ponownie wykorzystać, jeśli do tabeli zostaną wstawione dodatkowe dane. Jednak trudno jest odzyskać przestrzeń z poziomu stołu, ponieważ tablica może mieć na przykład bloki od 1 do 100, a puste bloki są w blokach 50-75, lub puste bloki to 1,3,5,7 itd.

Pytanie brzmi, czy martwisz się, że przestrzeń zostanie ponownie wykorzystana w tabeli, czy potrzebujesz przestrzeni przeznaczonej na inne obiekty w obszarze tabel, czy też musisz zmniejszyć pliki danych obszaru tabel?

6

To pytanie jest stare, ale nigdy nie miało działającej odpowiedzi i może być przydatne dla wielu osób, a więc tutaj znalazłem rozwiązanie, które napotkałem podczas stawiania czoła temu problemowi.

Masz rację, usunięcie LOB nie spowoduje odzyskania pamięci w tablescape.

Uruchomienie tego zapytania przed i po usunięciu LOB będzie dać taki sam efekt

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

czytanie this Oracle doc, okazało się, że trzeba wykonać następujące oświadczenie

ALTER TABLE yourLobTable MODIFY LOB (yourLobColumn) (SHRINK SPACE); 

Który będzie się kurczyć segment LOB BASICFILE.

Teraz, jeśli ponownie wykonać kwerendę

select bytes 
    from user_segments 
    where tablespace_name = yourTableSpace 
     and segment_name = yourTableName; 

Można zauważyć, że przestrzeń zostały dopuszczone do tabel i będzie mógł ponownie wykorzystać tę przestrzeń jak chciałeś.

Teraz dla tych, którzy chcieliby zwolnić miejsce na dysku, należy pamiętać, że plik danych nie zmieni się automatycznie i nadal będzie zawierał pełny rozmiar dysku.

Ale zanim ponownie doborze pliku danych, upewnij się, że zwalnianie niewykorzystaną przestrzeń w segmencie (ukradł go z tego samego dokumentu, jak podano wcześniej) przy użyciu tych zapytań (użyj jednego potrzeba)

ALTER TABLE table DEALLOCATE UNUSED KEEP integer; 
ALTER INDEX index DEALLOCATE UNUSED KEEP integer; 
ALTER CLUSTER cluster DEALLOCATE UNUSED KEEP integer; 

Note że klauzula KEEP jest opcjonalna i pozwala określić ilość wolnego miejsca w segmencie. Możesz zweryfikować, że zwolnione miejsce jest zwalniane, sprawdzając widok DBA_FREE_SPACE.

Teraz ponownie swoją wielkość datafile,

ALTER DATABASE DATAFILE yourDatafile.dbf resize 500M 

pamiętać, że maksymalny rozmiar można skurczy podczas zmiany rozmiaru opiera się na pozycji ostatniego bloku danych w pliku danych. Dlatego istnieje duże prawdopodobieństwo, że po usunięciu wielu danych nie da się naprawdę zmienić rozmiaru. Najprostszym sposobem jest wyeksportowanie danych i ponowne zaimportowanie do innego obszaru tabel, a następnie usunięcie starego obszaru tabel. Podczas importowania danych Oracle spakuje je w miarę możliwości.

Jeśli chcesz zwolnić jeszcze więcej miejsca, możesz wyczyścić tabelę tymczasową, która zajmuje dużo miejsca (5 GB dla mojej bazy danych). Użyj następujące oświadczenie to sprawdzić rozmiar:

SELECT tablespace_name, file_name, bytes 
    FROM dba_temp_files WHERE tablespace_name like 'TEMP%'; 
+0

Nie zapomnij włączyć ruchu w rzędzie, jeśli nie jest jeszcze włączony: ALTER TABLE x_tab ENABLE ROW MOVEMENT; – durette

Powiązane problemy