跳到主要内容

闪回查询

seekdb 提供了记录级别的闪回查询(Flashback Query)功能,该功能允许用户获取某个历史版本的数据。支持通过 AS OF SNAPSHOT 语法来查询。

seekdb 当前支持用户通过设置配置项 undo_retention 的方式来进行闪回查询。当用户设置 undo_retention 后,即可使用闪回查询功能查询 T - undo_retention 到当前时间 T 时间范围内的任意多版本数据。配置项 undo_retention 的默认值为 1800,单位为秒,有关配置项 undo_retention 的更多信息,参见 undo_retention

注意事项

使用配置项 undo_retention 进行闪回查询时,需要注意以下事项:

  • 假设 undo_retention 设置的时间为 T0,设置后对 T0 之前的数据不起作用,对 T0 之后的数据才起作用。

  • 如果被查询的表已经被删除进了回收站,则需要先将该表从回收站中恢复。

    关于恢复回收站对象的相关操作,参见 恢复回收站对象

  • 假设当前时间为 T,设置 undo_retention 后,如果在 T - undo_retention 时间段内有 DDL 操作,则:

    • 对于添加列操作,闪回查询操作发生前的数据时,所有新添加的列均为 Default 值。

    • 对于创建表、删除表或删除列等操作,闪回查询操作发生前的数据时,系统会报错。

  • 闪回查询需要额外的存储空间来保留历史数据,如果调大 undo_retention 会导致存储空间的放大。建议调大 undo_retention 后,留意存储空间的变化。

前提条件

在通过配置项 undo_retention 进行闪回查询前,需要先修改 undo_retention 的值。undo_retention 的默认值为 1800,单位为秒。

  1. 管理员 root 登录到 seekdb。

    连接示例如下,连接数据库时请以实际环境为准。

    mysql -h127.0.0.1 -uroot -P2881
  2. 执行以下语句,修改配置项 undo_retention 的值。

    示例如下:

    ALTER SYSTEM SET undo_retention=900;

    有关级配置项 undo_retention 的更多信息,参见 undo_retention

执行闪回查询

  1. 登录到 seekdb。

    连接示例如下,连接数据库时请以实际环境为准。

    mysql -h127.0.0.1 -uroot -P2881
  2. 对表执行闪回查询。

    假设当前 undo_retention 设置的值为 900,用户有一个表 table1。通过 AS OF SNAPSHOT 指定历史时间并闪回查询单表在该历史时间点的状态的数据的示例如下:

    SELECT * FROM table1 AS OF SNAPSHOT 1597306800000000000;

    其中,1597306800000000000 为时间戳,单位为纳秒。时间戳的起点时间为北京时间 1970 年 08 点 00 分 00 秒。您可以根据需要将待查询的时间转换为时间戳格式。

    例如,本示例中,需要闪回查询 2020 年 08 月 13 日 16 点 20 分 00 秒的表数据,转换时间的方法如下:

    SELECT time_to_usec('2020-08-13 16:20:00') * 1000;
    +--------------------------------------------+
    | time_to_usec('2022-01-01 00:00:00') * 1000 |
    +--------------------------------------------+
    | 1597306800000000000 |
    +--------------------------------------------+
    1 row in set