AKL Asked: 2014-07-09 12:14:35 +0800 CST2014-07-09 12:14:35 +0800 CST 2014-07-09 12:14:35 +0800 CST 数据库实例和数据库 772 我做了一些研究,最后得出了这个结论: 数据库实例=进程+内存 数据库=(物理)日志文件+控制文件+数据文件。 这种理解是否正确? 应用程序可以使用同一数据库的多个数据库实例吗? 数据库中的一个表可以同时被多个数据库实例使用吗? 谢谢。 database-design application-design 2 个回答 Voted Kitet 2014-07-09T12:47:31+08:002014-07-09T12:47:31+08:00 从技术上讲,实例驻留在内存中,数据库(物理文件)驻留在磁盘上。可以有一个没有数据库的实例(一个例子是在创建数据库之前启动的实例)。也可以有一个没有实例的数据库(例如数据库文件驻留在磁盘上但实例未运行,或者文件复制到其他位置,类似这些)。通常,您通过将客户端连接到它的实例来使用数据库,以便对其中包含的数据进行一些处理。因此,一个实例在启动时会将自己与一个或多个数据库相关联(例如,Firebird - 一个服务器进程可用于连接到多个数据库)。 第二个问题:仅在某些高可用性环境中,即 Oracle 上的 RAC,其中多个实例集群以服务同一个数据库。这对最终用户是透明的,所以实际上不能。如果您谈论的是非集群配置,那么不可以——没有两个实例可以使用同一组数据库文件,因此没有应用程序可以使用连接到同一组数据库文件的多个实例。至少在我所知道的 RDBMS 中没有。但是,理论上,应用程序可以使用两个实例为同一数据库的两个不同副本提供服务,为什么不呢。只是我看不到这样做的现实理由。 第三个问题:已经回答了。除非是某种 HA 环境,否则任何数据库都不能由两个实例提供服务。 编辑对象类型 这是查询select distinct object_type from dba_objects我的 Ora 10g 的结果,连我自己都感到惊讶: CONSUMER GROUP, INDEX PARTITION, SEQUENCE, QUEUE, SCHEDULE, TABLE PARTITION, RULE, PROCEDURE, OPERATOR, LOB PARTITION, WINDOW, LOB, PACKAGE, PACKAGE BODY, LIBRARY, RULE SET, PROGRAM, TYPE BODY, CONTEXT, TRIGGER, JOB CLASS, UNDEFINED, DIRECTORY, MATERIALIZED VIEW, TABLE, INDEX, SYNONYM, VIEW, FUNCTION, WINDOW GROUP, CLUSTER, TYPE, RESOURCE PLAN, EVALUATION CONTEXT, JOB Best Answer Vérace 2014-07-09T12:44:27+08:002014-07-09T12:44:27+08:00 我猜您在这里谈论的是 Oracle。请参阅我对这个关于 Oracle 中模式和数据库之间区别的问题的答复。另请参阅我对 Phil Sumner 关于使用不在同一模式中的表的回复的评论 - 是的,这是可能的,但不是理想的解决方案。 [编辑以回应 OP 的评论] 是的,您所说的正是它在 RDBMS 中的工作方式——这就是 Oracle、MS Server 和 MySQL(尽管存在关于不是_true_ RDBMS 的争论)。 要以您提出问题的方式回答您的问题: 你说: Database instance = processes + memory 是的,“实例”可以看作是这个——它主要是 Oracle 术语。其他人可能称它为“服务器”或(不幸的是!)“数据库”。最好区分实例(在 cpu/内存结构中)和物理文件)。 Database = (physical) log files + control files + data files. 数据库(在现代 RDBMS 意义上)是您编写的内容,除了您错过了实际数据(+ 日志文件、控制文件、初始化参数(通常是文本)文件)。 不幸的是,这就是现代术语中事情变得非常混乱的地方。 对于软件(实例)+ 数据库(磁盘上的文件),我会使用(如果我想说得非常清楚的话)术语“系统”(甚至运行系统)。 请注意,这些术语可能会被滥用和破坏,并且没有一个通用的权威术语被普遍接受。 要回答这个 如果我错了,请纠正我,表是在数据库中创建和存储的,数据库实例使用数据库中存在的这些表来执行插入、删除、查询等操作。 你在这方面是绝对正确的——至少对于 RDBMS 是这样。
从技术上讲,实例驻留在内存中,数据库(物理文件)驻留在磁盘上。可以有一个没有数据库的实例(一个例子是在创建数据库之前启动的实例)。也可以有一个没有实例的数据库(例如数据库文件驻留在磁盘上但实例未运行,或者文件复制到其他位置,类似这些)。通常,您通过将客户端连接到它的实例来使用数据库,以便对其中包含的数据进行一些处理。因此,一个实例在启动时会将自己与一个或多个数据库相关联(例如,Firebird - 一个服务器进程可用于连接到多个数据库)。
第二个问题:仅在某些高可用性环境中,即 Oracle 上的 RAC,其中多个实例集群以服务同一个数据库。这对最终用户是透明的,所以实际上不能。如果您谈论的是非集群配置,那么不可以——没有两个实例可以使用同一组数据库文件,因此没有应用程序可以使用连接到同一组数据库文件的多个实例。至少在我所知道的 RDBMS 中没有。但是,理论上,应用程序可以使用两个实例为同一数据库的两个不同副本提供服务,为什么不呢。只是我看不到这样做的现实理由。
第三个问题:已经回答了。除非是某种 HA 环境,否则任何数据库都不能由两个实例提供服务。
编辑对象类型
这是查询
select distinct object_type from dba_objects
我的 Ora 10g 的结果,连我自己都感到惊讶:CONSUMER GROUP, INDEX PARTITION, SEQUENCE, QUEUE, SCHEDULE, TABLE PARTITION, RULE, PROCEDURE, OPERATOR, LOB PARTITION, WINDOW, LOB, PACKAGE, PACKAGE BODY, LIBRARY, RULE SET, PROGRAM, TYPE BODY, CONTEXT, TRIGGER, JOB CLASS, UNDEFINED, DIRECTORY, MATERIALIZED VIEW, TABLE, INDEX, SYNONYM, VIEW, FUNCTION, WINDOW GROUP, CLUSTER, TYPE, RESOURCE PLAN, EVALUATION CONTEXT, JOB
我猜您在这里谈论的是 Oracle。请参阅我对这个关于 Oracle 中模式和数据库之间区别的问题的答复。另请参阅我对 Phil Sumner 关于使用不在同一模式中的表的回复的评论 - 是的,这是可能的,但不是理想的解决方案。
[编辑以回应 OP 的评论]
是的,您所说的正是它在 RDBMS 中的工作方式——这就是 Oracle、MS Server 和 MySQL(尽管存在关于不是_true_ RDBMS 的争论)。
要以您提出问题的方式回答您的问题:
你说:
是的,“实例”可以看作是这个——它主要是 Oracle 术语。其他人可能称它为“服务器”或(不幸的是!)“数据库”。最好区分实例(在 cpu/内存结构中)和物理文件)。
数据库(在现代 RDBMS 意义上)是您编写的内容,除了您错过了实际数据(+ 日志文件、控制文件、初始化参数(通常是文本)文件)。
不幸的是,这就是现代术语中事情变得非常混乱的地方。
对于软件(实例)+ 数据库(磁盘上的文件),我会使用(如果我想说得非常清楚的话)术语“系统”(甚至运行系统)。
请注意,这些术语可能会被滥用和破坏,并且没有一个通用的权威术语被普遍接受。
要回答这个
你在这方面是绝对正确的——至少对于 RDBMS 是这样。