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

В наличии была база данных 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. Радуемся жизни, либо траблшутим проблемы несовместимости баз.

Комментарии (4)


  1. Akina
    22.10.2022 00:08
    +1

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

    Убийственно! Если всё проделать так, как описано, то или получится, или нет...


    1. nas_x Автор
      24.10.2022 12:49

      Этой настройки хватит, чтобы работать с базами данных, которые по различным ограничениям похожи на postgres. В качестве примера несовместимости бд могу привести ограничение по количеству символов в идентификаторе (у меня вылезла ошибка при попытке импортировать таблицу, в которой был столбец с длинной названия более 64 символов). Для вполне стандартных таблиц будет работать уже на этом этапе. Возможно изначально не совсем корректно была выражена мысль, соглашусь)


  1. sargon5000
    23.10.2022 01:51

    Фраза "Ну и полное отсутствие интернета" резко противоречит инструкции "Скачиваем freetds библиотеку (freetds-0.91.tar.gz) из интернета ручками".


    1. nas_x Автор
      24.10.2022 12:51

      Опять же извинюсь за неточность формулировки. Интернет отсутствовал на линуксовом сервере, на котором стоит postgres. Не было возможности сделать yum install из репозитория, пришлось качать на другой машине и перекидывать руками.

      P.S. Я не волшебник, я только учусь выражать свои мысли)