时期生命周期
时期生命周期由一系列里程碑组成,使您能够执行各种操作并管理数据库的状态。
注意
根据您的配置,单个时期可以代表最新时期、上一个完好的时期、检查点时期和 Ancient History Mark。Vertica 提供时期管理参数和函数,以便您可以检索和调整时期值。此外,请参阅配置时期获取有关如何为特定用例设置时期的建议。
当前时期 (CE)
包含您当前写入数据库的所有未提交更改的开放时期。当前时期存储在 SYSTEM
系统表中:
=> SELECT CURRENT_EPOCH FROM SYSTEM;
CURRENT_EPOCH
---------------
71
(1 row)
以下示例演示了当您提交数据时当前时期如何前进:
-
查询
SYSTEM
系统表以返回当前时期:=> SELECT CURRENT_EPOCH FROM SYSTEM; CURRENT_EPOCH --------------- 71 (1 row)
当前时期是开放时期,这意味着它是您当前正在向其中写入数据的时期。
-
向
orders
表中插入行:=> INSERT INTO orders VALUES ('123456789', 323426, 'custacct@example.com'); OUTPUT -------- 1 (1 row)
每行数据都有一个隐含的时期列,用于存储该行的提交时期。您刚刚插入到表中的行没有提交,因此
epoch
列是空白的:=> SELECT epoch, orderkey, custkey, email_addrs FROM orders; epoch | orderkey | custkey | email_addrs -------+-----------+---------+---------------------- | 123456789 | 323426 | custacct@example.com (1 row)
-
提交数据,然后再次查询该表。提交的数据与时期
71
(即先前从SYSTEM
系统表返回的当前时期)相关联:=> COMMIT; COMMIT => SELECT epoch, orderkey, custkey, email_addrs FROM orders; epoch | orderkey | custkey | email_addrs -------+-----------+---------+---------------------- 71 | 123456789 | 323426 | custacct@example.com (1 row)
-
再次查询
SYSTEMS
表以返回当前时期。当前时期高 1 个整数:=> SELECT CURRENT_EPOCH FROM SYSTEM; CURRENT_EPOCH --------------- 72 (1 row)
最新时期 (LE)
最近封闭的时期。在提交操作之后,当前时期成为最新时期。
LE 是存储在 EPOCHS 系统表中的最近的时期:
=> SELECT * FROM EPOCHS;
epoch_close_time | epoch_number
-------------------------------+--------------
2020-07-27 14:29:49.687106-04 | 91
2020-07-28 12:51:53.291795-04 | 92
(2 rows)
检查点时期 (CPE)
仅在企业模式下有效。每个节点都有一个检查点时期,这是该节点上的数据在所有投影之间保持一致的最近一个时期。当数据库以最佳方式运行时,检查点时期等于 LE,它总是比当前时期早一个时期。
在节点故障和恢复期间使用检查点时期。当单个节点发生故障时,该节点会尝试从其他节点重建超出其检查点时期的数据。如果故障节点无法使用这些时期中的任何一个时期来恢复数据,则故障节点将使用检查点时期来恢复数据。
使用 PROJECTION_CHECKPOINT_EPOCHS 来查询有关检查点时期的信息。以下查询返回有关用来存储 orders
投影的节点上的检查点时期的信息:
=> SELECT checkpoint_epoch, node_name, projection_name, is_up_to_date, would_recover, is_behind_ahm
FROM PROJECTION_CHECKPOINT_EPOCHS WHERE projection_name ILIKE 'orders_b%';
checkpoint_epoch | node_name | projection_name | is_up_to_date | would_recover | is_behind_ahm
------------------+------------------+-----------------+---------------+---------------+---------------
92 | v_vmart_node0001 | orders_b1 | t | f | f
92 | v_vmart_node0001 | orders_b0 | t | f | f
92 | v_vmart_node0003 | orders_b1 | t | f | f
92 | v_vmart_node0003 | orders_b0 | t | f | f
92 | v_vmart_node0002 | orders_b0 | t | f | f
92 | v_vmart_node0002 | orders_b1 | t | f | f
(6 rows)
此查询确认数据库时期正在以正确方式前进。当上一个完好的时期 (LGE) 等于 CPE 时,would_recover
列显示 f
,因为 Vertica 会尽可能优先考虑 LGE 进行恢复。is_behind_ahm
列显示检查点时期是否在 AHM 之后。在数据库或节点出现故障时,早于 Ancient History Mark (AHM) 的时期中的任何数据都不可恢复。
上一个完好的时期 (LGE)
数据在群集中的所有节点之间保持一致的最小检查点时期。每个节点都有一个 LGE,Vertica 评估每个节点的 LGE 以确定群集 LGE。群集的 LGE 存储在 SYSTEM
系统表中:
=> SELECT LAST_GOOD_EPOCH FROM SYSTEM;
LAST_GOOD_EPOCH
-----------------
70
(1 row)
您可以通过查询预期恢复时期来检索每个节点的 LGE:
=> SELECT GET_EXPECTED_RECOVERY_EPOCH();
INFO 4544: Recovery Epoch Computation:
Node Dependencies:
011 - cnt: 21
101 - cnt: 21
110 - cnt: 21
111 - cnt: 9
001 - name: v_vmart_node0001
010 - name: v_vmart_node0002
100 - name: v_vmart_node0003
Nodes certainly in the cluster:
Node 0(v_vmart_node0001), epoch 70
Node 1(v_vmart_node0002), epoch 70
Filling more nodes to satisfy node dependencies:
Data dependencies fulfilled, remaining nodes LGEs don't matter:
Node 2(v_vmart_node0003), epoch 70
--
GET_EXPECTED_RECOVERY_EPOCH
-----------------------------
70
(1 row)
因为 LGE 是磁盘上所有最近数据的快照,所以使用它从数据库故障中恢复。管理工具使用 LGE 手动重置数据库。如果您在非正常关闭后从数据库故障中恢复,Vertica 会在重新启动期间提示您接受使用 LGE 进行恢复。
Ancient history mark (AHM)
包含历史查询可访问的数据的最旧时期。AHM 存储在 SYSTEM
系统表中:
=> SELECT AHM_EPOCH FROM SYSTEM;
AHM_EPOCH
-----------
70
(1 row)
AHM 之前的时期不可用于历史查询。以下示例返回 AHM,然后在执行早于 AHM 的历史查询时返回错误:
=> SELECT GET_AHM_EPOCH();
GET_AHM_EPOCH
---------------
93
(1 row)
=> AT EPOCH 92 SELECT * FROM orders;
ERROR 3183: Epoch number out of range
HINT: Epochs prior to [93] do not exist. Epochs [94] and later have not yet closed
AHM 根据您的 HistoryRetentionTime
、HistoryRetentionEpochs
和 AdvanceAHMInterval
参数设置前进。默认情况下,AHM 每 180 秒前进一次,直到等于 LGE。这有助于减少保存到时期映射的时期数量,从而减小编录大小。AHM 无法超越 LGE。
AHM 充当从物理磁盘清除数据的截止时期。随着 AHM 前进,Tuple Mover 合并过程会清除属于 AHM 之前时期的所有已删除数据。有关自动或手动清除的详细信息,请参阅清除删除的数据。