数据库体系结构—测试工程师核心开发技术(10)

发表于:2020-1-21 11:25  作者:51Testing教研团队   来源:51Testing软件测试网原创

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: 软件开发 测试开发

  3.2.6 数据库体系结构
  数据库体系结构涉及sys和system模式、数据库组件、数据字典及其他数据库对象。下面分别介绍这些内容。
  1.sys和system模式
  sys和system是每个Oracle数据库默认安装的两个账户。sys模式是所有内部数据库表、结构、供给包、过程等的拥有者,它还拥有所有的V$和数据字典视图,并创建所有封装的数据库角色(dba、connect、resource等)。sys是一个Oracle数据库的根用户或系统管理员。由于sys账户具有全能的性质,应尽量避免以sys账户注册和登录。当以sys账户注册和登录时,即使一个简单的输入错误,也有可能造成毁灭性的灾难。
  sys账户是唯一能够访问特定内部数据字典表的用户,因为它拥有所有的数据字典结构。为了将数据字典对象明确地授权给其他模式,sys也是用户必须登录的账户。当用户使用数据字典视图和表编写存储过程或触发器时,也必须使用sys账户。当首次安装当数据库时,sys账户的默认口令是change_on_install,并且数据库系统管理员会立即更改这个口令。
  system模式是在数据库创建时安装的,是用于dba任务的默认账户。system对所有的数据库对象拥有完全的权限,而且许多第三方工具软件依赖于system模式的存在及特权。system 账户的默认口令是MANAGER,并且像sys账户的口令一样,在数据库创建后应该立即更改。许多数据库系统管理员使用system模式执行数据库管理任务,但它更适于创建一个特殊的用户来完成数据库管理员的任务,这就确保了一个特殊的账户与一个特定的人相连,而那个特定的用户则对全部数据库的修改负责。
  因为这些模式都存在于每个Oracle数据库中,所以在安装完数据库后立即更改它们的默认口令是很重要的,这样可以防止对账户未经授权的访问。如果安全性是一个主要的问题,用户或许还应该考虑使这些账户不可登录,只有在需要登录时,才设置合法的口令。
  2.数据库组件
  可以把数据库对象划分成两种不同的类型:一类是由 RDBMS内部使用的对象,称为系统数据库对象(system database object);另一类是可以通过任何程序访问的对象,称为用户数据库对象(user database object)。
  1)系统数据库对象
  当提到系统数据库对象时,指的是RDBMS用于支持内部数据库功能的数据库对象。这些对象是由数据库系统管理员或服务器本身配置和创建的,并且不显式地用于用户数据库事务。
  系统数据库对象有初始化参数文件、控制文件、重做日志文件、数据文件、追踪文件、ROWID和Oracle块。下面分别详细介绍。
  (1)初始化参数文件(initialization parameter file)。初始化参数文件或init.ora是RDBMS主要的配置点,它是配置键码和数值的集合,每一个配置键码与数值都控制或修改数据库和实例操作的某个方面。
  初始化参数文件是一个ASCII文本文件,可以在UNIX服务器上的$ORACLE_HOME/dbs目录下和NT服务器上的$ORACLE_HOME/database下找到它。默认情况下,文件的名字为 initSID.ora,在这里,SID相当于它所控制的数据库的名称。在一个UNIX服务器上,如果在命令行上没有显式地指定一个init.ora文件,当启动一个数据库时,这就是Oracle服务器所要寻找的文件名(这里SID等于$ORACLE_SID环境变量的值)。每个Oracle数据库和实例都有自己唯一的init.ora文件。
  当数据库启动时,在创建实例或读取控制文件之前,先读取init.ora文件。init.ora文件中的值决定着数据库和实例的特性,如共享池、缓存、重做日志缓存分配、后台进程的自动启动、控制文件的读取、自动联机回滚段等。直到数据库关闭并重新启动,对init.ora文件中参数的更改才被承认。
  在Oracle RDBMS中,默认的init.ora文件位于$ORACLE_HOME/database目录下,带有针对小、中、大型数据库所预先设置的基本init.ora参数和不同的推荐(任意的)值。当用户创建新数据库和实例时,这个文件可复制和重命名。
  通过查询V$PARAMETER视图,可以从数据库内部观察init.ora文件中的配置参数集。V$PARAMETER视图把所有的init.ora参数和它们的值都列出来,并且每一个值都有一个标记符,用于指明参数值是否为服务器默认值。
  默认init.ora文件中的参数如表3-4所示。
  (2)控制文件。控制文件以"ctl"或"ctrl"为扩展名。控制文件维护数据库的全局物理结构,记录数据库中所有文件的控制信息。每个数据库至少要有一个控制文件,建议用户使用两个或更多控制文件,并存放在不同的磁盘上。Oracle系统通过控制文件保持数据库的完整性,以及决定恢复数据时使用哪些重做日志。
  控制文件是数据库的心脏,它包含数据库的数据文件和重做日志文件信息,数据库中的数据应该以何种字符集存储的信息,数据库中每个数据文件的状态和版本信息及其他的重要信息。包含在控制文件中的大部分参数是在数据库创建过程中设定的,并且相对来说是静态的,也就是说,它们不是经常改变的。控制文件采用二进制格式,并且是不可读或手动编辑的。
  控制文件是在创建数据库时创建的。大多数数据库可以操作多个控制文件。特定控制文件的创建是在init.ora参数CONTROL_FILES中指定的,在"create database"子句中指定的数据库创建参数存储在这些文件中。
  如果没有合适的控制文件,则数据库不能打开。如果由于某种原因控制文件无效或毁坏,则数据库将无法启动,并且存储在数据库中的数据信息将无法访问。因此,控制文件的镜像备份功能是被Oracle服务器内部支持的,并且也是大力推荐的。如果要将控制文件的镜像备份到一个新的数据库中,则只需要在发出"create database"命令之前,为CONTROL_FILES指定一个以上的参数值。要将控制文件镜像备份到一个现有数据库中,用户必须关闭数据库,将当前的控制文件复制到用户想要备份的目录当中,编辑CONTROL_FILES参数,以指定新的控制文件的位置,然后启动数据库。
  (3)重做日志文件。重做日志文件以"rdo"为扩展名。重做日志文件包含对数据库所做的更改记录,这样万一出现故障可以启用数据恢复功能。一个数据库至少需要两个重做日志文件,用来做轮询:当第一个重做日志文件达到一定容量时,就会停止写入,而会转向第二个重做日志文件;当第二个重做日志文件也满时,就会转向第三个重做日志文件。当第三个重做日志文件满时,就会往第一个重做日志文件中写入。
  归档模式指的是在向原来的记录中写入重做日志文件时,数据库会自动对原有的日志文件进行备份,需要通过大容量的硬盘空间来支持。
  非归档模式指的是在向原来的记录中写入重做日志文件时,数据库不自动对原有的日志文件进行备份,以节约硬盘空间。
  (4)数据文件。数据文件用于存放数据库数据,以"dbf"为扩展名。将数据放在多个数据文件中,再将数据文件分放在不同的硬盘中,可以提高存取速度。数据文件由数据块构成,块大小在创建数据库时确定。
  (5)追踪文件。所有的Oracle数据库都至少有一个文件用于记录系统信息、错误及主要事件。这个文件叫作sidALRT.log(这里sid是数据库系统的名称),存储在由init.ora参数background_dump_dest指定的位置。当调查数据库故障时,这是用户应该查看的第一个位置。关键的错误总是在这里记载,如数据库的启动和关闭信息、日志切换信息及其他的事件。
  (6)ROWID(Row Identifier,行标识符)。为了提取信息,Oracle数据库必须能够唯一识别数据库中的每一行。Oracle RDBMS中用于这种任务的内部结构叫作ROWID,这是存储数据库中每条记录的物理位置的两字节值。
  (7)Oracle块。我们能操作的最低层的数据库存储单元就是Oracle块,这是服务器能够访问的最小存储单元。不应该把它与操作系统块混淆,一个Oracle块是由操作系统块组成的,它们并不相同。
  Oracle块是操作系统块的整数倍。例如,在UNIX系统中,操作系统块通常为8KB,因此用户应该将db_block_size设置为8192、16384等,使它成为8KB的整数倍。所有的数据访问都是以Oracle块的形式实现的。Oracle块的大小是指在一次I/O过程中,RDBMS从数据文件中读写的字节数。数据库对象大小和缓存中的块也是以Oracle块的形式设置的(尽管有些视图用字节显示存储容量,但这只是为了增加可读性)。
  Oracle块的大小是在数据库创建时为数据库设置的,是不能改变的。如果在创建数据库后,用户认为需要大一些的(或小一些的)块,那么用户不得不重新创建整个数据库。每个Oracle块都包含头信息空间、块中数据将来的更新空间及块中实际存储行所占空间。块头保存这样的信息,如在块中有行存在的数据库段、同时可以有多少事务访问块等。每个块还分配了一定量的空间,用于块中存储行的将来更新,如果升级引起原先的行变大,那么这个可用空间就被使用了。
  2)用户数据库对象
  用户数据库对象是指那些不是Oracle RDBMS专用的对象。虽然它们是由Oracle管理的,但是它们能够提供一组用户建造块。利用这些块,用户可以创建自己的数据库。
  用户数据库对象包括数据文件、区间、表空间及数据库段。下面分别详细介绍。
  (1)数据文件。Oracle数据文件作为操作系统文件而存在,每个数据文件具有一个表空间,并且拥有存储在那个表空间里的实际数据。数据文件是文件系统中的实际文件,它可以像其他任何操作系统文件一样进行监控和操作。存储在数据文件中的数据采用Oracle二进制格式,这样除Oracle RDBMS之外,这些数据不能被其他任何对象读取。
  数据文件是使用SQL命令"create tablespace"或"alter tablespace"创建的。一个数据文件的大小是根据create语句中指定的大小来建立的,而不是由它所存储的数据量决定的。例如,对于一个以10MB大小创建的数据文件,不管它包含1行还是100万行,它都占用10MB的空间。
  (2)区间(extent)。区间是一个存储单位,由一个或多个逻辑连续的Oracle块组成,每个数据库段均由一个或多个区间组成,一个数据库段中的每个区间的大小可以相同或不同。
  (3)表空间(table space)。表空间是一个数据结构,用于组合以相似方式访问的数据。每个表空间都是由一个或多个数据文件组成的,对于所有的数据库对象都必须指定一个表空间,它们在那里创建,于是组成对象的数据就存储到分配给指定表空间的数据文件中。
  表空间用于分隔涉及数据访问的I/O。例如,可以创建一个表空间来存储数据对象,也可以创建另外一个表空间来存储索引对象。通过给驻留在不同物理磁盘上的表空间分配数据文件,用户可以确保对索引数据的访问不会影响对索引指向的数据的访问。
  在数据库备份和恢复中,表空间扮演了一个重要的角色。因为一个表空间直接映射到一个或多个数据文件,所以备份和恢复数据通常是在表空间(数据文件)下进行的。当然,备份或恢复操作应用于整个数据库时是例外的。
  (4)数据库段(database segment)。数据库段是存储在数据库中的用户建立的对象。这在很大程度上包括了组成模式的数据(表)和索引。
  除了用户创建的数据和索引段外,通常还有两种类型的段(称为系统段或管理员创建段),它们是临时段和回滚段。虽然那些拥有合法权限的用户可以创建这些段,但是最好由数据库系统管理员来创建这些段,然后让应用用户和程序共享这些段。
  ① 表(table)。表是存储数据的数据库段。每个表是由一列或多列组成的,每列都被指定一个名字和数据类型。每列的数据类型为存储在表中的数据定义了类型和精度。
  ② 索引(index)。索引是为了加速对特定表数据的访问而创建的数据段。一个索引拥有表的一列或多列的值及与这些列值相对应的ROWID。当Oracle服务器需要在表中查找某一指定行时,它在索引中查找ROWID,然后直接从表中提出数据。
  在Oracle RDBMS中有几种可用的索引类型。到目前为止,最常用的索引类型是B树(B-tree)索引。它是执行标准的create index语句时需要使用的索引类型。B树索引是标准的搜索树算法的一个变体。通过遍历索引树,用户保证能在相同数量的树遍历过程中找到所有的叶节点。每一个叶节点指向下一个和前一个叶节点的位置,这样就能够在索引扫描范围内进行快速索引搜索及类似操作。B树索引能确保维持平衡状态,并且每个节点的3/4都是空的,以便为更新提供可用空间。
  ③ 回滚段(rollback segment)。回滚段是存储在数据库事务中发生改变的原始数据块的数据库对象。它们用于提供数据的已经改变但尚未提交的读一致性视图。当数据发生改变时,原始数据就被复制到回滚段中,而且在内存缓冲区中对数据块做出更改。如果其他用户会话要求同样的数据,那么存储在回滚段中的原始数据就会返回(这称为读一致性)。当提交做出更改的会话时,回滚段项将被标注为无效。
  多个用户会话可以共享一个回滚段,每个回滚段至少由两个区间组成。当一个事务开始时,用户会话在一个可用回滚段中得到一个可用区间的专用锁,于是事务信息被写入回滚段中。如果事务填满了第一个区间,则它会被分配另一个区间。如果另一个区间不可用,则回滚段会自动地给自己分配其他区间,这正是用户会话所要获取的,这称为回滚段扩展(rollback segment extension)。因为区间的分配影响性能,所以用户的目标应该是在没有分配新区间的情况下使所有事务能够执行。
  如果回滚段不能分配其他区间(或许是因为已经达到回滚段的最大区间数,或者在回滚段表空间上没有更多的自由区间),那么就会出现错误,而且事务将被回滚。这种情况通常发生在加载大量数据时。在那时,联机回滚段无法为事务提供足够的空间来存储全部的回滚信息。
  ④ 表簇(table cluster)。表簇是一个数据库对象,它可以将那些经常在相同数据块中一起使用的表进行物理分组。当用户处理那些经常连接在一起进行查询的表时,表簇是特别有效的。一个表簇存储簇键(用于将表连接到一起的列),以及簇表中的列值。因为簇中的表都存储在相同的数据库块中,所以使用簇工作时,I/O操作就减少了。
  ⑤ 散列簇(hash cluster)。散列簇是数据库存储的最后选项。在一个散列簇中,表是基于散列值组织的,在表的主键值上使用散列函数可以得到这个散列值。在从散列簇中提取数据时,散列函数用于要求的键值上,结果值给出Oracle散列簇中的存储数据的块。
  使用散列簇能明显减少从表中提取数据行的I/O操作,但是使用散列簇也有一些缺点。
  3.数据字典
  数据字典(data dictionary)是存储在数据库中的所有对象信息的知识库,Oracle RDBMS使用数据字典获取对象信息和安全信息,而用户和数据库系统管理员用它来查阅数据库信息。数据字典保存数据库中数据库对象和段的信息,如表、视图、索引、包及过程,它还保存关于用户、权限、角色、审计和约束等的信息。数据字典是只读的,用户永远不要尝试对任何数据字典表中的任何信息进行手动更新或改动。数据字典由内部RDBMS(X$)表、数据字典表、动态性能(V$)视图和数据字典视图组成。
  1)内部RDBMS(X$)表
  Oracle数据库的心脏就是内部RDBMS(X$)表,在Oracle RDBMS中这些表用于跟踪内部数据库信息。X$表是加密命名的、非文献性的表,并且几乎是无法解密的。大多数内部RDBMS表不能被数据库系统管理员或用户直接使用。尽管如此,这些表仍包含有价值的信息。许多非文献性的或内部的统计和配置只能在内部RDBMS表中找到。
  2)数据字典表
  数据字典表(data dictionary table)存储表、索引、约束及所有其他数据库结构的信息。它们属于SYS,通过运行SQL.BSQ脚本来创建(在数据库创建时自动发生)。通过它们名字后面的美元($)符号(tab $、seg $、cons$等),很容易将它们辨认出来。在数据字典视图中,用户可以找到数据字典表中的大部分信息,一些应用或查询也可以从使用包含在基表中的信息中获益。
  数据字典的列和表在SQL.BSQ文件中归档,这个文件可以在$ORACLE_HOE/database目录中找到。当用户熟悉了SQL.BSQ的内容后,就可以更好地理解Oracle RDBMS存储数据字典和数据库信息的原理了。
  3)动态性能视图
  动态性能视图(dynamic performance view)是Oracle数据库系统管理员的主要依靠,包含了大量数据库函数运行时的性能和统计信息。它具有较高的可读性(与内部RDBMS表相反)。也就是说,它能够被数据库系统管理员用于诊断和解决问题。关于大多数动态性能视图的文档能够在Oracle Reference Manual中查到。
  注意,动态性能视图实际上是由SYS拥有的动态性能视图的公共同义词。当编写读取动态性能表的存储过程或函数时,这是很值得注意的。引用或授权给基表动态性能视图(而不是动态性能视图的公共同义词)常常是更必要的。
  4)数据字典视图
  数据字典视图是在内部RDBMS表和数据字典表上创建的视图,这意味着它能被终端用户与数据库系统管理员使用和查询。数据字典视图分成3类-DBA_、ALL_和USER_视图。DBA_视图包含数据库所有对象的信息。例如,DBA_TABLES包含所有已创建表的信息,ALL_视图包含用户查询表时可以访问的所有对象的信息,USER_视图包含用户查询表时表所拥有的全部对象的信息。
  4.其他数据库对象
  数据库中还存储着一些其他对象,这些对象没有准确地按段分类,尽管如此,还是应该讨论一下它们。它们包括视图、序列、同义词、触发器、数据库链,以及存储包、过程和函数。后续章节分别对它们进行介绍。

查看《测试工程师核心开发技术》全部连载内容>>
版权声明:51Testing软件测试网获得人民邮电出版社和作者授权连载本书部分章节。
任何个人或单位未获得明确的书面许可,不得对本文内容复制、转载或进行镜像,否则将追究法律责任。

【福利】填问卷送精选测试礼包+接口测试课程!为测试行业做点事!

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2020, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道