Как-то мне потребовалось настроить синхронизацию нескольких таблиц на разных серверах 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) );
добрый день.
Попробовал - получилось. И у меня возник вопрос: можно ли при помощи этого запроса скопировать данные из одной бд в такую же таблицу на другом сервере в другую бд?
Спасибо.
Да, конечно, в этом и есть основная идея DBLink.
Попробуйте "поиграть" с переменными, которые задают параметры работы с удалённой базой (это я про DBHOST DBNAME DBUSER DBPASS), Вы можете указать абсолютно любой хост, юзера, базу и т.д. Главное чтобы Вы могли подключиться к этой базе например через psql утилиту, если всё работает то и DBLink поднимется.
Так же, вы можете вместо SELECT использовать любой другой вид запроса, сгруппировать любые таблицы, или например запросить содержимое из VIEW, но в Вашем случае просто нужно вместо SELECT написать INSERT.
Спасибо за быстрый ответ. Но я попробовал
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 выскакивает ошибка. Может я что-то не правильно делаю?
Спасибо.
Внимательно просмотрел, оказалось две строчки в таблицах поменяны местами.
*колонки
Типичная проблема, иногда порядок колонок не совпадает и база ругается. Странно, что сервер не может сам исправить некорректный порядок если колонка существует, но это одна из особенностей PgSQL с которой приходится мириться 🙂
Добрый день , а связать несколько таблиц из разных БД с помощью linka возможно?