2015-08-26 2 views
0

У меня есть 2 сервера postgresql на двух разных компьютерах, которые не подключены.
Каждый сервер содержит базу данных с той же схемой.
Я бы хотел, чтобы один из серверов был главным сервером: этот сервер должен хранить все данные, вставленные в обе базы данных.
Для этого я хотел бы импортировать регулярно (например, ежедневно) данные из одной базы данных во вторую базу данных. Это означает, что я должен быть в состоянии:Копирование данных между двумя серверами, которые не подключены

  1. «сбросить» в файл (ы) все данные, которые были сохранены в первой базе данных с момента указанной даты.

  2. импорт экспортированных данных на второй базе данных

я не видел никакого времени/даты в опции команды pg_dump/pg_restore.
Итак, как я мог это сделать?

NB: данные вставляются в базу данных и не обновляются.

+1

Что вам нужно, это репликация postgresql http://www.postgresql.org/docs/9.3/static/high-availability.html, и этот вопрос отключен для этого сайта. – e4c5

ответ

0

Я не видел ни одной опции времени/даты в командах pg_dump/pg_restore.

Нет ни одного, и вы не сможете этого сделать. Вам придется сбрасывать и восстанавливать всю базу данных .

Альтернативы:

  • Использование WAL репликации на основе. Попросите мастера записать WAL в место архива, используя archive_command. Когда вы хотите синхронизировать, скопируйте все новое WAL от мастера к реплике, которое должно быть сделано как pg_basebackup мастера и должно иметь подходящий recovery.conf. Реплика будет воспроизводить WAL мастера, чтобы получить все последние изменения мастера.

  • Используйте настраиваемую триггерную систему для записи всех изменений в таблицы журналов. COPY эти таблицы журналов во внешние файлы, затем скопируйте их в реплику. Используйте специальный скрипт для применения записей изменений таблицы журналов к основным таблицам.

  • Добавить столбец временной отметки ко всем вашим таблицам. Сохраните запись, когда вы в последний раз синхронизировали изменения. Сделайте \COPY (SELECT * FROM sometable WHERE insert_timestamp > 'last_sync_timestamp') TO 'somefile' для каждой таблицы, возможно, с помощью скрипта. Скопируйте файлы на вторичный сервер. Там автоматизируйте процесс создания \copy sometable FROM 'somefile', чтобы загрузить изменения из файлов экспорта.

В вашей ситуации я, вероятно, сделаю репликацию на основе WAL. Это означает, что вторичная база данных должна быть абсолютно доступна только для чтения.

+0

Спасибо за ваш ответ. Я, вероятно, попробую вторую альтернативу: во-первых, это не влияет на схему базы данных, а во-вторых, реплика не такова, поскольку у нее есть свои собственные записи. –

+0

@AlainEsparel Cool. Если вы используете PostgreSQL 9.4 или новее, есть возможность использовать плагин вывода логического декодирования для изменения потока. Думаю, кто-то работает над плагином вывода json. –

Смежные вопросы