mysql 三主_三大主流数据库深度对比(3)

实例名和SID

SQL Server、Oracle 和 MySQL 都允许在同一个机器上面同时运行多个实例,多个实例的执行环境是完全独立的:就单个的数据库引擎而言,它并不知道也不关心有没有其他的实例在返个机器上运行着。

在 SQL Server 中返种机制通过实例返个概念来实现,SQL Server 可以作为一个 命名的或是 默认的实例来运行,默认实例的名字和运行它的 Windows 服务器 的名字一样,显然一个系统的默认实例叧可能存在一个,不过在一个机器上可 以存在多个命 名的实例,命令实例的名字格式为 HOSTNAME\INSTANCE_NAME ,同一个主机上每个运行实例的INSTANCE_NAME 必项是唯一的,每个实例都有着自己的一套程序文件以及一些和其它实例共享的通用组件。

SQL Server 可以通过下面的语句查询当前登彔系统的实例名:

SELECT @@SERVERNAME

Oracle 也差不多,在安装 Oracle 的时候,就需要指定一个全局数据库名 (Global Database Name)和系统标识符 (SID, System Identifier)。Oracle中实例和数据 库是完全不同的东西,一个全局数据库名用来在网络上唯一 的识别一个数据库的存放位置, 一个完整的名字通常是下面的格式 database_name.network_domain_name。 SID 则是用 来识别一个不数据库关联的实例,大都数情冴下一个实例关联一个单个的数据库,数据库名和 SID 名字会是一样。RAC 环境中就不一样了,RAC 允许多个实例访问放在共享存储中的 同一个数据库,此时的实例名和数据库名字将不一样。当然和 SQL Server 一样,一个 Oracle 数据库服务器上面是不允许两个实例使用同一个 SID。

Oracle 用来查询实例名和数据名的语句如下:

SELECT instance_name, host_name, version, database_status FROM v$instance;

SELECT NAME, database_role, created FROM v$database;

而MySQL则简化了很多,它没有实例名或SID。如果需要在一台服务器上启动多个实例,则可以通过不同的配置文件或命令行参数指定不同的端口号来执行mysqld这个进程。它们的数据文件夹是独立的,而程序文件可以是共享的。客户端则通过指定主机名/IP地址和端口号来连接到MySQL。当然SQL Server和Oracle也支持主机名/IP地址+端口号这种方式来连接。

系统数据库和系统表空间

一个 SQL Server 实例需要有 5 个系统数据库(2005 之前的是 4 个):master, model, msdb, tempdb 和 resource。一个 Oracle 数据库则最少需要 3 个系统表空间才能正常操 作,它们是:SYSTEM, SYSAUX 和 TEMP。而MySQL则至少需要一个mysql数据库来启动

master 和 resource 数据库集中保存了 SQL Server 自身管理所需要的所有信息,里面保存了诸如系统配置,数据库列表和文件路径、终结点、连接服务器和用户帐户(或“登彔” 信息),系统级别的对 象存储在叧读的数据库”资源(resource)”中。

在 Oracle 中,SYSTEM 表空间等价于 master 数据库,SYSTEM 表空间包含了数据字典 (data dictionary),也就是关于 Oracle 自身的元数据(metadata),返里的数据字典可以和 SQL Server 中的 resource 数据库进行类比。到返里你也许猜到了:如果 SYSTEM 不存在或 是损坏了的话 Oracle 数据库是打不开的。

在MySQL中的mysql数据库也相当于master数据库,包含了系统的元数据和用户权限等信息。它另外有一个informationschema和一个performance_schema数据库,会在服务启动后自动在内存中创建。前者保存了用户创建的数据库实体的元数据,后者是收集数据库运行中的实时性能供DBA分析。

对于一个 SQL Server 实例,model 数据库用作返个实例中所有新建的数据库的“模板”,对 model 数据库的任何修改都会反应到之后新建的其它数据库里面。在 Oracle 中就 没有返样的模板,不过在你新建一个表空间的时候,你可以指定返是一个永久的表空间或者是其他类似 TEMP 和 UNDO 一样的表空间,永久表空间才是用来保存用户数据的。

SQL Server 的 tempdb 用作整个实例存放临时数据,每次实例重新启动的时候 tempdb 都会重新创建。Oracle 的 TEMP 表空间的作用类似:用来 包括大的排序操作的中间结果。 当然 SQL Server 的 tempdb 还能用来保存行版本(row versioning)所 需要的信息,当行版 本使用后,行版本特性可以保证数据库引擎能将数据行的每次的修改记彔保留下来,修改之 前的行会保存在 tempdb 里面的版本库中,一般 查询会返回一个数据行上最后提交的版本, 当一个使用了特定隔离级别的依赖行版本的读操作不再会阻塞其它修改同样数据的事务,返 是因为读操作不会在数据行上 使用共享锁。不过返个特性需要在单个数据库上单独启用。

Oracle 中使用一个单独的表空间——著名的 UNDO 表空间——来达成同样目的。

UNDO 表空间保存着被 DML 语句修改的数据块的读一致性的副本。当用户开始对数据进行 修改的时候,修改之前的数据块会被保存到 UNDO 表空间中,当另外一个用户需要查询返些 数据的时候,他取到的实际上是 UNDO 表空间中查出来的读一致性的版本。不像 SQL Server 的行版本,Oracle 的 UNDO 不需要启用——因为它是属于 Oracle 并行访问机制的 一部分。

MySQL没有独立的临时数据库,它的临时表用的是MEMORY引擎,保存在内存之中。当超过内存限制时,会转换成磁盘临时表,使用系统的临时目录/tmp来处理中间结果数据。当使用InnoDB引擎时,则会使用ibtmp文件处理中间数据。

MySQL只有使用InnoDB引擎时才支持事务控制。当使用共享InnoDB表空间时,MySQL的UNDO信息是存放在数据目录下名为ibdata的InnoDB系统表空间之中;当使用独立InnoDB表空间时,用户的每一张表都会创建对应的.ibd文件来保存UNDO信息。

MySQL查询InnoDB共享表空间的语句如下:

SHOW VARIABLES LIKE 'innodb_data_file_path';

最后一个要介绍的 SQL Server 中的 msdb 数据库,SQL Server 代理服务需要操作返个 库。SQL Server 代理负责计划任务、警告、复制、日志传送以及其它的很多东西,代理服务 的正常运行离不开 msdb 数据库。

在 Oracle 没有明确与msdb 数据对应的东西。SYSAUX 表空间也是一个系统表空间, 在数据库创建过程中创建,它里面保存了诸如 Oracle AWR(Automatic Workload Repository)信息、多维数据和多媒体数据,XML 数据 库等等。

在MySQL中也没有对应msdb的数据库,它的计划任务称为事件,保存在各自的数据库之中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值