物理和逻辑日志

   通过本文的学习,您将能够:

  • 移动物理日志到新的 dbspace

  • 添加、删除和修改逻辑日志

  • 更改数据库的日志模式

  • 定义长事务

  • 列出并描述与物理和逻辑日志相关的配置参数

  • 监控物理日志和逻辑日志

1. 日志初始化

   onconfig.std 中的缺省参数设置:

PHYSFILE 50000        # Physical log file size (Kbytes)
LOGFILES 6            # The number of logical log files
LOGSIZE 10000         # The size of each logical log, in KB

   在缺省情况下,服务器初始化时,物理日志和逻辑日志文件将位于root dbspace 中。在数据库初始化后它们可以被移动到另一个 dbspace中。初始化时,您可以配置的物理日志和逻辑日志参数如下:

参数 说明
PHYSFILE 磁盘上只有一个物理日志被创建。最小物理日志大小为 200 KB。物理日志大小必须为页大小的倍数。
LOGFILES 逻辑日志文件数量。逻辑日志文件的最小数字为 3,最大为 32767。
LOGSIZE 逻辑日志文件大小最小为为 200KB,最大的计算方式如下:(ROOTSIZE - PHYSFILE - 512 -(63 *((pagesize)/1024))) / LOGFILES。逻辑日志大小必须为页大小的倍数。

2. 更改物理日志

   可以实用onparams 命令更改物理日志的大小或位置。例如

   onparams -p -d dbspace2 -s 10000

1700552002511

   onparams 实用程序可以用来更改物理日志 dbspace 的位置和大小。以上是使用命令改变物理日志的大小和位置的示例。通过 onparams 实用程序更改物理日志的命令行参数为:

参数 说明
-p 更改物理日志
-d dbspace 物理日志被移动的新 dbspace 名称。
-s size 以 KB 为单位的物理日志大小
-y 自动以“是”响应提示。

  执行该命令时,将显示一条警告,指示后续如果想对源和目标 dbspace 执行增量备份,则需要对这些空间先执行 0 级备份。

注意:
  除非在更改物理日志之后和日志记录开始之前对系统进行 0 级备份,否则服务器恢复机制可能不起作用。

  有关更改物理日志的大小和位置的其他信息,请参阅《SinoDB管理员指南》“管理物理日志”章节。

3. 添加逻辑日志

  • 添加逻辑日志文件到名为logspace的dbspace ,可使用由 LOGSIZE 配置参数指定的逻辑日志文件大小:
    onparams -a -d logspace
  • 添加一个大小为10,000 KB 的逻辑日志到名为logspace的dbspace
    onparams -a -d logspace -s 10000

  添加逻辑日志之前,请考虑:

  • 确保没有达到逻辑日志文件数量上限。
  • Dbspace中必须对整个日志文件有连续可用空间。
  • 系统备份时不能添加日志文件。
  • 不能通过修改配置参数的方式添加逻辑日志。
  • 添加逻辑日志时服务器必须在静默模式。

  使用 onparams 实用程序添加新的逻辑日志。可以指定逻辑日志的新大小和要创建日志的 dbspace。通过 onparams 实用程序更改逻辑日志的命令行参数为:

参数 说明
-a 添加逻辑日志
-d dbspace 存放逻辑日志的 dbspace 名称
-s size 新逻辑日志大小(如果没有设定,将使用 LOGSIZE 配置参数值)

  新添加逻辑日志时,会被以 A 进行标记。

4. 删除逻辑日志

  • 删除 logid 为 21 的逻辑日志文件:
   onparams -d -l 21

  在删除逻辑日志文件之后,要对root dbspace和修改过的dbspace 进行0级备份。这可以防止数据库服务器在恢复时使用已被删除的日志文件。
  onparams实用程序可以用来删除日志文件。(如果逻辑日志已备份且不包含上一个检查点或活动事务,则认为没有被使用。)命令行参数为:

