Программирование >>  Oracle 

1 ... 123 124 125 [ 126 ] 127 128 129 ... 469


Импорт и экспорт 407

Export file created by EXPORT:V08.01.06 via conventional path

import done in WE8ISO8859P1 character set and WE8ISO8859P1 NCHAR character

IMP-00046: using FILESIZE value from export file of 512000 . inserting TKYTEs objects into TKYTE

. . importing table T 21899 rows

imported

Import terminated successfully with warnings.

Экспортирование по частям

Это способ решить проблему, просто избегая ее. Если имеется база данных объемом 10 Гбайт с 50 схемами приложений, причем объем данных в каждой схеме не превосходит 2 Гбайт, можно выполнять экспортирование на уровне пользователей. В результате будет экспортировано 50 файлов, каждытй из которых содержит схему одного приложения.

Экспортирование в именованный канал

Это решение прекрасно работает в ОС UNIX. Я пока не нашел способа реализовать его в среде Windows. В данном случае с помощью команды mknod создается именован-н1й канал. Именованный канал - это специальный файл, с помощью которого один процесс может записывать в канал данные, а процесс с другой стороны канала - читать их. Утилита ЕХР может записывать в каналы неограниченный объем данных, поскольку каналы не поддерживают абсолютную адресацию. Процесс, читающий данные из канала, может выполнять сжатие данных. Таким образом, можно одновременно экспортировать и сжимать данные. Если размер сжатого файла превышает 2 Гбайт, можно использовать утилиту split для разбиения его на меньшие части. Ниже представлен сценарий командного интерпретатора, реализующий этот подход в ОС UNIX. Этот сценарий также показывает, как импортировать сжатые и разбитые на части данные, поскольку сразу после экспортирования выполняется полное импортирование с параметром SHOW = Y для проверки целостности созданного DMP-файла:

#!/bin/ceh -f

# Установите эту переменную равной значению идентификатора пользователя, от

# имени которого выполняется экспорт. Я всегда использую учетные записи

# OPS$ (аутентифицируемые операционной системой) для всех заданий,

# выполняемых в пакетном режиме. В этом случае в файле сценария или

# результатах работы команды ps никогда не появляется пароль, setenv UID /

# Это имя файла экспорта. Команда SPLIT будет использовать его для

# именования фрагментов сжатого DMP-файла. setenv FN exp.date +%j %Y.dmp

# Это имя используемого именованного канала, setenv PIPE /tmp/exp tmp ora8i.dmp



Глава 8

# Здесь я ограничиваю размер сжатых файлов до 500 Мбайт. Подойдет любое

# значение меньше 2 Гбайт,

setenv MAXSIZE 500m

# Задаем что экспортировать. По умолчанию экспортируется вся база данных, setenv EXPORT WHAT full=y COMPRESS=n

# Вот где размещаются файлы экспорта, cd /nfs/atc-netappl/expbkup ora8i

# Удаляем файлы, оставшиеся после предыдущего экспортирования, rm expbkup.log export.test exp.*.dmp* $PIPE

# Создаем именованный канал, mknod $PIPE p

# Записываем дату и время в журнальный файл, date > expbkup. log

# Запускаем процесс gzip в фоновом режиме. Программа gzip будет считывать

# сжатые данные из именованного канала и передавать их утилите split. Из

# полученных данных утилита split будет создавать файлы размером 500 Мбайт,

# добавляя суффиксы .аа, .ab, .ас, .ad, - к шаблону имени файла,

# заданному в переменной $FN.

( gzip < $PIPE ) split -b $MAXSIZE - $FN. &

# Теперь начинаем экспортировать. Вызванная ранее программа gzip ожидает,

# пока в именованный канал начнут выдаваться данные.

exp userid=$UID buffer=20000000 file=$PIPE $EXPORT WHAT >>& expbkup.log date >> expbkup.log

# По завершении экспорта утилита IMP используется следующим образом. Имена

# файлов сортируются, после чего их содержимое с помощью команды cat

# направляется последовательно утилите gunzip. Результат направляется в

# именованный канал. Утилита IMP считывает данные из этого канала и выдает

# соответствующие результаты в стандартный поток ошибок. Конструкция & в

# командном интерпретаторе csh переправляет в указанный файл как

# стандартный выходной поток, так и стандартный поток ошибок.

date > export.test

cat echo $FN.* sort gunzip > $PIPE &

imp userid=$UID file=$PIPE show=y full=y >>& export.test

date >> export.test

# Удаляем именованный канал, он нам больше не нужен, rm -f $PIPE

Если сервер работает в ОС UNIX, лично мне описанный выше подход кажется лучше, чем использование параметра FILESIZE = со списком имен файлов в командной строке, по двум причинам. Во-перв1х, он позволяет сжать данные перед записью на диск, а во-вторых, никогда не запрашивает у пользователя имена файлов.



Импорт и экспорт 409

Экспортирование на устройство, не поддерживающее абсолютную адресацию

Это решение тоже пригодно только для ОС UNIX. Можно экспортировать непосредственно на ленточное устройство, указав его имя в качестве файла экспорта. Например:

exp userid=tkyte/tkyte file=/dev/rmt/O volsize = 6000m full=у

Данные будут экспортироваться непосредственно на ленту с остановкой через каж-д1е 6000 Мбайт для смены ленты (при необходимости).

Выделение подмножеств данных

В Oracle 8i появилась возможность использовать утилиту ЕХР для экспортирования отдельных строк таблицы. До этой версии утилита ЕХР работала по принципу все или ничего . Сейчас можно использовать параметр QUERY= для задания конструкции WHERE, которая будет применяться к экспортируемой таблице. Следует отметить, что при использовании конструкции WHERE (параметра QUERY) непосредственный режим экспортирования (direct path mode) недоступен; если необходимо подмножество данн1х, экспортирование выполняется в обычном режиме (conventional path mode).

Способ задания параметра QUERY = зависит от операционной системы. Конструкция WHERE в общем случае содержит много специальных символов, таких как >, < и пробелы. Командные интерпретаторы в UNIX и Windows не жалуют подобные символы. Эти символы надо маскировать, а способ маскировки зависит от используемой операционной системы. Я предпочитаю всегда задавать параметр QUERY в файле PARFILE. Тогда можно использовать одни и те же командные строки, независимо от платформы.

Для демонстрации я создал таблицу Т как SELECT * FROM ALL OBJECTS. Я хочу экспортировать все строки, в которых столбец object id имеет значение менее 5000. В ОС Windows для этого пришлось бы выполнить:

C:\exp>exp userid=tkyte/tkyte tables=t query=where object id < 5000

Обратите внимание, что в Windows необходимо указывать по три двойные кавычки с обеих сторон конструкции WHERE. Аналогичная команда в ОС UNIX имеет вид:

$ exp userid=tkyte/tkyte tables=t query=\ where object id \< 5000\

Однако если просто использовать файл параметров, exp.par, содержащий следующий аргумент:

query= where object id < 5000

то можно использовать в обеих системах одну и ту же команду: exp userid=tkyte/tkyte tables=t parfile=exp.par

Я думаю, это намного проще, чем правильно замаскировать строки QUERY на разных платформах.



1 ... 123 124 125 [ 126 ] 127 128 129 ... 469

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика