Как стать автором
Обновить

Импорт данных с MSSQL на PostgreSQL

Время на прочтение3 мин
Количество просмотров14K

Исходные данные

В наличии была база данных MSSQL (с которой забираем данные), а также PostgreSQL Pro Enterprise 10.3, развернутая на CentOS 7 (на которую импортируем). Ну и полное отсутствие интернета.

Установка библиотек FreeTDS

  1. Скачиваем freetds библиотеку (freetds-0.91.tar.gz) из интернета ручками (http://mirrors.ibiblio.org/freetds/stable/)

  2. По WinSCP перемещаем на postgres сервер в любую доступную папку (У меня /home/myuser/)

  3. Распаковываем архив

    tar -zxvf freetds-0.91.tar.gz

  4. Далее проверяем наличие следующих библиотек: gcc-c++, ncurses-devel

    (Можете кусаться, но лично у меня без этих библиотек дальнейшие шаги не получались)

  5. Переходим в папку библиотеки, она появится после распаковки архива и будет называться идентично

    cd freetds-0.91/

  6. Выполняем команду конфигурации. Запоминаем директорию, указанную в —prefix (у меня /usr/local/freetds)

    ./configure --prefix=/usr/local/freetds --enable-msdblib

  7. Далее выполняем команды

    make && make install

    Проверяем, чтобы в конце вывода команды не было ошибок. Если есть, гуглим, исправляем сразу. Если будут ошибки на данном шаге, дальше не установится.

    На этом шаге мы установили FreeTDS (в папку /usr/local/freetds). Продолжаем настраивать.

  8. Открываем конфиг-файл командой, либо ручками в WinSCP

    vim /etc/ld.so.conf

  9. Дописываем в файл через один пробел путь до lib директории уже установленной библиотеки (/usr/local/freetds/lib/) и сохраняем.

  10. Далее выполняем команду, чтобы применить эти изменения

    ldconfig

  11. Добавим для удобства в переменную PATH путь до bin папки библиотеки

    PATH=/usr/local/freetds/bin:$PATH

  12. Проверяем работоспособность tsql сервиса

    tsql -C

    Скрипт выведет список настроек

  13. Указываем конфигурацию MS сервера (к которому будем подключаться) в freetds.conf файле (его расположение выводится в команде выше) в следующем формате

    [my_server]
    host = serverhost
    port = serverport
    tds version = 7.0

    Прописываем хост и порт (по дефолту 1433), запоминаем имя в квадратных скобках, далее мы будем к нему обращаться.

  14. Делаем тест подключение

    tsql -S myserver -U username -P password

    В результате успешного подключения откроется консоль

  15. Делаем тест запрос. Например, запросим список существующих таблиц для определенной базы

    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'

    Для выполнения через консоль, в строке 1> необходимо указать запрос, а в строке 2> написать слово go.

    А чтобы выйти из консоли MS сервера, пишем quit и нажимаем Enter .

Установка tds_fdw модуля

  1. Заходим на гит ресурс https://github.com/tds-fdw/tds_fdw.git

  2. Скачиваем модуль как zip-архив руками

  3. По WinSCP перемещаем на pg сервер в любую доступную папку (У меня /home/myuser/)

  4. Распаковываем архив командой

    unzip tds_fdw-master.zip

  5. Редактируем Makefile файл в папке с распакованным модулем (у меня /home/myuser/tds_fdw-master/Makefile)

    Редактируем переменные SHLIB_LINK и PG_CPPFLAGS, используем путь до уже установленной библиотеки freeTDS (путь запоминали в пункте 6 предыдущего блока)

  6. Выполняем команду

    make USE_PGXS=1 install

    Проверяем вывод команды. Ошибок быть не должно.

    Минутка траблшутинга

    Если возникает ошибка make: pg_config: Command not found

    а. Проверить наличие файла pg_config на системе. Можно искать через WinSCP или командой в консоли

    find / -depth -name "pg_config"

    b. Если файл отсутствует, проверить наличие пакета postgres\*version\* -devel-\* командой

    rpm -qa | grep postgres

    Если пакета нет, его нужно установить. В условиях отсутствия интернета качаем для этого rpm руками, перекидываем на сервер и устанавливаем командой

    yum localinstall /path/to/rpm/package.rpm

    c. Проверяем наличие pg_config файла. Он должен появиться

  7. Находим файл tds_fdw.so и проверяем его зависимые библиотеки

    ldd /path/to/file/tds_fdw.so

    Проверяем, что путь до lybsybdb.so.5 указан корректно. Если путь не указан, добавляем линку в папку /usr/lib/ , а затем выполняем ldconfig

    ln -s /usr/local/freetds/lib/libsybdb.so.5 /usr/lib/libsybdb.so.5 && ldconfig

    НА ЭТОМ ЭТАПЕ РАБОТА С СЕРВЕРОМ ЗАВЕРШЕНА, ПЕРЕХОДИМ В POSTGRESQL КОНСОЛЬ

Работа со связанным сервером

  1. Создаем расширение

    CREATE EXTENSION tds_fdw;

    Если расширение создалось успешно, значит, мы правильно подключили tds_fdw модуль.

  2. Создаем объект сервера

    CREATE SERVER serverName FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername 'serverName_fromFreetdsConf', database 'dbName', msg_handler 'notice');

    serverName - любое имя связанного сервера, которое мы будем использовать в sql запросах

    serverName_fromFreetdsConf - имя сервера, конфигурацию которого мы прописывали в freetds.conf файле в блоке 1

  3. Выполняем маппинг текущего пользователя на созданный сервер

    CREATE USER MAPPING FOR CURRENT_USER SERVER serverName OPTIONS (username 'dbUser', password 'dbUserPswd');

  4. Импортируем схему со связанного сервера

    IMPORT FOREIGN SCHEMA dbo FROM SERVER serverName INTO localSchema;

    dbo - имя схемы из MS базы (в MS базах не принято делить на схемы, поэтому используется дефолтная dbo)

    serverName - имя связанного сервера

    localSchema - имя схемы в нашей pg базе (должна быть создана до выполнения импорта)

  5. Радуемся жизни, либо траблшутим проблемы несовместимости баз.

Теги:
Хабы:
Всего голосов 5: ↑5 и ↓0+5
Комментарии4

Публикации

Истории

Работа

Ближайшие события

19 сентября
CDI Conf 2024
Москва
24 сентября
Конференция Fin.Bot 2024
МоскваОнлайн
30 сентября – 1 октября
Конференция фронтенд-разработчиков FrontendConf 2024
МоскваОнлайн