数据库的物理结构对应着存放在物理磁盘上不同格式、类型的物理文件。
Oracle数据库的文件主要包括数据文件、控制文件、联机日志文件(redo)等三大文件,加上参数文件(pf i le、spf i le)和归档日志文件、跟踪日志文件(trc、alert、listener)等。
达梦数据库的文件与Oracle数据库类似,下面逐一进行详细介绍。
相比Oracle数据库庞大复杂的文件目录结构,达梦数据库的文件目录要简洁很多。
在达梦数据库安装路径下,bin目录下保存着达梦的主要操作命令:disql、dexp、dimp、dexpdp、dimpdp等。
tool目录下主要保存达梦数据库的工具软件:dts、dbca、manager、monitor等。
log目录下保存达梦数据库的各种运行日志,其中需要关注的是以“dm_实例名_年月”命名的日志文件,该日志记录了数据库运行期间的重要事件(类似Oracle数据库的alert文件),为防止单个文件过大,每月生成一个。
data目录下保存的是创建的数据库文件目录,目录名即为数据库名。数据库目录下保存着参数文件dm.ini及其他配置文件、控制文件、数据文件、联机日志文件(redo)等。
达梦数据库的配置文件主要有四个。
(1)dm.ini:达梦数据库实例的配置参数,在创建达梦数据库实例时自动生成。
(2)dmmal.ini:MAL系统的配置文件。在配置达梦数据库可用解决方案时(DMDW,DMDSC)需要用到的配置文件。
(3)dmarch.ini:归档配置文件。启用数据库归档时,在该文件中配置归档的相关属性,如归档类型、归档路径、归档可使用的空间大小等。
(4)dm_svc.conf:客户端配置文件,包含达梦数据库各接口和客户端工具所需要配置的一些参数。
其中,dm.ini文件记录了达梦数据库的各种运行参数,是最重要的参数文件,也是数据库实例日常操作经常用到的文件,是读者学习的重点。
参数属性分为手动、静态和动态三种。
手动,表示不能被动态修改,只能手动修改dm.ini参数文件(dm.ini文件是文本格式,可以直接手动编辑修改),然后重启数据库实例才能生效。当参数值设置错误时,参数实际取值为默认值;若设置值小于参数取值范围的最小值,则实际取值为最小值;若设置值大于参数取值范围的最大值,则实际取值为最大值。
静态,表示可以动态修改,需重启数据库实例才能生效。
动态,表示可以动态修改,修改后即时生效。
动态参数又分为会话级和系统级两种。会话级参数被修改后,新参数值只会影响当前会话,其他会话不受影响;系统级参数的修改则会影响所有的会话。
达梦数据库提供的系统视图V$DM_INI可以查询到数据库运行的所有参数,其中,para_name、para_value、min_value、max_value、default_value、para_type分别表示参数名称、参数值、最小值、最大值、默认值和参数类型。其中,para_type有四种属性:read only(手动)、in fi le(静态)、session(动态,会话级)和sys(动态,系统级)。
达梦数据库的参数值有整数、浮点数和字符串三种类型。不同类型的参数值的获取和修改一般要使用不同的函数和存储过程。
达梦数据库提供sf_get_para_value、sf_get_para_double_value和sf_get_para_string_value三个函数来获取系统当前配置的整数、浮点数和字符串型参数。函数参数有两个:scope、para_name。scope参数为1表示获取配置文件中参数的值,参数为2表示获取内存中配置参数的值。para_name为参数名称。
例如,获取当前数据库实例的参数buffer的值:
SQL> select sf_get_para_value(2,'BUFFER');
注意:有一些隐含参数虽然在视图V$DM_INI中可以查到,但并没有记录在dm.ini文件中。这些参数存储在系统字典表中,只能通过调用系统存储过程的方式进行动态修改。不在dm.ini中的参数如表2-1所示。
表2-1
(续表)
动态修改是指拥有DBA权限的用户在数据库实例运行期间,通过调用系统存储过程SP_SET_PARA_VALUE、SP_SET_PARA_DOUBLE_VALUE和SP_SET_PARA_STRING_VALUE对参数值进行修改。这三个存储过程分别用来修改整型、浮点型、字符串类型的参数。存储过程的参数有三个:SCOPE、PARA_NAME、VALUE。SCOPE为修改范围,PARA_NAME为参数名称,VALUE为参数值。
SCOPE参数为1表示在内存和配置文件(或系统字典表)中同时修改参数值,此时只能修改动态类型的配置参数;参数为2表示只在配置文件(或系统字典表)中修改配置参数,此时可用来修改静态类型参数和动态类型参数。
需要注意的是,静态类型参数虽然能够动态修改,但只能在配置文件(或系统字典表)中修改,不能在内存中修改。如果试图在内存中修改静态配置参数(SCOPE等于1),服务器会返回错误信息。例如,buffer参数为静态参数,在内存中进行动态配置修改时会报错,如图2-3所示。
图2-3
在配置文件中进行修改(SCOPE等于2)则成功,如图2-4所示。
图2-4
注意 只有具有DBA权限的用户才能进行参数修改。
此外,达梦数据库还提供了兼容Oracle数据库的修改参数的命令“alter system set …”。但是达梦数据库中执行此命令的方法和Oracle数据库的方式稍有不同:参数名称必须加英文单引号,后面可以附加参数memory、spfile、both。Oracle数据库此参数默认为both,而达梦数据库则默认为memory(在内存中修改),如图2-5所示。
图2-5
对于只能在配置文件或系统字典表中修改的静态参数,需加上spf i le(不加“scope=”),否则会报错,如图2-6所示。
图2-6
如果加上both,则表示在参数文件(或系统字典表)和内存中同时修改,如图2-7所示。
图2-7
达梦数据库的动态参数分为系统级和会话级两种级别。会话级参数在服务器运行过程中被修改时,只有当前会话使用新的参数值,其他会话才不受影响。
设置会话级参数的函数:
SF_SET_SESSION_PARA_VALUE (para_name, value)
重置某个会话级参数的值,使得这个参数的值和系统参数的默认值保持一致:
SP_RESET_SESSION_PARA_VALUE (para_name)
获得当前会话的某个整数型INI参数的值:
SF_GET_SESSION_PARA_VALUE (paraname)
获得当前会话的某个浮点数型INI参数的值:
SF_GET_SESSION_PARA_DOUBLE_VALUE (para_name)
还可以使用兼容Oracle数据库的方式“alter session set …”,如图2-8所示。
图2-8
每个数据库都有一个控制文件,默认与dm.ini参数文件、数据文件存放在同一个目录下。控制文件主要记录数据库必要的初始信息和数据文件路径等重要信息:
(1)数据库名称。
(2)数据库服务器模式。
(3)OGUID唯一标识。
(4)数据库服务器版本。
(5)数据文件版本。
(6)数据库的启动次数。
(7)数据库最近一次启动时间。
(8)表空间信息,包括表空间名、表空间物理文件路径等。
(9)控制文件校验码,校验码由数据库服务器在每次修改控制文件后计算生成,保证控制文件合法性,防止文件损坏及手动修改。
控制文件是二进制文件,不能直接查看、编辑,可以使用达梦数据库的bin目录下的dmctlcvt命令将控制文件转换为文本格式输出。例如:
./dmctlcvt c2t /dmdbms/data/dameng/dm.ctl /dmctl.txt
c2t参数表示将控制文件转换为文本文件(control to txt)。
也可以使用t2c(text to control)参数将编辑好的文本文件转换为二进制控制文件:
./dmctlcvt t2c /dmctl.txt /dmdbms/data/dameng/dm.ctl
在dm.ini文件中记录了有关控制文件的三个参数:CTL_PATH,控制文件存放路径;CTL_BAK_PATH,控制文件备份路径;CTL_BAK_NUM,控制文件备份保留数量。
当控制文件发生改变时,数据库会先对控制文件进行备份,然后再对控制文件进行修改。如果修改操作失败,系统会使用备份文件将控制文件恢复到之前的状态。如果修改操作成功,系统会对修改后的控制文件再进行一次备份。如果备份数量超过CTL_BAK_NUM参数设定的保留数量,系统将删除最早的备份,保证备份文件数量不超过CTL_BAK_NUM参数值。
数据文件是用来存放数据(表、索引、存储过程、函数、序列等)的文件,包括用户数据和系统数据。
达梦数据库创建完成后,默认会创建SYSTEM.DBF、MAIN.DBF、ROLL.DBF、TEMP.DBF等数据文件,分别用来存放系统数据对象、用户数据对象、回滚(undo)数据、临时数据。
达梦数据库的日志文件记录了数据库运行的日志信息,主要有SQL日志文件、事件日志文件、联机日志文件和归档日志文件等。
SQL日志文件记录了系统各会话执行的SQL语句、参数信息、错误信息等,主要用于分析错误和性能。启用跟踪日志对系统的性能会有较大影响,默认情况下跟踪日志是关闭的,仅在查错和调优时才会打开。
用户在dm.ini中配置SVR_LOG参数后会打开SQL日志。
SQL日志文件是一个纯文本文件。默认生成在安装目录的log子目录下面,管理员可通过sqllog.ini参数FILE_PATH设置其生成路径。
达梦数据库在运行过程中,会在log子目录下产生一个以“dm_实例名_日期”命名的事件日志文件。事件日志简称ELOG。事件日志文件对达梦数据库运行时的关键事件进行记录,如系统启动、关闭、内存申请失败、I/O错误等一些致命错误。事件日志文件主要用于系统出现严重错误时进行查看并定位问题。事件日志文件随着达梦数据库服务的运行一直存在。
联机日志文件记录数据库发生的所有物理变化,当数据库实例意外关闭,实例重启时,可以通过联机日志文件进行实例恢复。
达梦数据库创建完成后,默认会创建两个联机日志文件,文件名为“数据库名+01.log”和“数据库名+02.log”。跟Oracle数据库一样,达梦数据库的联机日志文件也是循环使用,文件写满后自动切换。
通过系统视图V$RLOGFILE可以查询到联机日志文件的信息。
归档日志文件可以看作是联机日志文件内容的复制。
达梦数据库开启归档模式后,会在归档路径下生成归档日志文件。归档配置文件dmarch.ini记录数据库归档路径(ARCH_DEST)、日志文件大小(ARCH_FILE_SIZE)、归档可使用的空间大小(ARCH_SPACE_LIMIT)等参数。当日志文件占用的存储空间超过参数设置的大小时,系统会自动删除最早的归档日志文件。
达梦数据库的归档机制跟Oracle数据库不一样。Oracle数据库在联机日志切换时,归档进程会将日志文件复制到归档路径下。达梦数据库则是在重做日志记录写入联机日志文件的同时异步写入归档日志文件中进行存储。这一点和MySQL数据库的二进制日志(binlog)的机制类似。
通常生产数据库都是运行在归档模式下。当出现介质故障(如磁盘损坏)时,利用备份+归档日志,系统可被恢复至故障发生的前一刻,也可以恢复到归档日志范围内的任意时间点。如果没有归档日志文件,则只能利用备份将数据库恢复到备份时刻的状态。
通过系统视图V$ARCHIVED_LOG可以查询到归档日志的信息。