到目前为止,我一直在使用 Oracle,其中:
通常一个实例映射到一个数据库。在数据库内部,可以有许多表空间(系统、用户等)。
但是,我对 SQL Server 不太确定。在我看来,对于 SQL Server,一个实例 = 多个数据库?或者一个实例=多个模式?
在 Oracle 中,一个数据库包含系统、sysaux、临时表空间和用户表空间。简而言之,系统和用户都在同一个数据库中。
在 SQL Server 中,似乎只有一个系统数据库可以为多个用户数据库提供服务?
Nic*_*nay 18
我是 Oracle 和 SQL Server 的 DBA。
混淆是由于语义不匹配和 SQL Server 层次结构中的额外级别,但还有更多!
请注意,我们将只讨论两个实例中的单实例数据库(双关语)。
实例
在 Oracle 中,一个实例将分配有一定数量的内存(SGA/PGA)并产生进程(smon、pmon dw0X 等)。有系统视图来监视将创建和使用的所有内容(V$ 和 dba_ 视图)。
这就是我们在oracle中熟悉的结构。
您已经提到过,数据库是物理文件所在的位置。通常,迁移到 RAC 会产生明显的差异。
在 SQL Server 中,实例的工作方式相同:分配了一堆内存,并且有系统视图 (sys.) 来监视所有这些内容。
实例有4个系统数据库:
系统数据库保存 SQL Server 上每个其他数据库的元数据信息。
临时空间
在甲骨文中:
临时表空间(创建临时表空间)。在 oracle 中,临时表空间是无法放入 PGA 的操作的溢出区(进程内存,默认为 200M(最多 11g),例如,如果临时表空间中的溢出大于 200M,则您的哈希连接,通常这是一个原因执行缓慢的查询)。
在 SQL Server 中,有一个位于“系统数据库”部分的 tempdb 数据库,它的使用非常活跃,远远超过 oracle。将它放在非常快的磁盘上(想到 SSD 或光纤)
因此出现了第二大差异:
对象
在 SQL Server 中:
对象(表、视图)不像在 oracle 中那样绑定到用户,而是绑定到“数据库”。“数据库”保存(不是自己的)对象。在创建数据库时,提到了一个数据文件来存储这些对象。
在甲骨文中:
用户创建的对象将位于同名模式中。仔细命名用户变得很重要。
这是第三大区别:
安全
在甲骨文中:
用户将被创建,他们将被赋予至少创建会话的权利,以便他们可以访问他们被允许访问的对象。或者,他们将有权在自己的模式(资源角色)中创建对象,然后以该名称创建模式。
您可以选择创建一个表空间并使其成为每个能够创建对象的用户的默认值,这是一个很好的做法。如果没有这样做,则使用默认表空间,通常是“USER_DATA”。
在 SQL Server 中:
由于对象不属于模式中的特定用户,因此必须首先创建用户,然后分配权限。通常,无论谁是创建对象的主要用户,都将被授予对给定数据库的“所有者”角色。
SQL Server 中的该用户在 oracle 中相当于架构所有者,但可能有多个所有者。
安全性是 SQL Server 胜过 Oracle 的地方:SQL Server 安全性可以与管理桌面用户的 Active Directory 相关联。这些桌面用户可以绑定到一个用户组,比如“只读”。可以将该活动目录组添加到 SQL Server 并为其授予对数据库的“只读”访问权限。
当用户离开您的公司时,Active Directory 管理员会删除该用户并且对数据库的访问也会丢失。
Oracle 可以使用 LDAP,但让我们面对,它通常与 Windows 桌面用户没有很好的联系。
第四大区别。
语义
SQL Server 有一个额外的层。在 SQL Server 数据库中,对象可以按架构组织。模式也可能有所有者。它也引入了更细粒度的安全性,但虽然使用了它,但并不常见。我想说在开发阶段的早期按模式对对象进行分组也是一种很好的做法,以便以后在需要时从额外的安全功能中受益。
日志/归档日志
最后归档日志在 oracle 和 SQL Server 中的工作方式不同。SQL Server 为每个数据库创建了一个日志文件,而 oracle 在实例级别开启了归档日志模式。
这是线条模糊的地方。在某些方面,SQL Server 的数据库确实是数据库。在其他情况下,它们看起来更像模式。
SQL Server 中的归档设置为选项备份模式设置为完整。然后通过执行日志备份将它们归档。日志备份需要在开始工作之前进行完整备份。
在 Oracle 中,归档日志会自动归档,然后我们将它们备份到远程位置。
概括
甲骨文:
Instance->User1->Schema1(named User1)->Tablespace1
->Tablespace2
->User2->Schema2(named User2)->Tablespace3
->User3->Granted "read only"->schema2.table1
Run Code Online (Sandbox Code Playgroud)
SQL 服务器:
Instance->Database1->Schema1
->Database2->Schema2
->User1
->User2
->User1->Granted "owner"->Database1
->User2->Granted "read only"->Database2->Schema2
Run Code Online (Sandbox Code Playgroud)
当我比较两者时,这些是我想到的事情。我很想听听其他人的更多信息并添加/更正此答案。
另外我对两者都没有特别的偏好。我认为他们都做得很好,我非常喜欢和他们一起工作。
我不知道 Oracle,但我会澄清它在 SQL Server 中的含义。
在一台 Windows Server 上可以有多个 SQL Server 实例(独立安装)。
每个实例都有自己的数据库(用户数据库和系统数据库)。
重要的是要知道每个实例都有自己的系统数据库(master、model、msdb、tempdb)。实例可以使用不同的 SQL Server 版本、版本并安装不同的产品。
某些 SQL Server 组件在一台服务器(例如 SQL 浏览器)上的实例之间共享。
要从实例 B 访问实例 A,您必须在实例 B 上创建一个映射到实例 A 的链接服务器。您还可以使用此机制将 SQL Server 与 Oracle 连接起来。
每个数据库可以有多个模式。模式对表、过程、视图和其他数据库对象进行分组。
在 SQL Server 中,实例代表产品的单个安装并作为唯一的服务器进程运行。每台机器都可以承载多个 SQL Server 实例。
每个实例具有: