Как настроить dblink в PostgreSQL

Как-то мне потребовалось настроить синхронизацию нескольких таблиц на разных серверах PostgreSQL, не настраивая при этом репликацию в классическом её виде, проанализировал я много разных вариантов и самый простой оказался синхронизация через dblink.

Настройку выполняю на Debian 7.0 (Wheezy), база данных PoetgreSQL 9.1.

Предполагаю, что база уже развёрнута и работает, а так же что у Вас есть доступ к ней с правами администратора

Установим пакеты

apt-get install postgresql-contrib

Через консоль базы данных создадим расширение dblink:

CREATE EXTENSION dblink;

Протестируем:

select * from dblink (
'hostaddr=DBHOST dbname=DBNAME user=DBUSER password=DBPASS',
'select * from users'
) as users (
userid uuid,
email varchar(50),
alias varchar(50),
fullname varchar(50),
password varchar(100)
);

8 thoughts on “Как настроить dblink в PostgreSQL

  1. добрый день.
    Попробовал - получилось. И у меня возник вопрос: можно ли при помощи этого запроса скопировать данные из одной бд в такую же таблицу на другом сервере в другую бд?
    Спасибо.

    1. Да, конечно, в этом и есть основная идея DBLink.
      Попробуйте "поиграть" с переменными, которые задают параметры работы с удалённой базой (это я про DBHOST DBNAME DBUSER DBPASS), Вы можете указать абсолютно любой хост, юзера, базу и т.д. Главное чтобы Вы могли подключиться к этой базе например через psql утилиту, если всё работает то и DBLink поднимется.

    2. Так же, вы можете вместо SELECT использовать любой другой вид запроса, сгруппировать любые таблицы, или например запросить содержимое из VIEW, но в Вашем случае просто нужно вместо SELECT написать INSERT.

  2. Спасибо за быстрый ответ. Но я попробовал
    INSERT INTO users SELECT * FROM dblink (....) AS p_u (...);
    И выскочила ошибка ERROR: column "created_date" is of type timestamp without time zone but expression is of type numeric и подсказка You will need to rewrite or cast the expression.
    Хотя поля и типы данных одинаковые. А в спецификации написано, что типы не обязательно должны совпадать - строки должны быть допустимы для ввода данных.

    Для меня немного странно, что SELECT * FROM dblink (....) AS p_u (...); работает и выводит таблицу в консоль, а при добавлении INSERT выскакивает ошибка. Может я что-то не правильно делаю?
    Спасибо.

  3. Внимательно просмотрел, оказалось две строчки в таблицах поменяны местами.

      1. Типичная проблема, иногда порядок колонок не совпадает и база ругается. Странно, что сервер не может сам исправить некорректный порядок если колонка существует, но это одна из особенностей PgSQL с которой приходится мириться 🙂

  4. Добрый день , а связать несколько таблиц из разных БД с помощью linka возможно?

Comments are closed.