不论是Oracle ,MySQL 还是 SQL Server,在数据库软件安装和数据库创建的时候,都会自动创建一大堆表以及其他诸如视图、函数、存储过程之类的对象。这些系统级的表包括的是实例和实例所用到的物理和逻辑属性的元数据,Oracle 和 MySQL 把这些表统称为数据字典(data dictionary),在 SQL Server 中则是称为系统表(system tables)。
在 SQL Server 2005 及之后的版本,大部分的系统对象都保存在 resource 数据库中, 少部分保存在master 数据库中。Oracle 中,数据字典表是保存在 SYSTEM 和 SYSAUX 表空间中。在 MySQL 中,则是保存在information_schema数据库里。
从 SQL Server 2005 开始是无法再直接访问系统表了,目录视图(catalogue views)取代系统表作为新的访问系统元数据的统一的接口。在 Oracle 中数据字典表名都是加密过的,藉此来减少表被直接访问或修改,同样的,Oracle 也创建了一系列的视图用于给DBA和开发人员访问元数据,Oracle 称这些视图为数据字典视图(data dictionary views)
目录视图的定义存储在 SQL Server 的 resource 数据库中,这些系统视图归属于一个特别的名为 sys 的 用户架构之下(user schema)并能从任意数据库中访问到。例如,要查看一个 SQL Server 实例中存在的所有的数据库,以在任意数据库下使用下面语句查询:
SELECT * FROM sys.databases;
要查出任意一个数据库中的所有对象,则可以使用 sys.objects 目录视图:
SELECT * FROM sys.objects;
Oracle 中,数据字典从属于Oracle 用户 SYS。不过不同于 SQL Server 的时候每个数据字典视图都存在有三种不同的形式,分别提供三个不同级别的信息。数据字典视图也就存在三个不同的类型,从视图名的前缀就能看出视图能带来什么样的信息:
下面的例子展示的两个查询反回的结果就是不一样的:
SELECT table_name, tablespace_name FROM user_tables;
SELECT table_name, tablespace_name FROM dba_tables;
第一个只显示执行查询的用户自己创建的表而第二个则会显示数据库中存在的所有的表。
MySQL 中需要授予用户访问information_scheam数据库的权限去查询元数据。
其中以INNODB开头的是InnoDB引擎特有的元数据。MySQL 并没有把数据字典划分级别,而是统一的放在一张表里处理。例如,想查询某个库里所有的表,可以用如下SQL:
SELECT * FROM information_schema.tables WHERE table_schema='库名';
在 SQL Server 安装的时候,同时也会往Windows 注册表里面添加一些记录,这些注册表键值指定了实例所需要的各种参数。比如,有的注册表键值指定了错误 日志的保存目录, 另外的指定了默认的备份目录等等。SQL Server 在运行的过程中会使用到这些注册表键值。另外还能给 SQLSERVER.EXE 指定一些启动参数,包括追踪标志(trace flags),这些附加的参数决定了实例启动之后的行为。除了注册表键值和启动参数之外,SQL Server 还包括大量的内部配置参数,用于对实例进行调优。比如说“max server memory”就属于这些参数之一,它可用来调整实例所能使用的最大内存。这些系统配置参数也是保存在系统元数据表(system metadata tables)中的。
下面的方法都可以用来修改 SQL Server 配置参数:
Oracle 的配置参数来自两个对于启动实例和打开数据库都是非常重要的操作系统文件, 第一个文件是初始化参数文件 (initialisation parameter file),第二个是控制文件(control file)。 初始化参数文件所包括的参数决定怎么样创建实例。记住 Oracle 实例只包括内存结构和后台进程。参数文件包括的值决定了Oracle 要给自己分配多少内 存,可以同时有多少用户可以连接到数据库等等。Oracle 在读取到这个文件之后才会在内存中建立数据库实例。
参数文件可以是一个纯文本的ASCII文件或者是二进制文件,纯文本参数文件称为pfile,名字为 init
控制文件是实例启动之后Oracle 第二个要读取的文件。控制文件所存放的位置也是由参数文件中的参数来指定的。控制文件是一个很小的二进制文件,它包括了不数据库相关的关键的信息,其中包括数据文件和重做日志文件的名字不位置、表空间信息以及检查点信息, Oracle 使用控制文件来找到数据文件,然后才能打开供用户访问。控制文件损坏或者是不存在的话数据库都是无法打开的。考虑到控制文件的重要性,通常的做法都是设置多份相同的控制文件拷贝以保证容错能力,多路控制文件中的所有控制文件都会同时的被更新。
最后,第三种Oracle 数据库要使用的文件就是密码文件(password file)了,这个文件保存了拥有启动和关闭数据库权限的用户帐户的用户名和密码。
MySQL的配置参数主要来自命令行启动参数和配置文件my.cnf。所有的命令行参数都可以在配置文件中设置。例如可以在mysqld命令后加 --datafile 参数来指定数据文件所在的目录,也可以在my.cnf中添加datafile配置项来指定
在类UNIX系统中,MySQL按照以下的顺序来搜索配置文件。
用户也可以用SET命令实时设置系统参数。例如想要设置系统最大连接数,可以用以下的任意一条命令:
SET GLOBAL max_connections = 1000;
SET @@global.max_connections = 1000;
如果想要改变用户级别的配置,则可以用以下的任意一条命令,这样改变的配置只会影响在此用户会话期间:
SET SESSION sql_mode = 'TRADITIONAL';
SET @@session.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';
除了数据字典视图之外,Oracle 还提供大量称为动态性能视图(Dynamic Performance Views)的 视图,这些视图可以用来查看实例的内存结构或者是控制文件的内容。不数据字典视图不同的是,动态性能视图的内容不是来自于静态的数据表,而是来自服务器内存中实时的数据。这些数据在实例启动的时候开始积累,贯穿于整个实例的生命周期之内,在实例重启或是关闭的时候消失。另外一个不同点就是 DBA 只能在数据 库打开并在线的时候才能查看数据字典视图,而动态性能在实例启动运行之后就能够查看了。部分的动态性能视图只能在数据库MOUNT 之后才能查看。这些视图 常被称为 V$视图,因为它们的名字都是以V$开头的。例如,下面的查询可以显示Oracle 实例使用的初始化参数:
SELECT NAME, description, VALUE FROM v$system_parameter;
下面的查询显示当前会话相关的信息:
SELECT username, command, schemaname, osuser, machine FROM v$session;
在 SQL Server 中,动态管理视图(Dynamic Management Views, DMV)也同样可以显示实例内存中大量信息。和Oracle 动态性能视图一样,DMV 也不存在对应的数据表,也在系统重启之后会重新记录。DMV 属于 SYS 架构 (schema),名字以”dm_”开头, 下面的代码显示 SQL Server 实例当前的会话情况:
SELECT * FROM sys.dm_exec_requests
MySQL 有三种方法显示动态性能信息。例如同样要显示当前的会话信息,第一种是用SHOW 命令:
SHOW PROCESSLIST;
第二种是通过访问information_schema库相关的表:
SELECT * FROM information_schema.processlist;
第三种是访问performance_schema库的相关表:
SELECT * FROM performance_schema.threads;