Горбатов Аттестационные испытания автоматизированных систем от 2014
.pdfтающие с файлами 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
В таблице «scottsql.txt» сформированы DDL скрипты, которые можно корректировать так, как это требуется разработчику или администратору базы данных.
Отличительной особенностью «data pump» по сравнению с «exp», «imp», как уже указывалось, является возможность использования API, что позволяет разработчику встраивать в разрабатываемые приложения действия по экспорту и импорту информации базы данных. Приведем пример анонимного блока экспорта схемы
«scott» с использованием PL/SQL API (http://www.f-notes.info/oracle:oracledatapump10g).
Выполним
Connect scott/scott
host del c:\tmp\dpexmpl\scott.dmp DECLARE
l_dp_handle NUMBER;
l_last_job_state VARCHAR2(30) := 'UNDEFINED'; l_job_state VARCHAR2(30) := 'UNDEFINED'; l_sts KU$_STATUS;
BEGIN
l_dp_handle := DBMS_DATAPUMP.open( operation => 'EXPORT',
job_mode => 'SCHEMA', remote_link => NULL, job_name => 'SCOTT_EXPORT', version => 'LATEST'); DBMS_DATAPUMP.add_file( handle => l_dp_handle, filename => 'SCOTT.dmp', directory => 'DPEXMPL'); DBMS_DATAPUMP.add_file( handle => l_dp_handle, filename => 'SCOTT.log', directory => 'DPEXMPL',
filetype => DBMS_DATAPUMP.KU$_FILE_TYPE_LOG_FILE); DBMS_DATAPUMP.metadata_filter(
handle => l_dp_handle, name => 'SCHEMA_EXPR', value => '= ''SCOTT''');
496
DBMS_DATAPUMP.start_job(l_dp_handle);
DBMS_DATAPUMP.detach(l_dp_handle); END;
/
Этим скриптом запущена работа по экспорту. Через пару минут в папке «C:\tmp\dpexmpl» в файле scott.log можно будет увидеть протокол завершившегося экспорта.
Приведем еще один пример использования data pump – для работы с внешними таблицами (http://www.f- notes.info/oracle:oracledatapump10g). С помощью «data pump» дан-
ные переносятся из таблиц базы данных во внешние таблицы, а утилиты «sql*loader» ‒ из «плоских» файлов во внешние таблицы.
Создадим (http://www.f-notes.info/oracle:oracledatapump10g)
внешнюю таблицу с помощью «data pump» (в этом случае данные из таблицы базы данных перемещаются во внешние таблицы)
Drop table emp_xt;
Host del C:\tmp\dpexmpl\scott.dmp CREATE TABLE emp_xt ORGANIZATION EXTERNAL
(
TYPE ORACLE_DATAPUMP DEFAULT DIRECTORY dpexmpl LOCATION ('scott.dmp')
)
AS SELECT substr(to_char(empno),1,4) empno,ename,job, Substr(to_char(deptno),1,2) deptno FROM emp;
SELECT * FROM emp_xt;
Создадим внешнюю таблицу с помощью утилиты «sql*loader» (в этом случае данные из «плоского» файла перемещаются во внешние таблицы). Сначала создаем «плоский» файл:
Connect scott/scott
spool C:\tmp\dpexmpl\empplain.txt select empno||rpad(ename,10,' ')|| rpad(job,9,' ')||deptno
from scott.emp; spool off
497
В «плоском» файле «C:\tmp\dpexmpl\empplain.txt» удалим текст запроса, подсказку sql*plus и оставим только строки таблицы
«emp». Далее:
DROP TABLE emp_external;
create table emp_external (empno char(4), ename char(10), job char(9), deptno char(2)) organization external
(type oracle_loader default directory dpexmpl access parameters
(RECORDS DELIMITED BY NEWLINE LOGFILE 'BOXES.log'
fields
(empno position(1:4), Ename position(5:14), Job position(15:23), deptno position(24:25))) location ('empplain.txt'));
SELECT * FROM emp_external;
Сдача лабораторной работы
Сдача лабораторной работы заключается в выполнении заданий преподавателя по выгрузке (разного типа) данных из одной схемы
вдругую.
1.Пример задания студенту по работе с утилитами «exp», «imp»: из схемы «v19» выгрузить данные из нескольких (по выбору студента) таблиц с использованием файла параметров и без него, с трассировкой и просмотром результатов трассировки утилитой «tkprof», с обеспечением контроля протекания процесса экспорта (feedback), с использованием условия выгрузки «where» и загрузить данные в схему «v3».
2.Пример задания студенту по работе с утилитами «expdp», «impdp»: из схемы «v19» выгрузить данные из нескольких (по выбору студента) таблиц (конечно, с предварительным созданием директории – объекта файловой системы ОС и директории – объекта
498
базы данных) с использованием файла параметров и без него, с использованием опций «exclude», «include», «query», с демонстрацией процесса остановки процесса экспорта и последующего его продолжения, с демострацией использования PL/SQL API для получения файла выгрузки.
3.Продемонстрировать загрузку данных из схемы «v19» в схему «v3» с использованием утилиты «impdp».
4.Продемонстрировать формирование внешней таблицы в схеме «v3» и выгрузку в нее данных из таблицы (по выбору студента) базы данных.
5.Продемонстрировать формирование другой внешней таблицы в схеме «v3» и загрузку в нее данных из «плоского» файла ОС, сформированного данными таблицы (по выбору студента) в базе данных.
Тестовые задания к работе 20
Входной контроль
1.Какие возможности реализуются при полном экспортировании базы данных утилитой exp?
a)если имеется таблица со сбойным блоком, этот блок будет найден;
b)выполняется проверка словаря данных и выявление в нем логической несогласованности;
c)утилита exp находит блоки, требующие очистки;
d)утилита exp создает файл, содержащий все операторы DDL, текст представлений, программных объектов;
e)правильных ответов нет.
2.Что позволяет совместное использование утилит exp и
imp?
a)перенос табличных пространств;
b)пересоздание экземпляра с целью изменения, например, размера блока данных;
c)выполнение дефрагментации табличных пространств;
d)копирование данных с одной платформы на другую;
e)правильных ответов нет.
3.Утилиты exp/imp не рекомендуется использовать, как основное средство резервного копирования. Среди нижеприве-
499
денных укажите строки, указывающие на причину отсутствия такой рекомендации:
a)невозможно встраивать в приложения (нет API);
b)длительное время выполнения восстановления утилитой imp из-за необходимости выполнения SQL операторов заполнения таблиц;
c)инкрементное экспортирование/импортирование в дальнейших версиях СУБД не будет поддерживаться Oracle;
d)копирование данных с помощью названных утилит возможно только для определенной кодировки информации в базе данных;
e)правильных ответов нет.
4.Среди нижеприведенных укажите строки, верно характеризующие утилиты expdp, impdp.
a)большинство параметров аналогичны параметрам утилит exp/imp;
b)формат dmp файлов утилит expdp, impdp не совместим с форматом dmp файлов утилит exp, imp;
c)утилиты expdp, impdp имеют графический интерфейс;
d)формат dmp файлов утилит expdp, impdp совместим для всех версий, начиная с версии СУБД Oracle 10.1;
e)павильных ответов нет.
5.В ходе выполнения экспорта утилитой expdp есть возможность выполнять, используя встроенные в нее возможности этой утилиты, следующие действия:
a)действия по мониторингу состояния выполняемой по экспорту работы;
b)действия по остановке этой работы;
c)действия по возобновлению этой работы при выполнении заданного условия;
d)действия по повторному запуску этой работы;
e)правильных ответов нет.
6.Для использования утилиты expdp необходимо создание объектов-директорий в базе данных и соответствующих директорий в операционной системе. Какие привилегии должен иметь пользователь Oracle для работы с expdp?
a)пользователь Oracle должен иметь привилегии на соответствующие объект-директории в БД;
500
