Образовательный проект «SnakeProject» Михаила Козлова

Навигация

⇒ FreeBSD and Nix ⇐

CISCO

Voice(Asterisk\Cisco)

Microsoft

Powershell

Python

SQL\T-SQL

Общая

WEB Разработка

ORACLE SQL \ JAVA

Мото

Стрельба, пневматика, оружие

Саморазвитие и психология


Восстановление баз PostgreSQL (со SLAVE)


 

Восстановление баз PostgreSQL (со SLAVE)


Имеем два сервера FreeBSD с PostgreSQL

10.0.2.5 - Master
10.0.2.8 - Slave

Репликация настроена master - slave

Файловая система на slave - zfs

Создано 2 базы с тестовыми данными

Создан снапшот на zfs, когда обе базы отреплицированы


Как настроить PostgreSQL репликацию master - slave:
http://snakeproject.ru/rubric/article.php?art=freebsd_postgresql_master_slave_replication_19.06.18


Как сделать снапшот zfs:
http://snakeproject.ru/rubric/article.php?art=freebsd_gpart_zfs


Подразумевается, что в эксперименте участвуют 2 базы с таблицей и начальными данными:
testdb1
testdb2

create database testdb1;
\c testdb1;
create table testtable (id serial, data text);
insert into testtable(id, data) values (1, 'before delete testdb1');

create database testdb2;
\c testdb2;
create table testtable (id serial, data text);
insert into testtable(id, data) values (1, 'before delete testdb2');


Внимание! Считается, что на слейве снапшот сделан на этом шаге!
zfs snapshot zroot/data@11-10-2018


Поехали, план таков:
1. Удаляем одну из баз на мастере, создаем новые данные, проверяем
2. На слейве база пропадаетб новые данные появляются
3. Останавливаем сервера PostgreSQL
4. Восстанавливаем слэйв из снапшота
5. Переносим файлы базы с слейва на мастер
6. Запускаем сервера PostgreSQL
7. Проверяем репликацию


Шаг 1

На мастере:
su postgres
psql
drop database testdb1;

\l

\c testdb2;
insert into testtable(id, data) values (2, 'after delete testdb2');
create table testtable2 (id serial, data text);
insert into testtable2(id, data) values (1, 'before delete testdb2');
delete from testtable where id=1;

create database testdb3;
\c testdb3;
create table testtable3 (id serial, data text);
insert into testtable3(id, data) values (1, 'after delete testdb3');

Итого проверяем:

\l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 testdb2   | postgres | UTF8     | C       | C     |
 testdb3   | postgres | UTF8     | C       | C     |
(5 rows)


\c testdb2;
\dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | testtable  | table | postgres
 public | testtable2 | table | postgres
(2 rows)


select * from testtable;
 id |         data
----+----------------------
  2 | after delete testdb2
(1 row)


select * from testtable2;
 id |         data
----+-----------------------
  1 | before delete testdb2
(1 row)


\c testdb3;
\dt
           List of relations
 Schema |    Name    | Type  |  Owner
--------+------------+-------+----------
 public | testtable3 | table | postgres
(1 row)

select * from testtable3;
 id |         data
----+----------------------
  1 | after delete testdb3
(1 row)


Итог:
База testdb1 - отсутствует

База testdb2 - присутствует, имеет таблицы testtable и testtable2
Таблица testtable - имеет записи 2, after delete testdb2
Таблица testtable2 - имеет записи 1, before delete testdb2

База testdb3 - присутствует, имеет таблицу testtable3
Таблица testtable3 - имеет записи 1, after delete testdb3

Шаг 2

На слейве:
su postgres
psql

\l
\c testdb2;
\dt
select * from testtable;
select * from testtable2;
\c testdb3;
\dt
select * from testtable3;

На слейве все должно совпадать с выводом на мастере!


Шаг 3

На обоих:
service postgresql stop


Шаг 4

На слейве ():
zfs list -t snapshot
NAME                    USED  AVAIL  REFER  MOUNTPOINT
zroot/data@11-10-2018  2.71M      -  12.7M  -

zfs rollback zroot/data@11-10-2018


Шаг 5

На мастере:
ls -l /data/db/base/
total 43
drwx------  2 postgres  postgres  270 Oct 11 13:41 1
drwx------  2 postgres  postgres  270 Oct 11 13:41 12757
drwx------  2 postgres  postgres  271 Oct 11 16:33 12758
drwx------  2 postgres  postgres  279 Oct 11 16:37 24691
drwx------  2 postgres  postgres  275 Oct 11 16:37 24710

