当前位置: 首页 > 知识库问答 >
问题:

H2数据库不断增长:如何分析恢复工具的输出?

许茂才
2023-03-14

我们将H2用于一个长期运行的流程,该流程将许多短期“事件”存储到一个嵌入式H2数据库中。插入和删除行的吞吐量很高,但事件的频率各不相同。

在半生产系统上,数据库文件已增长到27 GiB。彻底压缩后,该文件只有1.25 MiB。这是一个因素

我知道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条INSERT语句用于提供模式信息。LOB_数据。但是当我在控制台中打开数据库时,这个表只有两行。为什么会有区别?

通常的嫌疑犯是未promise的交易。查看代码自动提交从未关闭,但我还是想检查一下。我的恢复输出有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中的人工事件,但文件以同样的方式快速增长。

这些问题是相关的,但并没有真正帮助我:

  • h2。db文件不断增长
  • H2数据库迅速失控
  • H2数据库

共有1个答案

邓宜年
2023-03-14

对于您分析过的文件,99%的所有页面都是免费的:free99%, 14108082page(s)。所以我猜到那时99%的数据已经被删除了(表被截断,表被删除,索引被删除,LOB被删除,事务日志被截断,临时表被删除,等等)。因此,分析这个文件将无济于事。

有趣的是在99%免费之前分析一个文件。为此,您可以在程序运行时使用内置的备份功能(SQL语句备份到…)复制文件。然后分析该文件(对该文件运行恢复工具)。您可能需要多次这样做,直到找到99%的文件尚未空闲的地方。

 类似资料:
  • 说明 pika新版binlog有时间戳,开发binlog_sender工具,根据输入的时间段回放对应数据到某个pika实例 工具目录: pika/tools/binlog_tools/binlog_sender 使用参数: -h -- 显示帮助 -t -- l 显示日志类型,old 或new -i -- pika实例的ip -p -- pika实例的port -n -- 输入的binlog的路径

  • 本文向大家介绍SQL恢复master数据库方法 只有mdf文件的数据库如何恢复,包括了SQL恢复master数据库方法 只有mdf文件的数据库如何恢复的使用技巧和注意事项,需要的朋友参考一下 首先先和大家讲一讲SQL Server恢复master数据库方法,具体步骤如下 第一步:复制model.mdf、mastlog.ldf、model.mdf、modellog.ldf、msdbdata.mdf、

  • 问题内容: 假设我们正在设计一个新系统,并决定使用MongoDB作为主数据库。数据模式与带有[增长中]评论的博客非常相似。 在《 MongoDB Developers》一书中,技巧6:不要嵌入增长无限制的字段,它说将数据连续追加到数组的末尾效率低下(但它也暗示注释是“奇怪的情况”) )。 假设我们的新系统就像博客中的“评论”一样-一直在动态增长,但有时也会发生变化或被删除。 因此,在意识到使用Mo

  • 数据库恢复是指以备份为基础,与备份相对应的系统维护和管理操作。 系统进行恢复操作时,先执行一些系统安全性的检查,包括检查所要恢复的数据库是否存在、数据库是否变化及数据库文件是否兼容等,然后根据所采用的数据库备份类型采取相应的恢复措施。 数据库恢复机制设计的两个关键问题是:第一,如何建立冗余数据;第二,如何利用这些冗余数据实施数据库恢复。 建立冗余数据最常用的技术是数据转储和登录日志文件。通常在一个

  • 当数据丢失或意外损坏时,可以通过恢复已经备份的数据来尽量减少数据的丢失和破坏造成的损失。本节主要介绍如何对备份的数据进行恢复操作。 在《 MySQL mysqldump备份数据库》一节中介绍了如何使用 mysqldump 命令将数据库中的数据备份成一个文本文件,且备份文件中通常包含 CREATE 语句和 INSERT 语句。 在 MySQL 中,可以使用 mysql 命令来恢复备份的数据。mysq

  • 就像RDBMS一样,OrientDB也支持恢复操作。 只有从控制台模式中,您才能成功执行此操作。 以下语句是恢复操作的基本语法。 示例 只能从控制台模式执行此操作。 因此,首先必须使用以下OrientDB命令启动OrientDB控制台。 然后,连接到相应的数据库以恢复备份。 可以使用以下命令连接到名为的数据库。 连接成功后,可以使用以下命令从文件恢复备份。在执行之前,请确保文件位于当前目录中。 如