Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > СУБД, общие вопросы > Перенос базы данных из Sybase ASA 5.5 MySQL 5


Автор: Berliner 6.3.2006, 17:12
Здраствууйте ! интересно возможен ли перенос данных из Sybase ASA на My SQL 5 Перенести хочу хотябы таблицы. Хранимые процедуры и тригера думаю надо руками переписывать. Насколько это сложно сделать? Может кто-то пытался сделать подобное?

Автор: chief39 6.3.2006, 18:44
нуууу..... о софтине такой не слыхал...
Структуру данных создавай ручками...
Ну а перекачивание данных.... наверное придётся аппликуху писать а-ля pump. Качаешь оттеда - льёшь туда. Соблюдая очерёдность чтоб с форэйн киз проблем не было. С айди полями - тут тоже подумать надо. Смотря как они у тебя в АСЕ

Автор: batigoal 6.3.2006, 19:38
Я полагаю, что должны быть в составе обеих СУБД утилиты, поддерживающие экспорт/импорт данных в XML/plain text. Неужели нету?

Автор: LSD 6.3.2006, 21:44
Вытянуть структуру базы и конвертануть ее, может тот же PowerDesigner.

Автор: Berliner 7.3.2006, 11:25
Спасиб, требуется наиболее простой вариант.

Автор: chief39 7.3.2006, 12:28
Цитата(LSD @ 6.3.2006, 21:44 Найти цитируемый пост)
Вытянуть структуру базы и конвертануть ее, может тот же PowerDesigner.

А данные? Может там и таблиц-то немного... Их даже ручками создать можно будет.. а вот перекачать.....

Цитата(Lamer George @ 6.3.2006, 19:38 Найти цитируемый пост)
Я полагаю, что должны быть в составе обеих СУБД утилиты, поддерживающие экспорт/импорт данных в XML/plain text. Неужели нету?

В универсальное представление какое-то? Ну то есть, одна СУБД воспримет данные в XML от другой СУБД?

Автор: Berliner 7.3.2006, 12:35
таблиц очень много
Предложите наиболее легкие варианты

Автор: LSD 7.3.2006, 13:13
Цитата(chief39 @ 7.3.2006, 12:28 Найти цитируемый пост)
В универсальное представление какое-то? Ну то есть, одна СУБД воспримет данные в XML от другой СУБД?

Ну например CSV. А вообще надо смотреть утилиты экспорта/импрота в Sybase и MySQL.
Или накатать самому приложение на Java, это не так сложно как кажется smile

Автор: Berliner 7.3.2006, 13:24
Т.Е нужно создать приложение которое сможет считывать данные(Импорт) из одной базы данных и экспортировать в другую базу данных(My SQL)
Напиши пожалуста по шагам(подробнее), что должно єто приложение делать.

Автор: LSD 7.3.2006, 13:32
1. Соединяемся с обеими базами.
2. Получаем список таблиц в обоих базах (на основе Connection.getMetaData()) и выбираем те которые будем "перекачивать" (по списку таблиц или просто все у которых имена совпадают)
3. Выбираем данные из таблици, формируем insert для другой базы (на основе RowSet.getMetaData()), идем по курсору и вставляем данные в другую базу
4. Повторяем пункт 3 для всех таблиц.

Автор: chief39 7.3.2006, 16:11
1. Только не забудь о том порядке таблиц, который позволит вставки при наличии внешних ключей.

То есть вставить все записи в таблицу "группы" надо до того, как начнёшь вставки в таблицу "люди", которая ссылается на "группы".

2. Проконтролируй чтоб не было проблем с айдишками. Если в mysql у тебя будет автоинкрементное поле (или какие там есть?) - то при вставке - надо сиё проконтролировать и обдумать....
Например в твоей базе в "группах" айдишки 3, 5, 8. При переносе, в этом поле автоинкрементно сгенерится 1,2,3 (к примеру). При переносе таблицы "люди" её записи будут ссылаться на группы 3,5,8. Две из которых не обнаружат и ругнутся
Тэк штааа... айдишки надо будет вязать по другому на время переноса...

Автор: LSD 7.3.2006, 17:49
Цитата(chief39 @ 7.3.2006, 16:11 Найти цитируемый пост)
1. Только не забудь о том порядке таблиц, который позволит вставки при наличии внешних ключей.

Угу согласен. Значит придется заранее составить список таблиц и идти по нему.

А вот со вторым пунктом труба, если MySQL не позволяет явно указать значение для автоинкрементного поля то надо или будет вообще отказаться от автоинкрементов в пользу триггер+последовательность, или делать вставку по хитрому алгоритму с учетом всех foreign key.

Автор: Berliner 9.3.2006, 12:00
Цитата

1. Только не забудь о том порядке таблиц, который позволит вставки при наличии внешних ключей.

То есть вставить все записи в таблицу "группы" надо до того, как начнёшь вставки в таблицу "люди", которая ссылается на "группы".


Это можно как то програмно отследить без анализа данных "вручную".
База данных большая. По каким признакам это можно отследить. Пример начсет людей и груп я понял. А что скажу люди которые знают хорошо MY SQL ?

Автор: chief39 9.3.2006, 12:28
Цитата(Berliner @ 9.3.2006, 12:00 Найти цитируемый пост)
Это можно как то програмно отследить без анализа данных "вручную".

Можно. Не помню как в ASA, но сдаётся мне, не хуже чем в ASE:
Есть табличка sysobjects(там все таблицы, вьюхи, процедуры и многая прочая - юзерские таблицы имеют TYPE="U"), ещё, кажется sysreferences и проч. Вобщем погляди все таблицы на sys. Из них можно вытянуть все связки таблиц и их структуру.
Потом надо построить граф(программно) и начать с тех таблиц, которые ни на что не завязаны и далее спускаться, по мере их переноса, до тех, которые от них зависят. А вот в целевой базе(mysql) придётся отказаться от автоинкрементов.
Или не отказываться, но продумать контроль при переносе.
Например, при переносе "групп" в мускле они создаются с другими айдишками.
при переносе "людей" нужна будет реальная айдишка нужной группы. Надо будет брать айдишку группы в ASA, резолвить в айдишку группы в мускле и вставлять запись о человеке с уже корректной айдишкой группы. Но тогда тебе нужен реальный механизм определения идентификации айдишки по другим аттрибутам (что не предполагается по идее структурой базы и может лишь иногда быть возможно). Или переносить по одной записи и связку "новая айдишка" - "старая айдишка" хранить в памяти, пока она нужна.
Т.е. Взял группу с айди 6, перенёс, в мускле вышло - 3, запомнил связку "6-3".
Потом, когда переносишь "людей", берёшь "человека", если у него - 6, заменешь на 3 и инсертишь в мускль.
Проблема может быть в том, что "люди" у тебя ссылаются на 10 таблиц. Тогда надо все десять таблиц перенести и запомнить для каждой их записи такие резолвы. А потом уже "людей переносить".
Если записей до черта и джвм сдохнет столько в памяти держать - тогда сделай временную табличку в одной из баз - <имя таблицы> <старая айди> <новая айди>. И там храни все данные спокойно до конца переноса.
Так будет логичней всего. Но перед этим всем надо полностью выстроить граф связей и точно обходить его, чётко соблюдая все зависимости.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)