На слейве:
ls -l /data/db/base/
total 43
drwx------  2 postgres  postgres  270 Oct 11 13:46 1
drwx------  2 postgres  postgres  270 Oct 11 13:46 12757
drwx------  2 postgres  postgres  271 Oct 11 16:33 12758
drwx------  2 postgres  postgres  274 Oct 11 16:35 24681
drwx------  2 postgres  postgres  274 Oct 11 16:35 24691


Вывод:
Удаленная база была с oid - 24681


Копируем удаленную базу и логи:
scp -r /data/db/base/24681 user@10.0.2.5:/home/user/
scp -r /data/db/pg_xlog user@10.0.2.5:/home/user/
scp -r /data/db/pg_clog user@10.0.2.5:/home/user/
scp -r /data/db/global user@10.0.2.5:/home/user/


На мастере:
cp -R /home/user/24681 /data/db/base/
cp -R /home/user/pg_xlog /data/db/
cp -R /home/user/pg_clog /data/db/
cp -R /home/user/global /data/db/

chown -R postgres:postgres /data/db

На обоих:
service postgresql start

su postgres
psql


#### Вспомним, после снапшота мы имели:
База testdb1 - присутствует, имеет таблицу testtable
Таблица testtable - имеет записи 1, before delete testdb1

База testdb2 - присутствует, имеет таблицу testtable
Таблица testtable - имеет записи 1, before delete testdb2
###


### Вспомним, после манипуляций мы имели:
База testdb1 - отсутствует

База testdb2 - присутствует, имеет таблицы testtable и testtable2
Таблица testtable - имеет записи 2, after delete testdb2
Таблица testtable2 - имеет записи 1, before delete testdb2

База testdb3 - присутствует, имеет таблицу testtable3
Таблица testtable3 - имеет записи 1, after delete testdb3
###


Проверяем:
\l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 testdb1   | postgres | UTF8     | C       | C     |
 testdb2   | postgres | UTF8     | C       | C     |
(5 rows)


\c testdb1;
\dt
           List of relations
 Schema |   Name    | Type  |  Owner
--------+-----------+-------+----------
 public | testtable | table | postgres
(1 row)


select * from testtable;
 id |         data
----+-----------------------
  1 | before delete testdb1
(1 row)

 

\c testdb2;
\dt
           List of relations
 Schema |   Name    | Type  |  Owner
--------+-----------+-------+----------
 public | testtable | table | postgres
(1 row)


select * from testtable;
 id |         data
----+-----------------------
  1 | before delete testdb2
(1 row)


На слейве все должно совпадать с выводом на мастере!


Вывод:
При восстановлении из снапшота и копировании:
1. Папки базы данных
2. pg_xlog
3. pg_clog
4. global

Мы получили состояние на момент снапшота и снова работающую репликацию

Данные после снапшота не сохранятся
Выход - перед копированием забэкапить нужные базы на мастере pg_dump`ом
Восстановить их после запуска серверов


Второй вариант, можно поробовать после удаления бд и внесения новых данных:
Поставить репликацию на паузу
ПОднять снапшот на слейве
Сделать бэкап pg_dump`ом и восстановить базу из дампа


Делаем Шаг 1 и Шаг 2

Шаг 3

На мастере:
service postgresql stop


На слейве:

Останавливаем и откатываемся на снапшот:
service postgresql stop

zfs rollback zroot/data@11-10-2018

Стартуем и ставим на паузу репликацию:
service postgresql start && su postgres

psql
select pg_xlog_replay_pause();

 

На мастере:

Создаем пустую базу со старым именем testdb1:

service postgresql start

su postgres
psql
create database testdb1;


На слейве:

Дампим базу на состоянии снапшота и восстанавливаем на мастере:
pg_dump -C -h 127.0.0.1 -U postgres testdb1 | psql -h 10.0.2.5 -U postgres testdb1


Снимаем с паузы репликацию PostgreSQL:
psql
select pg_xlog_replay_resume();


Проверяем базы и наличие данных в них на обоих серверах
Пробуем создать новые данные и базы, все должно работать


Комментарии пользователей

Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!

Контакты Группа ВК Сборник материалов по Cisco, Asterisk, Windows Server, Python и Django, SQL и T-SQL, FreeBSD и LinuxКод обмена баннерами Видео к IT статьям на YoutubeВидео на другие темы Смотреть
Мои друзья: Советы, помощь, инструменты для сис.админа, статическая и динамическая маршрутизация, FreeBSD

© Snakeproject.ru создан в 2013 году.
При копировании материала с сайта - оставьте ссылку.

Рейтинг@Mail.ru
Рейтинг@Mail.ru Яндекс.Метрика





Поддержать автора и проект