Flashback в GBase 8c для обеспечения согласованности данных
Технология Flashback в GBase 8c является важнейшим методом обеспечения глобальной согласованности данных. Она позволяет выполнять выборочный и эффективный откат результатов зафиксированной транзакции, облегчая восстановление после человеческих ошибок. До внедрения технологии Flashback восстановление зафиксированных изменений базы данных было возможно только с помощью таких методов, как резервное копирование и PITR, что могло занять минуты или даже часы. С технологией Flashback восстановление данных до состояния до зафиксированных изменений занимает всего несколько секунд, и это время восстановления не зависит от размера базы данных.
Flashback поддерживает два режима восстановления:
- Многоверсионное восстановление данных на основе MVCC: этот режим подходит для восстановления ошибочно удаленных, обновленных или вставленных данных. Пользователи могут настроить время хранения для старых версий и выполнить соответствующий запрос или команду восстановления, чтобы восстановить данные до указанного момента времени или точки CSN.
- Восстановление на основе корзины, аналогичное системной корзине Windows: этот режим используется для восстановления таблиц, которые были ошибочно удалены или усечены. Пользователи могут настроить параметры корзины и выполнить соответствующую команду восстановления, чтобы восстановить ошибочно удаленные или усеченные таблицы.
Применение
Настройте следующие параметры:
gs_guc set -N all -I all -c "undo_zone_count=16384"
## Количество зон отмены, которые можно выделить в памяти, 0 означает, что таблицы отмены и Ustore отключены, рекомендуемое значение max_connections*4.
gs_guc set -N all -I all -c "enable_default_ustore_table=on"
## Включить поддержку по умолчанию для хранилища Ustore.
gs_guc set -N all -I all -c "version_retention_age=10000"
## Количество транзакций, для которых сохраняются старые версии, версии сверх этого количества будут очищены.
Или войдите в базу данных, чтобы изменить параметры:
ALTER SYSTEM SET undo_zone_count=16384;
ALTER SYSTEM SET enable_default_ustore_table=on;
ALTER SYSTEM SET version_retention_age=10000;
Рекомендуемые параметры корзины:
gs_guc set -N all -I all -c "enable_recyclebin=on"
## Включить корзину.
gs_guc set -N all -I all -c "recyclebin_retention_time=15min"
## Установите время хранения объектов в корзине, объекты, покинувшие этот период, будут автоматически удалены.
Перезапустите базу данных, чтобы применить изменения:
gs_om -t restart
Пример 1:
Создайте образец таблицы и вставьте данные:
postgres=# drop table if exists t1;
postgres=# create table t1(a int,b int,c int,d int);
postgres=# insert into t1 values(1,2,3,4),(21,22,23,24),(31,32,33,34);
Запросите данные:
postgres=# select * from t1;
postgres=# select current_timestamp;
pg_systimestamp
------------------------------
2021-10-12 10:03:08.272344+08
postgres=# update t1 set a=99;
postgres=# select * from t1;
a | b | c | d
----+----+----+----
99 | 2 | 3 | 4
99 | 22 | 23 | 24
99 | 32 | 33 | 34
postgres=# select snptime,snpcsn from gs_txn_snapshot where snptime between '2022-04-21 13:39:36.007842+08' and '2022-04-21 13:39:39.007842+08';
postgres=# select * from t1 timecapsule timestamp to_timestamp('2022-04-21 13:39:38.540667+08','YYYY-MM-DD HH24:MI:SS.FF');
a | b | c | d
----+----+----+----
1 | 2 | 3 | 4
21 | 22 | 23 | 24
31 | 32 | 33 | 34
postgres=# select * from t1 timecapsule csn 417232;
a | b | c | d
----+----+----+----
1 | 2 | 3 | 4
21 | 22 | 23 | 24
31 | 32 | 33 | 34
postgres=# SELECT rcyname,rcyoriginname,rcytablespace FROM GS_RECYCLEBIN;
rcyname | rcyoriginname | rcytablespace
-----------------------------+---------------+---------------
BIN$3BFF4EB403B$4C71318==$0 | t2 | 0 -- Note: Only the t2 table stored in Astore is visible; the t1 table stored in Ustore is not visible.
(1 row)
postgres=# timecapsule table t1 to before drop rename to t1_bak;
# Возвращаемое сообщение «TimeCapsule Table» указывает на успешное выполнение.
postgres=# select * from t2_bak;
id | name
----+----------
1 | t2_Tom
2 | t2_Jerry
Пример 2:
postgres=# create table t_astore(id int,col1 varchar(8)) with (storage_type=astore);
postgres=# create table t_ustore(id int,col1 varchar(8));
postgres=# insert into t_ustore values(1,'u1'),(2,'u2');
postgres=# select now();
postgres=# update t_ustore set col1='uu' where id=2;
postgres=# select now();
postgres=# delete from t_ustore;
postgres=# select now();
postgres=# select * from t_ustore ;
postgres=# select * from t_ustore timecapsule timestamp to_timestamp('2022-03-20 23:33:41','YYYY-MM-DD HH24:MI:SS.FF');
id | col1
----+------
1 | u1
2 | u2
(2 rows)
postgres=# select * from t_ustore timecapsule timestamp to_timestamp('2022-03-20 23:34:04','YYYY-MM-DD HH24:MI:SS.FF');
id | col1
----+------
1 | u1
2 | uu
(2 rows)
postgres=# select * into t from t_ustore timecapsule timestamp to_timestamp('2022-03-20 23:34:04','YYYY-MM-DD HH24:MI:SS.FF');
postgres=# select * from t;
id | col1
----+------
1 | u1
2 | uu
(2 rows)