Monday, May 07, 2007

expdp & impdp

Как можно сделать импорт-экспорт ....
1) create directory dpump_dir1 as '/home/oracle/dmp', если нет возможности воспользоваться существующей директорией из select * from dba_directories;
2) expdp system/passwd directory=dpump_dir1 dumpfile=myfile.dmp schemas=user1,user2,user3;
3) Копируем файлик на сервер, где нужна копия схемы в '/home/oracle/dmp2';
4) create directory dpump_dir2 as '/home/oracle/dmp2';
5) impdp system/passwd directory=dpump_dir2 dumpfile=myfile.dmp schemas=user1,user2,user3

ИЛИ через network_link

1) create database link mylink
connect to system identified by passwd
using 'service_name';
2) create directory dpump_dir1 as '/home/oracle/dmp'
3) ipmdp system/passwd directory=dpump_dir1 job_name=dpimp_job1 schemas=user1,user2,user2 network_link=mylink

log-и будут "сыпаться" в файл import.log директории /home/oracle/dmp

Жмем ctrl+c, набираем help и "балдеем" :)
Import> help

Вспоминая, что “сердцем” любой операции Data Pump является мастер-таблица. Это ключ к возможности Data Pump продолжать прерванные задания....
Выйдя из интерактивного режима позже подсоединиться к процессу можно по заданному job_name через $impdp system/passwd attach=dpimp_job1
Имя джобы можно посмотреть через
select * from dba_datapump_jobs;
===========
Через пару дней появилась задача перелить в нерабочее время схему обновленную User1 из одной базы в другую под именем User2. Написал скрипт, запускаемый из at или cron под root'ом.
В листинге далее необходимо добавить '<<' перед первым EOF

#!/bin/sh
RCPNT=me@mydomain.ru
ORACLE_HOME=/oracle/product/10.2.0/OraHome1
ORACLE_SID=mydb
NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
ORA_NLS10=$ORACLE_HOME/nls/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/local/lib:/lib:/usr/lib
PATH=/bin:/sbin:$ORACLE_HOME/bin:$PATH:$HOME/bin
su - oracle -c "sqlplus system/passwd EOF
drop user user2 cascade;
exit;
EOF"
su - oracle -c "impdp system/passwd directory=data_pump_dir job_name=dp_user2 schemas=user1 remap_schema=user1:user2 network_link=mydb2"
DATE=`date +'%d/%m/%Y-%H:%M'`
echo "See logs of User2 dumped at "${DATE}|mail -s "User2 dumped" ${RCPNT}

# Скрипт проверил - работает.

Засады и ограничения:
1) Скрипт-то сработал и перелил схему, но .... оказалось, что при ремаппинге необходимо "возвращать" пароль импортированной схемы... "Чтите доку как грицо". И поэтому добавляем в скриптик (необходимо добавить '<<' перед первым EOF):
su - oracle -c "sqlplus system/passwd EOF
alter user user2 identified by values oldpasswd_of_user;
exit;
EOF"
Иначе user2 не сможет залогиниться под своим паролем.

Если много юзеров, воспользуемся скриптом

set pages 0;
set feedback off;
set termout off;
spool user_pass.sql;
select 'alter user "'||username||'" identified by values '''||password||''';'
from dba_users REM where username in ('USER1','USER2','USER3');
spool off;
exit;

2) Также при импорте СХЕМЫ (а не базы) по network_link не требуется создавать идентичную схему. Схема будет создана автоматом. За исключением того, что если у импортируемой схемы табличное пространство по умолчанию отличается от Users и такого ТС нет на целевой базе, то его необходимо просто создать.

No comments: