此部分包含 Vertica 专用的时期管理函数。
时期函数
- 1: ADVANCE_EPOCH
- 2: GET_AHM_EPOCH
- 3: GET_AHM_TIME
- 4: GET_CURRENT_EPOCH
- 5: GET_LAST_GOOD_EPOCH
- 6: MAKE_AHM_NOW
- 7: SET_AHM_EPOCH
- 8: SET_AHM_TIME
1 - ADVANCE_EPOCH
手动关闭当前时期并开始新的时期。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
ADVANCE_EPOCH ( [ integer ] )
参数
integer
- 指定要推进的时期数。
超级用户
注意
维护此函数主要是为了实现与 Vertica 较早版本的向后兼容性。
示例
以下命令将以 1 为增量递增时期编号:
=> SELECT ADVANCE_EPOCH(1);
2 - GET_AHM_EPOCH
返回 Ancient History Mark 所在 时期的编号。可以从物理存储中清除截至 AHM 时期(包括该时期)删除的数据。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_AHM_EPOCH()
注意
默认情况下(禁用清除),AHM 时期为 0(零)。特权
无
示例
=> SELECT GET_AHM_EPOCH();
GET_AHM_EPOCH
----------------------
Current AHM epoch: 0
(1 row)
3 - GET_AHM_TIME
返回代表 Ancient History Mark 的 TIMESTAMP 值。可以从物理存储中清除截至 AHM 时期(包括该时期)删除的数据。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_AHM_TIME()
特权
无
示例
=> SELECT GET_AHM_TIME();
GET_AHM_TIME
-------------------------------------------------
Current AHM Time: 2010-05-13 12:48:10.532332-04
(1 row)
4 - GET_CURRENT_EPOCH
当前正在将数据(COPY、INSERT、UPDATE 和 DELETE 操作)写入到的时期。
返回当前时期的编号。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_CURRENT_EPOCH()
特权
无
示例
=> SELECT GET_CURRENT_EPOCH();
GET_CURRENT_EPOCH
-------------------
683
(1 row)
5 - GET_LAST_GOOD_EPOCH
返回 上一个完好的时期的编号。如果数据库没有投影,此函数将返回错误。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
GET_LAST_GOOD_EPOCH()
特权
无
示例
=> SELECT GET_LAST_GOOD_EPOCH();
GET_LAST_GOOD_EPOCH
---------------------
682
(1 row)
6 - MAKE_AHM_NOW
将 Ancient History Mark (AHM) 设置为允许的最大值。这使您可以清除所有已删除的数据。
当心
运行此函数后,将无法查询当前时期之前的历史数据。只有数据库管理员才能使用此函数。MAKE_AHM_NOW
执行以下操作:
-
推进时间。
-
将 AHM 设置为 上一个完好的时期 (LGE),至少设置为执行
MAKE_AHM_NOW
时的当前时期。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
MAKE_AHM_NOW ( [ true ] )
参数
- true
- 当以下条件之一为 true 时,允许 AHM 推进:
-
一个或多个节点发生故障。
-
一个投影正在通过另一个投影进行刷新(保留刷新)。
在这两种情况下,必须将此实参提供给
MAKE_AHM_NOW
,否则 Vertica 会返回错误。如果在保留刷新期间执行MAKE_AHM_NOW(true)
,Vertica 将回滚刷新操作并推进 AHM。当心
如果函数将 AHM 推进到超过故障节点的上一个完好的时期,则这些节点必须从头开始恢复所有数据。 -
超级用户
在节点发生故障时设置 AHM
如果群集中的任何节点发生故障,则必须使用 true 实参调用 MAKE_AHM_NOW
;否则,函数将返回错误。
注意
此要求仅适用于企业模式;在 Eon 模式下,它将被忽略。在以下示例中,即使节点发生故障,MAKE_AHM_NOW
仍会推进 AHM:
=> SELECT MAKE_AHM_NOW(true);
WARNING: Received no response from v_vmartdb_node0002 in get cluster LGE
WARNING: Received no response from v_vmartdb_node0002 in get cluster LGE
WARNING: Received no response from v_vmartdb_node0002 in set AHM
MAKE_AHM_NOW
------------------------------
AHM set (New AHM Epoch: 684)
(1 row)
另请参阅
7 - SET_AHM_EPOCH
将 Ancient History Mark (AHM) 设置为指定的时期。此函数允许从物理存储中清除已删除数据,包括 AHM 时期。
SET_AHM_EPOCH
通常用于测试。相反,请考虑使用
SET_AHM_TIME
,此函数更易于使用。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
SET_AHM_EPOCH ( epoch, [ true ] )
参数
- epoch
- 指定下列内容之一:
-
设置 AHM 所在的时期数
-
零 (0)(默认值)表示禁用 PURGE
-
- true
- 允许 AHM 在节点关闭时推进。
超级用户
在节点发生故障时设置 AHM
如果群集中的任何节点发生故障,则必须使用 true 实参调用 SET_AHM_EPOCH
;否则,函数将返回错误。
注意
此要求仅适用于企业模式;在 Eon 模式下,它将被忽略。示例
以下命令可将 AHM 设置为数量为 12 的指定时期:
=> SELECT SET_AHM_EPOCH(12);
以下命令可将 AHM 设置为数量为 2 的指定时期,并且允许在节点发生故障时推进:
=> SELECT SET_AHM_EPOCH(2, true);
另请参阅
8 - SET_AHM_TIME
将
Ancient History Mark (AHM) 设置为与启动程序节点上指定时间相对应的时期。此函数允许从物理存储中清除历史数据,包括 AHM 时期。 SET_AHM_TIME
返回一个表示 AHM 时期终点的 TIMESTAMPTZ。
这是元函数。您必须在顶级 SELECT 语句中调用元函数。
行为类型
易变语法
SET_AHM_TIME ( time, [ true ] )
参数
- time
- 会自动转换为相应时期数的 TIMESTAMP/TIMESTAMPTZ 值。
- true
- 允许 AHM 在节点关闭时推进。
超级用户
在节点发生故障时设置 AHM
如果群集中的任何节点发生故障,则必须使用 true 实参调用 SET_AHM_TIME
;否则,函数将返回错误。
注意
此要求仅适用于企业模式;在 Eon 模式下,它将被忽略。示例
时期取决于配置的时期推进间隔。如果一个时期包含三分钟的时间范围,则清除操作仅精确到指定时间戳前三分钟内:
=> SELECT SET_AHM_TIME('2008-02-27 18:13');
set_ahm_time
------------------------------------
AHM set to '2008-02-27 18:11:50-05'
(1 row)
注意
输出字符串的 –05 部分是时区值,即 UTC(协调世界时,习惯上称为格林威治标准时间或 GMT)的偏移量(以小时为单位)。在上一示例中,AHM 时期实际于 18:11:50 结束,大约是指定时间戳前一分钟。这是因为 SET_AHM_TIME 选择了在指定时间戳或之前结束的时期。它没有选择在指定时间戳之后结束的时期,因为这样会清除 AHM 之后三分钟的已删除数据。
例如,在仅使用小时和分钟的情况下,假设时期 9000 从 08:50 运行至 11:50,时期 9001 从 11:50 运行至 15:50。 SET_AHM_TIME('11:51')
选择时期 9000,因为要在指定时间戳前一分钟左右结束。
在下一个示例中,假设某个节点在 2017 年 1 月 1 日上午 11:00:00 发生故障。中午,您将 AHM 推进到 11:15:00,但节点仍处于故障状态。
假设您尝试使用以下命令设置 AHM:
=> SELECT SET_AHM_TIME('2017-01-01 11:15:00');
然后您将收到一条错误消息。Vertica 会阻止您将 AHM 移动到超过节点出现故障的位置。Vertica 返回此错误以防止将 AHM 推进到超过故障节点的上一个完好的时期。您可以通过提供可选的其他参数来强制执行 AHM 推进:
=> SELECT SET_AHM_TIME('2017-01-01 11:15:00', true);
但是,如果强制 AHM 超过上一个完好的时期,则故障节点将不得不从头开始恢复。