首页天道酬勤内存泄漏和内存溢出,oracledmp文件查看器

内存泄漏和内存溢出,oracledmp文件查看器

张世龙 05-12 19:57 35次浏览

我们知道BDB是一个嵌入式数据库,访问效率高于mysql,但它没有mysql那么方便管理,分布式APP应用程序中的同步也是一个问题。

正好mysql支持将BDB用作存储引擎。 (5.1以后不直接支持。 因为BDB被oracle收购了。 )那么,是否可以让mysql进行数据管理和同步,而实际的APP应用程序绕过mysql直接访问BDB文件呢?

试了:

首先获取mysql 5.0的源代码,并由以下参数组成

./configure---- with-Berkeley-db=./BDB

编译后,启动mysql并使用engine=bdb创建表

现在,mysql数据目录中将显示*.db文件。

file命令显示文件格式为Berkeley db (树,版本9,本机字节顺序)

使用db_dump命令可以看到它与常规db文件有两个区别。

1 .常规数据库文件在一个文件中只有一个库,但mysql会生成两个库:主库和状态库。 (如果在创建表时添加主键以外的索引,也会生成其他索引库。 ) ) ) ) ) ) ) ) ) )。

2. mysql生成的db文件将表的主索引设置为key,表的整行数据设置为value。 特别是对于char和varchar列类型,mysql在字符串前存储字符长度。 例如," abc "被存储为"/x03abc "

第一,可以在dbopen时指定库名称,在由mysql生成的db文件的情况下,可以将库名称指定为“main”。

第二,在查询时,需要在检查对象的key前加上字符串的长度,在检测出结果后,剥离结果的长度信息。

这还有几个问题。 表结构的定义不在db文件中,而是在mysql生成的. frm文件中。 因此,首先我不知道如何分割字段。 其次,不知道表长度的字节是1字节还是2字节以上。 但是,这可以用约定的方式解决。 双方约定固定的表格形式,可以忍耐。

但是,出现了更麻烦的问题。 进行这些更改后,如果检查一些键值,就可以找到结果,但有些键值找不到结果。

原来,问题出在字符串前面的长度字节上。 bdb的APP应用程序通常使用字符串作为key,但对于mysql存储,会在字符串前面添加字节,从而导致自定义比较函数的问题。

如上所述,由于文件格式采用Btree,因此插入key时将与根节点进行大小比较,以确定要去哪个子树。 然而,标准比较大小是以字节为单位的比较,如果在字符串之前添加长度字节,则将相当于相同长度的字符串划分成子树。 mysql可能觉得这会影响搜索效率。 因此,mysql通过自定义的比较函数,在比较字符串时去除长度字节进行比较。 使用标准DBD的接口是标准的比较方式,经常找不到。

目前还没有考虑合适的解决方法。 试了一下……

-------------请参阅

问题解决了。 在bdb打开文件之前,只需设置自定义比较函数(DB-set_bt_compare ),跳过比较函数的第一个字节,然后调用strncmp对其馀部分进行比较即可。

现在,直接访问mysql存储引擎的问题已经完全解决。

数据库是,database数据库 重启rac集群,oracle11g rac安装