Відновлення логічного простору з простору таблиць


11

У мене є таблична область під назвою DATA, і вона налаштована з автоматичним розширенням як хибна. Цей табличний простір має два файли даних і налаштований так, що він займає 350 Гб фізичного простору.

Тиждень тому я запитав user_tablespaces та dba_data_files і помітив, що він має 20% доступного логічного простору. Потім я приступив до очищення та видалив багато записів із таблиць у цьому просторі таблиць. Ми очікували значного збільшення наявного простору. На жаль, коли я запитував погляди, я помітив, що наявний простір зараз становив 20,5%.

Це може бути пов'язано з фрагментацією даних? Чи можемо ми якось "дефрагментувати" простір таблиць і відновити втрачений простір? Або нам потрібно відтворити простір таблиць з нуля?

Відповіді:


14

Коли ви видаляєте записи, нічого, що автоматично ущільнює сегмент, нічого не потрібно, тому потрібно буде зменшити сегмент, щоб повернути простір. Ось уривок із 11.2 Посібника для адміністратора щодо відшкодування марнотратського простору :

З часом оновлення та видалення об'єктів у просторі таблиць можуть створювати кишені порожнього простору, які окремо не є достатньо великими, щоб повторно використовувати їх для нових даних. Цей тип порожнього простору називається фрагментованим вільним простором.

Об'єкти з фрагментованим вільним простором можуть призвести до багато витраченого простору і можуть вплинути на продуктивність бази даних. Кращим способом дефрагментації та повернення цього простору є виконання скорочення онлайн-сегменту. Цей процес консолідує роздроблений вільний простір під високим рівнем води та ущільнює сегмент. Після ущільнення марка високої води переміщується, що призводить до появи нового вільного простору над знаком високої води. Цей простір над знаком високої води потім розміщується. Сегмент залишається доступним для запитів і DML протягом більшої частини операції, і не потрібно виділяти зайвого дискового простору.

Далі вниз на цій же сторінці ви можете прочитати це:

Зменшення сегмента - це онлайн-операція на місці. Операції та запити DML можуть видаватися під час фази руху даних зменшення сегмента. Одночасні операції DML блокуються ненадовго в кінці операції скорочення, коли місце займає місце. Показники зберігаються під час операції скорочення та залишаються корисними після завершення операції. Зменшення сегмента не потребує виділення додаткового місця на диску.

Усадка сегменту повертає невикористаний простір і над, і під знаком високої води. Навпаки, космічне розселення повертає невикористаний простір лише над знаком високої води. При скорочувальних операціях база даних за замовчуванням ущільнює сегмент, регулює високий рівень води та звільняє відведений простір.

Сторінка містить набагато більше інформації щодо цього питання, включаючи приклади.

Розділ "Простір сегмента та високий рівень води" в Посібнику з концепцій також може бути корисним.


9

Так, це буде через фрагментацію.

Щоб відновити простір, спочатку отримайте список таблиць у просторі таблиць із наступним запитом (ігноруючи розділи - відредагуйте своє запитання, якщо ви їх використовуєте):

select distinct table_name from dba_tables where tablespace_name = 'DATA';

Потім для кожної таблиці ввімкніть рух рядків:

alter table TABLEINDATAPARTITION enable row movement;

Потім ви можете зменшити таблицю:

alter table TABLEINDATAPARTITION shrink space;

Потім стисніть файли даних за допомогою:

alter database datafile '/path/to/my/file/data01.dbf' resize 20480M;

Імена файлів даних можна отримати з DBA_DATA_FILESпредставлення даних, про яке ви вже знаєте.


Відмінна, практична відповідь. +1
Лей Ріффер
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.