【问题标题】:Will HSQL to H2 Migration solve the issue of unused space in HSQL DB?SQL to H2 Migration 能否解决 HSQLDB 中未使​​用空间的问题?
【发布时间】:2014-08-27 19:24:17
【问题描述】:

我们在文件模式下有 hibernate-hsql 组合。在生产中,我们发现 .lob 文件正在增长,现在它的大小约为 2.5GB。我们手动检查了数据内容,它只有 2 MB。

在浏览了几个 hsql 论坛后,我们注意到即使删除了 clob 记录,也不会从 .lob 文件中回收空间。这就是为什么 .lob 文件大小不断增加,最终备份时间过长的原因。

这就是迁移到 H2 的原因。这能解决问题吗?

【问题讨论】:

  • 它被设置为假。

标签: hibernate hsqldb h2


【解决方案1】:

如果您的应用程序使用了 lob 并删除了其中一些,则该空间将被重新用于未来的 lob。

在正常的应用程序使用中,DELETE 语句用于删除行。此语句取消分配 lob 空间以供重用。

您可以以重新创建数据库的方式设计测试,而不是在删除数据后重用旧数据库。但这将是如此如此昂贵。所以在HSQL中是没有办法的。

我对 H2 了解不多,当我说 Delete 时,如果 H2 中有某种机制不仅可以取消分配空间而且还可以对文件进行物理删除 (IO),那么迁移将对您有所帮助。

请参考这个链接HSQLDB and .lobs file size 回答它的描述很好,如果你去回答最后的评论,你会找到你的答案。

【讨论】:

  • H2 最多使用 ~1 GB 来在 db 文件中插入 1000 x 8 MB 文件。添加时和删除后的 H2 在 db 文件中使用 ~68 MB。删除数据库/表时的 H2 会减小 db 文件的大小。这让我想到如果我想减少磁盘空间使用,H2 是否是一个更好的选择。
  • 旧答案中的 cmets 不适用于较新版本的 HSQLDB,它可以压缩 lob 并在 CHECKPOINT 截断文件。
  • 压缩设置帮助我减小了 .lob 文件的大小。但即使是最新版本 2.3.2;在执行“CHECKPOINT DEFRAG”命令时,它仅从文件末尾回收空间。
  • 剩余空间在文件内,在插入新 lob 时将被重用。
  • 剩余空间将在稍后使用。没关系。但对我们来说,.lob 文件的大尺寸是备份过程的问题,即使空间稍后会被利用。所以我正在考虑改变备份过程。打开一个新数据库(备份数据库)并通过SQL将数据从主数据库复制到备份数据库。
【解决方案2】:

HSQLDB 的 .lob 文件文件的空间在每个 CHECKPOINT 之后被回收。然后将回收的空间用于新的 lob。

生产服务器只插入一次大量的lob,删除旧数据后不添加更多的情况是不正常的。因此,此架构适用于大多数用例。

当存储的数据很少时,您可以清除 .lobs 文件。

  1. 使用 ALTER TABLE t ALTER COLUMN c SET DATA TYPE 将所有 CLOB 和 BLOB 列的类型更改为 VARCHAR(100000000)。
  2. 关闭数据库并删除 .lobs 文件。
  3. 打开数据库并使用 ALTER TABLE t ALTER COLUMN c SET DATA TYPE 将类型改回 CLOB 或 BLOB。

HSQLDB 与大多数其他开源数据库不同,因为它有一个专用的 lob 文件。 lob 的管理与普通数据是分开的,因为大型 lob 数据不会影响对非 lob 列的较小数据的访问。您还可以将 lob 压缩与较小的 LOB SCALE 一起使用,以减少其存储空间,而不会影响正常数据。

【讨论】:

  • CHECKPOINT 只回收 lob 文件末尾的未使用空间,.lob 文件前面和中间部分的未使用空间将保持无人认领。
  • 剩余的可用空间在文件内,在插入新的 l​​ob 时将被重新使用。
猜你喜欢
  • 2011-11-20
  • 2011-04-11
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多