关于v$backup_redolog中next_change#列

本文详细解释了在RAC环境中使用v$backup_redolog中的next_change#列进行日志恢复的过程,通过SQL查询获取每个线程的已归档最大日志序列号,并比较next_change#值来确定恢复的终点。


关于v$backup_redolog中next_change#列

next_change#列实际上就是下一个日志序列号的first_change#。
在rac环境(假设是两个节点的rac)中进行recover时,
需要在每个thread中选择出日志序列号最大的那个日志序列号,
然后在这两个日志序列号之间进行比较,比较的依据是next_change#,选择较小的那个next_change#作为recover的终点,比如如下的例子:

SQL> select max(sequence#) from v$archived_log L, v$database D
     where L.resetlogs_change# = D.resetlogs_change# and thread#=1;

       MAX(SEQUENCE#)
       --------------
               25 ----------->thread# 1的已经归档的最大日志序列号是25

SQL> select max(sequence#) from v$archived_log L, v$database D
     where L.resetlogs_change# = D.resetlogs_change# and thread#=2;

       MAX(SEQUENCE#)
       --------------
             13   ----------->thread# 2的已经归档的最大日志序列号是13

 SQL> select sequence#, thread#, first_change#, next_change#
      from v$archived_log L, v$database D
      where L.resetlogs_change# = D.resetlogs_change# and
      sequence# in (13,25);

      SEQUENCE#    THREAD# FIRST_CHANGE# NEXT_CHANGE#
     -------------------- -------------- ------------------------- -------------------------
                            25            1                           1744432                    1744802
                            13            2                           1744429                    1744805

SQL> select sequence#, thread#, first_change#, next_change#
     from v$backup_redolog
     where sequence# in (13,25);

      SEQUENCE#    THREAD# FIRST_CHANGE# NEXT_CHANGE#
      -------------------- -------------- ------------------------- -------------------------
                            25            1                           1744432                    1744802
                            13            2                           1744429                    1744805


由于1744802<1744805,因此 recover的终点是thread# 1的最大日志序列号25,也就是:

SET UNTIL SEQUENCE 26 THREAD 1;

 

如上摘自:

HowTo Restore RMAN Disk backups of RAC Database to Single Instance On Another Node (文档 ID 415579.1)
 

在达梦数据库中,如果发现 `V$DDL_LOG` 视图不存在,可能是由于数据库版本不支持或视图名称错误。针对这种情况,可以通过以下几种方式获取 DDL 变更记录: ### 使用 `DBMS_LOGMNR` 包进行日志挖掘 达梦数据库提供了 `DBMS_LOGMNR` 系统包,用于对归档日志进行挖掘,可以重构出 DDL、DML 和 DCL 等操作,从而实现对数据库操作的审计和跟踪。通过该功能,可以获取详细的 DDL 变更记录,包括操作类型、操作用户、时间戳、目标对象等信息[^1]。 以下是一个使用 `DBMS_LOGMNR` 的示例代码: ```sql -- 添加归档日志文件 EXEC DBMS_LOGMNR.ADD_LOGFILE('D:\dmdata\arch\ARCHIVELOG_20230901.LOG'); -- 启动日志挖掘 EXEC DBMS_LOGMNR.START_LOGMNR(); -- 查询挖掘结果 SELECT OPERATION, SQL_REDO, USERNAME, TIMESTAMP FROM V$LOGMNR_CONTENTS WHERE OPERATION = 'DDL'; -- 结束日志挖掘 EXEC DBMS_LOGMNR.END_LOGMNR(); ``` ### 查询 `V$AUDITRECORDS` 视图 如果数据库启用了审计功能,可以通过 `V$AUDITRECORDS` 系统视图查询审计记录。该视图包含了操作类型、操作用户、时间戳、目标对象等信息,适用于跟踪 DDL 操作[^2]。 以下是一个查询示例: ```sql SELECT ACTION_NAME, OBJECT_NAME, USERNAME, HOST_NAME, IP_ADDRESS, TIMESTAMP FROM V$AUDITRECORDS WHERE ACTION_NAME LIKE 'DDL%'; ``` ### 查询系统视图中的其他相关记录 达梦数据库的系统视图中包含了一些与 DDL 操作相关的记录,例如 `V$SQL_HISTORY` 或 `V$SQL_EXEC_HISTORY`,这些视图可能存储了执行过的 SQL 语句,包括 DDL 操作。可以通过以下查询获取相关信息: ```sql SELECT SQL_TEXT, USER_NAME, CLIENT_IP, EXEC_TIME FROM V$SQL_HISTORY WHERE SQL_TYPE = 'DDL'; ``` ### 注意事项 1. **权限要求**:查询 `DBMS_LOGMNR` 和相关视图通常需要特定权限,如 `DBA` 或 `SELECT` 权限。 2. **日志保留时间**:系统视图中的记录或审计日志的保留时间取决于数据库的配置。如果需要长期保存 DDL 变更记录,建议定期导出相关数据。 通过上述方法,可以有效地获取达梦数据库中的 DDL 变更记录,即使 `V$DDL_LOG` 视图不存在,也可以通过其他途径实现对 DDL 操作的监控和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值