Исходные данные
В наличии была база данных MSSQL (с которой забираем данные), а также PostgreSQL Pro Enterprise 10.3, развернутая на CentOS 7 (на которую импортируем). Ну и полное отсутствие интернета.
Установка библиотек FreeTDS
Скачиваем freetds библиотеку (freetds-0.91.tar.gz) из интернета ручками (http://mirrors.ibiblio.org/freetds/stable/)
По WinSCP перемещаем на postgres сервер в любую доступную папку (У меня /home/myuser/)
-
Распаковываем архив
tar -zxvf freetds-0.91.tar.gz
-
Далее проверяем наличие следующих библиотек: gcc-c++, ncurses-devel
(Можете кусаться, но лично у меня без этих библиотек дальнейшие шаги не получались)
-
Переходим в папку библиотеки, она появится после распаковки архива и будет называться идентично
cd freetds-0.91/
-
Выполняем команду конфигурации. Запоминаем директорию, указанную в —prefix (у меня /usr/local/freetds)
./configure --prefix=/usr/local/freetds --enable-msdblib
-
Далее выполняем команды
make && make install
Проверяем, чтобы в конце вывода команды не было ошибок. Если есть, гуглим, исправляем сразу. Если будут ошибки на данном шаге, дальше не установится.
На этом шаге мы установили FreeTDS (в папку /usr/local/freetds). Продолжаем настраивать.
-
Открываем конфиг-файл командой, либо ручками в WinSCP
vim /etc/ld.so.conf
Дописываем в файл через один пробел путь до lib директории уже установленной библиотеки (/usr/local/freetds/lib/) и сохраняем.
-
Далее выполняем команду, чтобы применить эти изменения
ldconfig
-
Добавим для удобства в переменную PATH путь до bin папки библиотеки
PATH=/usr/local/freetds/bin:$PATH
-
Проверяем работоспособность tsql сервиса
tsql -C
Скрипт выведет список настроек
-
Указываем конфигурацию MS сервера (к которому будем подключаться) в freetds.conf файле (его расположение выводится в команде выше) в следующем формате
[my_server]
host = serverhost
port = serverport
tds version = 7.0Прописываем хост и порт (по дефолту 1433), запоминаем имя в квадратных скобках, далее мы будем к нему обращаться.
-
Делаем тест подключение
tsql -S myserver -U username -P password
В результате успешного подключения откроется консоль
-
Делаем тест запрос. Например, запросим список существующих таблиц для определенной базы
SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'
Для выполнения через консоль, в строке 1> необходимо указать запрос, а в строке 2> написать слово go.
А чтобы выйти из консоли MS сервера, пишем quit и нажимаем Enter .
Установка tds_fdw модуля
Заходим на гит ресурс https://github.com/tds-fdw/tds_fdw.git
Скачиваем модуль как zip-архив руками
По WinSCP перемещаем на pg сервер в любую доступную папку (У меня /home/myuser/)
-
Распаковываем архив командой
unzip tds_fdw-master.zip
-
Редактируем Makefile файл в папке с распакованным модулем (у меня /home/myuser/tds_fdw-master/Makefile)
Редактируем переменные SHLIB_LINK и PG_CPPFLAGS, используем путь до уже установленной библиотеки freeTDS (путь запоминали в пункте 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 файла. Он должен появиться
-
Находим файл 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 КОНСОЛЬ
Работа со связанным сервером
-
Создаем расширение
CREATE EXTENSION tds_fdw;
Если расширение создалось успешно, значит, мы правильно подключили tds_fdw модуль.
-
Создаем объект сервера
CREATE SERVER serverName FOREIGN DATA WRAPPER tds_fdw OPTIONS (servername 'serverName_fromFreetdsConf', database 'dbName', msg_handler 'notice');
serverName - любое имя связанного сервера, которое мы будем использовать в sql запросах
serverName_fromFreetdsConf - имя сервера, конфигурацию которого мы прописывали в freetds.conf файле в блоке 1
-
Выполняем маппинг текущего пользователя на созданный сервер
CREATE USER MAPPING FOR CURRENT_USER SERVER serverName OPTIONS (username 'dbUser', password 'dbUserPswd');
-
Импортируем схему со связанного сервера
IMPORT FOREIGN SCHEMA dbo FROM SERVER serverName INTO localSchema;
dbo - имя схемы из MS базы (в MS базах не принято делить на схемы, поэтому используется дефолтная dbo)
serverName - имя связанного сервера
localSchema - имя схемы в нашей pg базе (должна быть создана до выполнения импорта)
Радуемся жизни, либо траблшутим проблемы несовместимости баз.
Комментарии (4)
sargon5000
23.10.2022 01:51Фраза "Ну и полное отсутствие интернета" резко противоречит инструкции "Скачиваем freetds библиотеку (freetds-0.91.tar.gz) из интернета ручками".
nas_x Автор
24.10.2022 12:51Опять же извинюсь за неточность формулировки. Интернет отсутствовал на линуксовом сервере, на котором стоит postgres. Не было возможности сделать yum install из репозитория, пришлось качать на другой машине и перекидывать руками.
P.S. Я не волшебник, я только учусь выражать свои мысли)
Akina
Убийственно! Если всё проделать так, как описано, то или получится, или нет...
nas_x Автор
Этой настройки хватит, чтобы работать с базами данных, которые по различным ограничениям похожи на postgres. В качестве примера несовместимости бд могу привести ограничение по количеству символов в идентификаторе (у меня вылезла ошибка при попытке импортировать таблицу, в которой был столбец с длинной названия более 64 символов). Для вполне стандартных таблиц будет работать уже на этом этапе. Возможно изначально не совсем корректно была выражена мысль, соглашусь)