参数 说明
-d 删除逻辑日志
-l logid 指定要删除的逻辑日志文件编号

  请注意 logid 是逻辑日志文件编号,但不是唯一的逻辑日志编号。 逻辑日志的 logid 不会改变,始终指代磁盘上相同的逻辑日志文件。

  仅可以删除未被使用的或刚添加的逻辑日志文件。同样,因为服务器必须拥有 3 个逻辑日志,因此如果系统只有3个逻辑日志文件的情况下也不能删除日志。

  删除任何逻辑日志文件后,请执行服务器备份。

5. 释放逻辑日志文件

  因为逻辑日志文件在服务器中是循环使用的,所以了解逻辑日志文件什么时候会被释放以重用非常重要。

活动事务
  如果日志文件的任一部分内容是完成事务回滚或快速恢复时所需要的,那么该日志文件不能被释放。如果日志文件包含活动事务记录,则被认为在使用中,也不能被释放。

最后检查点记录

  如果日志文件包含最后检查点记录,如上面示例中 Log 1 所示,则该日志文件及其之后 (Log 2 and Log 3) 所有的日志文件都认为在使用中,不能被释放。当新的检查点记录写入时,从包含前一个检查点记录的日志文件到包含最新检查点记录的日志文件都不会被用来进行快速恢复了。除非它们包含活动事务的记录,否则都不会被认为在使用中了。如果这些逻辑日志已经备份到磁带,那么意味着它们可以被释放。

  释放逻辑日志文件也会释放任何曾通过包含在此日志文件中的事务被删除或更新的 blobspace blobpages 。

  重要已备份并释放的逻辑日志显示的标记为 U- B - - - - 如果逻辑日志不包含最后检查点,不在最后检查点之后,或不包含活动事务,则被认为可以释放。

6. 切换逻辑日志

  onmode 实用程序可以用来切换当前逻辑日志文件到下一个可用的逻辑日志文件,如下所示:

   onmode -l

  包含最后检查点的逻辑日志文件不能被释放。可以使用以下命令将最后一个检查点写入当前日志文件:

  onmode -c

  手动在当前日志写满之前切换到下一个逻辑日志文件的唯一方法是使用 onmode 实用程序的 - l 选项。写入新检查点到新逻辑日志,可使用此命令的 -c 选项。这些命令如上所展示。

7. 改变数据库日志模式

  可以使用 ondblog 实用程序来改变一个或多个数据库的日志模式。

  • 为改变已日志记录的数据库上的缓冲状态:
  ondblog unbuf stores_demo
  ondblog buf stores_demo
  • 改为无日志模式
  ondblog nolog stores_demo
  • 将文件“dbfile”中的数据库列表改为无日志模式
  ondblog nolog -f dbfile
  • 将数据库变成ANSI 模式
  ondblog ansi stores_demo

  可以使用 ondblog 实用程序来改变一个或多个数据库的日志记录模式。如果将一个数据库更改为日志模式,那必须做一个零级备份以使改变生效。

注意:
  如果不使用日志模式,服务器在发生故障时不能完全恢复数据库,而且也不能使用事务。

7. 监视物理日志和逻辑日志

$ onstat -l

Sinoregal SinoDB Dynamic Server Version 16.8.FC8U0X3 -- On-Line -- Up 63 days 17:56:34 -- 1355616 Kbytes

Physical Logging
Buffer bufused  bufsize  numpages   numwrits   pages/io
  P-2  0        64       596241     19278      30.93
      phybegin         physize    phypos     phyused    %used   
      2:53             1023945    596297     0          0.00    

Logical Logging
Buffer bufused  bufsize  numrecs    numpages   numwrits   recs/pages pages/io
  L-2  0        32       5678946    601068     446887     9.4        1.3     
        Subsystem    numrecs    Log Space used
        OLDRSAM      5669618    551938420     
        HA           8466       372504        
        DDL          862        296176        

address          number   flags    uniqid   begin                size     used    %used
463c4f88         7        U-B----  7        3:53               102390   102390   100.00
4618cf68         8        U-B----  8        3:102443           102390   102390   100.00
46269f40         9        U-B----  9        3:204833           102390   102390   100.00
46269fa8         10       U-B----  10       3:307223           102390   102390   100.00
463a8450         11       U-B----  11       3:409613           102390   102390   100.00
463a84b8         12       U---C-L  12       3:512003           102390    89144    87.06
463a8520         13       A------  0        3:614393           102390        0     0.00
463a8588         14       A------  0        3:716783           102390        0     0.00
463a85f0         15       A------  0        3:819173           102390        0     0.00
463a8658         16       A------  0        3:921563           102390        0     0.00
 10 active, 10 total

