тающие с файлами data pump, должны обладать привилегиями read и write на этот каталог.
Создадим каталог «c:\tmp\dpexmpl» (хотя Oracle рекомендует, чтобы этот каталог был создан именно в папке «Oracle – в целях большей безопасности, так как пользователь, не обладающий правами администратора ОС, не сможет читать файлы в этом каталоге):
connect sys/sys as sysdba host rd c:\tmp\dpexmpl; host mkdir c:\tmp\dpexmpl; drop directory dpexmpl;
create directory dpexmpl as 'c:\tmp\dpexmpl'; grant read, write on directory dpexmpl to scott; host del c:\tmp\dpexmpl\scott.dmp
Прежде чем выполнять экспорт, удалили и заново создали и директорию OC («c:\tmp\dpexmpl»), и директорию Объект базы данных (dpexmpl), связав этот объект с директорией ОС (create directory dpexmpl as 'c:\tmp\dpexmpl';). В нашем примере эти имена совпадают, но это совпадение не обязательно. Далее «scott» получил нужные привилегии. Последней выполненной командой удаляем уже имеющийся дамп-файл «scott.dmp» (иначе будет получено сообщение «файл уже существует»). Проверим возможность выполнения экспорта:
connect scott/scott
host expdp userid=scott/scott@orcl schemas=scott dumpfile=scott.dmp job_name=scott_export directory= dpexmpl logfile=scott.log
По умолчанию при установке создается объект базы данных
«directory» с именем «DATA_PUMP_DIR»: conn sys/sys as sysdba
SELECT directory_name, directory_path FROM dba_directories WHERE directory_name='DATA_PUMP_DIR';
Следующей командой удалим дамп-файл scott.dmp, оставшийся при предыдущем выполнении настоящей лабораторной работы в пути, указанном последней командой «SELECT», а потом, выдав scott привилегии на data_pump_dir, создадим заново дамп-файл: host del d:\oracle\product\10.2.0\admin\orcl\dpdump\scott.dmp
grant read, write on directory data_pump_dir to scott;
491
host expdp userid=scott/scott@orcl schemas=scott dumpfile= scott.dmp job_name=scott_export directory=data_pump_dir logfile= scott.log
Создадим в схеме «scott» таблицу «obj» доведем ее объем до величины в три с лишним миллиона записей с тем, чтобы процесс экспорта выполнялся за время, в течение которого мы могли бы посмотреть состояние выполняемой по экспорту работы, проиллюстировать остановку этой работы и повторный ее запуск:
connect sys/sys as sysdba
create table scott.obj as select * from all.objects; conn scott/scott
insert into obj select * from obj; insert into obj select * from obj; insert into obj select * from obj; insert into obj select * from obj; insert into obj select * from obj; insert into obj select * from obj; select count(*) from obj; commit;
Вотдельном окне SQL*Plus откроем вторую сессию пользователя «scott», из которой будем давать команду присоединения к выпоняемой по экспорту работе
connect scott/scott
Из окна SQL*Plus первой сессии выполним
host expdp userid=scott/scott@orcl schemas=scott dumpfile= scott.dmp job_name=scott_export directory= dpexmpl logfile=scott.log
После чего перейдем в окно SQL*Plus второй сессии пользователя «scott» и выполним команду
Host expdp scott/scott attach=scott_export
которая позволит пользователю «scott» во второй сессии подсоединиться к выполняемой работе по экспорту и увидеть характеристики выполнения этой работы, появление которых завершается выводом приглашения «export>». Вслед за тем остановим работу экспорта
Stop_job
Вокне первой сессии SQL*Plus мы увидим сообщение о том, что экспорт остановлен по запросу пользователя. Теперь есть возможность добавить, используя команду «add_file» в выполняемое и
492
остановленное задание другие файлы дампа из других каталогов, после чего продолжить выполнение задания. Для продолжения экспорта в окне второй сессии выполним еще раз команду
Host expdp scott/scott attach=scott_export
а вслед за тем
Start_job Status
Последняя команда показывает процент выполнения экспорта. Data pump позволяет выполнять экспорт с использованием оп-
ций «exclude», «include», «query». Выполним экспорт из схемы
«scott» всех таблиц, за исключением таблицы «obj»
Connect scott/scott
host del C:\tmp\dpexmpl\scott.dmp
host expdp userid=scott/scott@orcl schemas=scott dumpfile=scott.dmp job_name=scott_export directory= dpexmpl exclude=table:"IN('OBJ')" logfile=scott.log
По протоколу экспорта и по размеру дамп-файла видно, что таблица «obj» действительно не экспортировалась.
Выполним экспорт с опцией «include»:
Connect scott/scott
host del C:\tmp\dpexmpl\scott.dmp
host expdp userid=scott/scott@orcl schemas=scott dumpfile= scott.dmp job_name=scott_export directory=dpexmpl include=table: "IN('EMP')" logfile=scott.log
По протоколу экспорта видно, что экспортировалась только таблица «emp».
Выполним экспорт с опцией «query»:
Connect scott/scott
host del C:\tmp\dpexmpl\scott.dmp
host expdp userid=scott/scott@orcl schemas=scott dumpfile=scott.dmp job_name=scott_export directory= dpexmpl include=table:"IN('EMP')" query=scott.emp:" 'WHERE DEPTNO>10'" logfile=scott.log
По этой команде будет выгружено 11 строк таблицы «emp». При экспорте мы можем экспортировать только метаданные,
без самих данных. Для этого выполним: connect scott/scott
493
host expdp userid=scott/scott@orcl schemas=scott dumpfile=metadatascott.dmp job_name=scott_export directory= dpexmpl content=metadata_only logfile=metadatascott.log
Для импорта файла, созданного с помощью expdp, следует пользоваться утилитой impdp. Файлы выгрузки утилит «exp» и «expdp» не совместимы, т.е. утилитой «imp» не импортируются файлы выгрузки утилиты «expdp» и, наоборот, утилитой «impdp» не импортируются файлы выгрузки утилиты «exp».
Как уже говорилось выше, команда «impdp help=y» в окне dos выведет все опции этой утилиты.
Создадим файл параметров hrfromscott.par для импорта данных из схемы «scott» в схему «hr»:
Directory= dpexmpl Dumpfile=scott.dmp Remap_schema=scott:hr
Импорт будем выполнять из окна dos командой
impdp system/system parfile=c:\tmp\dpexmpl\hrfromscott.par
Импорт будет выполнен с ошибкой «не найдены родительские ключи», так как таблицу «dept» с родительскими ключами мы не экспортировали в последнем примере экспорта (с условием «where»). Несмотря на ошибку импорт в схему «hr» состоялся. В схеме «hr» создана таблица «emp» и в нее вставлено 14 строк. Выполним экспорт части таблиц «emp», «dept» из схемы «scott»
Connect scott/scott
host del c:\tmp\dpexmpl\scott.dmp
host expdp userid=scott/scott@orcl schemas=scott dumpfile=scott.dmp job_name=scott_export directory=dpexmpl INCLUDE= TABLE:\"IN ('DEPT','EMP')\" query=" 'WHERE DEPTNO>10'" logfile=scott.log
А теперь повторим импорт в схему «hr». Выполним пользователем «hr» команды:
Connect hr/hr Drop table hr.emp; Drop table hr.dept;
Drop public synonym dept;
Затем из окна dos повторим
impdp system/system parfile=c:\tmp\dpexmpl\hrfromscott.par
494
На этот раз импорт закончится благополучно, может быть, только с одной ошибкой «ORA-02298: невозможно подтвердить (HR.EMP_SELF_KEY) ‒ не найдены родительские ключи».
SQL, который может вызвать сбой: ALTER TABLE "HR"."EMP" ADD CONSTRAINT "EMP_SELF_KEY" FOREIGN KEY ("MGR") REFERENCES "HR"."EMP” (“EMPNO")». Сообще-
ние об ошибке вызвано тем, что мы импортировали строки служащих из 20-го и 30-го отделов, но начальники этих отделов имеют своим начальником личность «king», который приписан к 10-му отделу, строки служащих которого не экспортировались. При импорте невозможно стало реализовать FOREIGN KEY от столбца «MGR» на столбец «EMPNO», так как значения первичного ключа для служащего «king» не существует.
Выполненный нами пример импорта свидетельствует о том, что при операциях экспорта и последующего импорта следует быть очень внимательным, чтобы не нарушить согласованность дан-
ных.
Для импорта, так же как и для экспорта, применимы опции
«include», «exclude», «query».
Так же, как и для экспорта, можно останавливать выполняемую работу по импорту, а потом продолжать ее вновь («stop_job», «start_job»). При импорте мы пользовались файлом параметров. Точно так же файл параметров может быть использован для экспорта. И, наоборот, при импорте его парметры мы можем задавать в командной строке, как мы это делали при экспорте.
Импорт может быть выполнен с опцией «sqlfile», которая позволяет сформировать DDL предложения SQL – только по созданию объектов. Выше мы сделали экспорт только метаданных пользователя «scott» в файл «metadatascott.dmp». Создадим в папке, соответствующей директории «dpexmpl» файл параметров
«metadatascott.par» с таким содержимым
Directory= dpexmpl Dumpfile=metadatascott.dmp Sqlfile=scottsql.txt
Далее выполним
Connect scott/scott
host impdp scott/scott parfile= C:\tmp\dpexmpl\metadatascott.par
495