日志记录和日志管理
日志记录
这些主题描述了 GBase 8s 数据库的日志记录,并解决了以下问题:
- 哪些数据库服务器进程需要日志记录?
- 什么是事务日志记录?
- 记录哪种数据库服务器活动?
- 什么是数据库日志记录状态?
- 谁可以设置或更改数据库日志记录状态?
单个数据库服务器实例所管理的所有数据库均将其日志记录存储在同一逻辑日志中,而无论它们是否使用事务日志记录。大多数数据库用户可能会关心事务日志记录是否已缓冲,或表是否使用日志记录。
如果您希望更改数据库日志记录状态,请参阅日志记录状态或方式的设置或更改。
需要日志记录的数据库服务器进程
在 GBase 8s 运行时(处理事务、跟踪数据存储和确保数据一致性),GBase 8s 会自动为所执行的一些操作生成逻辑日志记录。大多数时候,数据库服务器不会进一步使用逻辑日志记录。但是,当数据库服务器需要回滚事务,例如在系统发生故障后运行快速恢复时,逻辑日志记录将会很关键。逻辑日志记录是数据恢复机制的核心。
数据库服务器将逻辑日志记录存储在逻辑日志中。逻辑日志由逻辑日志文件组成,数据库服务器在磁盘上管理它们,直至这些文件已安全地转为脱机(备份)。数据库服务器管理员将保留已备份的逻辑日志文件,直至在数据复原期间需要用到这些文件,或直至管理员决定不再需要这些记录用于复原。请参阅逻辑日志获取有关逻辑日志的更多信息。
逻辑日志记录本身长度可变。这就增加了可写入逻辑日志缓冲区中页的逻辑日志记录数。但数据库服务器常常在页满之前清空逻辑日志缓冲区。有关逻辑日志记录格式的更多信息,请参阅《GBase 8s 管理员参考》中有关解释逻辑日志记录的主题。
数据库服务器在执行各种恢复数据和确保数据一致性的函数时使用逻辑日志记录,如下所示:
事务回滚
如果数据库正在使用事务日志记录,并且事务一定要回滚,那么数据库服务器使用逻辑日志记录来还原事务期间所作更改。有关更多信息,请参阅事务日志记录。
快速恢复
如果数据库服务器以不受控方式关闭,那么数据库服务器使用逻辑日志记录来恢复自未将最旧的更新清空到磁盘以来发生的所有事务,以及回滚任何未落实的事务。(当共享内存中和磁盘上的所有数据均相同时,它们在物理上是一致的。)如果要将整个数据库服务器返回至最近逻辑日志记录之时的逻辑一致性状态,数据库服务器会在快速恢复中使用逻辑日志记录。 (有关更多信息,请参阅检查点之后的快速恢复。)
数据复原
数据库服务器使用最近存储空间和逻辑日志备份来重新创建数据库服务器系统,直到最近备份的逻辑日志记录点为止。逻辑复原将应用上一次备份存储空间以来的所有日志记录。
延迟检查
如果事务使用 SET CONSTRAINTS 语句将检查设置为 DEFERRED,那么数据库服务器直至落实事务后才检查约束。如果在落实事务之时发生约束错误,那么数据库服务器使用逻辑日志记录回滚事务。有关更多信息,请参阅《GBase 8s SQL 指南:语法》中的『设置数据库对象方式』。
级联删除
对参阅约束的级联删除使用逻辑日志记录可确保如果在删除子行之前删除父行时系统发生故障,事务可回滚。有关主键和外键约束的信息,请参阅《GBase 8s SQL 指南:教程》。
分布式事务
分布式事务所涉及的每个数据库服务器将保留事务的逻辑日志记录。即使在执行该事务的其中一个数据库服务器上发生故障,该过程也可确保数据完整性和一致性。有关更多信息,请参阅两阶段落实和逻辑日志记录。
数据复制
Data Replication 使用逻辑日志记录在主数据库服务器和辅助数据库服务器上维护一致数据,从而使其中一个数据库服务器在另一数据库服务器发生故障时迅速用作备份数据库服务器。有关更多详细信息,请参阅数据复制的工作原理。
Enterprise Replication
必须对 Enterprise Replication 使用数据库日志记录,因为它从逻辑日志记录中复制数据。
事务日志记录
当数据库中的 SQL 数据操作语句生成逻辑日志记录时,人们就认为数据库或表具有或使用事务日志记录。
数据库日志记录状态指示数据库是否使用事务日志记录。日志缓冲方式指示数据库使用已缓冲还是未缓冲日志记录、或是符合 ANSI 标准的日志记录。有关更多信息,请参阅数据库日志记录状态和管理数据库日志记录方式。
在创建数据库时,指定数据库是否使用事务日志记录,如果使用,将使用哪种日志缓冲机制。在创建数据库之后,您可以(例如)关闭数据库日志记录或切换到已缓冲日志记录。即使您关闭了所有数据库的事务日志记录,数据库服务器也始终会记录一些事件。有关更多信息,请参阅 始终记录的活动 和X/Open DTP 环境中的数据库日志记录。
您可以使用数据库中的日志记录表或非日志记录表。创建表的用户将指定表类型。即使您使用非日志记录表,数据库服务器也始终会记录一些事件。有关更多信息,请参阅 GBase 8s 的表类型。
SQL 语句和数据库服务器活动的日志记录
在数据库服务器中可能有以下三类记录活动:
- 始终记录的活动
- 使用事务日志记录为数据库记录的活动
- 未记录的活动
始终记录的活动
有些数据库操作始终生成逻辑日志记录(即使您关闭事务日志记录或使用非日志记录表)。
以下操作始终为永久表而记录:
- 某些 SQL 语句,其中包括 SQL 数据定义语句。
- 存储空间备份
- 检查点
- 对数据库服务器配置的管理更改(如添加块或数据库空间)
- 为表分配新扩展数据块
- 对数据库的日志记录状态的更改
- 智能大对象操作:
- 创建
- 删除
- 分配与取消分配扩展数据块
- 截断
- 组合与分割块可用列表页
- 更改 LO 头和 LO 引用计数
- 智能大对象空间元数据
- BLOB 空间
下表列出了生成操作的语句,即使关闭了事务日志记录也会记录这些操作。
- ALTER ACCESS_METHOD
- ALTER FRAGMENT
- ALTER FUNCTION
- ALTER INDEX
- ALTER PROCEDURE
- ALTER ROUTINE
- ALTER SECURITY LABEL COMPONENT
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TRUSTED CONTEXT
- ALTER USER
- CLOSE DATABASE
- CREATE ACCESS_METHOD
- CREATE AGGREGATE
- CREATE CAST
- CREATE DATABASE
- CREATE DISTINCT TYPE
- CREATE EXTERNAL TABLE
- CREATE FUNCTION
- CREATE FUNCTION FROM
- CREATE INDEX
- CREATE OPAQUE TYPE
- CREATE OPCLASS
- CREATE PROCEDURE
- CREATE PROCEDURE FROM
- CREATE ROLE
- CREATE ROUTINE FROM
- CREATE ROW TYPE
- CREATE SCHEMA
- CREATE SECURITY LABEL
- CREATE SECURITY LABEL COMPONENT
- CREATE SECURITY POLICY
- CREATE SEQUENCE
- CREATE SYNONYM
- CREATE TABLE
- CREATE TEMP TABLE
- CREATE TRIGGER
- CREATE TRUSTED CONTEXT
- CREATE USER
- CREATE VIEW
- CREATE XADATASOURCE
- CREATE XADATASOURCE TYPE
- DROP ACCESS_METHOD
- DROP AGGREGATE
- DROP CAST
- DROP DATABASE
- DROP FUNCTION
- DROP INDEX
- DROP OPCLASS
- DROP PROCEDURE
- DROP ROLE
- DROP ROUTINE
- DROP ROW TYPE
- DROP SECURITY
- DROP SEQUENCE
- DROP SYNONYM
- DROP TABLE
- DROP TRIGGER
- DROP TRUSTED CONTEXT
- DROP TYPE
- DROP USER
- DROP VIEW
- DROP XADATASOURCE
- DROP XADATASOURCE TYPE
- GRANT
- GRANT FRAGMENT
- RENAME COLUMN
- RENAME DATABASE
- RENAME INDEX
- RENAME SECURITY
- RENAME SEQUENCE
- RENAME TABLE
- RENAME TRUSTED CONTEXT
- RENAME USER
- REVOKE
- REVOKE FRAGMENT
- TRUNCATE
- UPDATE STATISTICS
- SAVE EXTERNAL DIRECTIVES
- SET CONSTRAINTS
- SET Database Object Mode
- SET INDEXES
- SET TRIGGERS
- START VIOLATIONS TABLE
- STOP VIOLATIONS
- ALTER ACCESS_METHOD
- ALTER FRAGMENT
- ALTER FUNCTION
- ALTER INDEX
- ALTER PROCEDURE
- ALTER ROUTINE
- ALTER SECURITY LABEL COMPONENT
- ALTER SEQUENCE
- ALTER TABLE
- ALTER TRUSTED CONTEXT
- ALTER USER
- CLOSE DATABASE
- CREATE ACCESS_METHOD
- CREATE AGGREGATE
- CREATE CAST
- CREATE DATABASE
- CREATE DISTINCT TYPE
- CREATE EXTERNAL TABLE
- CREATE FUNCTION
- CREATE FUNCTION FROM
- CREATE INDEX
- CREATE OPAQUE TYPE
- CREATE OPCLASS
- CREATE PROCEDURE
- CREATE PROCEDURE FROM
- CREATE ROLE
- CREATE ROUTINE FROM
- CREATE ROW TYPE
- CREATE SCHEMA
- CREATE SECURITY LABEL
- CREATE SECURITY LABEL COMPONENT
- CREATE SECURITY POLICY
- CREATE SEQUENCE
- CREATE SYNONYM
- CREATE TABLE
- CREATE TEMP TABLE
- CREATE TRIGGER
- CREATE TRUSTED CONTEXT
- CREATE USER
- CREATE VIEW
- CREATE XADATASOURCE
- CREATE XADATASOURCE TYPE
- DROP ACCESS_METHOD
- DROP AGGREGATE
- DROP CAST
- DROP DATABASE
- DROP FUNCTION
- DROP INDEX
- DROP OPCLASS
- DROP PROCEDURE
- DROP ROLE
- DROP ROUTINE
- DROP ROW TYPE
- DROP SECURITY
- DROP SEQUENCE
- DROP SYNONYM
- DROP TABLE
- DROP TRIGGER
- DROP TRUSTED CONTEXT
- DROP TYPE
- DROP USER
- DROP VIEW
- DROP XADATASOURCE
- DROP XADATASOURCE TYPE
- GRANT
- GRANT FRAGMENT
- RENAME COLUMN
- RENAME DATABASE
- RENAME INDEX
- RENAME SECURITY
- RENAME SEQUENCE
- RENAME TABLE
- RENAME TRUSTED CONTEXT
- RENAME USER
- REVOKE
- REVOKE FRAGMENT
- TRUNCATE
- UPDATE STATISTICS
- SAVE EXTERNAL DIRECTIVES
- SET CONSTRAINTS
- SET Database Object Mode
- SET INDEXES
- SET TRIGGERS
- START VIOLATIONS TABLE
- STOP VIOLATIONS TABLE
使用事务日志记录为数据库记录的活动
如果数据库使用事务日志记录,那么以下 SQL 语句将生成一个或多个日志记录。如果这些语句回滚,那么回滚也会生成日志记录。
- DELETE
- FLUSH
- INSERT
- LOAD
- MERGE
- PUT
- SELECT INTO TEMP
- UNLOAD
- UPDATE
以下 SQL 语句在特殊情况下才生成日志。
表 1. 在特殊情况下生成日志的 SQL 语句。
SQL 语句 | 语句生成的日志记录 |
---|---|
BEGIN WORK | 除非数据库使用事务日志记录,否则返回错误。如果事务进行一些其他日志记录工作,那么产生一条日志记录。 |
COMMIT WORK | 除非数据库使用事务日志记录,否则返回错误。如果事务进行一些其他日志记录工作,那么产生一条日志记录。 |
ROLLBACK WORK | 除非数据库使用事务日志记录,否则返回错误。如果事务进行一些其他日志记录工作,那么产生一条日志记录。 |
EXECUTE | 此语句是否生成日志记录取决于正在运行的命令。 |
EXECUTE FUNCTION | 此语句是否生成日志记录取决于正在执行的函数。 |
EXECUTE IMMEDIATE | 此语句是否生成日志记录取决于正在运行的命令。 |
EXECUTE PROCEDURE | 此语句是否生成日志记录取决于正在执行的过程。 |
未记录的活动
以下 SQL 语句无论数据库日志记录方式如何,均不生成日志记录。
- ALLOCATE COLLECTION
- ALLOCATE DESCRIPTOR
- ALLOCATE ROW
- CLOSE
- CONNECT
- DATABASE
- DEALLOCATE COLLECTION
- DEALLOCATE DESCRIPTOR
- DEALLOCATE ROW
- DECLARE
- DESCRIBE
- DISCONNECT
- FETCH
- FREE
- GET DESCRIPTOR
- GET DIAGNOSTICS
- INFO
- LOCK TABLE
- OPEN
- OUTPUT
- PREPARE
- RELEASE SAVEPOINT
- SAVEPOINT
- SELECT
- SET AUTOFREE
- SET COLLATION
- SET CONNECTION
- SET DATASKIP
- SET DEBUG FILE
- SET DEFERRED_PREPARE
- SET DESCRIPTOR
- SET ENCRYPTION PASSWORD
- SET ISOLATION
- SET LOCK MODE
- SET LOG
- SET OPTIMIZATION
- SET PDQPRIORITY
- SET ROLE
- SET SESSION AUTHORIZATION
- SET STATEMENT CACHE
- SET TRANSACTION
- SET Transaction Mode
- SET USER PASSWORD
- UNLOCK TABLE
- WHENEVER
- SET ENVIRONMENT
- SET EXPLAIN
对于临时数据库空间中的临时表,不记录任何内容,甚至始终记录的活动中所列的 SQL 语句也不记录。如果您在 DBSPACETEMP 中包含了临时(非日志记录)数据库空间,那么数据库服务器会将非日志记录表先放在这些临时数据库空间中。有关更多信息,请参阅临时表。
数据库日志记录状态
您必须对数据库使用事务日志记录以利用需要日志记录的数据库服务器进程中所列的所有功能。
数据库服务器管理的每个数据库均有日志记录状态。日志记录状态指示数据库是否使用事务日志记录以及(如果使用)数据库运用哪一种日志缓冲机制。要查明数据库的事务日志记录状态,请按监视数据库的日志记录方式中的说明,使用数据库服务器实用程序。数据库日志记录状态将指示下列日志记录类型中的任意一种:
- 未缓冲的事务日志记录
- 已缓冲的事务日志记录
- 符合 ANSI 的事务日志记录
- 无日志记录
所有逻辑日志记录在数据库服务器将其写入磁盘上的逻辑日志之前,均经过共享内存中的逻辑日志缓冲区。但是,数据库服务器清仓逻辑日志缓冲区的时刻对于已缓冲的事务日志记录和未缓冲的事务日志记录是不同的。
未缓冲的事务日志记录
如果事务是对使用未缓冲日志记录的数据库进行的,那么逻辑日志缓冲区中的记录可保证在落实处理期间写入磁盘。当应用程序在 COMMIT 语句之后(对于分布式事务,在 PREPARE 语句之前)重获控制权时,逻辑日志记录在磁盘上。一旦落实缓冲区中的任何事务(即,将落实记录写入逻辑日志缓冲区),数据库服务器就立即清仓记录。
当数据库服务器清仓缓冲区时,仅将已使用的页写入磁盘。已使用的页包含那些仅部分已满的页,但这样就浪费了一些空间。由于这个原因,相比在同一数据库服务器上的所有数据库均使用已缓冲的日志记录这种情况而言,磁盘上的逻辑日志文件会更快地填满。
未缓冲的日志记录对于大多数数据库而言是最好的选择,因为它保证所有已落实的事务可得以恢复。在发生故障的情况下,仅丢失在发生故障时未落实的事务。但是,有了未缓冲的日志记录,数据库服务器会更频繁地将逻辑日志缓冲区清仓到磁盘,而缓冲区将包含更多部分已满的页,因此它比已缓冲的日志记录会更快地填充逻辑日志。
已缓冲的事务日志记录
如果事务是对使用已缓冲日志记录的数据库进行的,那么记录尽可能久地保留(已缓冲)在逻辑日志缓冲区中。直至发生以下情况之一,这些记录才会从共享内存中的逻辑日志缓冲区刷新到磁盘上的逻辑日志:
- 缓冲区已满。
- 具有未缓冲日志记录的数据库上的落实清空了缓冲区。
- 出现检查点。
- 连接关闭。
如果您使用已缓冲日志记录并且发生了故障,那么不能期望数据库服务器恢复那些在发生故障时位于逻辑日志缓冲区中的事务。因此,可能会丢失一些已落实的事务。作为对该风险的补偿,变更期间的性能会稍有提高。只要您在发生故障的情况下可重新创建更新,那么已缓冲日志记录最适合用于频繁更新的数据库(这时更新速度很重要)。您可调整逻辑日志缓冲区的大小以便为您的系统在性能和因系统故障而丢失事务的风险之间找到可接受的平衡。
符合 ANSI 的事务日志记录
符合 ANSI 标准的数据库日志记录状态表明数据库所有者使用 MODE ANSI 关键字。符合 ANSI 标准的数据库对事务处理强制执行 ANSI 规则,始终使用未缓冲的事务日志记录。您无法更改符合 ANSI 标准的数据库的缓冲状态。
无数据库日志记录
如果您关闭了数据库的日志记录,那么将不记录事务,但会记录其他操作。有关更多信息,请参阅 始终记录的活动。通常,当您要装入数据或仅运行查询时,将关闭数据库的日志记录。
如果您对恢复源感到满意,可以决定不对数据库使用事务日志记录,从而减少数据库服务器处理量。例如,如果要将许多行从可恢复的源(如磁带或 ASCII 文件)装入数据库,那么可能不需要事务日志记录,并且在不使用事务日志记录的情况下装入会进行得更快。但是,如果其他用户在数据库中是活动的,那么您直到重新启动日志记录(这必须等待 0 级备份)后才会拥有其事务的逻辑日志记录。
具有不同日志缓冲状态的数据库
数据库服务器上的所有数据库使用相同的逻辑日志和相同的逻辑日志缓冲区。因此,对具有不同逻辑缓冲状态的各数据库的事务可写入相同的逻辑日志缓冲区。在这种情况下,如果事务是对具有已缓冲日志记录的数据库和对具有未缓冲日志记录的数据库而存在的,那么数据库服务器在缓冲区已满时或在具有未缓冲日志记录的数据库的事务完成时清空缓冲区。
X/Open DTP 环境中的数据库日志记录
X/Open 分布式事务处理 (DTP) 环境中的数据库必须使用未缓冲日志记录。未缓冲日志记录确保数据库服务器逻辑日志始终处于一致状态,并且可与事务管理器同步。如果在 X/Open DTP 环境中打开用已缓冲日志记录创建的数据库,数据库状态会自动更改为未缓冲日志记录。数据库服务器支持符合 ANSI 标准和不符合 ANSI 标准的数据库。有关更多信息,请参阅事务管理器。
日志记录状态或方式的设置或更改
用 CREATE DATABASE 语句创建数据库的用户为该数据库设立日志记录状态或缓冲方式。有关 CREATE DATABASE 语句的更多信息,请参阅《GBase 8s SQL 指南:语法》。
如果 CREATE DATABASE 语句不指定日志记录状态,那么创建无日志记录的数据库。
只有数据库服务器管理员可以更改日志记录状态。管理数据库日志记录方式描述了该主题。普通用户不能更改数据库日志记录状态。
如果数据库不使用日志记录,那么无需考虑是已缓冲还是未缓冲日志记录更为适当。如果您为数据库指定了日志记录但没有为其指定缓冲方式,那么缺省为未缓冲日志记录。
用户可以在会话期间从未缓冲日志记录切换到已缓冲(但不符合 ANSI 标准)日志记录,也可以从已缓冲日志记录切换到未缓冲日志记录。应用程序中的 SET LOG 语句将执行该切换。有关 SET LOG 语句的更多信息,请参阅《GBase 8s SQL 指南:语法》。
管理数据库日志记录方式
可以监视和修改数据库日志记录方式。
本节中的主题提供了有关以下内容的信息:
- 了解数据库日志记录方式
- 使用 ondblog 修改数据库日志记录方式
- 使用 ontape 修改数据库日志记录方式
- 监视事务日志记录
作为数据库服务器管理员,您可以如下所示更改数据库的日志记录方式:
- 将事务日志记录从已缓冲更改为未缓冲。
- 将事务日志记录从未缓冲更改为已缓冲。
- 使数据库符合 ANSI 标准。
- 向数据库添加事务日志记录(已缓冲或未缓冲)。
- 结束数据库的事务日志记录。
有关数据库日志记录方式、何时使用事务日志记录以及何时缓冲事务日志记录的信息,请参阅日志记录。要查明数据库的当前日志记录方式,请参阅监视数据库的日志记录方式。
有关使用 SQL 管理 API 命令(而不是一些 ondblog 和 ontape 命令)的信息,请参阅使用 SQL 管理 API 执行远程管理和《GBase 8s 管理员参考》。
更改数据库日志记录方式
可以使用 ondblog 或 ontape 来添加或更改日志记录。然后使用 ON-Bar 或 ontape 来备份数据。在使用 ON-Bar 或 ontape 时,数据库服务器必须处于在线、管理员或静态模式。
可以使用 ondblog、ontape 来添加或更改日志记录。然后使用 ON-Bar 或 ontape 来备份数据。在使用 ON-Bar 或 ontape 时,数据库服务器必须处于在线、管理员或静态模式。
有关 ON-Bar 和 ontape 的信息,请参阅《GBase 8s 备份与复原指南》。
下表显示数据库服务器管理员能如何更改数据库记录方式。某些日志记录方式更改是立即发生的,而另外一些更改需要 0 级备份。
表 1. 日志记录方式转换
转换源: | 转换为无日志记录 | 转换为未缓冲日志记录 | 转换为已缓冲日志记录 | 转换为符合 ANSI 标准 |
---|---|---|---|---|
无日志记录 | 不适用 | (受影响存储空间的)0 级备份 | (受影响存储空间的)0 级备份 | (受影响存储空间的)0 级备份 |
未缓冲日志记录 | 是 | 不适用 | 是 | 是 |
缓冲的日志记录 | 是 | 是 | 不适用 | 是 |
符合 ANSI 标准 | 非法 | 非法 | 非法 | 不适用 |
更改数据库日志记录方式有以下影响:
- 数据库服务器在更改日志记录状态时对数据库加上互斥锁定以防止其他用户访问该数据库,而当更改完成时释放该锁定。
- 如果在日志记录方式更改期间发生故障,那么在复原数据库服务器数据后,请检查 sysmaster 数据库的 sysdatabases 表内标志中的日志记录方式。有关更多信息,请参阅监视数据库的日志记录方式。然后重试更改日志记录方式。
- 如果在日志记录方式更改期间发生故障,那么在复原数据库服务器数据后,请检查 sysmaster 数据库中 sysdatabases 表中的标志。有关更多信息,请参阅监视数据库的日志记录方式。然后重试更改日志记录方式。
- 在选择了已缓冲或未缓冲日志记录之后,应用程序就可以使用 SQL 语句 SET LOG 从一种日志记录方式更改为另一种日志记录方式。此更改在会话期间会一直持续。有关 SET LOG 的信息,请参阅 GBase 8s SQL 指南:语法。
- 如果您向数据库添加日志记录,那么直至数据库的所有存储空间的下一次 0 级备份才完成该更改。
使用 ondblog 修改数据库日志记录方式
您可以使用 ondblog 实用程序更改一个或多个数据库的日志记录方式。如果您向数据库添加日志记录,那么必须在更改生效之前对包含该数据库的数据库空间创建 0 级备份。有关更多信息,请参阅《GBase 8s 管理员参考》中有关使用 ondblog 的主题。
使用 ondblog 更改缓冲方式
要在名为 stores_demo 的数据库上将缓冲方式从已缓冲日志记录更改为未缓冲日志记录,请运行以下命令:
ondblog unbuf stores_demo
要在名为 stores_demo 的数据库上将缓冲方式从未缓冲日志记录更改为已缓冲日志记录,请运行以下命令:
ondblog buf stores_demo
使用 ondblog 取消日志记录方式更改
要在发生下一次 0 级备份之前取消日志记录方式更改请求,请运行以下命令:
ondblog cancel stores_demo
不能取消那些立即执行的日志记录更改。
使用 ondblog 结束日志记录
要结束名为 dbfile 的文件中所列的两个数据库的日志记录,请运行以下命令:
ondblog nolog -f dbfile
使用 ondblog 使数据库符合 ANSI 标准
要使用 ondblog 使名为 stores_demo 的数据库成为符合 ANSI 标准的数据库,请运行以下命令:
ondblog ansi stores_demo
更改符合 ANSI 标准的数据库的日志记录方式
在将数据库创建或转换为 ANSI 方式之后,就不能轻易将其更改为任何其他日志记录方式。如果您意外地将数据库转换为 ANSI 方式,请遵循以下步骤来更改日志记录方式:
要更改日志记录方式,请执行以下操作:
-
要卸载数据,可使用 dbexport 或任何其他迁移实用程序。
dbexport 实用程序创建 schema 文件。
-
要使用已缓冲日志记录重新创建数据库并装入数据,请使用 dbimport -l buffered 命令。
要使用未缓冲日志记录重新创建数据库并装入数据,请使用 dbimport -l 命令。
使用 ontape 修改数据库日志记录方式
如果您将 ontape 用作备份工具,那么可使用 ontape 来更改数据库的日志记录方式。
使用 ontape 打开事务日志记录
在您修改数据库日志记录方式之前,请阅读更改数据库日志记录方式。
在创建 0 级备份的同时用 ontape 向数据库添加日志记录。
例如,要使用 ontape 向名为 stores_demo 的数据库添加已缓冲日志记录,请运行以下命令:
ontape -s -B stores_demo
要使用 ontape 向名为 stores_demo 的数据库添加未缓冲日志记录,请运行以下命令:
ontape -s -U stores_demo
除了打开事务日志记录以外,这些命令还创建整个系统存储空间备份。当 ontape 提示您提供备份级别时,请指定 0 级备份。
对于 ontape,您必须执行所有存储空间的 0 级备份。
使用 ontape 结束日志记录
要使用 ontape 为名为 stores_demo 的数据库结束日志记录,请运行以下命令:
ontape -N stores_demo
使用 ontape 更改缓冲方式
要使用 ontape 在名为 stores_demo 的数据库上将缓冲方式从已缓冲日志记录更改为未缓冲日志记录,但不创建存储空间备份,请运行以下命令:
ontape -U stores_demo
要使用 ontape 在名为 stores_demo 的数据库上将缓冲方式从未缓冲日志记录更改为已缓冲日志记录,但不创建存储空间备份,请运行以下命令:
ontape -B stores_demo
使用 ontape 使数据库符合 ANSI 标准
要使用 ontape 使已经使用事务日志记录(未缓冲或已缓冲)的名为 stores_demo 的数据库成为符合 ANSI 标准的数据库,请运行以下命令:
ontape -A stores_demo
要使用 ontape 使尚未使用事务日志记录的名为 stores_demo 的数据库成为符合 ANSI 标准的数据库,请运行以下命令:
ontape -s -A stores_demo
除了使数据库符合 ANSI 标准以外,该命令还同时创建存储空间备份。当提示您提供级别时,请指定 0 级备份。
在将日志记录方式更改为符合 ANSI 标准之后,就不能再轻易对其进行更改。要更改符合 ANSI 标准的数据库的日志记录方式,请卸载数据,使用新日志记录方式重新创建数据库,并重新装入数据。有关详细信息,请参阅更改符合 ANSI 标准的数据库的日志记录方式。
修改表日志记录方式
在缺省情况下,数据库服务器创建使用日志记录的标准表。要创建非日志记录表,请使用带 WITH LOG 子句的 CREATE TABLE 语句。有关 CREATE TABLE 和 ALTER TABLE 语句的信息,请参阅《GBase 8s SQL 指南:语法》。有关更多信息,请参阅 GBase 8s 的表类型。
更改表以关闭日志记录
要将表从日志记录切换为非日志记录,请使用 TYTE 选项为 RAW 的 SQL 语句 ALTER TABLE。例如,以下语句将表 tablog 更改为 RAW 表:
ALTER TABLE tablog TYPE (RAW)
更改表以打开日志记录
要从非日志记录表切换为日志记录表,请使用 TYPE 选项为 STANDARD 的 SQL 语句 ALTER TABLE。例如,以下语句将表 tabnolog 更改为 STANDARD 表:
ALTER TABLE tabnolog TYPE (STANDARD)
当您将表更改为 STANDRAD 时,请打开该表的日志记录。在更改表后,如果必须能够复原该表,请执行 0 级备份。
禁用对临时表的日志记录
可以禁用对临时表的日志记录以提高性能,并阻止 GBase 8s 在数据复制环境(含有 HAC 辅助服务器、RHAC 辅助服务器和 SSC 辅助服务器)中使用主服务器时传输临时表。
要禁用对临时表的日志记录,可将 TEMPTAB_NOLOG 配置参数设置为 1。
对于高可用性集群中的 HAC、RHAC 和 SSC 辅助服务器,必须通过将 TEMPTAB_NOLOG 配置参数设置为 1 来始终禁用对临时表的逻辑日志记录。
可以使用 onmode -wf 命令来更改 TEMPTAB_NOLOG 的值。
监视事务
本主题中包含有关监视事务方法的信息的参考。
命令 | 描述 | 引用 |
---|---|---|
onstat -x | 监视事务。 | 监视全局事务 |
onstat -g sql | 监视 SQL 语句,并按会话标识和数据库列出语句。 | |
onstat -g stm | 监视预编译 SQL 语句的内存使用情况。 |
监视数据库的日志记录方式
使用 SMI 表监视日志记录方式
查询 sysmaster 数据库中的 sysdatabases 表以确定日志记录方式。 该表包含对应于数据库服务器管理的每个数据库的行。标志字段指示数据库的日志记录方式。is_logging、is_buff_log 和 is_ansi 字段指示日志记录是否为活动的,以及使用已缓冲日志记录还是符合 ANSI 标准的日志记录。有关该表中的列的描述,请参阅《GBase 8s 管理员参考》中有关 sysmaster 数据库一章中的 sysdatabases 一节。
逻辑日志
日志记录中的信息和以下主题说明了数据库服务器如何使用逻辑日志。有关如何执行逻辑日志任务的信息,请参阅管理逻辑日志文件和管理数据库日志记录方式。
什么是逻辑日志?
为了保留自上次存储空间备份以来的事务和数据库服务器更改的历史记录,数据库服务器生成日志记录。数据库服务器将日志记录存储在逻辑日志中,这是由三个或更多逻辑日志文件组成的循环文件。将该日志称为逻辑的是因为日志记录代表数据库服务器的逻辑操作(而不是物理操作)。存储空间备份加上逻辑日志备份的组合在任何时候均包含数据库服务器数据的完整副本。
作为数据库服务器管理员,您必须配置并管理逻辑日志。例如,如果您不定期备份日志文件,那么逻辑日志会填满,而数据库服务器暂挂处理。
这些职责包含以下任务:
-
为逻辑日志选择适当的位置
请参阅逻辑日志文件的位置。
-
监视逻辑日志文件状态
请参阅逻辑日志文件的标识。
-
为逻辑日志分配适当的磁盘空间量
请参阅逻辑日志文件的大小。
-
在任何需要之时分配附加日志文件
请参阅分配日志文件。
-
将逻辑日志文件备份到介质上
-
管理 BLOB 空间和智能大对象空间的日志记录
逻辑日志文件的位置
在数据库服务器初始化磁盘空间时,它将逻辑日志文件和物理日志放在根数据库空间中。 您对该操作没有控制权。要提高性能(尤其是减少对根数据库空间的写入次数以及将争用最小化),可将逻辑日志文件从根数据库空间移出至磁盘上未被活动表或物理日志共享的数据库空间中。请参阅将逻辑日志文件移至另一个数据库空间。
要进一步提高性能,可将逻辑日志文件分成两组,并将这两组存储在两个不同的磁盘(两个磁盘均不包含数据)上。例如,如果您有 6 个逻辑日志文件,那么您可能会将文件 1、3 和 5 放在磁盘 1 上,将文件 2、4 和 6 放在磁盘 2 上。这种安排可提高性能,因为从不需要同一磁盘驱动器同时处理写入当前逻辑日志文件和备份到磁带。
逻辑日志文件包含关键信息,因此必须制作镜像以获取最大数据保护。如果将逻辑日志文件移至其他数据库空间,请计划对该数据库空间启动镜像过程。
逻辑日志文件的标识
每个逻辑日志文件(不管是否备份到介质)都有唯一的标识号。以初始化数据库服务器磁盘空间后所填充的第一个逻辑日志文件为 1 而开始该序列。在当前逻辑日志文件已满时,数据库服务器切换到下一个逻辑日志文件并为新日志文件将唯一标识号增加 1。新添加的或标记为删除的日志文件的唯一标识号为 0。
为每个逻辑日志文件分配的实际磁盘空间具有称为日志文件号的标识号。例如,如果您配置 6 个逻辑日志文件,那么这些文件具有从 1 到 6 的日志号。日志号可以不按顺序。在备份并释放逻辑日志文件时,数据库服务器将磁盘空间重新用于逻辑日志文件。
下表说明了日志号和唯一标识号之间的关系。 日志 7 在日志 5 之后插入,并在第二次循环交替中第一次使用。
表 1. 逻辑日志文件的编号顺序
日志文件号 | 第一次循环交替唯一标识号 | 第二次循环交替唯一标识号 | 第三次循环交替唯一标识号 |
---|---|---|---|
1 | 1 | 7 | 14 |
2 | 2 | 8 | 15 |
3 | 3 | 9 | 16 |
4 | 4 | 10 | 17 |
5 | 5 | 11 | 18 |
7 | 0 | 12 | 19 |
6 | 6 | 13 | 20 |
逻辑日志文件的状态标志
所有逻辑日志文件在第一位置均具有以下状态标志之一:已添加 (A)、已删除 (D)、可用 (F) 或已使用 (U)。下表显示了可能的日志状态标志组合。
表 1. 逻辑日志状态标志
状态标志 | 逻辑日志文件的状态 |
---|---|
A------ | 日志文件已添加且可用,但尚未使用。 |
D------ | 如果您删除具有状态 U-B 的日志文件,那么它会标记为已删除。该日志文件被删除,其空间得以释放,可在您为所有存储空间进行 0 级备份时重新使用。 |
F------ | 日志文件是空闲的且可供使用。 逻辑日志文件在备份后得以释放,逻辑日志文件中的所有事务均关闭,存储在该文件中的最旧更新会清空到磁盘。 |
U | 日志文件已使用但尚未备份。 |
U-B---- | 日志文件已备份但仍需用于恢复。(当不再需要该日志文件用于恢复时,将释放该文件。) |
U-B---L | 日志已备份但仍需用于恢复。包含上一个检查点记录。 |
U---C | 数据库服务器当前正在填充日志文件。 |
U---C-L | 当前日志文件包含上一个检查点记录。 |
使用 onstat -l 命令按号码列出日志文件,并监视已使用日志空间的状态标志和百分比。有关更多详细信息,请参阅 onstat -l 命令。
逻辑日志文件的大小
逻辑日志文件的最小大小为 200 KB。
逻辑日志文件的最大大小为 524288 页(等于 0x7ffff + 1),其中基页大小为 2 KB 或 4 KB,具体取决于操作系统。要确定您操作系统上数据库服务器的基页大小,请运行 onstat -d,然后检查根数据库空间的 pgsize 值。
确定要使用的日志文件的大小和数量。如果分配了多于所需的磁盘空间,那么会浪费空间。但如果未分配足够的磁盘空间,那么性能可能会受到不利影响。当许多用户在同时写入日志时,使用较大日志文件。
较小的日志文件意味着如果包含该日志文件的磁盘脱机,那么您可在稍后进行恢复。如果设置了连续日志备份,那么日志文件在填满时会自动备份。较小日志导致逻辑恢复时间稍长。
逻辑日志文件的数量
当您估计逻辑日志文件的数目时,请考虑以下要点:
- 必须始终有至少 3 个逻辑日志文件,最多为 32,767 个日志文件。日志文件数目取决于日志文件的大小。
- 日志文件的数目影响逻辑日志备份的频率。
- 日志文件的数目影响 BLOB 空间 BLOB 页可回收的速率。请参阅备份日志文件以释放 BLOB 页。
性能注意事项
对于给定的系统活动级别,分配的逻辑日志磁盘空间越少,那么逻辑日志空间就越快填满,且用户活动就越有可能因备份和检查点而阻塞。调整逻辑日志大小以找出您系统的最佳值。
-
逻辑日志备份
当逻辑日志文件填满时,必须对其进行备份。备份进程会阻碍涉及到与逻辑日志文件位于同一磁盘上的数据的事务处理。将物理日志、逻辑日志和用户数据放在不同的磁盘上。(请参阅《GBase 8s 备份与复原指南》。)
-
逻辑日志的大小
较小逻辑日志比较大逻辑日志填充更快。 您可以按手动添加逻辑日志文件中的说明添加较大逻辑日志文件。
-
个别逻辑日志记录的大小
逻辑日志记录的大小根据处理操作和数据库服务器环境而变化。通常,数据行越长,逻辑日志记录就越大。 逻辑日志包含已插入、更新或删除的行的映像。更新可使用多达插入和删除所用空间两倍的空间,因为更新可能既包含前映像又包含后映像。(插入仅存储后映像,而删除仅存储前映像。)
-
逻辑日志记录的数目
向逻辑日志写入的逻辑日志记录越多,逻辑日志填充就越快。带事务日志记录的数据库填充逻辑日志比对不带事务日志记录的数据库进行的事务更快。
-
日志缓存的类型
使用未缓冲事务日志记录的数据库填充逻辑日志比使用已缓冲事务日志记录的数据库更快。
-
对表进行的 Enterprise Replication
因为 Enterprise Replication 会生成复制表的前映像和后映像,因此可能使逻辑日志填满。
-
回滚频率
更多回滚会更快地填充逻辑日志。虽然回滚记录很小,但回滚本身也需要逻辑日志文件空间。
-
智能大对象的数目
已启用用户数据日志记录且具有大量用户数据更新的智能大对象会以极快的速率填充逻辑日志。如果您不希望记录这些元数据,可使用临时智能大对象。
动态日志分配
动态日志分配可防止在长事务回滚期间日志文件填满并挂起系统。仅当下一个日志文件包含打开的事务时,该功能才处于活动状态。(如果事务在到达长事务高水位标志时未落实或回滚,那么为长事务。)
数据库服务器在下一个日志文件包含打开的事务时,在当前日志文件后自动(动态)分配日志文件。可以将动态记录分配用于以下操作:
- 当系统活动时添加日志文件
- 在当前日志文件后插入日志文件
- 立即访问新日志文件(即使根数据库空间未备份)
测试动态日志分配的最好方法是产生跨所有日志文件的事务,然后使用 onstat -l 检查是否有新添加的日志文件。有关更多信息,请参阅分配日志文件。
仍然必须备份日志文件以防止其填满。如果日志文件填满,那么系统挂起,直至您执行备份。
释放逻辑日志文件
每次数据库服务器提交或回滚事务时,会尝试释放事务开始所在的逻辑日志文件。在数据库服务器为重新使用而释放逻辑日志文件之前,必须满足以下标准:
- 备份日志文件。
- 逻辑日志文件中没有记录与打开的事务相关联。
- 逻辑日志文件不包含尚未刷新到磁盘的最旧更新。
下一个逻辑日志文件未释放时要执行的操作
如果数据库服务器尝试切换到下一个逻辑日志文件但发现顺次的下一个日志文件仍在使用中,那么数据库服务器立即暂挂所有处理。即使其他逻辑日志文件是可用的,数据库服务器也无法跳过使用中的文件而写入非顺次的可用文件。处理将停止,以保护逻辑日志文件中的数据。
逻辑日志文件可能由于以下任一原因而在使用中:
-
文件包含尚未清空到磁盘的最近检查点或最旧更新。
发出 onmode -c 命令以执行检查点并释放逻辑日志文件。有关更多信息,请参阅 强制执行检查点。
-
文件包含打开的事务。
打开的事务就是在设置用于回滚长事务的高水位标志中所说明的长事务。
-
文件未备份。
如果逻辑日志文件未备份,那么当您使用 ON-Bar 或 ontape 来备份逻辑日志文件时,处理会恢复进行。
下一个逻辑日志文件中包含上一个检查点时要执行的操作
数据库服务器在下一个日志文件包含上一个检查点或最旧更新时不暂挂处理。如果尚未清空到磁盘的上一个检查点记录或最旧更新位于紧随上一个可用日志后的日志中,那么数据库服务器在切换到上一个可用日志时,将始终强制执行检查点。例如,如果 4 个逻辑日志文件具有以下列表中显示的状态,那么数据库服务器在切换到逻辑日志文件 3 时强制执行检查点。
日志文件号 逻辑日志文件状态
1 U-B----
2 U---C--
3 F
4 U-B---L
记录 BLOB 空间和简单大对象
简单大对象数据(TEXT 和 BYTE 数据类型)可能太多,无法包含在逻辑日志记录中。 如果始终记录简单大对象,它们可能会非常大,以致减缓了逻辑日志。
数据库服务器假设您将数据库设计为较小简单大对象存储在数据库空间中而较大简单大对象存储在 BLOB 空间中:
- 对于存储在数据库空间中的简单大对象,数据库服务器将简单大对象数据包含在日志记录中。
- 对于存储在 BLOB 空间中的简单大对象,数据库服务器不会将简单大对象数据包含在日志记录中。仅当您备份逻辑日志时,逻辑日志才记录 BLOB 空间数据。
为了那些对 BLOB 空间中简单大对象执行频繁更新的应用程序能获取更好的整体性能,可减少逻辑日志的大小。较小日志可改进对必须重新使用的简单大对象的访问。
切换日志文件以激活 BLOB 空间
您必须在以下情况中切换到下一个逻辑日志文件:
- 在创建 BLOB 空间后,如果您想要立即将简单大对象插入 BLOB 空间
- 向现有 BLOB 空间添加新块后,如果您要将简单大对象插入到将使用该新块的 BLOB 空间
数据库服务器需要在不同的逻辑日志文件中创建用于创建 BLOB 空间的语句、在 BLOB 空间中创建块的语句,以及将简单大对象插入该 BLOB 空间的语句。此需求与数据库日志记录状态无关。
有关切换到下一个日志文件的指示信息,请参阅切换到下一个逻辑日志文件。
备份日志文件以释放 BLOB 页
在删除存储在 BLOB 空间页中的数据时,不必为重新使用而释放那些页。仅当以下两个操作均已发生时,BLOB 空间页是可用的:
- 通过对列的更新或通过删除行而删除了 TEXT 或 BYTE 数据
- 备份了存储行(包含 TEXT 或 BYTE 数据)中插入的逻辑日志
插入或删除 TEXT 和 BYTE 数据之前备份 BLOB 空间
请确保备份所有包含有关 BLOB 空间中所存储简单大对象的事务的 BLOB 空间和逻辑日志。在日志备份期间,数据库服务器在逻辑日志中使用数据指针将更改过的 text 和 byte 数据从 BLOB 空间复制到逻辑日志中。
记录智能大对象空间和智能大对象
智能大对象空间中描述的智能大对象空间包含两个组成部分:元数据和用户数据。在缺省情况下,不记录智能大对象空间。
智能大对象空间的元数据组成部分描述存储在特定智能大对象空间中的智能大对象的关键特征。元数据包含指向智能大对象的指针。如果元数据要遭受损坏或变得不可访问,那么智能大对象空间也将损坏,且智能大对象空间中的智能大对象将不可恢复。
即使关闭数据库的日志记录,标准智能大对象空间中的元数据将始终得以记录。记录智能大对象空间元数据可确保元数据始终恢复为一致的事务状态。但是,不记录临时智能大对象空间中的元数据。
智能大对象空间日志记录
在记录智能大对象空间时,数据库服务器速度减慢,且逻辑日志迅速填满。如果您对智能大对象空间使用日志记录,那么必须确保逻辑日志大到足以容纳日志记录数据。有关更多信息,请参阅估计记录智能大对象时的日志大小。
为数据库打开日志记录后,数据库服务器直至您执行 0 级备份时才开始日志记录。但是,为智能大对象打开日志记录后,数据库服务器立即开始执行其日志记录更改。要减少日志条目数,请装入已关闭日志记录的智能大对象,然后再将日志记录重新打开以捕获对智能大对象的更新。
在为智能大对象打开日志记录时,必须立即执行 0 级备份,从而可恢复和复原智能大对象。
智能大对象的日志记录
如果用户在频繁更新数据,或如果恢复任何已更新数据的能力很重要,可为智能大对象使用日志记录。数据库服务器将操作(插入、更新、删除、读取或写入)记录写入逻辑日志缓冲区。CLOB 或 BLOB 数据的已修改部分包含在日志记录中。
要提高性能,可关闭智能大对象的日志记录。如果用户主要在分析数据而非在频繁更新数据,或如果数据对于恢复并不重要,也可关闭日志记录。
已更新的智能大对象的日志记录
在更新智能大对象时,数据库服务器不会记录整个对象。假设用户在为智能大对象启用日志记录的情况下以偏移量 Y 写入 X 字节的数据。数据库服务器将记录以下信息:
- 如果在大对象的末尾设置 Y,那么数据库服务器记录 X 字节(更新的字节范围)。
- 如果 Y 位于大对象的开始或中间,那么数据库服务器记录以下选项中的最小值:
- 旧映像和新映像之间的差额
- 前映像和后映像
- 如果前映像和后映像相同,那么不记录任何值
关闭或打开智能大对象空间的日志记录
可以使用多种不同的方法来打开或关闭智能大对象空间的日志记录。
如果要在智能大对象空间中使用日志记录,请在创建智能大对象空间时指定 onspaces 命令的 -Df "LOGGING=ON" 选项。 如果在智能大对象空间中关闭了日志记录,您可在特定列中为智能大对象打开日志记录。包含智能大对象的一列可在另一列的日志记录关闭期间打开日志记录。
要验证智能大对象空间中的智能大对象是否已记录,请使用 oncheck -pS sbspace_name | grep "Create Flags"
命令。
如果在带缺省日志记录选项的智能大对象空间中创建智能大对象,且在输出中看到 LO_NOLOG 标志,那么该智能大对象空间中的智能大对象不会记录。如果在输出中看到 LO_LOG 标志,那么该智能大对象空间中的所有智能大对象均记录。
您可以按以下任一方法来修改智能大对象空间的日志记录状态。
要指定的函数或语句 | 日志记录操作 | 参考资料 |
---|---|---|
onspaces -ch -Df "LOGGING=ON" onspaces-ch -Df "LOGGING=OFF" | 为现有的智能大对象空间打开或关闭日志记录 | 更改智能大对象的存储特征 《GBase 8s 管理员参考》中 onspaces -ch: 更改 sbspace 缺省规范的内容 |
使用 set sbspace logging on 或 set sbspace logging off 自变量的 SQL 管理 API task() 或 admin() 函数 | 为现有的智能大对象空间打开或关闭日志记录 | 《GBase 8s 管理员参考》中设置智能大对象空间日志记录自变量:更改智能大对象空间的日志记录(SQL 管理 API)的内容 |
CREATE TABLE 或 alter table 语句的 PUT 子句中的 LOG 选项 | 为装入该列的所有智能大对象打开日志记录 | 日志记录 PUT 子句 |
ifx_lo_create GBase 8s ESQL/C 函数 | 在最初装入智能大对象之时关闭它的日志记录 | 《GBase 8s ESQL/C 程序员手册》 |
ifx_lo_alter GBase 8s ESQL/C 函数 | 在装入完成后打开日志记录 | 《GBase 8s ESQL/C 程序员手册》 |
智能大对象日志记录
当用 LOG 选项创建智能大对象时,逻辑日志创建智能 BLOB 日志记录。智能 BLOB 日志记录跟踪对用户数据或元数据的更改。在更新智能大对象时,日志记录中仅包含智能大对象页的已修改部分。仅当为智能大对象启用了日志记录时,才会在逻辑日志中创建用户数据日志记录。
请注意为频繁更新的智能大对象启用日志记录。该日志记录开销可能会显著减慢数据库服务器的速度。
有关智能大对象的日志记录的信息,请参阅《GBase 8s 管理员参考》中有关解释逻辑日志记录的章节。
记录智能大对象数据时阻止长事务
您可在单个智能大对象的数据收集过程持续很长时间的情况下使用智能大对象。例如,考虑记录了许多个小时低质量音频信息的应用程序。虽然收集的数据量可能是最少的,但记录会话可能很长,导致出现长事务的条件。
要防止长事务发生,请定期落实对智能大对象的写入。
日志记录过程
这些主题详细描述了数据库空间、BLOB 空间和智能大对象空间的日志记录过程。这些信息对于执行常规数据库服务器管理任务不是必需的。
数据库空间日志记录
数据库服务器对涉及数据库空间中所存储数据的操作使用以下日志记录过程:
- 将数据页从磁盘读到共享内存页缓冲区
- 将未更改的页复制到物理日志缓冲区(如果需要)
- 将新数据写入页缓冲区并创建事务的逻辑日志记录(如果需要)
- 将物理日志缓冲区清空到磁盘上的物理日志
- 将逻辑日志缓冲区清空到磁盘上的逻辑日志文件
- 清空页缓冲区并将其写回到磁盘上
BLOB 空间日志记录
数据库服务器记录 BLOB 空间数据,但数据不经过共享内存或磁盘上的逻辑日志文件。数据库服务器将存储在 BLOB 空间中的数据直接从磁盘复制到磁带上。对 BLOB 空间开销页(自由图页和位图页)的修改记录是仅有的到达逻辑日志的 BLOB 空间数据。
管理逻辑日志文件
即使您的数据库都不使用事务日志记录,您也必须管理逻辑日志文件。请参阅逻辑日志以获取有关逻辑日志的背景信息。
在 UNIX™ 上,您必须以 gbasedbt 或 root用户身份登录才能进行本章中所述的任何更改。
在设置逻辑日志时要执行以下任务:
-
在您初始化或重新启动数据库服务器之前,请使用 LOGFILES 参数来指定要创建的逻辑日志文件的数量。
-
在数据库服务器在线后,请估计系统需要的逻辑日志文件的大小和数量。
请参阅估计日志文件的大小和数量。
-
如果您不想要使用缺省值,请更改 LOGSIZE 和 LOGBUFF 配置参数。
请参阅更改日志记录配置参数。
-
添加估计数目的逻辑日志文件。
请参阅分配日志文件。
您要例行执行以下任务:
- 备份逻辑日志文件
- 切换到下一个逻辑日志文件
- 释放逻辑日志文件
- 监视日志记录活动和日志备份状态
如有需要,您要例行执行以下任务:
- 添加逻辑日志文件
- 删除逻辑日志文件
- 更改逻辑日志文件的大小
- 移动逻辑日志文件
- 更改逻辑日志配置参数
- 为逻辑日志监视事件警报
- 为事务设置高水位标志
有关使用 SQL 管理 API 命令(而不是一些 oncheck、onmode、onparams 和 onspaces 命令)的信息,请参阅使用 SQL 管理 API 执行远程管理和《GBase 8s 管理员参考》。
估计日志文件的大小和数量
使用 LOGSIZE 配置参数可设置逻辑日志文件的大小。
对于您的数据库服务器系统最优的日志空间量取决于以下因素:
- 您的应用程序需求和应用程序经历的更新活动量。更高的更新活动需要更大的日志空间。
- 恢复时间目标 (RTO) 标准,用于在重新启动服务器并使服务器进入在线或静态模式后,服务器从问题恢复所用时间量(以秒计)。
在灾难性事件的情况中,要考虑您可以容许多少数据丢失。更多频繁的日志备份(该备份可以减少数据和事务丢失所带来的风险),需要更大的日志空间。
- 是使用 Enterprise Replication 还是使用数据复制配置(例如,HAC 辅助服务器、SSC 辅助服务器或 RHAC 辅助服务器)。
这些复制服务都可以影响日志文件的数量和大小。如果您的系统使用其中任何一个复制服务,请参阅高可用性集群配置或《GBase 8s Enterprise Replication 指南》中的指南。
确定日志大小的指南:
- 通常,管理较少的大日志文件比管理大量的小日志文件要容易得多。
- 日志空间过多不会影响性能。但是,日志文件和日志空间不足却会影响性能,因为数据库服务器将触发频繁的检查点。
- BLOB 空间中没有登录的智能大对象,但是这些对象包含在创建对象的日志备份中。这意味着对象将不会释放直到服务器备份创建了对象的日志。 因此,如果 BLOB 空间中的智能大对象频繁更新,您可能需要更加频繁的日志备份以获得 BLOB 空间中的更多可用空间。
- 对于生成少量日志数据的应用程序,请一开始使用 10 个日志文件,每个文件 10 MB。
- 对于生成大量日志数据的应用程序,请一开始使用 10 个日志文件,每个文件 100 MB。
有以下两种维护 RPO 策略的方式,这决定了在灾难性事件中所容许的数据丢失,例如,数据服务器的丢失:
- 一种维护 RPO 策略的方式是使用自动日志备份,即一旦日志文件填满就触发日志备份。这样就将数据丢失限制到在备份期间包含在日志文件中的事务以及在日志备份期间发生的任何其他事务。
- 另一种维护 RPO 策略的方式是使用调度程序。您可以创建一个任务,该任务自上次日志备份以来在设定的时间间隔内自动备份任何新的日志数据。这样就将数据丢失限制到在设定时间间隔内没有进行备份的事务。有关使用调度程序的信息,请参阅调度程序。
如果 RPO 策略是必需的,那么可以使用调度程序插入一个按适当频率执行的任务来维护该策略。这样就在日常周期内的特定时间自动备份日志文件。如果日志空间在日志备份或回收之前就已填满,那么可以备份这些日志并添加新的日志文件以允许事务处理继续进行,或者可以使用调度程序添加新的任务来检测此情况,并自动执行其中任一操作。
您可以随时添加日志文件,并且当事务一致性需要时数据库服务器会自动添加日志文件(例如,可能占用大量日志空间的长事务)。
增加逻辑日志空间量的最简单的方法是添加另一逻辑日志文件。请参阅手动添加逻辑日志文件。
以下表达式提供了示例总日志空间配置(以 KB 计):
LOGSIZE = (((connections * maxrows) * rowsize) / 1024) / LOGFILES
表达式元素 | 解释 |
---|---|
LOGSIZE | 指定每个逻辑日志文件的大小(以 KB 计)。 |
connections | 为您在 sqlhosts 文件或注册表以及在 NETTYPE 参数中指定的所有网络类型指定最大连接数。如果您通过在您的配置文件中设置多个 NETTYPE 配置参数来配置多个连接,请为每个 NETTYPE 添加用户字段,并替换前公式中 connections 的总数。 |
maxrows | 指定在单个事务中要更新的最大行数。 |
rowsize | 指定表行的平均大小(以字节计)。要计算 rowsize,请添加行中各列的长度(来自 syscolumns 系统目录表)。 |
1024 | 将 LOGSIZE 转换为指定的单位 (KB)。 |
LOGFILES | 指定逻辑日志文件的数量。 |
估计记录智能大对象时的日志大小
如果计划记录智能大对象用户数据,那么必须确保日志大小比正写入的数据量大得多。 如果您将智能大对象存储在标准智能大对象空间中,那么始终记录元数据(即使不记录智能大对象)。如果您将智能大对象存储在临时智能大对象空间中,那么根本不存在日志记录。
估计逻辑日志文件的数量
LOGFILES 参数提供系统初始化或重新启动时逻辑日志文件的数量。如果所有逻辑日志文件的大小相同,您可以如下所示计算分配给逻辑日志文件的总空间:
逻辑日志空间总数 = LOGFILES * LOGSIZE
如果数据库服务器包含不同大小的日志文件,那么不能使用 (LOGFILES * LOGSIZE) 表达式来来计算逻辑日志的大小。必须改为将磁盘上的每个日志文件的大小相加。检查 onstat -l 输出中的 size 字段。 有关更多信息,请参阅 onstat -l 命令。
有关 LOGSIZE、LOGFILES 和 NETTYPE 的信息,请参阅《GBase 8s 管理员参考》 中有关配置参数的主题。
备份逻辑日志文件
逻辑日志包含已执行的事务的历史记录。逻辑日志文件复制到介质的过程称为备份逻辑日志文件。备份逻辑日志文件实现以下两个目标:
- 它将逻辑日志记录存储在介质上,以便在需要数据复原时可以前滚这些记录。
- 它使逻辑日志文件空间可用于新的逻辑日志记录。
如果您忽略了备份日志文件,那么可能会耗尽日志空间。
您可以启动手动逻辑日志备份或设置连续逻辑日志备份。在复原存储空间后,您必须复原逻辑日志以使数据处于一致状态。有关日志备份的更多信息,请参阅《GBase 8s 备份与复原指南》。
备份 BLOB 空间
先备份逻辑日志还是先备份 BLOB 空间,这一点无关紧要。
要备份 BLOB 空间,请执行以下操作:
- 在当前的逻辑日志包含有关 BLOB 空间中简单大对象的事务时关闭该日志。
- 在更新简单大对象数据后尽快执行对逻辑日志和 BLOB 空间的备份。
如果您不备份这些 BLOB 空间和逻辑日志,就可能无法复原 BLOB 空间数据。如果您等到 BLOB 空间不可用时才执行日志备份,数据库服务器将无法访问 BLOB 空间以将更改过的数据复制到逻辑日志中。
备份智能大对象空间
当为智能大对象打开日志记录时,必须执行该智能大对象空间的 0 级备份。
下图显示在未备份的智能大对象空间中打开日志记录时会发生的情况。尽管已记录的更改是可恢复的,但在故障期间会丢失未记录的对智能大对象 LO1 的更改。您将无法完全复原 LO1。
在快速恢复期间,数据库服务器前滚 LO1 的所有已落实事务。如果未记录 LO1,那么数据库服务器将无法回滚未落实的事务。而那时 LO1 内容将是不正确的。有关更多信息,请参阅快速恢复。
图: 打开智能大对象空间中的日志记录
切换到下一个逻辑日志文件
由于以下原因,您可能希望在当前日志文件变满之前切换到下一个逻辑日志文件:
- 备份当前日志
- 激活新的 BLOB 空间和 BLOB 空间块
数据库服务器可以处于在线模式以进行该更改。 运行以下命令以切换到下一个可用的日志文件:onmode -l
更改将立即生效。(请确保您在命令行中输入小写的 L,而非数字 1。)
释放逻辑日志文件
如果日志文件是新添加的(状态 A),那么可立即使用该文件,也可立即删除。
您可能希望为以下原因而释放逻辑日志文件:
- 使数据库服务器不停止处理
- 释放已删除的 BLOB 页所用的空间
释放日志文件的过程根据日志文件的状态而变化。每个过程均在以下主题中进行了描述。 要查明逻辑日志文件的状态,请参阅逻辑日志文件的状态标志和监视日志记录活动。
有关使用 ON-Bar 或 ontape 以备份存储空间和逻辑日志的信息,请参阅《GBase 8s 备份与复原指南》。
删除状态为 D 的日志文件
当删除已使用的日志文件时,该文件将标记为已删除(状态为 D)且无法再次使用,同时 onparams 将打印以下消息:
Log file _log_file_number_ has been pre-dropped. It will be deleted from the log list and its space can be reused once you take level 0 archives of all BLOBspaces, Smart BLOBspaces and non-temporary DBspaces.
必需具有 0 级归档,以确保日志文件本身以及不同数据库空间中的所有关联信息都已归档。在 0 级归档的结束后会删除日志文件;但是,由于除去日志文件本身属于磁盘上根保留页结构中的更改,因此下一次执行的归档也必须是 0 级归档。必须先执行 0 级归档,然后才能执行 1 级或 2 级归档。
释放状态为 U 的日志文件
如果日志文件包含记录但尚未备份(状态为 U),请使用通常使用的备份工具来备份该文件。
如果备份日志文件无法将状态更改为可用 (F),那么其状态会更改为 U-B 或 U-B-L。请参阅释放状态为 U-B 或 F 的日志文件或释放状态为 U-B-L 的日志文件。
释放状态为 U-B 或 F 的日志文件
如果日志文件已备份但仍在使用中(状态为 U-B),那么说明日志文件中的某些事务仍在进行,或日志文件包含快速恢复所需的最旧更新。由于过去已使用过状态为 F 的日志文件,因此该文件将与状态为 U-B 的日志文件一样遵循相同的规则。
要释放正在使用的已备份日志文件,请执行以下操作:
-
如果您不希望等待至事务完成,可将数据库服务器切换到静态模式。
请参阅立即从在线更改到静态模式。任何活动的事务将回滚。
-
使用 onmode -c 命令以强制产生一个检查点。执行此操作的原因是状态为 U-B 的日志文件可能包含最旧的更新。
已备份但不在使用中(状态为 U-B)的日志文件无需释放。在以下示例中,日志 34 无需释放,但日志 35 和 36 需要释放。日志 35 包含上一个检查点,而日志 36 已备份但仍在使用中。
34 U-B-- Log is used, backed up, and not in use
35 U-B-L Log is used, backed up, contains last checkpoint
36 U-B-- Log is used, backed up, and not in use
37 U-C-- This is the current log file, not backed up
仅当逻辑日志没有通过活动的事务跨越并且不包含最旧的更新,您才能释放带有 U-B(而非 L)状态的逻辑日志。
释放状态为 U-C 或 U-C-L 的日志文件
请遵循以下步骤来释放当前日志文件。
要释放当前日志文件(状态为 C),请执行以下操作:
- 运行以下命令将当前日志文件切换到下一个可用的日志文件:onmode -l
- 用 ON-Bar 或 ontape 备份原始日志文件。
- 在备份了所有填满的日志文件后,会提示您切换到下一个可用的日志文件并备份新的当前日志文件。
因为刚刚切换到此日志文件,所以无需执行备份。
在释放当前日志文件后,如果日志文件的状态为 U-B 或 U-B-L,请参阅释放状态为 U-B 或 F 的日志文件或释放状态为 U-B-L 的日志文件。
释放状态为 U-B-L 的日志文件
如果日志文件已备份,并且其中的所有事务已关闭,但该文件还未释放(状态为 U-B-L),那么此逻辑日志文件包含最近的检查点记录。可以释放状态为 U-B-L 的日志文件。
要释放状态为 U-B-L 的日志文件,数据库服务器必须创建新的检查点。 可以运行以下命令来强制执行检查点:onmode -c
监视日志记录活动
监视逻辑日志文件以确定总的可用空间(在所有文件中)、当前文件中的可用空间以及文件状态(例如,日志是否已备份)。有关监视逻辑日志缓冲区的信息,请参阅监视物理和逻辑日志记录活动。
监视逻辑日志记录以了解填充度
您可使用以下命令行实用程序来监视逻辑日志文件。
onstat -l 命令
onstat -l 命令显示有关物理日志和逻辑日志的信息。
包含有关每个逻辑日志文件的信息的输出部分包含以下信息:
- 逻辑日志文件描述符的地址
- 日志文件号
- 指示每个日志状态(空闲、已备份、当前等等)的状态标志
- 日志文件的唯一标识
- 文件的开始页
- 文件大小(以页计)、已用页数和已用页的百分比
如果您删除列表中间的几个日志或如果数据库服务器动态地添加日志文件,那么 numbers 字段的日志文件数量可以无序。
有关 onstat -l 输出的示例的更多信息,请参阅《GBase 8s 管理员参考》。
oncheck -pr 命令
数据库服务器将逻辑日志文件信息存储在专用于检查点信息的保留页中。因为数据库服务器仅在检查点期间更新该信息,所以该信息不如 onstat -l 选项所显示的信息新。有关使用这些选项来显示保留页信息的更多详细信息,请参阅《GBase 8s 管理员参考》。
您可以用 oncheck -pr 命令查看检查点保留页。以下示例显示一个逻辑日志文件的样本输出。
...
Log file number 1
Unique identifier 7
Log contains last checkpoint Page 0, byte 272
Log file flags 0x3 Log file in use
Current log file
Physical location 0x1004ef
Log size 750 (p)
Number pages used 1
Date/Time file filled 01/29/2001 14:48:32
...
监视临时逻辑日志
因为在热复原期间永久日志不可用,所以此时数据库服务器使用临时逻辑日志前滚事务。当前滚完成时,数据库服务器将释放临时日志文件。如果您在热复原期间发出 onstat -l,那么输出将包含有关临时日志文件(其格式与常规日志文件相同)的第四部分。临时日志文件仅使用 B、C、F 和 U 状态标志。
SMI 表
查询 syslogs 表以获取有关逻辑日志文件的信息。该表包含对应于每个逻辑日志文件的行。各列如下所示。
number
逻辑日志文件的标识号
uniqid
日志文件的唯一标识
size
文件大小(以页计)
used
已用页数
is_used
指示日志文件是否正在使用的标志
is_current
指示日志文件是否为当前文件的标志
is_backed_up
指示日志文件是否已备份的标志
is_new
指示日志文件自上次存储空间备份以来是否已添加的标志
is_archived
指示日志文件是否已写入归档磁带的标志
is_temp
指示日志文件是否标记为临时日志文件的标志
监视日志备份状态
为了监视日志的状态以及为了查看哪些日志已备份,请使用 onstat -l 命令。状态标志 B 表示日志已备份。
分配日志文件
当您初始化或重新启动数据库服务器时,该服务器将创建您在 LOGFILES 配置参数中所指定数量的逻辑日志文件。这些日志文件是您在 LOGSIZE 参数中指定的大小。
动态添加逻辑日志文件
DYNAMIC_LOGS 配置参数确定数据库服务器何时将动态添加逻辑日志文件。当您使用 DYNAMIC_LOGS 的缺省值 2 时,如果下一个活动日志文件包含最旧打开事务的开头,那么数据库服务器将动态添加新的日志文件并将警报设置为关闭。
数据库服务器将在以下时刻检查逻辑日志空间:
- 在切换到新日志文件后
- 在逻辑恢复的事务清除阶段开始时
如果 DYNAMIC_LOGS 参数设置为 1 并且下一个活动日志文件包含来自打开事务的记录,那么数据库服务器将提示您手动添加日志文件并将警报设置为关闭。在您添加日志文件后,数据库服务器将重新开始处理事务。
如果 DYNAMIC_LOGS 参数设置为 0 并且在长事务回滚过程中逻辑日志文件耗尽了空间,那么该数据库服务器可能挂起。(长事务将防止第一个逻辑日志文件变为空闲并防止其可用于重新使用。)要修复该问题并完成长事务,请将 DYNAMIC_LOGS 设置为 2 并且重新启动数据库服务器。
有关更多信息,请参阅监视动态添加的日志的事件和设置用于回滚长事务的高水位标志
动态添加的日志文件的大小和数量
动态日志的用途是添加足够的日志空间,以允许回滚事务。在动态添加日志文件时,数据库服务器使用以下因素来计算日志文件的大小:
- 平均日志大小
- 可用的连续空间量
如果逻辑日志空间过小,那么数据库服务器将按需添加尽可能多的日志文件,以回滚事务。日志文件的数目由以下条件限制:
- 支持的最大数目的日志文件
- 日志文件的磁盘空间量
- Root 块中可用的连续空间量
如果数据库服务器因为耗尽磁盘空间而停止添加新日志文件,它会写入错误消息并发出警报。向现有数据库空间添加数据库空间或块。然后数据库服务器会自动重新开始处理事务。
Root 块中的保留页存储有关每个日志文件的信息。在添加更多日志文件时,包含该信息的扩展数据块会扩展。Root 块需要两个 1.4 兆字节的扩展数据块,各用于跟踪 32,767 个日志文件(支持的最大数目)。
如果在还原期间要从非 Root 块分配块保留页扩展数据块,那么服务器会尝试将其放回 Root 块中。如果在 Root 块中没有足够空间可用,还原将失败。包含所需空间的消息会显示在联机日志中。所需空间必须在再次尝试还原之前从 Root 块中释放。
动态添加的日志文件的位置
数据库服务器按以下搜索顺序在数据库空间中分配日志文件。一个数据库空间如果包含逻辑日志文件或物理日志,就可成为关键的数据库空间。
途径 分配日志文件的位置
1 包含最新日志文件的数据库空间(如果该数据库空间已满,数据库服务器会搜索其他数据库空间。)
2 包含日志文件的镜像数据库空间(但根数据库空间除外)
3 所有已经包含日志文件的数据库空间(根数据库空间除外)
4 包含物理日志的数据库空间
5 根数据库空间
6 任何镜像数据库空间
7 任何数据库空间
如果不想使用此搜索顺序来分配新的日志文件,那么必须将 DYNAMIC_LOGS 参数设置为 1 并在要用于新日志的位置运行 onparams -a -i。有关详细信息,请参阅监视动态添加的日志的事件。
手动添加逻辑日志文件
可以使用 onparams 命令来添加逻辑日志文件。
您可以为以下原因而手动添加逻辑日志文件:
- 增加分配给逻辑日志的磁盘空间
- 更改逻辑日志文件的大小
- 允许打开的事务回滚
- 作为将逻辑日志文件移至不同数据库空间的操作的一部分
您不能执行以下操作:
- 向 BLOB 空间或智能大对象空间添加日志文件。
- 向具有非缺省页大小的数据库空间添加逻辑或物理日志。
一次添加一个,最多向任一数据库空间添加 32,767 个逻辑日志文件。一旦您向数据库空间添加了日志文件,该空间就成为关键数据库空间。您可以在存储空间备份期间添加逻辑日志文件。
您可以在以下任一位置添加逻辑日志文件:
- 文件列表的末尾(使用 onparams -a 命令)
- 当前逻辑日志文件之后(使用 onparams -a -i 命令)
要使用 onparams 添加逻辑日志文件,请执行以下操作:
-
以用户 gbasedbt 或 root 的身份(在 UNIX™ 上)。
-
请确保数据库服务器处于在线、管理、静态或快速恢复方式的清除阶段。
数据库服务器在清除阶段将以下消息写入日志:
Logical recovery has reached the transaction cleanup phase.
-
决定要将日志文件添加到日志文件列表的末尾还是添加到当前日志文件之后。
无论 DYNAMIC_LOGS 参数值为多少,您都可以在当前日志文件后插入日志文件。添加新大小的日志文件不会更改 LOGSIZE 的值。
-
以下命令使用 LOGSIZE 配置参数指定的日志文件大小将逻辑日志文件添加到 logspace 数据库空间中逻辑日志文件列表的末尾:
onparams -a -d logspace
-
以下命令将 1000 KB 的逻辑日志文件插入 logspace 数据库空间中的当前日志文件之后:
onparams -a -d logspace -s 1000 -i
-
要添加具有新大小(此例中为 250 KB)的逻辑日志文件,请运行以下命令:
onparams -a -d logspace -s 250
-
-
使用 onstat -l 检查日志文件状态。
新日志文件的状态为 A,且立即可用。
-
下次必须备份数据时,请对根数据库空间和包含新日志文件的数据库空间执行 0 级备份。
虽然在添加日志文件后不再需要立即备份,但因为数据结构已更改,所以下一次备份必须为 0 级备份。有关备份数据的信息,请参阅《GBase 8s 备份与复原指南》。
有关使用 onparams 来添加逻辑日志文件的更多信息,请参阅 《GBase 8s 管理员参考》。
删除逻辑日志文件
可以使用 onparams 命令来删除逻辑日志文件。
要删除逻辑日志文件并增加数据库空间中可用的磁盘空间量,可以使用 onparams。数据库服务器始终需要最少三个逻辑日志文件。如果逻辑日志仅由三个日志文件组成,就无法删除该日志。
删除日志文件的规则已更改:
- 如果您删除从未被写入的日志文件(状态 A),数据库服务器将立即删除它并释放空间。
- 如果您删除已使用的日志文件(状态 U-B),数据库服务器将其标记为已删除 (D)。 在您对包含日志文件的数据库空间和根数据库空间进行了 0 级备份之后,数据库服务器删除日志文件并释放空间。
- 您无法删除当前正在使用或包含上一个检查点记录(状态 C 或 L)的日志文件。
要使用 onparams 删除逻辑日志文件,请执行以下操作:
-
请确保数据库服务器处于在线、管理或静态模式中。
-
运行以下命令来删除日志文件号为 21 的逻辑日志文件:onparams -d -l 21
一次删除一个日志文件。您必须知道要删除的每个逻辑日志的日志文件号。
-
如果日志文件具有新添加 (A) 的状态,那么将其立即删除。
如果日志文件具有已使用 (U) 的状态,那么将其标记为删除 (D)。
-
要删除已使用的日志文件,请对所有数据库空间进行 0 级备份。
该备份防止数据库服务器在复原期间使用已删除的日志文件,并确保保留页包含有关当前日志文件数量的信息。
有关使用 onparams 删除逻辑日志文件的信息,请参阅《 GBase 8s 管理员参考》。
有关使用 onlog 显示逻辑日志文件和唯一标识号的信息,请参阅显示逻辑日志记录。
更改逻辑日志文件的大小
如果要更改日志文件的大小,那么添加适当大小的新日志文件并随后删除旧文件会更为容易。可以用以下方法来更改逻辑日志文件的大小:
-
使用 onparams 连同 -s 选项可添加不同大小的新日志文件。
请参阅手动添加逻辑日志文件。
-
如果希望数据库服务器创建较大的日志文件,请增加 onconfig 文件中的 LOGSIZE 值。
请参阅更改日志记录配置参数。
将逻辑日志文件移至另一个数据库空间
按逻辑日志文件的位置中的说明,您可能由于性能原因或为使数据库空间中有更多空间而希望移动逻辑日志文件。要查明逻辑日志文件的位置,请参阅监视日志记录活动。 虽然移动逻辑日志文件并不难,但它可能很耗时。
移动逻辑日志文件将由两个较简单的操作组合完成:
- 从逻辑日志文件当前所在数据库空间删除这些文件
- 将逻辑日志文件添加到其新数据库空间
以下过程提供如何将 6 个逻辑日志文件从根数据库空间移至另一数据库空间 dbspace_1 的示例。
您不能在非缺省页大小的数据库空间中移动逻辑和物理日志文件。
要将逻辑日志文件从根数据库空间移出(示例),请执行以下操作:
-
请确保数据库服务器处于在线、管理、静态或快速恢复方式中。
-
向 dbspace_1 添加 6 个新逻辑日志文件。
请参阅手动添加逻辑日志文件。
-
对所有存储空间进行 0 级备份,以释放除当前日志文件以外的所有日志文件。
(如果使用 onbar -l -b -c,那么可备份包括当前日志文件在内的所有日志文件。)请参阅释放逻辑日志文件。
-
使用 onmode -l 切换到新的当前日志文件。
请参阅切换到下一个逻辑日志文件。
-
删除根数据库空间中的全部 6 个逻辑日志文件。
您不能删除当前逻辑日志文件。
请参阅删除逻辑日志文件。
-
创建根数据库空间和 dbspace_1 的 0 级备份。
有关更多信息,请参阅《GBase 8s 备份与复原指南》。
更改日志记录配置参数
可以使用文本编辑器来更改数据库服务器用于日志记录的配置参数
下表显示了逻辑日志的配置参数。有关更多信息,请参阅 GBase 8s 管理员参考 中有关配置参数的主题。
配置参数 | 最小值 | 缺省值 | 最大值 |
---|---|---|---|
DYNAMIC_LOGS | 0 或 1 | 2 | 2 |
LOGBUFF | 2 * 页大小 | 64 KB | LOGSIZE 值 |
LOGFILES | 3 个文件 | 5 个文件 | 32,767 个文件 |
LOGSIZE | 10000 KB(在 UNIX™ 上) | 10000 KB | 请参阅《GBase 8s 管理员参考》 |
LTXEHWM | LTXHWM 值 | 90% | 100% |
LTXHWM | 1% | 80% | 100% |
对于 LOGFILES 的更改直到您重新初始化或重新启动了磁盘空间才会生效。
要更改 onconfig 文件中的逻辑日志配置参数,请执行以下操作:
-
使得数据库服务器脱机或进入静态或管理员模式中。
-
使用文本编辑器来更新配置参数。
DYNAMIC_LOGS、LTXHWM 和 LTXEHWM 参数不在 onconfig.std 文件中。要更改这些参数的值,请将它们添加到 onconfig 文件。
-
关闭并重新启动数据库服务器。
-
仅当您要更改 LOGFILES,且希望所有日志文件位于连续空间中时,请执行该步骤。(通常您会使用 onparams 实用程序来添加和删除 LOGFILES。)
-
卸载所有数据库服务器数据。
这么做是因为您不能依赖于存储空间备份来卸载和复原数据,因为复原会将参数返回到以前的值。
-
重新初始化数据库服务器磁盘空间。
请参阅初始化磁盘空间。
-
重新创建所有数据库和表。
-
重新装入所有数据库服务器数据。
-
-
备份根数据库空间以启用更改过的逻辑日志。
显示逻辑日志记录
使用 onlog 实用程序显示并解释逻辑日志记录有关使用 onlog 的信息,请参阅《GBase 8s 管理员参考》。
监视动态添加的日志的事件
监视以下由动态添加的日志文件触发的事件警报(见下表)。 当每个警报被触发,就向消息日志写入一条消息。有关更多信息,请参阅《GBase 8s 管理员参考》中有关事件警报和配置参数的章节。
您可以包含 onparams 命令以在您的事件类标识 27(日志文件必需的)的警报脚本中添加日志文件。您的脚本还可运行 onstat -d 命令来检查有否足够空间,并对具有足够空间的位置执行 onparams a -i。必须使用 -i 选项在当前日志文件之后添加新的日志。
表 1. 动态添加的日志文件的事件警报
类标识 | 严重性 | 类消息 | 消息 |
---|---|---|---|
26 | 3 | 动态添加的日志文件 log_number | 当数据库服务器动态添加日志文件时显示该消息。 动态地将日志文件 log_number 添加到数据库空间 dbspace_number。 |
27 | 4 | 需要日志文件 | 当 DYNAMIC_LOGS 设置为 1 且数据库服务器等待您添加日志文件时,显示该消息。 警报:最旧的逻辑日志 log_number 包含来自打开的事务 transaction_address 的记录。逻辑日志记录将保持阻塞状态,直到添加了日志文件为止。如下所示,使用 onparams -a 命令和 -i(插入)选项添加日志文件:onparams -a -d dbspace -ssize-i 然后尽快完成该事务。 |
28 | 4 | 没有可用于日志文件的空间 | 警报:因为最旧的逻辑日志 log_number 包含来自 transaction_address 打开事务的记录,那么服务器将尝试动态添加日志文件。但没有可用的空间。添加数据库空间或块,然后尽快完成该事务。 |
下表显示数据库服务器对于 DYNAMIC_LOGS 配置参数的每个设置执行的操作。
表 2. DYNAMIC_LOGS 设置
DYNAMIC_ LOGS | 含义 | 事件警报 | 等待添加日志 | 动态日志添加 |
---|---|---|---|---|
2(缺省值) | 允许自动分配新日志文件,从而防止打开的事务挂起系统。 | 是(26、28) | 否 | 是 |
1 | 允许手动添加新日志文件。 | 是 (27) | 是 | 否 |
0 | 不分配日志文件,但发出以下有关打开的事务的消息: 警告: 最旧的逻辑日志文件 log_number 包含来自打开事务 transaction_address 的记录,但是动态日志功能已关闭。 | 否 | 否 | 否 |
设置用于回滚长事务的高水位标志
数据库服务器使用 LTXHWM 和 LTXEHWM 配置参数来设置长事务的高水位标志。如果 DYNAMIC_LOGS 设置为 1 或 2,那么缺省 LTXHWM 值为 80%,而 LTXEHWM 为 90%。如果 DYNAMIC_LOGS 设置为 0,那么缺省的 LTXHWM 值是 50% 而缺省的 LTXHEWM 值是 60%。
如果您减少高水位标志值,就增加了长事务的可能性。要进行补偿,须分配附加的日志空间。有关 LTXHWM 和 LTXEHWM 的信息,请参阅《GBase 8s 管理员参考》中有关配置参数的章节。
长事务高水位标志 (LTXHWM)
长事务高水位标志是在回滚事务前允许事务跨及的总日志空间的百分比。如果数据库服务器在最旧使用的日志文件中发现打开的事务,它会动态添加日志文件。因为日志空间一直在增加,所以高水位标志会向外扩展。当日志空间到达高水位标志,数据库服务器会回滚事务。事务回滚及其他过程也会生成逻辑日志记录。数据库服务器继续添加日志文件直至回滚完成,以便防止逻辑日志耗尽空间。如果存在一个以上的长事务,那么可回滚一个以上的事务。
例如,数据库服务器具有 10 个逻辑日志且 LTXHWM 将设置为 98。事务从日志文件 1 开始,而更新活动填满日志 1 到 9。数据库服务器在日志文件 10 之后动态添加日志文件 11。只要事务不完成,该过程就一直持续至数据库服务器添加了 40 个日志文件。当数据库服务器添加第 50 个日志时,事务已赶上高水位标志,而数据库服务器会将其回滚。
互斥存取长事务高水位标志 (LTXEHWM)
在当前正回滚的长事务获得对逻辑日志的互斥存取权时,发生了互斥存取长事务高水位标志。数据库服务器显著减少了日志记录的生成。仅允许当前正在回滚事务的线程和当前正在写 COMMIT 记录的线程访问逻辑日志。限制访问逻辑日志为用户线程正在写入的回滚记录保留了尽可能多的空间(该线程正在回滚事务)。
如果您同时将 LTXHWM 和 LTXEHWM 设置为 100,那么长事务将永不停止。 因此,必须将 LTXHWM 设置为低于 100,才能进行正常的数据库服务器操作。为运行未知长度的已调度事务,将 LTXHWM 设置为 100。如果当长事务在回滚并且当您有大量磁盘空间时您从不希望阻塞其他用户,那么将 LTXEHWM 设置为 100。
调整日志文件大小以防止长事务
当许多用户在同时写入日志时,使用较大日志文件。如果您使用小日志,而长事务又有可能发生,那么降低高水位标志。请将 LTXHWM 值设置为 50 并将 LTXEHWM 的值设置为 60。
如果日志文件太小,数据库服务器可能会在回滚长事务时耗尽日志空间。在这种情况下,数据库服务器无法足够快速地阻拦以便及时在上一个日志文件填满之前添加新日志文件。如果上一个日志文件填满,系统将挂起并显示错误消息。要解决该问题,可关闭并重新启动数据库服务器。有关详细信息,请参阅从长事务挂起恢复。
从长事务挂起恢复
如果您的系统具有足够的磁盘空间并且您想要执行未知长度的事务,请考虑将 LTXHWM 设置为 100 以强制数据库服务器继续添加日志文件直到您完成事务。
事务可能因为数据库服务器已耗尽磁盘空间而挂起。数据库服务器将停止添加新的日志文件、写入错误消息并且发出警报。
要继续事务,请执行以下操作:
- 向数据库空间添加数据库空间或块。
- 重新开始处理该事务。
如果您无法将更多的磁盘空间添加到数据库服务器,请终止该事务。
要添加事务
- 发出 onmode -z 命令。
- 关闭并重新启动数据库服务器。
当数据库服务器以快速恢复方式启动时,事务将回滚。然后执行以下步骤:
从长事务挂起恢复
- 添加更多磁盘空间或另一磁盘,直至事务成功回滚。
- 在长事务开始之前执行时间点复原或尽早执行时间点复原以便使数据库服务器可以回滚事务。
- 将额外的日志文件、数据库空间或块从数据库服务器实例删除。
- 执行完全的 0 级备份以释放逻辑日志空间。
物理日志记录、检查点和快速恢复
这些主题涵盖数据库服务器用来实现数据一致性的三个过程:
- 物理日志记录
- 检查点
- 快速恢复
物理日志磁盘页的集合,数据库服务器在此存储称为前映像的未修改页的副本。物理日志记录是存储数据库服务器将要更改的页的前映像的过程。 检查点是当数据库服务器将磁盘上的页与共享内存缓冲区中的页进行同步时的时间点。快速恢复是一种自动过程,该过程在数据库服务器在无控的条件下脱机后将数据库服务器复原到一致状态。
这些过程确保将多个逻辑相关的写入记录为一个单元,并将共享内存中的数据与磁盘上的数据定期调整为一致。
有关管理和监视物理日志和检查点的任务,请参阅管理物理日志。
临界区
临界区是必须作为单个单元执行的代码段(或机器指令)。临界区通过允许线程在其交换出去之前运行一系列指令,可确保线程的完整性。
物理日志记录
物理日志记录是在更改页实际记录在磁盘上之前存储数据库服务器将要更改的页的过程。在数据库服务器修改共享内存缓冲池中的某些页之前,它将页的前映像存储在共享内存中的物理日志缓冲区。
数据库服务器为这些页而将前映像页保留在共享内存的物理日志中,直至一个或多个页清除程序将页清空到磁盘。未修改的页在数据库服务器发生故障或备份过程需要它们的情况下可用于提供数据库服务器数据的准确快照。快速恢复和数据库服务器备份会使用这些快照。
数据库服务器重新启动每个检查点上的物理日志,但特殊情况下的除外。有关检查点的更多信息,请参阅检查点。
快速恢复物理记录页的使用
在故障后,数据库服务器使用页的前映像将磁盘上这些页复原至它们在上一个检查点中的状态。 然后数据库服务器使用逻辑日志记录使所有数据返回至最近完成的事务之时物理和逻辑上的一致状态。快速恢复更详细地说明了该过程。
物理记录的页的备份使用
当您执行备份时,数据库服务器执行检查点并检查物理日志,以确定备份上所属的页的正确版本。在 0 级备份中,数据库服务器备份所有磁盘页。 有关更多详细信息,请参阅《GBase 8s 备份与复原指南》。
物理记录的数据库服务器活动
如果对检查点之间的页作了多次调整,那么通常仅在物理日志中记录第一个前映像。
物理日志是一种循环日志,其中仅对每个检查点使用一次物理日志中的页。如果设置了 RTO_SERVER_RESTART 配置参数,那么将出现其他物理日志以提高快速恢复性能。
物理恢复消息
当快速恢复开始时,数据库服务器记录以下带有块和偏移量名称的消息:
Physical recovery started at page chunk:offset.
当快速恢复完成时,数据库服务器记录以下带有已检查和已复原页的数目的消息:
Physical recovery complete: number pages examined, number pages restored.
物理日志记录和简单大对象
物理日志中的数据库服务器页可以是任何数据库服务器页,包括表空间 (tblspaces) 中的简单大对象。甚至开销页(如块可用列表页、BLOB 空间可用图页和 BLOB 空间位图页)也会在页上数据修改并清空到磁盘之前复制到物理日志。
BLOB 空间 BLOB 页不在物理日志中记录。有关 BLOB 空间日志记录的更多信息,请参阅记录 BLOB 空间和简单大对象。
物理日志记录和智能大对象
智能大对象的用户数据部分不进行物理记录。但是,元数据要物理记录。有关智能大对象的信息,请参阅智能大对象空间。
物理日志的大小和位置
这些主题描述了如何配置物理日志的大小和位置。
指定物理日志的位置
在数据库服务器初始化磁盘空间时,它将逻辑日志文件和物理日志放在根数据库空间中。 您对该放置没有初始控制权。要提高性能(尤其是减少对根数据库空间的写入次数以及将磁盘争用最小化),可将物理日志从根数据库空间移出至另一数据库空间(最好是不包含活动表或逻辑日志文件的磁盘)。
找到容错存储设备上的关键数据库空间。如果物理日志所在的存储器不是容错存储器,请对包含物理日志的数据库空间使用 GBase 8s 镜像。这将在存储设备发生故障时保护数据库。
用于估计物理日志的大小的策略
物理日志的大小取决于两个因素:事务生成物理日志活动的速率和是否设置了 RTO_SERVER_RESTART 配置参数
事务生成物理日志活动的速率可影响检查点性能。在检查点处理期间,如果因事务持续生成物理日志数据而导致物理日志开始变得太满,那么数据库服务器将阻塞事务以使检查点完成,并避免物理日志溢出。
要避免事务阻塞,数据库服务器必须具有足够的物理日志空间来包含检查点处理期间出现的所有事务活动。在物理日志填充度达到 75% 时触发检查点。在物理日志填充度达到 75% 时,必须在完成检查点处理之后才能使用剩余的 25% 的物理日志。一旦系统检测到有物理日志溢出的可能性,就会发生事务阻塞,因为每个活动事务都可能生成一个物理日志活动。
例如,假设您具有 1 千兆字节的物理日志和 1000 个活动事务。如果每个事务同时处于临界区,那么这 1000 个活动事务具有生成大约 80 兆字节物理日志活动的可能性。当填入 750 兆字节的物理日志时,数据库服务器将触发检查点。如果在使用 920 兆字节物理日志时检查点仍未完成,那么将出现事务阻塞直到检查点完成。如果发生事务阻塞,那么服务器将自动触发更频繁的检查点以避免事务阻塞。您可以禁用自动检查点的生成。
如果存在大量脏分区,那么即使物理日志填充度不到 75%,服务器也可能触发检查点,因为将修改的分区数据清空到磁盘需要物理日志空间。 当服务器检查物理日志填充度是否达到 75% 时,服务器还会检查以下情况是否为真:
(使用的物理日志页数 + 脏分区数量)>= ((物理日志大小 * 9)/10)
有关检查点处理和自动检查点的更多信息,请参阅检查点。
估计物理日志大小时要考虑的第二个因素取决于是否使用 RTO_SERVER_RESTART 配置参数指定了快速恢复的目标时间量。如果无需考虑快速恢复时间,那么不需要启用 RTO_SERVER_RESTART 配置参数。如果为 RTO_SERVER_RESTART 配置参数指定值,那么事务活动将生成附加物理日志活动。
通常,此附加物理日志活动对事务性能影响较小或没有影响。额外的日志记录用于在快速恢复期间辅助缓冲池,以便以最佳方式执行日志重放。如果物理日志比所有缓冲池的总大小要大很多,那么快速恢复期间将对页清空并出现缺页故障。页清空和缺页故障大幅减小了快速恢复性能,而且数据库服务器不能维护 RTO_SERVER_RESTART 策略。
对于缓冲池空间小于 4 千兆字节的系统,物理日志的大小可定在所有缓冲池总大小的 110%。对于较大的缓冲池,以 4 千兆字节的物理日志空间开始,然后监视检查点活动。如果检查点发生过于频繁,似乎会影响性能,请增加物理日志大小。
为数据库服务器配置了较小的物理日志并且该服务器具有大量用户时,可能会出现一种称为物理日志溢出的罕见情况。遵循上述有关大小的准则可帮助避免物理日志溢出。每当消息日志检测到未达到最佳标准的配置时,数据库服务器将对其生成性能警告。
如果检测到未达最佳标准的配置,那么您可以使用 onstat -g ckp 命令来显示配置建议。
事务日志记录关闭时物理日志溢出
如以下示例所示,如果您在事务日志记录关闭的数据库中使用简单大对象或智能大对象,物理日志可能会溢出。
在数据库服务器处理简单大对象时,数据库服务器存储在磁盘上的简单大对象的每个部分均可分别记录,允许线程退出各部分之间的代码临界区。但如果日志记录关闭,那么数据库服务器必须对一个临界区中的简单大对象执行所有操作。如果该简单大对象很大,而物理日志很小,那么该情况可能导致物理日志填满。如果发生这种情况,数据库服务器会将以下消息发送至消息日志:
Physical log file overflow
然后数据库服务器启动关机操作。有关建议的更正操作,请参阅消息日志。
检查点
数据库服务器会定期将缓冲池内的事务和数据清空到磁盘。直到将事务和数据清空到磁盘之前,数据和事务都处于流出的状态。除了在事务完成后立即强制将每个事务清空到磁盘,数据库服务器还将事务写入到逻辑日志中。数据库服务器在事务发生时记录事务。 如果出现系统故障,那么服务器执行以下操作:
- 重放日志以重做和复原事务。
- 将数据库返回至与发生故障时数据库系统的状态一致的状态。
为了便于数据库系统的复原或逻辑恢复,数据库服务器生成一致性点,称为检查点。检查点是建立数据库系统的已知和一致状态时日志中的时间点。通常,检查点涉及到记录特定数量的信息,因此,如果发生故障,数据库服务器可在已建立的点上重新启动。
检查点的目的在于定期将逻辑日志中的重新启动点向前移动。如果检查点不存在而且发生故障,那么数据库服务器需要处理自系统重新启动以来逻辑日志中记录的所有事务。
检查点可在以下某个情境中出现:
-
当指定事件发生时。例如,每当将数据库空间添加到服务器或执行数据库备份时,检查点将出现。
通常,这些类型的事件会触发阻塞事务处理的检查点。因此,这些检查点称为阻塞检查点。
-
当资源限制发生时。例如,逻辑日志空间的每个范围需要检查点来保证日志具有开始快速恢复的检查点。数据库服务器将在物理日志达到总大小的 75% 时触发检查点,以避免物理日志溢出。
资源限制触发的检查点通常不会阻塞事务。因此,这些检查点称为非阻塞检查点。
但是,如果在检查点处理期间数据库服务器将要耗尽资源,那么在检查点处理的中段将出现事务阻塞,以保证耗尽资源之前检查点能够完成。如果事务被阻塞,那么服务器将更频繁的尝试触发检查点,以避免检查点处理期间的事务阻塞。有关更多信息,请参阅用于估计物理日志的大小的策略。
自动检查点引起数据库服务器触发更频繁的检查点,以避免事务阻塞。自动检查点尝试监视系统活动和资源使用情况(物理和逻辑日志使用情况以及缓冲池脏的程度)以能够及时地触发检查点,这样检查点的处理就可在物理日志或逻辑日志耗尽之前完成。
数据库服务器为逻辑日志空间的每个范围生成至少一个自动检查点。这保证了可开始快速恢复的检查点的存在。
使用 AUTO_CKPTS 配置参数可在数据库服务器启动时启用或禁用自动检查点。(可通过使用 onmode -wm 或 onmode -wf 来动态地启用或禁用自动检查点。)
手动检查点是您可以启动的基于事件的检查点。
数据库服务器提供了两种方法来确定发生意外中断时快速恢复所用时间。
-
使用 CKPTINTVL 配置参数可指定服务器触发检查点的频率。
-
使用 RTO_SERVER_RESTART 配置参数可指定快速恢复需要的时间。
当您使用 RTO_SERVER_RESTART 配置参数时:
- 数据库服务器忽略 CKPTINTVL 配置参数。
- 数据库服务器监视物理和逻辑日志使用情况,以估计快速恢复的持续时间。如果服务器估计快速恢复将超出 RTO_SERVER_RESTART 配置参数中指定的时间,那么服务器将自动触发检查点。
RTO_SERVER_RESTART 配置参数可以是目标时间量,不能是保证的时间量。
可增加重新启动时间的多个因素也可影响快速恢复时间。这些因素包括回滚遇到意外中断时处于活动状态的长事务。
有关 RTO_SERVER_RESTART 和 AUTO_CKPTS 配置参数的更多信息,请参阅《GBase 8s 管理员参考》中有关配置参数的主题。
用于清空检查点之间缓冲池的 LRU 值
用于清空检查点之间缓冲池的 LRU 值对于检查点性能不是特别重要。在 BUFFERPOOL 配置参数中设置的 lru_max_dirty 和 lru_min_dirty 值通常仅对于维护页替换的足够清洁页是必需的。通过将 lru_min_dirty 设置为 70 和将 lru_max_dirty 设置为 80 开始。
如果检查点期间事务被阻塞,那么数据库服务器随后将尝试增加检查点频率以消除被阻塞的事务。当服务器搜索空闲页以执行页替换并且发生前台写入时,服务器随后将自动增加 LRU 清空频率以防止该事件再次发生。当数据库服务器完成页替换并找到后续访问的页时,服务器将自动增加 LRU 清空。对 LRU 清空所作的任何自动调整都不会持续到 onconfig 文件。
备份期间的检查点
如果执行备份,那么数据库服务器将运行检查点并将所有经更改的页清空到磁盘中。如果您执行复原,那么数据库服务器重新应用所有逻辑日志记录。
有关 ON-Bar 或 ontape 的信息,请参阅《GBase 8s 备份与复原指南》。
快速恢复
快速恢复是自动容错功能,数据库服务器每次从脱机方式转向静态、管理员或在线模式时将执行该功能。无需为快速恢复执行任何管理操作;它是自动执行的功能。
快速恢复过程检查数据库服务器上次脱机时是否在不受控条件下进行的。如果是,那么快速恢复将数据库服务器返回至物理和逻辑一致性状态。
如果快速恢复过程发现数据库服务器在受控方式下脱机,那么快速恢复过程终止,并且数据库服务器转向在线模式。
请参阅检查点之后的快速恢复。
需要快速恢复
快速恢复在任何导致数据库服务器内存内容丢失的故障之后将数据库服务器复原至物理和逻辑一致性。例如,操作系统发生故障,但没有任何警告。系统故障不损坏数据库,但却影响发生故障时正在进行的事务。
启动快速恢复时的情境
每次管理员将数据库服务器从脱机方式转为静态、管理员或在线模式时,数据库服务器都会检查是否需要快速恢复。
作为共享内存初始化的一部分,数据库服务器检查物理日志的内容。当数据库服务器在受控条件下关闭时,物理日志为空。 从在线模式转向静态模式的过程包含一个清空物理日志的检查点。因此,如果数据库服务器在物理日志中找到页,很明显数据库服务器会在不受控条件下脱机,并且快速恢复开始。
快速恢复和已缓冲日志记录
如果数据库使用已缓冲日志记录(如已缓冲的事务日志记录中所述),那么与已落实事务相关联的一些逻辑日志记录可能不会在发生故障时写入逻辑日志。 如果发生这种情况,快速恢复不会复原那些事务。快速恢复仅能复原那些在磁盘上的逻辑日志中存储有相关联的 COMMIT 记录的事务。(由于该原因,已缓冲日志记录代表性能和数据脆弱性之间的平衡。)
快速恢复期间可能的物理日志溢出
在快速恢复期间,物理日志可能会溢出。如果此情况发生,那么数据库服务器将尝试将物理日志空间扩展到名为 plog_extend.servernum 的磁盘文件。 此文件的缺省位置件 $GBASEDBTDIR/tmp。
使用 ONCONFIG 参数 PLOG_OVERFLOW_PATH 可定义用于创建此文件的位置。
当在快速恢复期间执行第一个检查点时,数据库服务器将除去 plog_extend.servernum 文件。
快速恢复和无日志记录
对于不使用日志记录的数据库或表,快速恢复将数据库复原到它在最近检查点之时的状态。自上一个检查点以来对数据库所作的所有更改都将丢失。
检查点之后的快速恢复
作为共享内存初始化的一部分,快速恢复将数据库服务器返回至一致状态。将存储所有已落实的事务,并将回滚所有未落实的事务。
快速恢复按以下步骤发生:
- 数据库服务器使用物理日志中的数据将所有磁盘页返回至它们在最近检查点时的状态。该点称为物理一致性。
- 数据库服务器在逻辑日志文件中查找最新的检查点记录。
- 数据库服务器前滚所有在最近检查点记录之后写入的逻辑日志记录。
- 数据库服务器回滚所有未落实的事务。某些 XA 事务在 XA 资源管理器可用之前可能未解析。
服务器恢复到上一个检查点的状态
要将所有磁盘页返回到它们在最近检查点之时的状态,数据库服务器将物理日志中存储的前映像写入共享内存,然后写回到磁盘。物理日志中的每个前映像包含在检查点之后更新的页的地址。当数据库服务器将物理日志中的每个前映像页写到共享内存并又写回到磁盘时,自最近检查点时刻以来对数据库服务器数据的更改将撤销。现在数据库服务器在物理上是一致的。 下图说明了此步骤。
图: 将物理日志中的所有剩余前映像写回到磁盘
服务器在逻辑日志中查找检查点记录
在返回到上一个检查点状态之后,数据库服务器在逻辑日志中定位最近检查点记录的地址。最近检查点记录可保证位于磁盘上的逻辑日志中。
服务器前滚逻辑日志记录
在定位逻辑日志中的检查点记录之后,数据库服务器前滚在最近检查点记录之后写入的逻辑日志记录。此操作再现自检查上一个检查点以来直到发生不受控的关机之时对数据库的所有更改。下图说明了此步骤。
图: 前滚自最近检查点以来写入的逻辑日志记录
在此图之前的段描述了此图的内容。
服务器回滚未落实的事务
在前滚逻辑日志记录之后,数据库服务器回滚系统失败时未落实的事务的所有逻辑日志记录。所有数据库逻辑一致,因为所有已落实事务已前滚并且所有未落实事务已回滚。某些 XA 事务在 XA 资源管理器可用之前可能未解析。
已完成两阶段落实的第一阶段的事务是例外情况。有关更多信息,请参阅两阶段落实协议如何处理故障。
因为可能有一个或多个事务跨及几个检查点而未落实,所以该回滚过程可能会越过最近检查点记录而往回读完逻辑日志。包含打开的事务的记录的所有逻辑日志文件可用于数据库服务器,因为直至日志文件包含的所有事务关闭才会释放该日志文件。
下图说明了回滚过程。此处,未落实的更改从逻辑日志回滚到特定磁盘上的数据库空间。当快速恢复完成时,数据库服务器将转回静态、管理员或在线模式。
图: 回滚未完成的所有事务
管理物理日志
这些主题描述了以下过程:
- 更改物理日志的位置或大小
- 监视物理日志、物理日志缓冲区和逻辑日志缓冲区
- 监视并强制执行检查点
请参阅物理日志记录、检查点和快速恢复以获取背景信息。
更改物理日志的位置和大小
可以使用 onparams 实用程序来更改物理日志的位置和大小。
您可以移动物理日志文件来尝试提高性能。 在数据库服务器初始化磁盘空间时,它会将分配给逻辑日志和物理日志的磁盘页放在根数据库空间中。 您可以通过将物理日志和/或逻辑日志文件移至其他数据库空间来提高性能。
无法将逻辑或物理日志添加到没有缺省页大小的数据库空间中。
先决条件:
- 执行更改时,以用户 gbasedbt 或 root 身份(在 UNIX™ 上)登录。
- 通过运行 oncheck -pe 命令,确定是否有足够的连续空间可用。
为物理日志分配的空间必须是连续的。 当更改物理日志的大小或位置时,如果目标数据库空间包含的连续空间不足,那么服务器将不更改物理日志。此外,如果在初始化数据库服务器时物理日志没有足够的资源,初始化会失败。
要更改物理日志的大小和位置,请在数据库服务器处于管理员、停顿或在线模式时运行以下命令:
onparams -p -s size -d dbspace -y
size
物理日志的新大小(以 KB 计)
数据库空间
指定物理日志要位于的数据库空间
以下示例更改物理日志的大小和位置。新的物理日志大小为 400 KB,并且该日志位于 dbspace6 数据库空间中:
onparams -p -s 400 -d dbspace6 -y
监视物理和逻辑日志记录活动
监视物理日志以确定在检查点出现前使用的物理日志文件的百分比。可使用这些信息来找出物理日志文件的最佳大小。该大小必须足够大,使数据库服务器无需过于频繁地强制执行检查点,也必须足够小,以节省磁盘空间并保证快速恢复。
监视物理日志和逻辑日志缓冲区以确定它们对于当前处理级别是否为最佳大小。要监视的重要统计信息就是每个磁盘的写入页数统计信息。
要监视物理日志文件、物理日志缓冲区和逻辑日志缓冲区,请使用以下命令。
实用程序 | 命令 | 更多信息 |
---|---|---|
命令行 | onstat -l | 第一行显示以下有关每个物理日志缓冲区的信息: ● 已用的缓冲区页数 (bufused) ● 每个物理日志缓冲区以页计的大小 (bufsize) ● 向缓冲区写入的页数 (numpages) ● 从缓冲区到磁盘的写入次数 (numwrits) ● 向缓冲区写入的页数与向磁盘写入的次数之比率 (pages/IO) 第二行显示以下有关物理日志的信息: ● 物理日志文件中首页的页码 (phybegin) ● 物理日志文件以页计的大小 (physize) ● 日志中要发生下次写入的当前位置,指定为页码 (physpos) ● 日志中的已用页数 (phyused) ● 已用的总物理日志页数的百分比 (%used) 第三行显示以下有关每个逻辑日志缓冲区的信息: ● 已用的缓冲区页数 (bufused) ● 每个逻辑日志缓冲区以页计的大小 (bufsize) ● 向缓冲区写入的记录数 (numrecs) ● 向缓冲区写入的页数 (numpages) ● 从缓冲区到磁盘的写入次数 (numwrits) ● 缓冲区中记录数与页数的比率 (recs/pages) ● 向缓冲区写入的页数与向磁盘写入的次数之比率 (pages/IO) |
命令行 | onparams -p | 移动物理日志或调整物理日志大小 |
命令行 | onmode -l | 前进到下一逻辑日志文件。 |
有关 onstat -l 输出的示例的更多信息,请参阅《GBase 8s 管理员参考》。
有关使用 SQL 管理 API 命令(而不是一些 onparams 和 onmode 命令)的信息,请参阅使用 SQL 管理 API 执行远程管理和《GBase 8s SQL 指南:语法》。
监视检查点信息
监视检查点活动以查看各种信息,包括线程需要等待检查点完成的次数。这些信息对于确定检查点间隔是否适当非常有用。
要监视检查点,请使用以下命令。
实用程序 | 命令 | 更多信息 |
---|---|---|
onstat 实用程序 | onstat -m | 查看消息日志中的最近 20 行。 如果最近 20 行中不包含检查点消息,那么直接用文本编辑器读取消息日志。数据库服务器在检查点结束时将个别检查点消息写入日志。 如果发生了检查点,但数据库服务器没有页可写入磁盘,那么数据库服务器不会将任何消息写入消息日志。 |
onstat 实用程序 | onstat -p | 获取这些检查点统计信息: ● numckpts:自数据库服务器在线以来发生的检查点数。 ● ckptwaits:用户线程等待检查点完成的次数。数据库服务器将防止用户线程在检查点期间进入临界区。 |
打开或关闭检查点调整
要打开自动检查点调整,请发出 onmode –wf AUTO_CKPTS=1 命令。要关闭自动检查点调整,请发出 onmode –wf AUTO_CKPTS=0 命令。
强制执行检查点
如果必要,可以使用 onmode 或 SQL 管理 API 命令来强制执行检查点。
在以下任何情况下强制执行检查点:
- 要释放包含最近检查点记录且已备份但尚未释放( onstat -l 的 U-B-L 或 U-B 状态)的逻辑日志文件
- 在您发出 onmode -sy 将数据库服务器置为静态模式之前
- 在构建较大索引后,如果数据库服务器在下一个检查点之前终止。索引构建将在下一次重新启动数据库服务器时重新启动。
- 如果检查点有很长时间未出现,而您要尝试进行可能中断数据库服务器的系统操作
- 如果前台写入将耗用比预期更多的资源(执行强制检查点临时将资源使用量降至零)
- 运行 dbexport 或卸载表之前,请确保在导出或卸载数据之前所有数据在物理上保持一致
- 在使用 PUT 或 INSERT 语句执行大量表的装入后(因为表的装入使用缓冲区高速缓存,强制执行检查点可清除高速缓存。)
要强制执行检查点,请运行 onmode -c。
有关使用 SQL 管理 API 命令(而不是一些 onmode 命令)的信息,请参阅使用 SQL 管理 API 执行远程管理和《GBase 8s SQL 指南:语法》。
服务器提供的检查点统计信息
数据库服务器提供有关前 20 个检查点的历史记录信息。可以通过 SMI sysckptinfo 表来访问这些信息。
SMI 表
查询 sysprofile 表以获取有关物理日志和逻辑日志缓冲区的统计信息。sysprofile 表还提供与 onstat -p 选项提供的信息相同的检查点统计信息。以下行包含以下统计信息。
plgpagewrites
写入物理日志缓冲区的页数
plgwrites
从物理日志缓冲区到物理日志文件的写入次数
llgrecs
写入逻辑日志缓冲区的记录数
llgpagewrites
写入逻辑日志缓冲区的页数
llgwrites
从逻辑日志缓冲区到逻辑日志文件的写入次数
numckpts
自数据库服务器变为在线后所出现的检查点数
ckptwaits
线程在检查点期间等待检查点完成进入临界区的次数
value
numckpts 和 ckptwaits 的值
打开或关闭自动 LRU 调整
使用 AUTO_LRU_TUNING 配置参数可在数据库服务器启动时启用或禁用自动 LRU 调整。
如果设置了 RTO_SERVER_RESTART 配置参数,数据库服务器将自动触发检查点,以便能在指定的时间内使服务器转为在线。如果服务器不满足 RTO_SERVER_RESTART 策略的要求,那么数据库服务器会打印消息日志中的警告信息。
要关闭特定会话的自动 LRU 调整,请发出 onmode –wm AUTO_LRU_TUNING=0 命令。
要在会话期间关闭自动 LRU 调整后再将其打开,请发出 onmode –wm AUTO_LRU_TUNING=1 命令
自动 LRU 调整更改会影响所有缓冲池并调整 BUFFERPOOL 配置参数中的 lru_min_dirty 和 lru_max_dirty 值。