[sinodbms@feig-wzq-db ~]$ 

  onstat -l 命令显示了物理和逻辑日志的当前状态。逻辑日志的 flags 列可以包含下列几项:

参数 说明
F 空闲,可用
B 已备份
C 当前正在使用的
U 已使用
A 新添加的
L 包含最后检查点

8. 长事务

  如果一个事务跨越了所有可用逻辑日志文件,就会产生问题。为使长事务 继续,会需要更多逻辑日志空间。提供那些空间的唯一方式就是将其中一个日志文件备份到磁带以释放它的空间来接收新的事务。可是,必须等到所有包含在日志文件中的事务都被提交,日志文件才能被释放(这是以防事务需要回滚,在这种情况下涉及的所有日志文件必须在磁盘上)。因此,系统可能会变成死锁而不能再有数据库活动。

LTXHWM

  为避免此情况,当一个事务达到长事务高水位标志 (LTXHWM)时,它就会被宣布为一个长事务 (LTX)。该事务就会自动回滚。

LTXEHWM独占访问

  为确保该长事务的回滚不会将剩余可用日志空间都填满,当日志达到长事务专用高水位标志 (LTXEHMW)时,只有当前回滚事务的线程(包括该长事务)和当前正写 COMMIT 记录的线程才被允许继续(并且访问逻辑日志);所有其他的事务被挂起直到该长事务结束回滚。

  在配置文件中 LTXHWM 和 LTXEHWM 参数是可更改的。缺省百分比是:

参数 默认值
LTXHWM 50
LTXEHWM 60

  这些缺省百分比是逻辑日志文件数量 的百分比,不是逻辑日志总大小的百分比。另外,数据库服务器只有在它连接到下一个逻辑日志文件时才会检查该百分比。最小值三个逻辑日志文件是不够的。SinoDB数据库建议您使用一个更大的数量,例如 30 或者 40 甚至 100 个逻辑日志文件。

  如果选择记录智能大对象数据的日志,必须要意识到该选择可能会产生大量逻辑日志流量,可能会填满逻辑日志。为阻止长事务发生,对智能大对象要定期进行commit。

  注意: 当一个逻辑日志备份后,onstat -l 的状态标志指明它被使用和备份。为判定哪些日志由于包含了活动事务条目,虽然被备份了但仍不可用,运行 onstat -x 。来自 onstat - x 的输出显示了活动事务以及它们最开始使用的日志编号。

9. 日志的动态分配

  为避免导致长事务的问题出现,SinoDB数据库增加了一个新特性,遇到长事务的情况时,系统会动态添加逻辑日志。您可以配置数据库服务器在下一个逻辑日志仍包含活动事务时,自动在当前日志文件之后插入一个或多个逻辑日志文件。数据库服务器来决定添加的逻辑日志文件的大小和位置(dbspace)。

  也可以配置数据库服务器来手动添加逻辑日志文件。这种情况下添加逻辑日志文件时,可以指定日志文件的大小和位置。

9.1 DYNAMIC_LOGS 动态日志配置参数

  DYNAMIC_LOGS 的值决定了:

  • 一个事件警报是否发生
  • 服务器是否被挂起来以允许添加日志文件
  • 是否自动添加一个新的逻辑日志
  • LTXHWM 和 LTXEHWM 配置参数的设置
发出警报? 等待? 自动添加? LTXHWM/ LTXEHWM
2 80/90
1 80/90
0 50/60

  DYNAMIC_LOGS 配置参数可被设为下列值:

