love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

Phone:18180207355 提供专业Oracle/MySQL/PostgreSQL数据恢复、性能优化、迁移升级、紧急救援等服务

达梦数据库学习笔记之–物理文件结构

本站文章除注明转载外,均为本站原创: 转载自love wife love life —Roger的Oracle/MySQL/PostgreSQL数据恢复博客

本文链接地址: 达梦数据库学习笔记之–物理文件结构

这里达梦数据库学习系列的第三篇文章,今天重点了解一下达梦数据库的物理文件结构。

从数据库目录来看,其中包含了几类主要的问题:控制文件、system文件、回滚段文件、temp文件、HMAIN文件以及redo日志文件、参数文件dm.ini。

参数文件之前已经讲过,这里不再描述。首先来看下控制文件。

1、控制文件

 

通过上面几个参数来进行定义控制文件的路径和备份路径;以及控制文件保留的数量(这一点比较灵活,比Oracle好,Oracle如果默认不配置策略,会永久保留)。
当数据库中文件数量发生变化时,比如新增文件或者删除文件时,控制文件会自动进行备份。接下来我们strings来看看控制文件有什么内容:

数据库在启动之前,首先需要加载控制文件,那么控制文件中到底有哪些内容呢?如果控制文件损坏或者不存在,我们来看看启动数据库是什么现象?

如果是控制文件损坏呢?假设文件是存在的。 我这里将数据库名称enmotech修改成enmottch。看看能否启动数据库?

居然能够顺利启动数据库?这是神马情况??? 继续看看数据库日志呢。

奇怪了。登陆数据库查一下看看情况。

 

可以看到数据库名称被修改了。似乎看上去类似Oracle的instance name,而非db name。 可见达梦数据库的数据库文件结构中并不会存数据库name;否则肯定是无法打开的。

这看上去似乎比Oracle controlfile 简单的多,在进行恢复时,处理起来就更简单了。。

查看文档发现dm提供了一个文件格式转换工具dmctlcvt,可以将控制文件转换成txt(或者反向转换),如下:

到这里我们就豁然开朗了,如果控制文件损坏,我们可以构造上述类似的txt文件即可,然后通过该工具进行反向转换成ctl文件即可。

实际上我们看到达梦数据库的控制文件内容极其简单,存放的内容很少。

2、表空间、文件分布

这里v$datafile.max_size单位时M,即对于默认值pagesize=8k的情况,dm数据库中单个数据文件最大为16777215M,即15TB。 这跟Oracle的机制完全不同,在Oracle数据库中

对于small tablespace而言,8k的blocksize,单个数据文件最大是32GB;如果是bigfile,8k的情况下可以达到32TB。

从这里来看,似乎DM数据库的文件存储类似Oracle Bigfile。 达梦数据库中还有一种叫HUGE表空间,及支持存列table,后面再进行测试。

3、对象分配和组成

在物理层面来看,一个表空间中可以存着多个用户,多个对象,这是逻辑层面。 在物理分配方面,当创建一个Table时,需要在datafile中分配空间,

分配的单位是簇,即簇是达梦的最小分配单元,默认值为16. 类似Oracle的extent。

这里可以看到,我们刚刚新建的表test0825_2的初始分配簇大小为131072;其中131072/8192=16,说明默认一个簇大小就是16个page。一共分配了1098个簇。通过计算131072*1098刚好等于143917056,即表的大小。

继续看看相关跟Oracle的兼容性视图,能否有一些发现:

从上述结果来看,有点像为了兼容而兼容,看上去dba_Tables视图跟Oracle的dba_Tables 定义一样了;然而很多数据都没有的,毕竟结构不同。这里看居然有统计信息?

查看文档发现也有dbms_stats兼容包,用来收集统计信息看看:

发现sample_size 确实更新了,不过last_analyzed居然还是为null。 看来这里兼容性做的还是有一些问题。 从这个统计信息收集来看,似乎有些问题。

4、关于ROWID

在Oracle数据库中我们都知道有一个有趣的结构,即ROWID,是由文件号,block,data object id和row number组成;rowid的结构也决定了Oracle

的一系列限制。那么在DM数据库中是否也存在ROWID呢 ?

我们可以看到,达梦数据库中的ROWID并非真正的rowid;而且我们也可以看到,似乎所有数据文件的文件号初始值均为0;随着文件的增加,文件号开始递增。

5、关于数据文件的检测

达梦数据库提供了dmdbchk检测工具,可以检测数据库文件的完整性,类似Oracle dbv工具;不过dmdbchk 只能在数据库停止的情况下进行使用。

我们可以看到,该工具主要是检测数据文件,不包括temp文件和redo文件以及控制文件。

最后通过od -x来看看达梦的数据库文件头的情况:

不难看出前面2个偏移量是表空间编号.

最后简单总结一下:

1、达梦的物理文件结构也分为system、user表空间,回滚段表空间(类似Undo)以及temp表空间;也存在redo log和控制文件;

2、达梦的控制文件中的数据库名称并非类似Oracle一样的db name,和instance name类似;

3、达梦数据库的数据文件头部中并不会存放数据库名称。

4、一个表空间可以存放多个数据文件;每个表空间的文件号从0开始进行递增。

5、单个数据文件最大为15tb(默认pagesize 8k的情况下),类似Oracle bigfile。

6、从官方手册来看,达梦数据库也是有类似Oracle ASM的功能,即DMASM,后面再进行测试研究。

 

猜想一下,由于上述这些文件结构的特点,dm数据库的异常恢复,我认为应该是较为简单的。

 

Leave a Reply

You must be logged in to post a comment.