3.1フラッシュバッククエリ
ヘンケルデータベースは、エンタープライズバージョンV5.6.1からフラッシュバッククエリ(HG_FBQ)機能(ヘンケルが特許を取得)を追加しましたが、セキュリティバージョンV4はそれをサポートしておらず、セキュリティバージョンV4.5.1はそれを完全にサポートし始めています。この章では、この機能とその操作方法について詳しく説明します。
3.1.1はじめに
フラッシュバッククエリ機能はMVCCメカニズムに基づいており、削除または更新のために送信されたデータを復元またはクエリするために使用できます。データ復旧方法は、データフラッシュバッククエリ方式に基づいており、返されたデータが復旧データとして使用されます。
全体的なアーキテクチャ図:
使用するシーン:
- データの損失や誤った操作などの軽微な問題。
- バックアップとリカバリを日常的に使用することは非効率的で時間がかかり、ビジネスを中断するためにサービスを停止する必要があります。一部のマイナーエラーの場合、変更はやり過ぎであり、修正の複雑さが増すため、このようなリカバリではフラッシュバッククエリを使用する必要があります。
- フラッシュバッククエリを使用して、ダウンタイムなしで迅速に回復します(パラメータ設定が有効になっている場合)。
- フラッシュバッククエリは、特定の時間間隔でデータの異なるバージョン間の違いを表示して、人間のデータの誤操作を防ぐこともできます。
3.1.2パラメータ設定
フラッシュバック関数に関しては、postgresql.confには3つのパラメーターがあります。
- track_commit_timestamp:
トランザクションのコミット時間の追跡を有効にして、トランザクション番号からトランザクションの終了時刻を確実に取得できるようにするには、フラッシュバック機能を有効にすることをオン(デフォルトはオフ)に設定する必要があります。変更を有効にするには、データベースを再起動する必要があります。
- HG_FBQ_RETENTION:
フラッシュバッククエリデータの保存時間。単位は秒(秒)、デフォルトは0(フラッシュバッククエリ機能なし)です。最大値は432000(5日)を超えないようにすることをお勧めします。
システムの現在時刻より前に保持されている時間値。30に設定すると、現在時刻の30秒前のデータが保存されます。このパラメーターを設定すると、この時間範囲内のデータに対して自動真空操作は許可されませんが、手動で実行できます。真空洗浄が可能です。
- HG_FBQ_GUARANTEE:
フラッシュバッククエリを有効にした後、HG_FBQ_RETENTIONパラメータ設定のデータをフラッシュバックで取得できることが保証されていますか。デフォルトはオフです。つまり、自動バキュームはこのパラメーターの時間範囲内でデータをクリーンアップすることはできませんが、手動のバキューム操作は制限されていません。
このパラメーターは、HG_FBQ_RETENTIONが0より大きい場合にのみ有効になります。
構成例:
データベース管理者を使用して以下を実行します。
ALTER SYSTEM SET track_commit_timestamp = on;
ALTER SYSTEM SET hg_fbq_retention = '43200s';
ALTER SYSTEM SET hg_fbq_guarantee = off;
注: Henco Enterprise Editionのデータベース管理者はhighgoであり、Henco SecurityEditionのデータベース管理者はsysdbaです。
データベースを再起動する必要があります。後者の2つのパラメーターが必要ない場合は、select pg_reload_conf();を実行するだけです。
3.1.3テストインスタンスを作成する
ユーザー、データベース、およびスキーマを作成します。
create user test password 'Hello@1234';
create database testdb with owner=test template=template0 encoding=utf8 connection limit=100;
\c testdb
create schema test authorization test;
\c testdb test
テーブルオブジェクトを作成し、データベースに挿入します。
CREATE TABLE EMPLOYEES (
emp_no INT NOT NULL , /*员工编号*/
emp_name VARCHAR(60) NOT NULL , /*姓名*/
gender VARCHAR(10) NOT NULL , /*性别*/
birth_date VARCHAR(10) NOT NULL , /*生日*/
hire_date VARCHAR(10) NOT NULL , /*入职时间*/
PRIMARY KEY (emp_no)
);
INSERT INTO EMPLOYEES VALUES (10001,'刘亦菲','女','1953-09-02','1986-06-26');
INSERT INTO EMPLOYEES VALUES (10002,'房祖名','男','1953-09-02','1985-11-21');
INSERT INTO EMPLOYEES VALUES (10003,'郭雪芙','女','1953-09-02','1986-08-28');
INSERT INTO EMPLOYEES VALUES (10004,'陈晓','女','1953-09-02','1986-12-01');
INSERT INTO EMPLOYEES VALUES (10005,'黄子韬','女','1953-09-02','1989-09-12');
INSERT INTO EMPLOYEES VALUES (10006,'肖战','男','1953-09-02','1989-06-02');
INSERT INTO EMPLOYEES VALUES (10007,'蔡徐坤','男','1953-09-02','1989-02-10');
INSERT INTO EMPLOYEES VALUES (10008,'杨幂','女','1953-09-02','1994-09-15');
INSERT INTO EMPLOYEES VALUES (10009,'陈伟霆','男','1953-09-02','1985-02-18');
INSERT INTO EMPLOYEES VALUES (10010,'邓紫棋','男','1953-09-02','1989-08-24');
3.1.4文法構造
ある時点のデータを、その時点とトランザクション番号に従ってクエリできます。
- 指定された時点のクエリ構文:
SELECT column_name[ , … ] FROM table_name
[ FLASHBACK TIMESTAMP expression ]
[ WHERE condition ];
- トランザクション番号を指定するためのクエリ構文:
SELECT column_name[ , … ] FROM table_name
[ FLASHBACK XID expression ]
[ WHERE condition ];
期間とトランザクション番号のセクションに基づいて、特定の範囲のデータをクエリすることもできます。
- 指定された期間のクエリ構文:
SELECT column_name[ , … ] FROM table_name
[ FLASHBACK BETWEEN TIMESTAMP expression1 AND expression2 ]
[ WHERE condition ];
- トランザクション番号セグメントを指定するためのクエリ構文:
SELECT column_name[ , … ] FROM table_name
[ FLASHBACK BETWEEN XID expression1 AND expression2 ]
[ WHERE condition ];
3.1.5ベストプラクティス
データの履歴バージョンを表示したいのですが、正確なトランザクションIDまたは対応するタイムスタンプがわからない場合があります。おおよその時間を見積もり、期間に応じてすべてのデータ行バージョンを見つけることができます(12時間以内にデータを設定します)。
testdb=> select xmin, xmax, * from employees FLASHBACK BETWEEN TIMESTAMP '2021-01-23 21:00:00' AND '2021-01-24 00:05:00';
xmin | xmax | emp_no | emp_name | gender | birth_date | hire_date
------+------+--------+----------+--------+------------+------------
502 | 0 | 10009 | 陈伟霆 | 男 | 1953-09-02 | 1985-02-18
503 | 0 | 10010 | 邓紫棋 | 男 | 1953-09-02 | 1989-08-24
505 | 506 | 10007 | 蔡徐坤 | 男 | 2000-01-02 | 1989-02-10
506 | 507 | 10007 | 蔡徐坤 | 男 | 2000-01-02 | 1989-02-10
507 | 508 | 10007 | 蔡徐坤 | 男 | 2000-12-25 | 1989-02-10
508 | 0 | 10007 | 蔡徐坤 | 男 | 1975-01-01 | 1989-02-10
10007には複数のバージョンのデータ行があることがわかります。正しい範囲の時間が最新のトランザクション時間である場合、xminが最大の時間は現在の行です(xmaxは、現在の行によって実行された最後のトランザクションIDのみです。トランザクションが成功したかどうかの。)
xminが506のバージョンのデータを使用する場合は、次のステートメントを実行します。
testdb=> select xmin, xmax, * from employees FLASHBACK xid 506 where emp_no='10007';
xmin | xmax | emp_no | emp_name | gender | birth_date | hire_date
------+------+--------+----------+--------+------------+------------
506 | 507 | 10007 | 蔡徐坤 | 男 | 2000-01-02 | 1989-02-10
(1 row)
目的のデータ行バージョンを取得して、データの復元などの次の手順に進むことができます。
現在、フラッシュバッククエリ関数はDML(挿入、更新、および削除)操作のフラッシュバッククエリのみを実行できます。テーブルに対するDDLおよび切り捨て操作の場合、フラッシュバッククエリは現在サポートされていません。さらに、フラッシュバッククエリは、テーブル構造による変更操作をサポートしていません。