说明
2 自动分配一个新的逻辑日志文件并且引起警报。这是缺省值,且是推荐设置。由于长事务回滚导致日志变满时,可以自动添加额外的日志文件,因此高位标志可以设的更高些。
1 发出警报,并且暂停来允许手动添加新的逻辑日志文件。如果您不想让数据库服务器自行选择新日志文件的大小和地址,就使用该选项。使用 onparams 命令来添加另一个日志文件。因为直到新日志文件被添加之前,服务器一直是挂起的,所以高位标志可被设为更高阈值。
0 如果使用此设置,则在长事务回滚期间,逻辑日志可能会完全变满。您可以通过将 DYNAMIC_LOGS 设置为 1 或 2 来完全避免该问题。高水位线设置为低得多的值,因为在长事务的情况下必须允许更多的日志空间。由于需要给万一发生的长事务留出多的日志空间,高位标志要设得低一些。

10. 插入一个新的日志文件

  使用 onparams 的新 -i 选项,在当前逻辑日志之后 插入一个新的逻辑日志文件。

示例:

  onparams -a -i -d logdbs -s 5000

  为了动态添加日志文件,SinoDB数据库允许当服务器处于联机模式时动态添加逻辑日志文件。而且不需要一个零级别备份来激活新添加的逻辑日志文件。

  如果您将 DYNAMIC_LOGS 配置参数设为 1,并且一个长事务已经导致服务器进入等待模式,那么可以使用带有一个 -i 选项的 onparams 命令来在当前逻辑日志文件后插入一个新逻辑日志,正如以上所示。如果没有 -i 选项,onparams 则在最后的逻辑日志文件后面添加一个新逻辑日志文件。

11. onlog实用程序

log number:	4.			
addr	len	type	xidid	link	
18	32	BEGIN	11 4	0	01/12/94	15:50:28 222	informix
38	120	BLDCL	11	0	18	200002	8	8 104		4 systables
b0	28	CHALLOC	11	0	38	200035		8			
cc	32	PTEXTEND	11	0	b0	200002		7		200035
ec	72	HINSERT	11	0	cc	100002		203		36	
134	56	ADDITEM	11	0	ec	100002		203		1	1	18
16c	120	BLDCL	11	0	134	200003	8	8 36	0	syscolumns
1e4	28	CHALLOC	11	0	16c	20003d		8			
200	32	PTEXTEND	11	0	1e4	200003		7		20003d
220	56	CINDEX	11	0	200	200003		1			
258	72	HINSERT	11	0	220	200003		201		36	

  onlog 实用程序被用来检查一个逻辑日志的内容。该实用程序可以读取位于磁盘或者备份到磁带上的日志。当它读取日志中的条目时,它会打印出一个列有每个条目的报告。onlog 输出在需要追踪事务活动流来进行故障排除的情形下非常有用。

11.1 使用onlog实用程序

onlog -n 34					
...						
addr	len	type	xid	id	link	
2274	172	HINSERT	9	0	21c8	400010	290f	126
2320	36	CHALLOC	9	0	2274	400169	4
2344	40	PTEXTEND	9	0	2320	400010	45	400169
236c	172	HINSERT	9	0	2344	400010	2a01	126
2418	172	HINSERT	9	0	236c	400010	2a02	126
2518	56	CKPOINT	1	46	0	1
		begin	xid	id	addr	user
		46	6	46	2374	sinodbms
2618	28	CLR	6	0	2374	
2634	36	ROLLBACK	6	0	2374	10/28/2023 14:33:13

onlog 命令提供这些选项:

参数 说明
(没有选项) 显示当前在服务器上使用的所有逻辑日志的日志记录。
-n logid 显示由logid指定的单个逻辑日志的记录。
-u username 显示指定用户的记录。
-x tx_id 显示和指定事务 ID 有关的记录。
-t tblsp_num 显示和指定 tblspace_num有关的记录。
-b 只显示和 blobspace blobpage 有关的记录。
-d device 显示从逻辑日志备份到指定设备的记录。
-l 显示逻辑日志记录的长列表。

一个单个命令可以组合以上选项。例如,为显示名为 herbt 的用户的、位于逻辑日志34号的日志记录,运行命令:

 onlog -u herbt -n 34

11.2 日志记录页头

