Июн 172011
 

Иногда бывает, что нужно оценить размер некоторых таблиц в дампе, сделанном утилитой exp, но без импорта его в базу. Можно, конечно, сделать импорт с параметром show=y, но это не всегда удобно, т.к. imp в этом режиме показывает размеры таблиц в строках (а мы хотим в мегабайтах, к примеру), и требует подключения к базе данных, даже для имитации. Выход - написать свой скрипт для оценки размеров таблиц (прошу прощения за неряшливый код): Continue reading »

Июн 062011
 

Я уже писал, как выявить блокирующие сессии и сгенерировать команды на их завершение. Проблема в том, что команда KILL SESSION не всегда быстро отрабатывает. Гораздо быстрее (особенно, если сессий нужно завершить много) будет убивать серверный процесс, соответствующий этой сессии, средствами ОС, после чего фоновый процесс PMON удалит из памяти экземпляра БД данные об убитой сессии, снимет все блокировки и откатит транзакции.

Итак, запрос: Continue reading »

Апр 182011
 

Временные табличные пространства (temporary tablespaces) отличаются от обычных и узнать количество свободного места в них тем же способом, что и в предыдущем посте, не получится. Тут немного сложнее: общий размер пространства по-прежнему есть сумма размеров всех составляющих его файлов, а вот аналога DBA_FREE_SPACE для temporary tablespaces нет, поэтому придётся подсчитать сумму размеров всех временных сегментов с группировкой по имени пространства: Continue reading »

Апр 152011
 

Узнать общий размер табличного пространства можно, сложив размеры всех составляющих его файлов данных. Эта информация есть в представлении DBA_DATA_FILES.
Объём доступного свободного места в каждом tablespace можно получить из DBA_FREE_SPACE.
Теперь объединим запросы из этих представлений в один и добавим округление, подсчёт процентов свободного места, etc.: Continue reading »

Мар 222011
 

Если нам нужно создать пустую схему в новой базе данных, которая бы полностью наследовала права доступа, системные привилегии и роли другой схемы в существующей базе, то экспортом это делать неудобно и долго, гораздо проще создать нового пользователя и дать ему необходимые права. Список прав получим с помощью специального запроса (см. ниже). Полный набор прав доступа хранится в трёх представлениях словаря данных: dba_tab_privs, dba_sys_privs, и dba_role_privs, в которых нас прежде всего интересует столбец GRANTEE, где и содержится имя пользователя, которому даётся привилегия. Поэтому нам понадобятся 3 запроса, результаты которых мы для удобства объединим в одно множество с помощью оператора объединения множеств - UNION.

Итак, запрос: Continue reading »

Фев 282011
 

При создании дампа схемы с помощью утилиты exp иногда бывает нужно экспортировать не некоторые таблицы по списку, а все таблицы, кроме некоторого списка. При большом количестве таблиц в экспортируемой схеме удобно будет автоматизировать создание файла параметров (parfile) для exp.

Для этого создадим файл build_parfile.sh с таким содержимым: Continue reading »

Фев 242011
 

Вот пример триггера, в котором устанавливается ограничение на количество сессий, открытых одновременно и удовлетворяющих определённому условию (в дополнение к этому посту): Continue reading »

Фев 142011
 

Чтобы узнать, какие транзакции наиболее активно потребляют место в Undo tablespaces с привязкой к сессиям, поможет такой запрос (для версий 10g и выше):

SELECT DISTINCT s.sid, s.serial#, s.schemaname, s.osuser, s.program, t.start_time,  
       t.used_ublk, r.name rollback_segment_name, 
       st.sql_text, st_prev.sql_text prev_sql_text, s.event
FROM v$session s, v$transaction t, v$rollname r, v$sql st, v$sql st_prev
WHERE 
	t.addr = s.taddr AND
	t.USED_UBLK > 0 AND 
	t.xidusn = r.usn AND
	st.SQL_ID(+) = s.SQL_ID AND
	st_prev.SQL_ID(+) = s.SQL_ID
ORDER BY t.USED_UBLK DESC;

Continue reading »

Янв 282011
 

В некоторых случаях, например, когда к базе подключается приложение, возникает необходимость снимать трассировку сессии с самого начала, и нет возможности ни включить трассировку из этой сессии, ни из другой, как описано здесь. Тогда решением будет создание триггера на событие Logon: Continue reading »