我们将H2用于长时间运行的过程,该过程将许多短暂的“事件”存储到嵌入式H2数据库中。插入和删除的行的吞吐量很高,但事件的频率各不相同。
在半生产系统上,数据库文件已增长到27 GiB。彻底压缩后,文件只有1.25 MiB。这是一个因素> 20000!
据我所知,H2在运行时不会压缩,但会标记并重用自由空间,我认为应该没问题。在某些时候,应该在已用空间和可用空间之间取得平衡,数据库文件不需要进一步增长。
H2的恢复工具通常建议用于分析此类情况(使用开关-transactionLog
)。 如何解释恢复工具的输出?
首先,底部的统计部分:
---- Statistics ----
-- page count: 14147341, free: 14106216
-- page data bytes: head 612539, empty 20613944, rows 9040909 (32% full)
-- free 99%, 14108082 page(s)
-- data leaf 0%, 14779 page(s)
-- data node 0%, 241 page(s)
-- btree leaf 0%, 2644 page(s)
-- btree node 0%, 564 page(s)
-- free list 0%, 865 page(s)
-- stream trunk 0%, 39 page(s)
-- stream data 0%, 20124 page(s)
免费页面计数显示几乎所有空间都由空闲页面占用(默认页面大小为2 KiB)。
流数据20124页意味着40 MiB用于事务日志,对吗?
下一个问题是关于LOB。在我的Recover输出中,有13342个INFORMATION_SCHEMA.LOB_DATA的INSERT语句。但是当我在控制台中打开数据库时,该表只有2行。为什么不同?
通常的嫌疑人是未提交的交易。查看代码自动提交从未关闭,但无论如何我想检查。我的恢复输出有702431行事务日志。那看起来很重要吗?这是正常的吗? 如何识别未提交的交易?前几行如下所示:
---- Transaction log ----
-- log 164481:8670836 next: 8673913
-- log 164481:8670836/8672265
-- undo page 34939 data leaf (last)
-- undo page 32723 free list
-- undo page 8590631 data node
-- log 164481:8670836/8672266
-- undo page 42949 data node
-- undo page 6686382 data node
-- undo page 44 data node
-- session 1 table 10 - 61593342
DELETE FROM INFORMATION_SCHEMA.LOB_DATA WHERE _ROWID_ = 61593342;
-- commit 1
-- undo page 111 b-tree leaf (last)
-- log 164481:8670836/8672267
-- undo page 62 b-tree node (last)
-- log 164481:8670836/8672268
-- undo page 3566625 b-tree node (last)
-- undo page 48 b-tree node (last)
-- undo page 8590604 data leaf (last)
-- log 164481:8670836/8672269
-- undo page 42802 data node
-- undo page 8187925 data node
-- undo page 49 data node
-- session 1 table 2 - 48272953
DELETE FROM INFORMATION_SCHEMA.LOBS WHERE _ROWID_ = 48272953;
-- commit 1
这两个承诺不是成功的吗?他们为什么还在日志中?
H2版本为1.3.163。我已尝试使用1.3.176人工事件,但文件以同样的方式快速增长。
这些问题是相关的,但对我没有帮助:
答案 0 :(得分:0)
对于您分析的文件,99%的网页都是免费的:free 99%, 14108082 page(s)
。所以我猜当时99%的数据被删除(表被截断,表被删除,索引被删除,LOB被删除,事务日志被截断,临时表被删除等等)。因此,分析此文件无济于事。
有趣的是在 99%获得免费之前分析文件。为此,您可以使用内置备份功能(SQL语句backup to ...
)在程序运行时复制文件。然后分析该文件(在该文件上运行Recover工具)。您可能需要多次这样做,直到找到99%的文件 尚未免费的地方。