Фев 282013
 

Возникла у меня такая задача: смигрировать базу c Linux x86-64 на AIX 7.1. Версия Oracle - 11.2.0.3. Можно было бы использовать expdp, но из-за приличного объёма базы (180Гб) процесс занял бы длительное время. Тут нам на помощь приходит технология Transportable Tablespaces. Суть её состоит в том, что файлы данных копируются целиком и все существующие сегменты данных "подключаются" напрямую, т.е. эта операция, в отличие от импорта, не генерирует redo информацию и не требует перестройки индексов. Технология эта годится только для относительно крупных баз, т.к. требует от администратора кучу действий, особенно при смене порядка бит (endianess), как в моём случае.
Заодно мы решили воспользоваться случаем и смигрировать данные сразу в ASM (раньше файлы просто лежали на большом дисковом разделе).

Итак, вот примерная последовательность действий. Continue reading »

Янв 282013
 

Утилита DataPump работает немного не так, как старинные exp/imp. В отличие от них, она не просто открывает сессию, по которой выкачивает/заливает данные, но создаёт несколько серверных процессов (они называются DataPump jobs, но путать их с заданиями, запускаемыми с помошью пакета dbms_job не стоит, тут другой механизм). Кстати, именно поэтому если убить процесс expdp/impdp командой kill -9, то сессии DataPump всё равно останутся в базе и могут помешать повторному запуску утилиты.
Иногда бывает необходимо убедиться, что сессии не подвисли и процесс перекачки данных идёт нормально. Раньше можно было просто поискать в v$session записи с полем program, содержащим строку 'imp%' или 'exp%' соответственно, но теперь всё немного хитрее. Для мониторинга сессий DataPump есть представление dba_datapump_sessions.

Вот так можно определить, на каком событии висят сессии DataPump и кто их блокирует: Continue reading »

Янв 272012
 

Обе утилиты экспорта данных, exp и expdp имеют параметр query, который позволяет экспортировать не все строки таблицы, а только те, которые попадают под условие. Беда в том, что в этом параметре допускается использовать только условие WHERE. Это может привести к тому, что план запроса, который будет использовать exp/expdp окажется крайне неоптимальным, и экспорт будет идти неприемлемо долго, хотя результирующий набор не такой уж большой.
Есть любопытный способ заставить утилиту использовать hint, тем самым выбирать оптимальный план выполнения. Continue reading »

Июн 172011
 

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

Мар 042011
 

Объект базы данных DIRECTORY - это ссылка на каталог сервера, на котором работает инстанс Oracle. Он нужен для пакета UTL_FILE, работы утилит impdp/expdp, при использовании полей типа BFILE в таблицах, а также при создании внешних таблиц (external tables).
Вот что можно делать с объектом DIRECTORY: Continue reading »