Подразумевается, что в эксперименте участвуют 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 deletetestdb3
Шаг 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
#### Вспомним, после снапшота мы имели:
База 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();
Проверяем базы и наличие данных в них на обоих серверах
Пробуем создать новые данные и базы, все должно работать
Комментарии пользователей
Эту новость ещё не комментировалиНаписать комментарий
Анонимам нельзя оставоять комментарии, зарегистрируйтесь!