Скрипт определения размера таблиц в oracle и очистка данных

Часта ситуация когда в Oracle размер таблиц достигает больших величин и мы оказываемся в положении когда прикладное приложение просто не может записать что-либо в базу данных. Пришлось столкнуться с такой проблемой в Oracle XE, когда размер уперся в лицензионное ограничение этой бесплатной версии oracle.

Все операции будем производить через консоль линукс-сервера, на котором установлена наша СУБД.

Для начала логинимся под root и переключаемся на пользователя под которым работает демон оракла, у меня это пользователь oracle.

Затем устанавливаем переменные окружения для запуска утилиты sqlplus

Здесь следует обратить внимание:при установке переменной ORACLE_HOME в конце не должен стоять слэш! Иначе мы потом получим сообщение о том , что не можем присоединиться к инстансу оракла!
И устанавливаем инстанс к которому будем подключаться, у меня это иснтанс XE

Далее запускаем консольного клиента Oracle с правами sysdba

Далее все запросы запускаем в sqlplus.

Для скрипта определения размера таблиц oracle нужно будет указать владельца таблиц, поэтому сначала вытащим из базы всех возможных владельцев таблиц:

и следом выполняем сам мега-скрипт:

(не забываем нажать ентер :))
У нас спрашивается для какого владельца посчитать размеры таблиц — указываем, жамкаем ентер и наконец-то мы видим сколько места занимает каждая таблица!

У меня оказалось, что прикладное приложение записывает логи ошибок в базу данных и за несколько лет эта таблица разрослась до безумных размеров. И удалить ее за один запрос не получилось, так как не хватало места для undo table space. Поэтому долго и нудно пришлось чистить по частям:

Но и после того как все данные были очищены таблица продолжает занимать все-тоже место! Здесь нам поможет сжатие таблицы. Для начала мы должны разрешить для таблицы перемещение строк:

И после этого сжимаем базу таблицу запросом:

И теперь наступило полное счастье ) Пользователи могут работать дальше!