这是本节的多页打印视图。
点击此处打印.
返回本页常规视图.
清除删除的数据
在 Vertica 中,删除操作不会从物理存储中移除行。 DELETE 会将行标记为已删除,UPDATE 也是如此,后者会合并删除和插入操作。在这两种情况下,Vertica 都会将丢弃的行保留为历史数据,在清除这些历史数据之前,仍然可通过历史查询访问这些数据。
保留历史数据的成本有双部分:
清除操作将从物理存储中永久移除历史数据,并释放磁盘空间供重复使用。只有
Ancient History Mark (AHM) 之前的历史数据才符合清除条件。
可以通过两种方式清除数据:
在这两种情况下,Vertica 都会清除直到并包括 AHM 时期的所有历史数据,然后重置 AHM。有关 Vertica 如何使用时期的详细信息,请参阅时期。
当心
大型删除和清除操作可能需要很长时间才能完成,因此请谨慎使用它们。如果应用程序需要定期(例如按月或按年)删除数据,请考虑设计利用
表分区的表。如果分区不适合,请考虑
重新构建表。
1 - 设置清除策略
清除数据的首选方法是建立一个策略来确定哪个已删除的数据符合清除条件。当
Tuple Mover 执行
合并操作时,会自动清除符合条件的数据。
Vertica 提供了两种方法用于确定已删除的数据何时符合清除条件:
指定保存删除数据的时间
指定保存删除数据的时间是确定可以清除哪些已删除数据的首选方法。默认情况下,仅当节点处于关闭状态时,Vertica 才会保存历史数据。
要更改保存已删除数据的指定时间,请使用 HistoryRetentionTime
配置参数:
=> ALTER DATABASE DEFAULT SET HistoryRetentionTime = {seconds | -1};
在上述语法中:
以下示例将历史时期保留级别设置为 240 秒:
=> ALTER DATABASE DEFAULT SET HistoryRetentionTime = 240;
指定保存的时期数
除非您有理由限制时期数,否则 Vertica 建议您指定保存删除数据的时间。
要通过 HistoryRetentionEpochs
配置参数指定保存的历史时期数:
-
关闭 HistoryRetentionTime
配置参数:
=> ALTER DATABASE DEFAULT SET HistoryRetentionTime = -1;
-
通过 HistoryRetentionEpochs
配置参数设置历史时期保留级别:
=> ALTER DATABASE DEFAULT SET HistoryRetentionEpochs = {num_epochs | -1};
以下示例将要保存的历史时期数设置为 40:
=> ALTER DATABASE DEFAULT SET HistoryRetentionEpochs = 40;
将立即在数据库群集内的所有节点上实施修改。您无需重新启动数据库。
注意
如果同时指定了 HistoryRetentionTime
和 HistoryRetentionEpochs
,则优先使用 HistoryRetentionTime
。
有关更多详细信息,请参阅时期管理参数。有关 Vertica 如何使用时期的信息,请参阅时期。
禁用清除
如果要保留所有历史数据,可按以下方式将历史时期保留参数的值设置为 -1:
=> ALTER DABABASE mydb SET HistoryRetentionTime = -1;
=> ALTER DATABASE DEFAULT SET HistoryRetentionEpochs = -1;
2 - 手动清除数据
可以按如下方式手动清除已删除的数据:
-
设置清除已删除数据的截止日期。首先,调用以下函数之一以验证当前的 Ancient History Mark (
AHM):
-
使用以下函数之一将 AHM 设置为所需的截止日期:
如果调用 SET_AHM_TIME
,请记住指定的时间戳将映射到默认具有三分钟粒度的时期。因此,如果将 AHM 时间指定为 2008-01-01 00:00:00.00
,则 Vertica 可能会清除 2008 年前三分钟的数据,或保留 2007 年最后三分钟的数据。
注意
不能将 AHM 推进到 Vertica 无法为故障节点恢复数据的时间点。
-
使用以下函数之一从所需的投影中清除已删除的数据:
Tuple Mover 执行
合并操作以清除数据。Vertica 会定期调用 Tuple Mover 以执行合并操作,如 Tuple Mover 参数所配置的那样。可以通过调用函数
DO_TM_TASK
来手动调用 Tuple Mover。
当心
手动清除操作可能需要较长时间。
有关 Vertica 如何使用时期的详细信息,请参阅时期。