|
Программирование >> Oracle
Импорт и экспорт 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 на разных платформах.
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |