Резервное копирование Postgresql PITR: лучшие практики для обработки нескольких баз данных? - PullRequest
1 голос
/ 15 июля 2009

Ребята, у меня есть сервер postgresql 8.3 со многими базами данных.

На самом деле, я планирую сделать резервную копию этих БД с помощью скрипта, который будет хранить всю резервную копию в папке с таким же именем БД, например:

/mypath/backup/my_database1/
/mypath/backup/my_database2/
/mypath/backup/foo_database/

Каждый день я делаю 1 дамп каждые 2 часа, перезаписывая файлы каждый день ... например, в папке my_database1, которую я имею:

my_database1.backup-00.sql  //backup made everyday at the 00.00 AM
my_database1.backup-02.sql  //backup made everyday at the 02.00 AM
my_database1.backup-04.sql  //backup made everyday at the 04.00 AM
my_database1.backup-06.sql  //backup made everyday at the 06.00 AM
my_database1.backup-08.sql  //backup made everyday at the 08.00 AM
my_database1.backup-10.sql  //backup made everyday at the 10.00 AM
[...and so on...]

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

2 часа все еще выглядит слишком много.

Я посмотрел, что postgresql pitr занимается файлами WAL, но эти файлы, кажется, содержат все данные о всех моей базе данных.

Мне нужно разделить эти файлы, точно так же, как я делю файлы дампа.

Как?

В противном случае есть еще одна простая в установке процедура резервного копирования, которая позволяет мне восстанавливать только 1 резервную копию на 10 секунд раньше, но без создания файла дампа каждые 10 секунд?

Ответы [ 3 ]

2 голосов
/ 15 июля 2009

Это невозможно с одним экземпляром PostgresSQL.

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

Здесь также не будет работать Slony, поскольку он не реплицирует операторы DDL, например, отбрасывает таблицу.

Я бы порекомендовалвыполняя и то, и другое:

  • продолжайте делать резервные копии pg_dump, но попробуйте сгладить его - throtle pg_dump io bandwith, поэтому он не будет калечить сервер и будет работать непрерывно - когда он завершитсязатем последняя база данных сразу начинается с первой;

  • дополнительно настраивает PITR.

Таким образом, вы можете быстро восстановить одну базу данных, ноВы можете потерять некоторые данные.Если вы решите, что не можете позволить себе потерять такое количество данных, вы можете восстановить резервную копию PITR во временную папку (с fsync = off и символической ссылкой pg_xlog на ramdisk для скорости), оттуда pg_dump затронет базу данных и восстановит ее на основнойбазы данных.

1 голос
/ 17 июля 2009

Я думаю, что вы делаете это ошибочно. У вас должна быть одна база данных с несколькими схемами и ролями. Тогда вы можете использовать PITR. Однако PITR не является заменой свалок.

1 голос
/ 15 июля 2009

Почему вы хотите разделить базы данных?

То, как работает PITR, невозможно, поскольку он работает на всем кластере. В этом случае вы можете создать каталог данных и отдельный кластер для каждой из этих баз данных (хотя и не рекомендуется, поскольку для этого потребуются разные порты и экземпляры postmaster).

Я полагаю, что преимущества использования PITR вместо обычных дампов перевешивают наличие отдельных резервных копий для каждой базы данных, поэтому, возможно, вы сможете переосмыслить причины, по которым вам нужно разделить его.

Другим способом может быть настройка репликации с помощью Slony-I , но для этого потребуется отдельный компьютер (или экземпляр), который получает данные. С другой стороны, таким образом вы получите реплицированную систему практически в реальном времени.

Обновление для комментария:

Чтобы исправить ошибки, такие как удаление таблицы, PITR был бы идеальным вариантом, поскольку вы можете воспроизводить их в определенное время. Тем не менее, для 500 баз данных я понимаю, что это может быть много накладных расходов. Slony-я бы наверное не работал, так как это тиражирование. Не уверен, как он обрабатывает удаление таблиц.

Я не знаю ни о каких других путях, по которым вы можете идти. То, что я сделал бы, вероятно, все еще будет идти на PITR и просто не делать никаких ошибок;). Помимо шуток, в зависимости от того, как часто допускаются ошибки, это может быть решением:

  • Установите его для PITR
  • второй экземпляр готов в режиме ожидания.
  • Если произошла ошибка, воспроизведите восстановление к моменту времени во втором экземпляре.
  • Выполните pg_dump для уязвимой базы данных из этого экземпляра.
  • Создайте pg_restore в производственном экземпляре для этой базы данных.

Однако для этого потребуется, чтобы у вас был готов второй экземпляр, либо на том же сервере, либо на другом (рекомендуется другой). Кроме того, время восстановления будет немного больше, поскольку вам потребуется сделать один дополнительный дамп и восстановить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...