Oracle mechanics

01.06.2008

Миграция БД Oracle Enterprise -> Standard edition с использованием transportable tablespace

Filed under: install-config-migration,Oracle — Игорь Усольцев @ 16:13
Tags:

Практическая задача: конвертировать Oracle БД в Standard Edition, в целях «оптимизации лицензионной политики» или, попросту, для экономии средств, если позволяют требования приложения и бизнеса.

Согласно официальному документу, 139642.1 Converting from Enterprise Edition to Standard Edition, единственным допустимым методом является export/import. Однако, поскольку целью миграции будет перенос только пользовательских данных (нечасто имеет смысл полный перенос БД, включая системные объекты пользователей SYS, SYSTEM, SYSMAN,..), можно использовать механизм Oracle Transportable Tablespace, официально разрешённый в части импорта в Oracle Standard Edition:

Import transportable tablespace, including cross-platform transport, is included with Standard Edition and Standard Edition One, but export transportable tablespace is not included.

Указанный метод требует тестов и может  дать значительный выигрыш по сравнению с экспортом-импортом при использовании быстрой 1Gbit/s сети. При наличии нескольких независимых сетевых интерфейсов можно распараллелить копирование табличных пространств через разные db link’и. Далее краткий сценарий (процедура стандартная, протестированная для миграции на 10g Standard Edition RAC), просто чтобы был под рукой.

—Целевая БД. Установка Oracle 10g Standard Edition (RAC+archivelog) на целевом хосте
—Проверка и выполнение предварительных требований для транспортировки табличных пространств
—1. Результаты этого запроса должны точно совпадать на исходной и целевой базах:

select * from v$nls_parameters where parameter like '%CHARACTERSET';

—2. Исходная БД. Список TS для транспортировки:

select distinct tablespace_name from dba_segments where owner='SCOTT';
USERS
INDEX

—3. Исходная БД. Проверка переносимых TS на содержание XMLtypes (при переносе имеют ряд ограничений):

select distinct p.tablespace_name
from
dba_tablespaces p,
dba_xml_tables x,
dba_users u,
all_all_tables t
where
t.table_name=x.table_name and
t.tablespace_name=p.tablespace_name and
x.owner=u.username;

Табличное пространство SYSAUX, которое может появиться в результате запроса, нас не интересует.

—4. Исходная БД. Подготовка к транспортировке TS — список пользователей, чьи объекты находятся в переносимых TS:

select distinct owner
from dba_segments
where tablespace_name in
(select distinct tablespace_name
from dba_segments where owner='SCOTT');

SCOTT
PERFSTAT

—5. Проверка возможности транспортировки выбранных ТС:

begin
SYS.DBMS_TTS.TRANSPORT_SET_CHECK(
ts_list => 'USERS,INDEX',
incl_constraints => TRUE,
full_check => TRUE);
end;
/
select * from sys.transport_set_violations;

Если запрос ничего не возвращает — проверка прошла успешна!

—6. Исходная БД. Подготовка схем для переноса  — экспорт пользовательских объектов, без данных:

exp system/password@source_db
file=users.dmp
log=users.log
DIRECT=y
rows=n
owner=(SCOTT,PERFSTAT)
statistics=none

—7. Целевая БД. Создание пользователей перед импортом:

connect system/password@target_db
DROP USER SCOTT CASCADE;
DROP USER PERFSTAT CASCADE;
drop tablespace USERS including contents and datafiles;
drop tablespace INDEX including contents and datafiles;
@create_users.sql

create_users.sql — предварительно подготовленный скрипт создания пользователей SCOTT и PERFSTAT

9. Проверить взаимную доступность баз данных по сети  для последующего создания db links

—Предварительные требования для транспортировки табличных пространств ВЫПОЛНЕНЫ—

—Исходная БД. Перед миграцией (включая тестовую) рекмендуется сделать BACKUP

10. Собственно скрипт миграции, запускается на целевом сервере:

