Лучший инструмент для миграции базы данных PostgreSQL в MS SQL 2005?

8

У меня есть база данных в PostgreSQL 8.3.1, которую я хотел бы перенести на MS SQL Server 2005 (или, возможно, 2008), включая схему таблицы и данные. База данных имеет размер около 50 ГБ и около 400 000 000 строк, поэтому я думаю, что простые операторы INSERT исключены. Кто-нибудь может порекомендовать лучший инструмент для выполнения этой миграции? Очевидно, что он должен быть надежным, поэтому данные в целевой БД точно такие же, как и в исходной, и должны иметь возможность копировать этот объем данных в течение разумного времени.

EMP
источник
4
просто из любопытства: с какой стати ты хочешь это сделать?
wzzrd
Я предполагаю, что вы переходите на сервер Windows по какой-то другой причине, а не просто по функциональности db? Я надеюсь :)
Уоррен

Ответы:

6

Я закончил тем, что не использовал какой-либо сторонний инструмент для данных, поскольку ни один из тех, которые я пробовал, не работал для больших таблиц. Даже SSIS не удалось. Я использовал коммерческий инструмент для схемы, хотя. Итак, мой процесс преобразования был следующим:

  1. Full Convert Enterprise для копирования схемы (без данных).
  2. pg_dump для экспорта данных из Postgres в формате «обычный текст», который в основном представляет собой файл значений, разделенных табуляцией (TSV).
  3. Сценарии Python для преобразования экспортируемых файлов в формат, который понимает bcp.
  4. BCP для импорта данных в MSSQL.

Шаг преобразования учитывал некоторые различия в форматах, используемых pg_dump и bcp, таких как:

  • pg_dump помещает некоторые специфичные для Postgres вещи в начало файла и заканчивает данные на «.», тогда как bcp ожидает, что весь файл будет содержать данные
  • pg_dump хранит значения NULL как "\ N", в то время как bcp ничего не ожидает вместо NULL (т.е. нет данных между разделителями столбцов)
  • pg_dump кодирует вкладки как "\ t" и переводы строк как "\ n", в то время как bcp обрабатывает их буквально
  • pg_dump всегда использует вкладки и символы новой строки в качестве разделителей, в то время как bcp позволяет пользователю указывать разделители. Это становится необходимым, если данные содержат какие-либо вкладки или новые строки, поскольку они не закодированы.

Я также обнаружил, что некоторые уникальные ограничения в Postgres были нарушены в MSSQL, поэтому мне пришлось их отбросить. Это произошло потому, что NULL = NULL в MSSQL (т. Е. NULL рассматривается как уникальное значение), но не в Postgres.

EMP
источник
Это особенность SQL-сервера. Вместо ограничения уникальности вам нужно установить отфильтрованный уникальный индекс (WHERE имя_ столбца не пусто).
затруднение
Вы привели мне инструмент, который я убедил моего босса купить. Это потрясающе #FullConvert
mugume David
6

Если у вас установлены соответствующие драйверы поддержки Postgres на вашем сервере SQL 2005 (или вы хотите использовать Postgres через ODBC, или хотите выгрузить данные из Postgres в файл и импортировать из него), вы можете использовать мастер импорта / экспорта в SQL Server в Для того, чтобы скопировать данные. Это задаст вам множество вопросов, а затем выполнит импорт как задание пакета служб SQL Server Integration Services (SSIS), используя соответствующие операции пакетной вставки.

Однако, если этот мастер не подходит, стоит учесть, что, хотя у вас есть большое количество строк, индивидуальный размер строк составляет в среднем <135 байт, и при этом достаточно места в журнале транзакций, чтобы обеспечить выполнение транзакции 50 ГБ ' утверждения о простой вставке сами по себе не исключены.

Стив Грей
источник
1
Посмотрите на использование BCP (это утилита, которая поставляется с SQL-сервером), если вы в конечном итоге экспортируете данные, а затем импортируете в SQL Server. Использование SSIS - хорошая идея, если вы хотите просто получить ее напрямую с PG-сервера, но это может привести к проблемам с журналом.
ColtonCat
Пакет служб SSIS звучал очень многообещающе, и я попробовал его, но, к сожалению, ему не хватает памяти и он не работает. :( ОШИБКА [HY000] Недостаточно памяти при чтении кортежей. Ошибка при выполнении запроса (PSQLODBC35W.DLL)
EMP
0

http://www.easyfrom.net/

Вот и все :) К сожалению, это немного дороже.

Дэвид Рикман
источник
Спасибо, попробовал, но наткнулся на несколько ошибок с большими таблицами.
EMP
0

Прошло почти 10 лет, и это все еще непростая задача. В итоге я получил гибридное решение, я свернул свой собственный сопоставитель схем, экспортировав комментарии к схеме и таблице / столбцу с помощью следующей команды:

pg_dump --schema-only --no-owner --no-privileges your_db_name > schema_create_script.sql

Затем я написал PHP-скрипт, который переводил схему в T-SQL. Впоследствии я использовал следующее стороннее программное обеспечение для фактического импорта строк (без привязки):

http://www.convert-in.com/pgs2mss.htm

Это было немного медленно, но пока все хорошо. Наша база данных была меньше вашей, всего 15 ГБ, но этот инструмент, похоже, хорошо с ней справлялся. Это был также самый дешевый, который я мог найти приблизительно в 50 $. Пока это стоило вложений.

dearsina
источник