| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > СУБД, общие вопросы > Перенос базы данных из 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 |
| Спасиб, требуется наиболее простой вариант. |
| Автор: Berliner 7.3.2006, 12:35 |
| таблиц очень много Предложите наиболее легкие варианты |
| Автор: LSD 7.3.2006, 13:13 | ||
Ну например CSV. А вообще надо смотреть утилиты экспорта/импрота в Sybase и MySQL. Или накатать самому приложение на Java, это не так сложно как кажется |
| Автор: 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 | ||
Угу согласен. Значит придется заранее составить список таблиц и идти по нему. А вот со вторым пунктом труба, если MySQL не позволяет явно указать значение для автоинкрементного поля то надо или будет вообще отказаться от автоинкрементов в пользу триггер+последовательность, или делать вставку по хитрому алгоритму с учетом всех foreign key. |
| Автор: Berliner 9.3.2006, 12:00 | ||
Это можно как то програмно отследить без анализа данных "вручную". База данных большая. По каким признакам это можно отследить. Пример начсет людей и груп я понял. А что скажу люди которые знают хорошо MY SQL ? |
| Автор: chief39 9.3.2006, 12:28 | ||
Можно. Не помню как в ASA, но сдаётся мне, не хуже чем в ASE: Есть табличка sysobjects(там все таблицы, вьюхи, процедуры и многая прочая - юзерские таблицы имеют TYPE="U"), ещё, кажется sysreferences и проч. Вобщем погляди все таблицы на sys. Из них можно вытянуть все связки таблиц и их структуру. Потом надо построить граф(программно) и начать с тех таблиц, которые ни на что не завязаны и далее спускаться, по мере их переноса, до тех, которые от них зависят. А вот в целевой базе(mysql) придётся отказаться от автоинкрементов. Или не отказываться, но продумать контроль при переносе. Например, при переносе "групп" в мускле они создаются с другими айдишками. при переносе "людей" нужна будет реальная айдишка нужной группы. Надо будет брать айдишку группы в ASA, резолвить в айдишку группы в мускле и вставлять запись о человеке с уже корректной айдишкой группы. Но тогда тебе нужен реальный механизм определения идентификации айдишки по другим аттрибутам (что не предполагается по идее структурой базы и может лишь иногда быть возможно). Или переносить по одной записи и связку "новая айдишка" - "старая айдишка" хранить в памяти, пока она нужна. Т.е. Взял группу с айди 6, перенёс, в мускле вышло - 3, запомнил связку "6-3". Потом, когда переносишь "людей", берёшь "человека", если у него - 6, заменешь на 3 и инсертишь в мускль. Проблема может быть в том, что "люди" у тебя ссылаются на 10 таблиц. Тогда надо все десять таблиц перенести и запомнить для каждой их записи такие резолвы. А потом уже "людей переносить". Если записей до черта и джвм сдохнет столько в памяти держать - тогда сделай временную табличку в одной из баз - <имя таблицы> <старая айди> <новая айди>. И там храни все данные спокойно до конца переноса. Так будет логичней всего. Но перед этим всем надо полностью выстроить граф связей и точно обходить его, чётко соблюдая все зависимости. |