connect system/password@target_db
CREATE OR REPLACE DIRECTORY tts_target_dir
AS ‘+DG_XX/DBNAME/DATAFILE’; —Директория (ASM), куда попадут файлы БД

connect system/password@source_db
ALTER TABLESPACE USERS READ ONLY;

— с этого момента исходная БД будет недоступна на запись

ALTER TABLESPACE INDEX READ ONLY;
CREATE OR REPLACE DIRECTORY tts_dir AS ‘/home/oracle/export’;
CREATE OR REPLACE DIRECTORY tts_source_dir AS ‘/u01/oradata/dbname’;
begin
execute immediate ‘drop DATABASE LINK TTS_TARGET’;
exception when others then null;
end;
/
CREATE DATABASE LINK TTS_TARGET
CONNECT TO SYSTEM IDENTIFIED BY PASSWORD
USING ‘target_db’;
BEGIN
DBMS_FILE_TRANSFER.PUT_FILE (
‘TTS_source_dir’ , ‘users.dbf’ ,
‘tts_target_dir’ , ‘users.dbf’ ,
‘TTS_TARGET’ ) ;
DBMS_FILE_TRANSFER.PUT_FILE (
‘TTS_source_dir’ , ‘index.dbf’ ,
‘tts_target_dir’ , ‘index.dbf’ ,
‘TTS_TARGET’ ) ;
END;
/

—Целевая БД. TTS import

connect system/password@target_db
CREATE OR REPLACE DIRECTORY tts_dir AS ‘/home/oracle/tts’;
begin
execute immediate ‘drop DATABASE LINK TTS_SOURCE’;
exception when others then null;
end;
/
CREATE DATABASE LINK TTS_SOURCE
CONNECT TO SYSTEM IDENTIFIED BY password
USING ‘source_db’;

—Параметр transport_datafiles указывает на перемещённые PL/SQL процедурой файлы,
параметр TRANSPORT_TABLESPACES — на перемещаемые TS

host impdp system/password@target_db
directory=tts_dir NETWORK_LINK=TTS_SOURCE
transport_datafiles=+DG_XX/DBNAME/DATAFILE/users.dbf,
+DG_XX/DBNAME/DATAFILE/index.dbf
TRANSPORT_TABLESPACES=users, index

ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE index READ WRITE;
—Целевая БД. Импорт объектов перемещаемых схем без данных:

host imp system/password@target_db
file=users.dmp log=users_imp.log indexes=n ignore=y rows=n
fromuser=(SCOTT,PERFSTAT) touser=(SCOTT,PERFSTAT)
statistics=none

—используется экспортный файл users.dmp исходной БД, подготовленный на шаге 6.

begin
DBMS_UTILITY.COMPILE_SCHEMA (  schema => ‘SCOTT’, compile_all => FALSE);
DBMS_UTILITY.COMPILE_SCHEMA (  schema => ‘PERFSTAT’, compile_all => FALSE);
end;
/

11. Проверяем логи, в случае НЕудачного завершения, меняем статус TS на исходной БД и продолжаем работать со старой базой данных:

connect system/password@source_db
ALTER TABLESPACE users READ WRITE;
ALTER TABLESPACE index READ WRITE;

В случае Удачного завершения выполнения скрипта, БД приложения доступна по новому адресу. Рекомендуется собрать статистику для импортированных схем на новой БД:

BEGIN
DBMS_STATS.GATHER_SCHEMA_STATS(‘SCOTT’,
ESTIMATE_PERCENT=>NULL,
CASCADE=>TRUE);
DBMS_STATS.GATHER_SCHEMA_STATS(‘PERFSTAT’,
ESTIMATE_PERCENT=>NULL,
CASCADE=>TRUE);
END;
/

Добавить комментарий »

Комментариев нет.

RSS feed for comments on this post. TrackBack URI

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

Блог на WordPress.com.

%d такие блоггеры, как: