V$LOGMNR_CONTENTS 中 COMMIT_TIMESTAMP 的时区

Timezone for COMMIT_TIMESTAMP in V$LOGMNR_CONTENTS

V$LOGMNR_CONTENTS 字典视图中,TIMESTAMPCOMMIT_TIMESTAMP 列是 DATE 数据类型 - 没有任何时区信息。那么它们在哪个时区——数据库时区、主机时区还是 UTC?是否有数据库参数来配置他们的时区?

当对 V$LOGMNR_CONTENTS 视图执行 SELECT 语句时,归档重做日志文件将按顺序读取。这些存档重做日志文件存在于存档日志目标中。重做日志文件中的翻译记录在此视图中作为行返回。这一直持续到满足启动时指定的筛选条件(EndTime 或 endScn)或到达存档日志文件的末尾。

TIMESTAMP 字段是数据库更改时的时间戳。此时间戳对应于 SCN 转换 SCN_TO_TIMESTAMP,因此对于给定的 SCN,您有对应的时间戳。

字段COMMIT_TIMESTAMP为事务提交时的时间戳;只有在 DBMS_LOGMNR.START_LOGMNR() 调用中选择了 COMMITTED_DATA_ONLY 选项才有意义。如您所知,查询重做日志和归档日志需要您在日志挖掘器会话中调用此包。

实际上,当 Oracle 可能应该在许多不同的字典字段中使用 TIMESTAMP 时,有时会使用 DATE 数据类型。为什么 ?老实说,我不知道,当他们用于某些字典视图所有者、其他 table_owner 和其他 owner_name.

时,情况是一样的

DBTIMEZONE 是在 CREATE DATABASE 语句中指定的,因此在您创建数据库的那一刻。您可以使用 ALTER DATABASE

更改 DBTIMEZONE
alter database set time_zone = 'EST';

请记住,更改数据库时区只会在 shutdown/startup 后生效,不推荐这样做。

TIMESTAMP WITH TIME ZONE 是 TIMESTAMP 的变体,其值中包含时区区域名称或时区偏移量。时区偏移量是本地时间与 UTC(协调世界时,以前称为格林威治标准时间)之间的时差(以小时和分钟为单位)。

当数据存储在 disk.Oracle 上时,Oracle 数据库将所有新的 TIMESTAMP WITH LOCAL TIME ZONE 数据规范化为数据库的时区 disk.Oracle 数据库不会自动将数据库中的现有数据更新为新的时区。因此,如果数据库中存在任何 TIMESTAMP WITH LOCAL TIME ZONE 数据,则无法重置数据库时区。您必须先删除或导出 TIMESTAMP WITH LOCAL TIME ZONE 数据,然后重新设置数据库时区。因此,Oracle 不鼓励您更改包含数据的数据库的时区。

我的案例示例:我在 Azure 中有一个 Oracle 数据库(其中所有服务器都使用 UTC)在我的案例中,我选择使用 UTC 而不是使用不同的 DBTIMEZONE。然后我创建了一个函数来将任何 table 中存储的任何时间戳转换为我的时区。

我想知道为什么你需要阅读 redo/archive 日志,你是否必须恢复一些丢失的交易?希望解释得令人满意,如有其他疑问,请随时评论或提问。

猜想是数据库服务器操作系统的时区。因为SYSDATE可能用于insert,返回的也是数据库服务器操作系统的时区。

也许由于历史原因,Oracle 使用 DATE 数据类型而不是 TIMESTAMP 数据类型。我不知道 TIMESTAMP 是什么时候引入的,但肯定 DATE 来得更早。