 | Уровень сложности: простой Хемант Бхатия, инженер по программному обеспечению,
IBM
Николас Гейб, инженер по программному обеспечению,
IBM
18.06.2007 Январь - время приятных перемен, и много удачных изменений
было внесено в IBM® Migration Toolkit (MTK), что несомненно заслуживает поздравлений! Последняя
версия бесплатного набора инструментов IBM по миграци, MTK 1.4.9, включает новые функции,
позволяющие еще более упростить миграцию (перенос) на платформу СУБД от IBM: поддержка дополнительных функций
DB2® , поддержка миграции Oracle PL/SQL на IBM Informix® Dynamic Server
(IDS), пакет Oracle UTL_FILE и др. Ознакомьтесь с кратким описанием данных улучшений.
Oracle в DB2
В MTK добавлено множество новых функций по поддержке миграции
в DB2 для Linux®, UNIX®и Windows® (DB2 LUW). Среди этих усовершенствований:
поддержка миграции на DB2 версии 9, а также поддержка трансляции новых
SQL-предложений и
улучшение существующих преобразований некоторых SQL-предложений. В данном разделе представлен обзор трех новых функций, применяемых в MTK для трансляции в DB2 LUW:
-
Секционирование по диапазонам;
-
Сжатие данных;
-
Оператор MERGE.
Секционирование по диапазонам
Теперь в MTK имеется поддержка трансляции секционирования по диапазонам Oracle (также известного как
секционирование таблиц). Трансляция данной функции поддерживается только в том случае, когда в качестве целевой платформы используется DB2 версии 9.1 или
выше. MTK транслирует range_values_clause и встроенную
функцию PARTITION().
В данной версии трансляция операторов, содержащих предложение секционирования по диапазонам,
поддерживается только для операторов, включенных во входной файл при помощи опции
импорта в MTK. В DB2 UDB не разрешается использовать после MAXVALUE
другие значения, а диапазон должен быть действительным для каждого значения раздела.
Решить проблему можно, изменив значения в команде ENDING
следующим образом: (MAXVALUE, MAXVALUE, MAXVALUE).
В листингах 1 и 2 показана трансляция секционирования по диапазонам, выполняемая MTK:
Листинг 1. Предложение секционирования по диапазонам
CREATE TABLE accessnumbers (area INT, exchange INT)
PARTITION BY RANGE (area, exchange)
( PARTITION access1 VALUES LESS THAN (1,1),
PARTITION access2 VALUES LESS THAN (10,100),
PARTITION access3 VALUES LESS THAN (MAXVALUE, MAXVALUE) );
SELECT * FROM accessnumbers PARTITION(access1) ;
|
Листинг 2. Трансляция MTK
CREATE TABLE accessnumbers(
area DECIMAL(31,0),
exchange DECIMAL(31,0)
)
PARTITION BY RANGE(
area,
exchange
)(
PARTITION access1 STARTING (MINVALUE, MINVALUE) INCLUSIVE
ENDING (1, 1) EXCLUSIVE,
PARTITION access2 STARTING (1, 1) INCLUSIVE
ENDING (10, 100) EXCLUSIVE,
PARTITION access3 STARTING (10, 100) INCLUSIVE
ENDING (MAXVALUE, MAXVALUE) EXCLUSIVE)!
SELECT * FROM accessnumbers WHERE DATAPARTITIONNUM(area) =
( SELECT SEQNO FROM SYSCAT.DATAPARTITIONS WHERE TABNAME = UPPER('accessnumbers')
AND DATAPARTITIONNAME = UPPER('access1'))!
|
Сжатие данных
MTK теперь обеспечивает поддержку трансляции предложения Oracle table_compression. Трансляция данной функции поддерживается только для миграции на DB2 версии 9.1 или выше.
В преобразовании в DB2 версии 9.1 поддерживается оператор ALTER TABLE со
сжатием данных, а также имеется поддержка оператора CREATE TABLE. Для оператора CREATE
TABLE трансляция предложения Oracle key_compression и секционированных таблиц со сжатием не поддерживается. В DB2 версии 9.1 сжатие выполняется только после создания словаря таблиц, которое, как правило, осуществляется на этапе реорганизации таблиц (REORG).
В листингах 3 и 4 показана трансляция предложения table_compression, выполняемая MTK:
Листинг 3. Предложение table_compression
CREATE TABLE SALES_HISTORY_COMP1 (
PART_ID VARCHAR2(50) NOT NULL,
STORE_ID VARCHAR2(50) NOT NULL,
SALE_DATE DATE NOT NULL,
QUANTITY NUMBER(10,2) NOT NULL
)
COMPRESS;
ALTER TABLE SALES_HISTORY COMPRESS;
|
Листинг 4. Трансляция MTK
CREATE TABLE SALES_HISTORY_COMP1(
PART_ID VARCHAR(50) NOT NULL,
STORE_ID VARCHAR(50) NOT NULL,
SALE_DATE TIMESTAMP NOT NULL,
QUANTITY DECIMAL(10,2) NOT NULL
) COMPRESS YES!
ALTER TABLE SALES_HISTORY COMPRESS YES!
|
Оператор MERGE
В MTK теперь также имеется поддержка трансляции оператора Oracle MERGE
в DB2 UDB. Предложение DELETE
merge_update_clause транслируется в отдельное условие сопоставления и
условие поиска DB2. Трансляция данной функции поддерживается, если в качестве целевой базы данных выбрана DB2 версии 8.1 или выше. Трансляция оператора Oracle MERGE error_logging_clause не поддерживается.
В листингах 5 и 6 показана трансляция оператора Oracle MERGE, выполняемая MTK:
Листинг 5. Оператор MERGE
MERGE INTO merge_tab10b t
USING (SELECT school_id,teacher_name,field FROM merge_tab10a) s
ON (0 = 1)
WHEN NOT MATCHED THEN
INSERT VALUES (s.teacher_name,s.field)
WHERE s.school_id = 100;
|
Листинг 6. Трансляция MTK
MERGE INTO merge_tab10b t USING
(SELECT school_id, teacher_name, field FROM merge_tab10a) s
ON ( 0 = 1 )
WHEN NOT MATCHED
AND s.school_id = 100
THEN INSERT VALUES (s.teacher_name,s.field)!
|
Oracle PL/SQL в IDS
Ранее в этом году в MTK была объявлена ограниченная поддержка миграции с Oracle на IBM
IDS. В последней версии MTK 1.4.9 возможна миграция с процедурного языка программирования Oracle (PL/SQL) на язык хранимых процедур IDS (SPL). Многие пользователи Oracle
применяют PL/SQL для добавления пользовательской логики к обработке данных различными
способами. Такая логика может быть довольно сложной и для ее миграции вручную часто требуется довольно много
времени. MTK 1.4.9 позволяет автоматически перенести логику PL/SQL в процедурах, функциях, курсорах, пакетах и т.д. в IDS:
-
Процедуры и функции;
-
Триггеры;
-
Курсоры;
-
Обработка исключений.
Процедуры и функции
Все элементы Oracle PL/SQL основаны на двух компонентах: в Oracle они называются подпрограммами и
анонимными PL/SQL блоками. Подпрограммы существуют в двух формах -- процедуры или
функции. Обе эти формы содержат набор операторов PL/SQL и назначают этому набору
имя, что позволяет легко ссылаться на логику из других конструкций PL/SQL и SQL-кода. Процедуры и функции часто находятся в базах данных Oracle, MTK выполняет миграцию и тех и других. С другой стороны, анонимные PL/SQL блоки не назначают имена наборам логических операторов. Как правило, они применяются для разработки или тестирования процедур и функций и не хранятся в базе данных Oracle. MTK не выполняет миграцию анонимных PL/SQL блоков.
Заданы следующие процедуры и функции Oracle:
Листинг 7. Процедуры и функции Oracle
CREATE PROCEDURE ADD_NEW_EMPLOYEE (empName CHAR(50)) AS
nextEid INT DEFAULT 0;
BEGIN
SELECT MAX(eid) INTO nextEid FROM employee;
nextEid := nextEid + 1;
INSERT INTO employee VALUES (nextEid, empName);
END;
CREATE FUNCTION NUM_DEPARTMENTS RETURN INT AS
i1 INT;
BEGIN
SELECT COUNT(*) INTO i1 FROM dept;
RETURN i1;
END;
|
MTK создает следующие IDS SPL:
Листинг 8. IDS SPL, созданные MTK
CREATE PROCEDURE ADD_NEW_EMPLOYEE (empName CHAR(50) )
DEFINE nextEid DECIMAL(32,0);
LET nextEid = 0.0;
SELECT ROUND(MAX(eid)) INTO nextEid FROM employee;
LET nextEid = nextEid + 1;
INSERT INTO employee VALUES (nextEid,empName);
END PROCEDURE;
CREATE FUNCTION NUM_DEPARTMENTS()
RETURNING DECIMAL(32,0)
DEFINE i1 DECIMAL(32,0);
LET i1 = NULL;
SELECT COUNT(*) INTO i1 FROM dept;
RETURN i1;
END FUNCTION;
|
В дополнение к вышеприведенным примерам MTK выполняет миграцию процедур, использующих такие функции,
как позиционные и именованные параметры, перегрузка и рекурсия. Для MTK имеются
некоторые ограничения, например, поддерживаются только параметры IN. Подробнее о поддерживаемых областях и ограничениях см. документацию на программный продукт.
Триггеры
Триггеры представляют собой наборы PL/SQL, автоматически выполняемые при возникновении в базе данных
определенных условий. Используйте MTK 1.4.9 для автоматической миграции триггеров Oracle в IDS.
Например, рассмотрим триггер Oracle в листинге 9, выполняющий регистрацию процентного
изменения и дату изменения заработной платы сотрудника, и трансляцию IDS (листинг
10):
Листинг 9. Триггер Oracle
CREATE TRIGGER salary_change_trigger
BEFORE UPDATE OF salary on emp_salary
REFERENCING OLD as old NEW as NEW FOR EACH ROW
BEGIN
INSERT INTO salary_change VALUES (:new.eid,
:new.salary / :old.salary, CURRENT_DATE);
END;
|
Листинг 10. Трансляция IDS
CREATE TRIGGER salary_change_tri1
UPDATE OF salary ON emp_salary
REFERENCING OLD AS OLD NEW AS NEW FOR EACH ROW
(
INSERT INTO salary_change VALUES (NEW.eid,NEW.salary /
OLD.salary,CURRENT YEAR TO FRACTION(5))
);
|
Некоторые функции триггеров Oracle не поддерживаются IDS, поэтому MTK не
выполняет их трансляцию. Сюда включается определение нескольких триггеров для одного события
INSERT, UPDATE или DELETE для одной таблицы, синтаксис Oracle REFERENCING PARENT
и триггеры INSTEAD OF.
Курсоры
Курсоры представляют собой общие абстракции баз данных, позволяющие программам и пользователю просматривать и,
таким образом, обрабатывать за раз результаты одной строки запросов. Курсоры Oracle могут
объявляться, открываться, выбираться и закрываться. Oracle также позволяет тесно
связывать курсоры с оператором цикла, конструкцией, называемой циклом курсора FOR. В противоположность этому IDS
SPL поддерживает аналогичный оператор цикла курсора, но не разрешает явно
объявлять, открывать или закрывать курсоры. Данная функция доступна в других
инструментах (например, в языке программирования ESQL/C).
MTK поддерживает миграцию курсоров Oracle в IDS. Но из-за некоторых различий имеются следующие ограничения:
- Все операторы
FETCH должны быть с одними и теми же переменными;
- Можно объявить и использовать не более одного курсора на блок PL/SQL;
- Курсоры во вложенных блоках PL/SQL не поддерживаются;
- В операторах цикла (
WHILE, LOOP, например) не должно содержаться операторов FETCH;
- Атрибуты курсоров не поддерживаются;
- Переменные курсоров не поддерживаются.
В листингах 11 и 12 представлены примеры курсора Oracle и трансляции IDS:
Листинг 11. Курсор Oracle
CREATE OR REPLACE FUNCTION sum_remaining_vacation RETURN INT AS
vac_sum INT DEFAULT 0;
cursor emp_cur IS SELECT * FROM employee;
BEGIN
FOR emp_rec in emp_cur LOOP
vac_sum := vac_sum + emp_rec.vac_days;
END LOOP;
RETURN vac_sum;
END;
|
Листинг 12. Трансляция IDS
CREATE FUNCTION sum_remaining_vac1()
RETURNING DECIMAL(32,0)
DEFINE vac_sum DECIMAL(32,0);
DEFINE emp_rec_EID DECIMAL(32,0);
DEFINE emp_rec_ENAME CHAR(50);
DEFINE emp_rec_VAC_DAYS DECIMAL(32,0);
LET vac_sum = 0.0;
FOREACH emp_cur for SELECT * INTO emp_rec_EID, emp_rec_ENAME,
emp_rec_VAC_DAYS FROM employee
LET vac_sum = vac_sum + emp_rec_VAC_DAYS;
END FOREACH;
RETURN vac_sum;
END FUNCTION ;
|
Обработка исключений
В базах данных могут возникать ошибки, Oracle PL/SQL обеспечивает взаимодействие с
ошибками при помощи концепции EXCEPTION. PL/SQL предоставляет множество
функциональных возможностей для обработки исключений, их можно обрабатывать или регистрировать, можно определять новые исключения и т.д. MTK поддерживает большинство операторов исключений PL/SQL.
Некоторые исключения являются общими и сгруппированы в набор предварительно заданных или системных
исключений. Среди таких исключений ZERO_DIVIDE, ROWTYPE_MISMATCH и LOGIN_DENIED. Хотя
предварительно заданные исключения Oracle представляют собой символы или слово, исключения IDS являются номерами.
MTK автоматически сопоставляют эти типы исключений. Кроме того, Oracle разрешает сопоставлять слова исключений номерам при помощи объявления PRAGMA EXCEPTION_INIT. Обработку таких исключений MTK выполняет автоматически.
MTK переносит в IDS пользовательские исключения Oracle, вызовы процедуры RAISE_APPLICATION_ERROR и операторы, вызывающие и обрабатывающие исключения.
Пакет Oracle UTL_FILE
База данных Oracle содержит пакеты, предоставляющие функции, находящиеся вне
области традиционных баз данных. Один из таких пакетов, UTL_FILE, содержит
методы утилит, обеспечивающие взаимодействие с файловой системой компьютера, на котором размещена база данных. Эти методы пакета можно вызывать с помощью PL/SQL программ в других средах программирования. Хотя сигнатуры и функции данных методов различны в разных версиях, основной набор функций одинаков.
MTK поддерживает миграцию на DB2 UDB для LUW и IDS шести основных методов UTL_FILE. Поддерживаются только сигнатуры Oracle 9.2 данных методов. Функциональные возможности методов Oracle 9.2 обеспечиваются за счет серии пользовательских функций, развертываемых MTK в целевой базе данных. Поддерживаемые шесть методов UTL_FILE:
- FOPEN;
- FCLOSE;
- GET_LINE;
- PUT_LINE;
- FRENAME;
- FREMOVE.
В листинге 13 показан пример программы Oracle PL/SQL, считывающей данные из одного файла
и записывающей их в другой файл:
Листинг 13. Программа Oracle PL/SQL
CREATE PROCEDURE COPY_START_OF_FILE(numLines INT) AS
file1 utl_file.file_type;
file2 utl_file.file_type;
line VARCHAR(3000);
i INT DEFAULT 0;
BEGIN
file1 := utl_file.fopen('DIR1', 'readme.txt', 'r', 3000);
file2 := utl_file.fopen('DIR1', 'write_to_me.txt', 'w');
WHILE i < numLines LOOP
utl_file.get_line(file1, line);
utl_file.put_line(file2, line);
i := i + 1;
END LOOP;
utl_file.fclose(file1);
utl_file.fclose(file2);
END;
|
В листингах 14 и 15 показаны трансляции MTK и IDS для DB2 UDB для LUW:
Листинг 14. Трансляция MTK в DB2 UDB для LUW
CREATE PROCEDURE COPY_START_OF_FILE (numLines DECIMAL(31,0) )
LANGUAGE SQL
BEGIN
DECLARE file1 DECIMAL(31,0);
DECLARE file2 DECIMAL(31,0);
DECLARE line VARCHAR(3000);
DECLARE i DECIMAL(31,0) DEFAULT 0.0;
DECLARE file1_OFFSET BIGINT DEFAULT 0;
SET file1 = ORA.FOPEN('/tmp', 'readme.txt', 'r', 3000);
SET file2 = ORA.FOPEN('/tmp', 'write_to_me.txt', 'w');
WHILE i < numLines DO
CALL ORA.GET_LINE('/tmp','readme.txt','r',3000,
line,3000,3000,file1_OFFSET);
CALL ORA.PUT_LINE('/tmp','write_to_me.txt','w',1,line);
SET i = i + 1;
END WHILE ;
CALL ORA.FCLOSE(file1);
CALL ORA.FCLOSE(file2);
END!
|
Листинг 15. Трансляция MTK в IDS
CREATE PROCEDURE COPY_START_OF_FILE (numLines DECIMAL(32,0) )
DEFINE file1 DECIMAL(32,0);
DEFINE file2 DECIMAL(32,0);
DEFINE line LVARCHAR(3000);
DEFINE i DECIMAL(32,0);
DEFINE file1_OFFSET INT8;
LET file1 = NULL;
LET file2 = NULL;
LET line = NULL;
LET i = 0.0;
LET file1 = ORA.FOPEN('/tmp', 'readme.txt', 'r', 3000);
LET file2 = ORA.FOPEN('/tmp', 'write_to_me.txt', 'w');
WHILE i < numLines
LET file1_OFFSET = 0;
SELECT temp_file1_OFFSET, temp_line INTO file1_OFFSET, line
FROM informix.dual
WHERE ORA.GET_LINE('/tmp', 'readme.txt', 'r', 3000,
temp_line # LVARCHAR, 3000, 3000, file1_OFFSET,
temp_file1_OFFSET # INT8) = 1;
EXECUTE PROCEDURE PUT_LINE('/tmp','write_to_me.txt',
'w',1,line);
LET i = i + 1;
END WHILE ;
EXECUTE PROCEDURE ORA.FCLOSE(file1);
EXECUTE PROCEDURE ORA.FCLOSE(file2);
END PROCEDURE;
|
Дополнительные улучшения
В этом разделе описаны изменения и усовершенствования, добавленные в MTK
с момента выхода версии MTK 1.4, в дополнение к вышеописанным функциям:
-
Миграция на DB2 UDB на платформе iSeries;
-
Установка Windows без вмешательства пользователей;
-
Компоновка JRE;
-
Вопросы и ответы по MTK;
-
MTK 2.0.1.1 поддерживает MySQL.
Миграция на DB2 UDB на платформе iSeries
В MTK добавлены различные усовершенствования для миграции на DB2 UDB на iSeries. Среди них:
- Поддержка миграции на версию V5R4M0 DB2 for i5/OS;
- Снято ограничение на схему развертывания в DB2, при создании сценариев данных и во время размещения можно задать другую схему;
- Улучшена поддержка миграции для случаев, когда исходный компьютер и компьютер с iSeries не
доступны в одной сети. Можно извлечь объекты базы данных и
создать сценарии переноса данных в одной сети. Затем можно заархивировать проект и отправить
его на удаленный компьютер. После разархивирования проекта на компьютере в
другой сети MTK может развернуть объекты и данные базы данных на удаленной системе;
- Поддержка сопоставления типов данных VARCHAR и CHAR, обеспечивающая лучшую
производительность DB2 UDB for i5/OS. Данное сопоставление поддерживается для всех источников, которые можно
перенести на DB2 UDB for i5/OS;
- Использование для повышения производительности, по возможности, встроенных операторов, аналогичных DB2, для трансляции Sybase и SQL Server.
Установка Windows без вмешательства пользователей
MTK теперь можно устанавливать без вмешательства пользователей на платформе Windows. Для выполнения такой установки MTK на Windows выполните следующие операции:
- Разархивируйте ZIP-файл, загруженный с сайта MTK. (ZIP-файл содержит
файл MTKSilentInstall.iss file, файл readme и файл mtk.exe);
- Запустите установку при помощи файла ответов MTKSilentInstall.iss. Для этого выполните
следующую команду:
mtk.exe -s -f1"<полный путь к файлу MTKSilentInstall.iss>"
-f2"<полный путь к файлу журнала установки>" |
Параметр -s указывает, что установка будет выполняться
без вмешательства пользователей. Обратите внимание, что между параметром f1 и местоположением файла iss установки без вмешательства пользователей не должно быть пробела. Также
не должно быть пробелов между параметром -f2 и местоположением файла журнала установки.
После завершения установки без вмешательства пользователей, можно открыть файл журнала установки и проверить значение ResultCode. Если значение ResultCode соответствует 0, установка выполнена успешно.
Компоновка JRE
Программа установки MTK больше не включает среду JRE.
Поэтому необходимо установить среду JRE 1.4.2 или более поздней версии, и указать к ней путь в
переменной окружения PATH. Можно проверить доступность Java и версию
(должна быть не ниже 1.4.2) с помощью следующей команды:
Вопросы и ответы по MTK
В документацию по MTK добавлен раздел "Часто задаваемые
вопросы (FAQ) о MTK". Эти вопросы и ответы отобраны по результатам запросов
различных пользователей, полученных группой разработки MTK. Вопросы охватывают широкий диапазон
тем, связанных со всеми пятью этапами миграции, выполняемыми MTK. Подробные ответы
в этом разделе помогут пользователям решить обычные проблемы, возникающие при работе с MTK. Пользователям перед отправкой запросов в группу разработки MTK настоятельно рекомендуется просмотреть раздел "Вопросы и ответы" в документации по MTK.
MTK 2.0.1.1 поддерживает MySQL
Для загрузки доступен прототип MTK 2.0.1.1. Данный прототип включает
поддержку миграции MySQL (версий 4 и 5) в Informix Dynamic Server, DB2
UDB на Linux, Unix и Windows, и DB2 UDB for i5/OS.
Подключение к исходной базе данных
MTK позволяет непосредственно подключиться к исходной базе данных. После подключения MTK
может автоматически извлекать объекты базы данных (например, таблицы, представления и индексы
) и данные из таблиц. Подключение к исходной базе данных (
например, Oracle) выполняется довольно просто.
- Прежде всего загрузите и установите драйвер Oracle JDBC. (Поскольку для MTK требуется
Java 1.4 или выше, то подойдет драйвер ojdbc14.jar);
- Выполните инструкции Oracle по настройке соответствующих переменных среды
(например, PATH и CLASSPATH);
- Затем в проекте миграции MTK на вкладке Specify Source нажмите
Extract . Открывается диалоговое окно "Connect to Database"
(см. рисунок 1):
Рисунок 1. Диалоговое окно подключения к исходной базе данных
- Укажите соответствующие сведения о подключении.
Поскольку подключение выполняется к Oracle,
можно просмотреть файл конфигурации Oracle tnsnames.ora. Пример файла конфигурации
представлен далее в листинге Listing 16. (Как правило, этот файл находится в папке ORACLE_HOME/network/admin
или ORACLE_HOME/net80/admin);
Листинг 16. Пример файла tnsnames.ora
MY_ORACLE_DB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = brutus)(PORT = 1521))
)
(CONNECT_DATA =
(SID = ORA_ON_BRUTUS)
(SERVER = DEDICATED)
)
)
|
- Определите элементы базы данных, которые требуется
перенести;
- Наконец, введите данную информацию в диалоговое окно Connect to Database (см.
рисунок 1):
- Идентификатор сервиса (SID) из файла tnsnames.ora указан в первой строке диалогового окна MTK;
- Установите флажок Use native JDBC driver;
- Для определения IP-адреса HOST brutus используйте программу, такую как nslookup,
затем введите в соответствующие поля данный адрес и порт;
- Наконец, введите имя пользователя и пароль учетной записи.
Теперь к базе данных Oracle можно подключиться через MTK!
Ресурсы Научиться
Получить продукты и технологии
-
Загрузите MTK: Загрузите удобный инструмент, позволяющий перенести данные из различных исходных баз данных в DB2 или Informix Dynamic Server независимо от платформы;
-
Используйте в следующем проекте по разработке
ознакомительные версии ПО от IBM
, которые можно загрузить непосредственно с портала developerWorks.
Обсудить
Об авторах  | |  | Хемант Бхатия работает инженером по программному обеспечению в лаборатории Lenexa компании IBM. Он также работал с программными продуктами IBM Informix 4GL, классическими базами данных Informix, DB2 Information Integrator и IBM Migration Toolkit. |
 | |  | Николас Гейб является инженером по программному обеспечению в лаборатории Lenexa компании IBM и занимается IBM Migration Toolkit. |
Выскажите мнение об этой странице
|  |