Oracle: Как перенести схему из одной базы данных в другую с помощью exp / imp
Здесь я дам подробные инструкции по миграции схемы с использованием exp / imp, pipe, gz между двумя базами данных.
Как перенести схему из одной базы данных в другую
Следующие шаги необходимо выполнить в исходной базе данных.
Метаданные о схеме
SQL> select owner,sum(bytes)/1024/1024 from dba_segments where owner in ('EXAMPLE_SCH') group by owner;
SQL> select tablespace_name,sum(bytes)/1024/1024 from dba_segments where owner in ('EXAMPLE_SCH') group by tablespace_name;
SQL> select default_tablespace,username from dba_users where username in ('EXAMPLE_SCH');
SQL> select owner,status,object_type,count(*) from dba_objects where owner in ('EXAMPLE_SCH') group by object_type,owner,status;
SQL> select object_type,count(*) from dba_objects where owner in ('EXAMPLE_SCH') group by object_type;
SQL> select count(*),status from dba_objects where owner in ('EXAMPLE_SCH') group by status;
SQL> select object_type,count(*),status from dba_objects where owner in ('EXAMPLE_SCH') group by status,object_type;
Экспорт схемы
vi exp.sh
#!/bin/ksh
export NLS_LANG=AMERICAN_AMERICA.UTF8
mknod /tmp/exp_pipe1 p
gzip -c < /tmp/exp-pipe1 > SOURCE_schemas.dmp.gz &
exp system/password file=/tmp/exp_pipe1 buffer=2097152 log=exp_SOURCE_schemas.log statistics=none owner=EXAMPLE_SCH
rm -f /tmp/exp_pipe1
unset NLS_LANG
nohup ./exp_SOURCE_schemas.sh > exp_SOURCE_schemas.log 2>&1
Скопируйте SOURCE_schemas.dmp.gz
на сервер целевой базы данных.
scp -p SOURCE_schemas.dmp.gz orac@host1:/home/oracle/export
В целевой базе данных
Создать метаданные в целевой базе данных
1. Создайте табличные пространства в соответствии с результатами, полученными в исходной базе данных.
2. Создать пользователей в целевой базе данных
Запустите следующий сценарий в исходной базе данных и выполните полученный сценарий в целевой базе данных.
set linesize 300
set pagesize 300
spool create_users.sql
select 'create user '||username||' identified by values '''||password||''' default tablespace '||default_tablespace||' temporary tablespace temp profile '||profile||';' from dba_users where username in ('EXAMPLE_SCH');
spool off
3. Предоставление квот в целевой базе данных
Запустите следующий сценарий в исходной базе данных и выполните результирующий сценарий в целевой базе данных.
spool create_tablespace_quota.sql
select 'alter user '||username||' quota unlimited on '||tablespace_name||';' from dba_ts_quotas where MAX_BYTES='-1' and username in ('EXAMPLE_SCH');
select 'alter user '||username||' quota '||max_bytes||' on '||tablespace_name||';' from dba_ts_quotas where MAX_BYTES!='-1' and username in ('EXAMPLE_SCH');
spool off
4. Предоставление ролей в целевой базе данных
Запустите следующий сценарий в исходной базе данных и выполните полученный сценарий в целевой базе данных.
spool create_grant_roles.sql
select 'grant '||GRANTED_ROLE||' to '||GRANTEE||';' from dba_role_privs where ADMIN_OPTION='NO' and grantee in ('EXAMPLE_SCH');
select 'grant '||GRANTED_ROLE||' to '||GRANTEE||' with admin option;' from dba_role_privs where ADMIN_OPTION='YES' and grantee in ('EXAMPLE_SCH');
spool off
5. Предоставление системных привилегий в целевой базе данных
Запустите следующий сценарий в исходной базе данных и выполните полученный сценарий в целевой базе данных.
spool create_sys_privs.sql
select 'grant '||PRIVILEGE||' to '||GRANTEE||';' from dba_sys_privs where ADMIN_OPTION='NO' and grantee in ('EXAMPLE_SCH');select 'grant '||PRIVILEGE||' to '||GRANTEE||' with admin option;' from dba_sys_privs where ADMIN_OPTION='YES' and grantee in ('EXAMPLE_SCH');
spool off
Импортировать схему в целевую базу данных
vi imp.sh
#!/bin/ksh
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
mknod /tmp/imp_pipe1 p
gunzip -c SOURCE_schemas.dmp.gz >/tmp/imp_pipe1 &
imp system/password file=/tmp/imp_pipe1 buffer=20971520 log=imp_TARGET_schemas.log full=y
rm -f /tmp/imp_pipe1
unset NLS_LANG
Шаги поста
- Проверьте журналы импорта на наличие ошибок
- Запустите метаданные, которые были запущены в источнике, чтобы сравнить количество объектов
- Предоставление таблицы Priv на целевой объект
Запустите следующий сценарий в исходной базе данных и выполните результирующий сценарий в целевой базе данных
spool create_tab_privs.sql
select 'grant '||privilege||' on '||owner||'.'||table_name||' to '||grantee||';' from dba_tab_privs where GRANTABLE='NO' and grantee in ('EXAMPLE_SCH');
select 'grant '||privilege||' on '||owner||'.'||table_name||' to '||grantee||' with grant option;' from dba_tab_privs where GRANTABLE='YES' and grantee in ('EXAMPLE_SCH');
spool off
4. Cкомпилируйте импортированную схему
EXEC DBMS_UTILITY.COMPILE_SCHEMA ('EXAMPLE_SCH');
5. Соберите статистику по всем импортированным схемам
exec dbms_stats.gather_schema_stats ('EXAMPLE_SCH', cascade=>TRUE);