优化Oracle实例

3

我正在与一个开发在SQL Server和Oracle上运行的应用程序的团队合作。

SQL Server有实例的概念,可以包含多个数据库。但是,Oracle 10g需要每个数据库一个实例(可以允许更多的冗余实例),所以对于我们运行的每个数据库,我们都有一组完全独立的进程,因此需要更多的内存。

因此,我们开始更多地采用具有单独模式的单个实例。但是,我们仍然希望保持不同客户(或开发机器)的数据分开。

我们大部分实例都是使用本地开发的脚本创建的(例如,在Windows上使用oradim)。

为了降低Oracle实例的内存使用要求、占用空间等,使多个实例可以安全地在一台计算机上运行,我们可以做些什么?Linux还是Windows更好?我们可以通过禁用不需要的额外功能(数据挖掘,Oracle Text等)来轻松降低内存使用吗?

7个回答

2

在我看来,内存是Oracle性能最重要的因素。

运行多个数据库意味着需要保留多组缓存的SQL和PL/SQL,系统表的多个数据缓存等。

如果您只需要将数据分开,可以为不同的用户创建不同的TABLESPACES。但是LOGFILES仍然需要共享。

禁用Data Mining等额外功能并不能帮助太多,因为它们在未被使用时不会消耗内存。

您肯定需要降低任何内存值,但是没有看到您的数据库设计,很难确定哪些值应该保留,哪些需要降低。

作为一个非常粗略的经验法则,如果您有OLTP数据库,即小表和高并发级别,则可能应该牺牲sort_area_size和hash_area_size,但尽可能保持db_block_buffers高。

如果您有使用HASH JOINS和MERGE JOINS的大型表,则需要sort_area_size和hash_area_size进行高效的连接和排序,但可以减少db_block_buffers,因为您无法缓存这些表。

Linux和Windows在Oracle性能方面没有太大区别。但是Linux支持LOCK_SGA,而Windows也尝试这样做,但在内存条件艰苦的情况下可能会交换出。


也许我对原帖的理解错误,但我认为他可能想从调整较粗粒度的MEMORY_TARGET开始,而不是调整各种细粒度参数(如sort_area_size、hash_area_size...)。调整MEMORY_TARGET或许足以满足他的需求。 - RussellH
我可以降低内存限制,但我希望只能减少内存使用,以便它不会达到限制。 :) 我愿意听取所有建议,并乐意深入了解,如果简单的方法不起作用的话。 - crb
你尝试过调整这些参数进行实验吗?Oracle 可能会预先分配比你实际需要的更大的 SGA。 - RussellH

1

赞同“每台服务器一个实例”的概念。 如果您想给某些用户优先处理权或确保每个应用程序都能公平地使用数据库,请考虑资源管理和配置文件。

http://download.oracle.com/docs/cd/B19306_01/network.102/b14266/admusers.htm#i1012785

http://download.oracle.com/docs/cd/B19306_01/server.102/b14200/statements_2007.htm#sthref4352

http://download.oracle.com/docs/cd/B19306_01/server.102/b14231/dbrm.htm#ADMIN027

将数据保存在单独的模式中(并在物理级别上使用表空间)应确保客户数据得到适当分离。只要不在模式之间共享表空间,就可以相对容易地使用导出和可传输表空间来提取和分离单个模式,以便在随后需要将它们放在自己的服务器上时将它们移动到数据库(及其实例)之间。


1

内存消耗将来自以下几个方面:

  1. 每个实例的SGA
  2. 每个会话的UGA,PGA(排序等)
  3. 其他杂项的每个进程内存需求不包括在上述范围内(例如每个Oracle进程使用的堆栈和堆,实际可执行映像使用的内存等)

为了防止开发人员和客户相互干扰缓冲区高速缓存,1的成本是值得的。那些不关心这些事情的实例应该合并。

您可以假设所有RDBMS都支付了2的成本,以某种形式支付(仅取决于您的RDBMS配置),因此这不是一种权衡。

我估计3的影响最好在Linux上减少,因为fork and page sharing,所以您只需要支付您使用的部分。在现代*nix系统上,采用fork-instead-of-multithreaded方法从CPU和内存角度来看非常高效,同时提供许多其他优点(您几乎永远不必担心内存泄漏)。


说了这些,不要忘记从Windows任务管理器或top读取的内存读数可能会误导进程的实际内存消耗,因为存在“双重计数”:共享内存段以及实际Oracle可执行文件和动态链接库的大小可能会被计算为每个进程,而实际上该内存由所有涉及的进程共享(仅使用一次)。在Unix下使用“pmem”或“cat /proc//maps”查看进程实际使用了多少内存以及有多少内存是共享的。


1

如果你使用的是Oracle 11g,那么MEMORY_TARGET就是你想要设置的参数。

http://download.oracle.com/docs/cd/B28359_01/server.111/b28320/initparams133.htm

当您将更多的数据库实例添加到同一服务器时,您需要在所有其他实例上向下调整此参数,以便不会在服务器上使用过多的内存并导致其交换。在Oracle 10g上,您设置PGA_AGGREGATE_TARGET和SGA_TARGET。

http://download.oracle.com/docs/cd/B19306_01/server.102/b14237/initparams157.htm

不幸的是,您添加的Oracle实例越多,调整就越困难,系统运行速度也会变慢。

我对Windows和Linux没有太多信息。


1

如果您的主要目标是客户端数据的分离,那么无需运行多个实例。您可以实现两种类型的分离。通过将每个客户端放入单独的模式中,您已经实现了第一种逻辑分离。为了物理上分离数据,请为每个客户端创建一个表空间。表空间是实际数据库文件的分组。通过使用它们,您可以控制数据的物理存储位置。在为客户端创建模式时,将客户端的表空间分配为“默认表空间”。

除非您想要在同一服务器上运行不同版本的Oracle之类的操作,否则很少有理由启动多个实例。为了充分利用单个实例,尽可能将其大部分存储在内存中,并使用诸如TOAD或包含的Oracle工具之类的工具来优化将内存分配给各种Oracle进程。


我原本以为他需要单独的实例(例如代码中过度使用公共同义词),但我同意,每个服务器一个实例是最优的。 - RussellH

1
如果您有单独的模式(schema),则可以将不同客户的数据分开。为什么需要更多实例?每台机器一个实例对于生产环境是最好的选择。
对于开发环境,您可以做出不同的选择。但是开发环境和生产环境应该分开。

我在发布最简单的时候忽略了一个显而易见的原因,那就是我们可以继续使用“标准”的应用程序用户和角色名称,而不必担心一个应用程序中的密码更改会影响其他应用程序(不幸的是,我们还集成了一个没有服务器组件的遗留应用程序 - 它使用Oracle用户)。 - crb
我不明白你的意思。什么是“标准”的应用程序用户名? - tuinstoel
默认用户(或模式/角色)名称。例如,我们的传统应用程序仍需要像DOC这样的(硬编码)角色,因此我们的脚本在每个数据库中创建该角色。在该角色中的用户也可以访问授予访问权限的其他模式中的数据。我们尽可能使用SCHEMA_DOC角色来解决问题。 - crb

1

你能给服务器增加内存吗?你可以花不到1000美元购买32GB的内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接