向早于时间点恢复日志端点的时间进行时间点恢复将创建替代数据库时间线。后续时间点恢复操作可在任何现有时间线上进行
替代时间线由全局唯一标识符 (GUID) 标识,该时间线建立当前时间线、先前时间线、当前日志序列和先前日志序列。先前时间线 GUID 包括对先前时间线中出现当前时间线分支的位置的 OFFSET 引用。所有 GUID 都具有在时间点恢复操作开始时创建的时间戳。
要创建替代时间线,使用适当的时间点恢复语法扩展运行 RESTORE DATABASE 以恢复到特定 log-offset> :
RESTORE DATABASE ''
FROM ''
RECOVER UNTIL TIMESTAMP ''
USING LOG PATH ', , ...'
或者
RESTORE DATABASE ''
FROM ''
RECOVER UNTIL OFFSET
USING LOG PATH ', , ...'
重启数据库服务器时,时间点恢复将沿新的时间线恢复日志记录操作。
时间点恢复支持任意数量的时间线。通过执行数据备份建立初始数据库时间线来启用时间点恢复。向早于当前时间线端点的任一时间进行时间点恢复将创建替代数据库时间线。
考虑以下时间线:
DB ---- LB1 -- -- LB2 ---- P1 ---- LB3 ---- T1
|
PITR1 ---- LB4 -- -- LB5 ---- P2 ---- T2
|
PITR2 ---- LB6 ---- P3 ---- LB7 ---- T3
DB 是数据备份,而 LB 是日志备份。T1 代表缺省时间线。PITR1 表示向 LB1 和 LB2 之间的点执行的恢复操作。这已启动时间线 T2。PITR2 表示向 LB4 和 LB5 之间的点执行的恢复操作。这已启动时间线 T3。
所有可恢复到替代时间线的时间点恢复操作都包括 ON TIMELINE 子句:
RESTORE DATABASE ''
[ FROM ''
USING LOG PATH ', [...]]'
RECOVER UNTIL [ TIMESTAMP | OFFEST ]
ON TIMELINE ''
OVERWRITE EXISTING
CLEAR LOGS
ON TIMELINE 子句需要用于标识替代时间线的时间线 GUID。不含此子句的时间点恢复操作将恢复到当前时间线。使用 OVERWRITE EXISTING 子句覆盖现有 dbfile 和事务日志。
如果 RESTORE DATABASE 在时间点恢复操作期间无法找到事务日志、RLV 日志和时间点恢复日志,恢复操作将失败。当数据库恢复到新位置且新环境中没有可用日志时,可能出现这种情况。在这种情况下,使用 CLEAR LOGS 子句取消通常在时间点恢复操作期间进行的自动日志备份。
CLEAR LOGS 取消自动日志备份。仍将进行恢复数据库的自动备份。
使用初始时间线 (T0) 上的备份创建第二时间线 (T1):
//record the current timeline (T0) GUID
SELECT db_property('CurrentTimelineID')
// enable point in time recovery
SET OPTION PUBLIC.IQ_POINT_IN_TIME_RECOVERY_LOGGING = 'ON'
ALTER DBSPACE IQ_SYSTEM_LOG RENAME '/localhost/demo/pitrLog/PITRLOG'
BACKUP DATABASE FULL TO '/localhost/demo/dataBackup/FULL1'
// perform some DDL/DML operations
CREATE TABLE T1 ( ID INT )
INSERT INTO T1 VALUES (1)
// record timestamp TS1 / offset OFS1
TS1: SELECT getdate()
OFS1: SELECT db_property('LastCommitRedoPos')
// perform DDL/ DML operations
CREATE TABLE T2 ( ID INT )
INSERT INTO T2 VALUES (1)
// record timestamp TS2 / offset OFS2
TS2: select getdate()
OFS2: select db_property('LastCommitRedoPos')
// shutdown the database
// start a utility server
// connect to the utility server
// recover to offset OFS2 in timeline TS2
RESTORE DATABASE 'iqdemo' FROM '/localhost/demo/dataBackup/FULL1'
RECOVER UNTIL OFFSET OFS2
USING LOG PATH '/localhost/demo/pitrLog/'
OVERWRITE EXISTING
// record the new timeline (T1) GUID - TLID1
SELECT db_property('CurrentTimelineID')
使用初始时间线 (T0) 的备份创建第三时间线 (T2)。当前时间线是时间线 T1:
// perform some DDL/DML operations
CREATE TABLE T3 ( ID INT )
INSERT INTO T3 VALUES (1)
// record timestamp TS3 / offset OFS3
TS1: SELECT getdate()
OFS1: SELECT db_property('LastCommitRedoPos')
// perform DDL/ DML operations
CREATE TABLE T4 ( ID INT )
INSERT INTO T4 VALUES (1)
// record timestamp TS4 / offset OFS4
TS2: SELECT getdate()
OFS2: SELECT db_property('LastCommitRedoPos')
// shutdown the database
// start a utility serveR
// connect to the utility server
// restore to timestamp TS3 / offset OFS3
RESTORE DATABASE 'iqdemo'
FROM '/localhost/demo/dataBackup/FULL1'
RECOVER UNTIL OFFSET OFS3
USING LOG PATH '/localhost/demo/pitrLog/'
OVERWRITE EXISTING
// record the new timeline (T2) GUID TLID2
SELECT db_property('CurrentTimelineID')
返回到较早时间线中的时间戳。时间线 (T3) 是时间线 (T0) 的新时间线。假定当前时间线为 T2:
// perform some DDL/DML operations
CREATE TABLE T5 ( ID INT )
INSERT INTO T5 VALUES (1)
// record timestamp TS5 / offset OFS5
TS1: select getdate()
OFS1: select db_property('LastCommitRedoPos')
// shutdown the database
// start a utility server
// connect to the utility server and execute the restore command
// recover to timestamp TS1 / offset OFS1 on timeline T0
RESTORE DATABASE 'iqdemo' FROM '/localhost/demo/dataBackup/FULL1'
RECOVER UNTIL OFFSET
USING LOG PATH '/localhost/demo/pitrLog/'
OVERWRITE EXISTING ON TIMELINE ''
// record the new timeline (T3) GUID TLID3
SELECT db_property('CurrentTimelineID')