页头 内容 格式
addr 日志记录 十六进制的
len 记录字节长度 十进制的
type 记录类型名称 ascii
xid 事务编号 十进制的
id 逻辑日志编号 十进制的

  每个日志记录的以上数据都会被打印。大多数记录都还有额外数据字段来提供额外信息。
  onlog 显示了每个逻辑日志记录的页头和由记录类型的不同而带来的其它信息。如果指定 选项**-l** ,整个逻辑日志记录就会以ASCII 和十六进制两种格式被添加到显示中。以上图表概括了逻辑日志页头中字段的内容和格式。每一类型的条目中这些字段都会被显示。

11.3 日志记录子条目

1700547515254

  大多数日志记录包含额外的字段,或者子条目 ,它们用来提供关于日志记录的额外信息。

  逻辑日志记录描述在数据库服务器中执行的不同操作,并且描述这些操作所需的信息因日志记录类型而不同。除了为每条逻辑日志条目记录的页头信息外,子条目也显示在 onlog 报告中。

  以上示例 显示了在一个 HINSERT 日志条目中的三个子条目。

  关于所有逻辑日志记录类型的完整列表以及逻辑日志记录类型的每个分项字段, 请参阅星瑞格数据库管理员参考手册中的解释逻辑日志记录 章节。

  有关逻辑日志记录中所有逻辑日志记录类型以及该类型的每个子条目字段的完整列表,请参阅《SinoDB管理员参考》中的“解释逻辑日志记录”一章。

11.4 检查点记录子条目

字段 说明 格式
begin 日志开始 十进制的
xid 事务 ID 编号 十进制的
id 唯一日志编号 十进制的
addr 日志位置 (logpos) 十六进制的
user 用户 id 名称

  在检查点发生时,每一个活动事务都会有以上信息重复出现。

  如果在检查点出现时存在活动事务,检查点记录会按上述字段列出每一个活动事务的子项目。

12. Blobspace日志

  在一个 blobspace 中使用简单大对象时,在对数据的日志处理方式上会有一些不同。

  • 首先,blobspace blobpages 在共享内存中没有缓冲,当它们被创建或更新时,会被迅速写入磁盘。这意味着在物理日志中,没有任何 blobspace blobpages 的前映像。

  • 其次,blob free map的每一处变动都被记录在逻辑日志中,并且,blob free map页面的改变被记录在物理日志中。因为 blob free map通过记录所有 blobspace 中的 blobpages 的改变来追踪它们的状态,这也使得 blob 数据的恢复成为可能。

  • 第三,对个别blobpages的改变以及改变它们的事务都最终被写入逻辑日志备份磁带中。当一个日志备份到磁带,就会检查 blob free map,任何和日志中的事务有关的 blobpages 都在备份开始时被复制到磁带中。

  • 最后,当 blob 更新时,新的 blobpages 被分配,旧的不能被重写。直到包含 blob 数据改变的逻辑日志被释放,blobspace blobpages 的前映像才能被重复利用。这是因为事务回滚和快速恢复都需要 blobpages 的旧的拷贝。数据库服务器可以确定不再需要那些前映像的唯一方式是查证与改变相关的事务日志被释放。

13. Sbspace日志

  当数据库服务器记录智能大对象数据时:

  • 数据库服务器向逻辑日志缓冲区写入每一个操作(插入、更新、删除、读取或者写入)的记录。

  • 如果用户数据日志为智能大对象开启,CLOB 或者 BLOB 数据修改过的部分也包含在日志记录中。

  • 逻辑日志始终记录元数据,其中包含指向智能大型对象的指针。

  如果计划对智能大对象数据启用日志,则必须确保日志大小远大于写入的数据量。即使智能大对象未开启日志,也会始终记录智能大对象元数据。

  当用 LOG 选项创建一个智能大对象时,逻辑日志就会创建一个 smart-blob 记录。Smart-blob 日志记录追踪用户数据或元数据的改变。更新智能大对象时,日志记录中仅显示 sbspace 页面的修改部分。 当为智能大对象启用日志记录时,用户数据日志记录才会显示在逻辑日志中。

注意:
  为频繁更新的智能大对象启用日志记录时要小心。日志记录开销可能会显著降低数据库服务器的速度。事实上,为智能大对象启用用户数据日志,而且智能大对象有大量用户数据更新时,会以惊人的速度填满逻辑日志文件。