2

I come from a strong experience in MySQL, and I am now starting with Oracle. But I find really difficult to understand what a DATABASE is in Oracle, given that they use similar concepts which I am struggling to differentiate. In mysql, there is a simple concept of "database" instead of a mixture of

  • SCHEMA concept (User's woprkspace logically divided by TABLESPACES)
  • TNS and SID/SERVICES concept
  • CONNECTION concept (in both ODBC definition and SQLDeveloper)

I won't ask a pure definition of them as I am still reading, but just some guidance on how can I map a mysql database in the closest Oracle concept.

4

1 回答 1

1

这是我可以从开发人员的角度为您提供的信息。我对 Oracle 了解不多,但我已经完成了一些相当重要的工作,将其部署到现在正在生产中的一些应用程序。

数据库

在Oracle 术语中,数据库是一组文件,它们位于磁盘上并作为一个内聚单元进行管理。数据库包含几乎所有内容:登录名、角色、表、索引、临时空间、事务日志等等。创建一个在 Oracle 中是一项不平凡的任务。它基本上需要直接访问机器(如在 SSH 或 Windows 远程桌面中)。DBA 在安装过程中创建一个并且是服务器曾经托管的唯一一个是很常见的。与 MySQL、PostgreSQL 和 SQL Server 不同,您不能真正使用此级别进行基本分组。例如,由于重新创建数据库的开销,给每个开发人员自己的数据库是不常见的。

架构

Oracle模式将两个目的混为一谈:用户和命名空间。

  • 每个模式都是一个用户,它可以与凭据(密码,Active Directory 中的用户)相关联。请注意,所有帐户都是特定于数据库的;没有办法创建可以登录多个数据库的用户(除了将两个数据库指向同一个 LDAP 服务器或以其他方式涉及某些外部服务)。

  • 模式还充当包含对象(例如,表、视图、过程和索引)的名称空间,并且模式名称可以明确地用于限定您试图引用的对象。例如,如果我说MYOWNER.MYTABLE,Oracle 将查找MYTABLE拥有的表MYOWNER。如果您需要所有相同对象的多个副本,这是将它们分组的最简单级别,这使它们成为每个开发人员拥有数据库副本的最佳级别。

手动划分这两个概念是很常见的:一个模式可以被锁定而无法登录,并且可以将权限授予另一个用户对其对象的权限。不过,这有点麻烦,因为无法在整个架构中授予权限。每个对象都必须明确授予某些用户或角色。除了他们自己的之外,也没有办法强制用户在特定模式中创建对象;只能授予在用户自己的架构中创建对象或在任何架构中全局创建对象的权限。

撇开完整不谈:在 PostgreSQL 和 SQL Server 中,模式只是名称空间,而不是用户。

表空间

表空间是磁盘上的文件集,包含您需要存储的所有内容,包括数据和元数据(例如表定义)。一个数据库可以使用多个表空间,一个模式中的不同对象甚至可以在不同的表空间上。一个表空间可以是一个或多个文件,但它们作为一个逻辑单元进行管理。如果在创建对象时未指定表空间,则每个模式都有其对象的默认表空间。在数据库之间共享它们介于不可能和闻所未闻之间。

在实践中,通常甚至不关心表空间而只保留默认配置。默认是一个文件命名的表空间USERS,它是数据库中所有模式的默认表空间。如果您完全更改这些,您通常会为每个模式设置一个默认值,然后再考虑它,直到磁盘空间成为问题。

实例

您没有具体询问这些内容,但您需要先了解它们,然后我们才能讨论连接到数据库。

实例是在服务器上运行的用于侦听连接的实际进程。与数据库一样,这些都需要直接访问数据库服务器才能进行设置。您可以在服务器上拥有多个或单个。每个数据库都有一个是很常见的。

可以通过两种方式识别实例:SID服务名称。SID 标识单个实例,而服务名称是可以引用多个实例的别名。它如何工作的细节通常并不重要;只知道您需要了解它们才能连接。

连接

要从客户端连接,您需要一个连接描述符。这是一个包含主机、端口和 SID 或服务名称的混乱字符串。它们看起来像这样,例如:(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=orclservice))). 它们可以变得更复杂,但这是基本形式。要使用 SID 而不是服务名称,您将替换SERVICE_NAME=orclserviceSID=orclinstance. 还有一种更新、更紧凑的格式,称为“EZ connect”,它看起来像这样myoracleserver:1521/orclservice:它只支持基本参数。

TNS是“Transparant Network Substrate”的缩写,它由用于与数据库通信的整个网络堆栈组成。您几乎不需要将自己作为一个整体来关注。

您经常遇到的是TNS 名称。TNS 名称是连接描述符的别名。它们存储在客户端机器上的纯文本文件中,它们通常对整个机器都是全局的。这是您可以在文件中找到的示例映射:mydatabase=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orcl))). 以我的经验,大多数时候您实际上可以完全避免使用 TNS 名称而直接使用连接描述符。

连接标识符是可以代表连接描述符的任何内容。它可以是完整的连接描述符、EZ 连接描述符、TNS 名称或其他一些东西。但通常,它们会识别您要连接到的服务器和其上的特定数据库。

考虑到所有这些,连接变得更加简单。从概念上讲,它们与其他数据库中的几乎相同。如前所述,它们可能令人困惑的是您作为模式连接。“用户名”是模式名称,模式可以有密码或其他形式的身份验证与之相关联。连接字符串因客户端软件而异,就像在任何其他数据库中一样。对于 SQL*Plus(Oracle 的命令行客户端),连接字符串如下所示:[USERNAME]/[PASSWORD]@[connect identifier]. 因此,如果您的用户是MY_SCHEMA,密码是PASS,并且服务器就像上面一样,它可能看起来像

MY_SCHEMA/PASS@(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orclinstance)))

对于 .NET 应用程序,它可能看起来像

Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myoracleserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SID=orcl)));User Id=MY_SCHEMA;Password=PASS

这与任何其他数据库非常相似。请注意,在您看到讨厌的服务器信息的任何地方,您都可以将其替换为任何连接标识符(例如 TNS 名称)。

就 SQL Developer 而言,“连接”实际上只是一个保存的连接字符串。ODBC 像任何其他数据库一样连接;您只需要正确的连接字符串和驱动程序。

驱动程序

驱动程序可能是 Oracle 中的一个痛点,具体取决于语言。我相信 Java 有一些不错的独立客户端,但其他语言通常依赖于二进制版本。二进制版本确实有一个将二进制文件放在 PATH 上的安装程序,但安装程序很难使用,最好避免使用。如果可以,我会避免安装客户端并使用所谓的“即时客户端”。通常,如果您可以在应用程序可以找到它们的地方获取即时客户端二进制文件,它们就可以工作。如果没有,那么最好只PATH为您的应用程序在内存中预先添加,而不是为您的机器全局修改它。

如果您碰巧使用 .NET 进行开发,请使用Oracle的 NuGet 上的 ODP.NET 提供程序。它是用完整的 .NET 编写的,无需处理本地二进制文件。

概括

简而言之:

  • 数据库是服务器设置的一部分
  • 架构既是用户,也是您划分数据库的方式
  • 表空间是保存数据库的物理文件
  • TNS 名称只是客户端的命名便利
  • SID/服务名称只是连接时使用的名称

我个人觉得这种安排太复杂了。

于 2013-07-16T19:18:51.097 回答