Как перенести базу данных PostgreSQL в базу данных SQLServer? - PullRequest
47 голосов
/ 03 июля 2011

У меня есть база данных PostgreSQL, которую я хочу переместить на SQL Server - и схему, и данные. Я беден, поэтому я не хочу платить деньги. Я тоже ленивый, поэтому не хочу много работать. В настоящее время я делаю эту таблицу за таблицей, и есть около 100 таблиц. Это очень утомительно.

Есть какой-то трюк, который делает то, что я хочу?

Ответы [ 2 ]

50 голосов
/ 04 июля 2011

Вы можете найти полезную информацию в принятом ответе на этой странице Serverfault: https://serverfault.com/questions/65407/best-tool-to-migrate-a-postgresql-database-to-ms-sql-2005.

Если вы можете преобразовать схему без данных, вы можете сократить шаги дляданные с помощью этой команды:

pg_dump --data-only --column-inserts your_db_name > data_load_script.sql

Эта загрузка будет довольно медленной, но опция --column-inserts генерирует самые общие операторы INSERT, возможные для каждой строки данных, и должна быть совместимой.

РЕДАКТИРОВАТЬ: Предложения по преобразованию схемы следующие:

Я бы начал с выгрузки схемы, но удалил все, что связано с владением или разрешениями.Этого должно быть достаточно:

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

Отредактируйте этот файл, чтобы добавить строку BEGIN TRANSACTION; в начало и ROLLBACK TRANSACTION; в конец.Теперь вы можете загрузить его и запустить в окне запросов в SQL Server.Если вы получаете какие-либо ошибки, убедитесь, что вы идете в конец файла, выделите оператор ROLLBACK и запустите его (нажав F5, когда оператор выделен).

По сути, вы должны разрешать каждую ошибку до тех пор, пока скрипт не будет выполнен корректно.Затем вы можете изменить ROLLBACK TRANSACTION на COMMIT TRANSACTION и запустить в последний раз.

К сожалению, я не могу помочь с тем, какие ошибки вы можете увидеть, поскольку я никогда не переходил с PostgreSQL на SQL Server, только наоборот.вокруг.Некоторые вещи, которые я ожидаю вызвать, однако (очевидно, НЕ исчерпывающий список):

  • PostgreSQL выполняет автоматическое увеличение полей, связывая поле NOT NULL INTEGER с SEQUENCE, используяDEFAULT.В SQL Server это столбец IDENTITY, но это не одно и то же.Я не уверен, что они эквивалентны, но если ваша оригинальная схема заполнена полями «id», у вас могут возникнуть некоторые проблемы.Я не знаю, имеет ли SQL Server CREATE SEQUENCE, поэтому вам, возможно, придется их удалить.
  • Функции базы данных / хранимые процедуры не транслируются между платформами RDBMS.Вам нужно будет удалить все операторы CREATE FUNCTION и перевести алгоритмы вручную.
  • Будьте осторожны с кодировкой файла данных.Я работаю в Linux, поэтому не знаю, как проверить кодировку в Windows, но вам нужно убедиться, что SQL Server соответствует файлу, который вы импортируете из PostgreSQL.pg_dump имеет опцию --encoding=, которая позволит вам установить определенную кодировку.Кажется, я вспоминаю, что Windows склонна использовать двухбайтовую кодировку UTF-16 для Unicode, где PostgreSQL использует UTF-8.У меня возникли некоторые проблемы при переходе с SQL Server на PostgreSQL из-за вывода в формате UTF-16, поэтому его стоит изучить.
  • Тип данных PostgreSQL TEXT - это просто VARCHAR без максимальной длины.В SQL Server TEXT ... сложно (и не рекомендуется).Каждое поле в вашей исходной схеме, объявленное как TEXT, должно быть проверено на соответствующий тип данных SQL Server.
  • SQL Server имеет дополнительные типы данных для данных UNICODE.Я недостаточно знаком с этим, чтобы делать предложения.Я просто указываю, что это может быть проблемой.
1 голос
/ 27 сентября 2017

Я нашел более быстрый и простой способ сделать это.

Сначала скопируйте вашу таблицу (или запрос) в файл с разделителями табуляции, например, так:

COPY (SELECT siteid, searchdist, listtype, list, sitename, county, street, 
   city, state, zip, georesult, elevation, lat, lng, wkt, unlocated_bool, 
   id, status, standard_status, date_opened_or_reported, date_closed, 
   notes, list_type_description FROM mlocal) TO 'c:\SQLAzureImportFiles\data_script_mlocal.tsv' NULL E''

Затем вам нужносоздайте свою таблицу в SQL, это не обработает никакой схемы для вас.Схема должна соответствовать экспортированному файлу tsv в порядке полей и типах данных.

Наконец, вы запускаете утилиту bcp SQL, чтобы получить файл tsv следующим образом:

bcp MyDb.dbo.mlocal in "\\NEWDBSERVER\SQLAzureImportFiles\data_script_mlocal.tsv" -S tcp:YourDBServer.database.windows.net -U YourUserName -P YourPassword -c

Несколько вещейобратите внимание, что я столкнулся.Postgres и SQL Server обрабатывают логические поля по-разному.В вашей схеме SQL Server должны быть установлены логические поля varchar (1), а получаемые данные будут 'f', 't' или null.Затем вам нужно будет немного преобразовать это поле.делать что-то вроде:

ALTER TABLE mlocal ADD unlocated bit;
UPDATE mlocal SET unlocated=1 WHERE unlocated_bool='t';
UPDATE mlocal SET unlocated=0 WHERE unlocated_bool='f';
ALTER TABLE mlocal DROP COLUMN unlocated_bool;

Другое дело, что поля географии / геометрии сильно различаются между двумя платформами.Экспортируйте поля геометрии как WKT, используя ST_AsText(geo), и выполните соответствующее преобразование на стороне SQL Server.

Может быть больше несовместимостей, нуждающихся в таких настройках.

РЕДАКТИРОВАТЬ.Таким образом, хотя этот метод технически работает, я пытаюсь перенести несколько миллионов записей из более чем 100 таблиц в SQL Azure, а bcp в SQL Azure оказывается довольно нестабильным.Я постоянно получаю Невозможно открыть ошибки файла данных хоста BCP , сервер периодически прерывается, и по какой-то причине некоторые записи не передаются без признаков ошибок или проблем.Поэтому этот метод нестабилен для передачи больших объемов данных в Azure SQL.

...