时期生命周期

时期生命周期由一系列里程碑组成,使您能够执行各种操作并管理数据库的状态。

Vertica 提供时期管理参数函数,以便您可以检索和调整时期值。此外,请参阅配置时期获取有关如何为特定用例设置时期的建议。

当前时期 (CE)

包含您当前写入数据库的所有未提交更改的开放时期。当前时期存储在 SYSTEM 系统表中:

=> SELECT CURRENT_EPOCH FROM SYSTEM;
 CURRENT_EPOCH
---------------
         71
(1 row)

以下示例演示了当您提交数据时当前时期如何前进:

  1. 查询 SYSTEM 系统表以返回当前时期:

    => SELECT CURRENT_EPOCH FROM SYSTEM;
     CURRENT_EPOCH
    ---------------
             71
    (1 row)
    

    当前时期是开放时期,这意味着它是您当前正在向其中写入数据的时期。

  2. 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)
    
  3. 提交数据,然后再次查询该表。提交的数据与时期 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)
    
  4. 再次查询 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 根据您的 HistoryRetentionTimeHistoryRetentionEpochsAdvanceAHMInterval 参数设置前进。默认情况下,AHM 每 180 秒前进一次,直到等于 LGE。这有助于减少保存到时期映射的时期数量,从而减小编录大小。AHM 无法超越 LGE。

AHM 充当从物理磁盘清除数据的截止时期。随着 AHM 前进,Tuple Mover 合并过程会清除属于 AHM 之前时期的所有已删除数据。有关自动或手动清除的详细信息,请参阅清除删除的数据