针对挂起/低速系统的直连 SGA 访问
当用户经常抱怨数据库运行速度慢并经常超时时,大多数 DBA 最先想到的就是以 SYSDBA 连接到数据库并检查等待事件。但如果实例挂起,甚至您无法登录时又会怎样?这种情况下,即使最强大、最优秀的故障诊断查询也无济于事。
在 Oracle 数据库 10g 第 2 版中,Oracle Enterprise Manager Grid Control 可以在苛刻环境下根据您的请求直接连接到 SGA,从而从进程状态中直接收集数据。这个所谓的内存访问模式增强了您有效使用 Oracle Enterprise Manager 的能力,即使在实例经历严重问题的情况下也是如此。而最重要的是,这是在 SQL 访问基本无法实现的情况下自动执行的。
以下是它的工作方式:在 Oracle Enterprise Manager 用户界面中,选择 Performance 选项卡,并向下滚动到该页面底部标记为“Related Links”的部分,这将显示一个如下所示的屏幕。
注意名为“Monitor in Memory Access Mode”的链接。单击该链接将显示一个如下所示的屏幕。注意“View Mode”下拉菜单,其中的“Memory Access”选项处于选中状态。
可以使用“View Mode”下拉菜单控制 Oracle Enterprise Manager 获取数据的方式。在本示例中,它显示从内存获取的数据(“Memory Access”)。还可以在此处选择“SQL Access”以从性能视图中进行选择。
请注意,内存访问模式并不是 SQL 访问的替代模式;它只适合在 SQL 访问不可用的紧急情况下使用。此外,内存访问模式只提供对分析挂起会话有帮助的数据子集。(有关该主题的详细信息请见下个部分 — “性能”特性。)
联机重新定义分区
当大多数 DBA 没有停机时间来更改表时(如对其进行分区),他们将使用联机重新定义工具 DBMS_REDEFINITION。使用该工具,您可以更改对象定义,同时使它们保持可访问状态。
但 DBMS_REDEFINITION 有一个限制,这使它在某些情况下无法提供帮助。例如,您可能要将表分区移动到不同的表空间。为此,必须移动整个表,即使已将其分区。如果该表很大,此方法将产生大量的重做和撤消操作,且无法利用现有分区。但如果一次可以移动一个分区,则可以显著减少时间、空间和重做/撤消要求。
使用 Oracle 数据库 10g 第 2 版,您可以完全实现该目标:可以通过 Oracle Enterprise Manager 或命令行重新定义一个表分区。
我们来看一个使用命令行的示例。在这里,您有一个名为 ACCOUNTS 的表,它包含 11 个分区,所有这些分区都位于同一表空间 USERS 中。您要将它们移到一个专门为该表创建的新表空间 ACCDATA 中。您将以一次移动一个分区的方式移动该表。
首先,创建一个中间表,其结构与表 ACCOUNTS 相同但现在将数据置于 ACCDATA 表空间上。 SQL> create table accounts_int 2 tablespace accdata 3 as 4 select * from accounts 5 where 1=2 6 / 注意分区现在所在的位置: SQL> select partition_name, tablespace_name, num_rows 2 from user_tab_partitions 3 / PARTITION_NAME TABLESPACE_NAME NUM_ROWS ------------------------------ ------------------------------ ---------- P1 USERS 1014 P2 USERS 1042 P3 USERS 1002 P4 USERS 964 P5 USERS 990 P6 USERS 1042 P7 USERS 915 P8 USERS 983 P9 USERS 1047 P10 USERS 1001 PMAX USERS 0 11 rows selected. 所有分区均位于 USERS 表空间中。现在,将第一个分区 P1 移到表空间 ACCDATA 中。 SQL> begin 2 dbms_redefinition.start_redef_table ( 3 uname => 'ARUP', 4 orig_table => 'ACCOUNTS', 5 int_table => 'ACCOUNTS_INT', 6 part_name => 'P1' 7 ); 8 end; 9 / PL/SQL procedure successfully completed. 注意第 6 行,其中的 part_name 参数指定要重新组织的分区。如果省略该参数,则将同时重新定义所有分区。
现在,将中间表与原始表同步。(仅当要对表 ACCOUNTS 进行更新时才需要执行该操作。) SQL> begin 2 dbms_redefinition.sync_interim_table ( 3 uname => 'ARUP', 4 orig_table => 'ACCOUNTS', 5 int_table => 'ACCOUNTS_INT', 6 part_name => 'P1' 7 ); 8 end; 9 / PL/SQL procedure successfully completed. 最后,完成重新定义过程。 SQL> begin 2 dbms_redefinition.finish_redef_table ( 3 uname => 'ARUP', 4 orig_table => 'ACCOUNTS', 5 int_table => 'ACCOUNTS_INT', 6 part_name => 'P1' 7 ); 8 end; 9 / PL/SQL procedure successfully completed. 确认分区 P1 确已移到表空间 ACCDATA 中。 SQL> select partition_name, tablespace_name, num_rows 2 from user_tab_partitions 3 / PARTITION_NAME TABLESPACE_NAME NUM_ROWS ------------------------------ ------------------------------ ---------- P1 ACCDATA 1014 P2 USERS 1042 P3 USERS 1002 P4 USERS 964 P5 USERS 990 P6 USERS 1042 P7 USERS 915 P8 USERS 983 P9 USERS 1047 P10 USERS 1001 PMAX USERS 0 11 rows selected. 行了!对其他分区重复该过程。
相比而言,如果您重新组织了整个表,则将 (a) 需要一个大小与整个表相等的空间,(b) 为整个表生成重做(必须存在),否则将产生错误。但通过对单个分区执行此过程,将减少单个分区的空间要求,并减少只为该分区生成的重做。
使用这个强大而有用的特性,您可以联机重新组织非常大的对象(就像大多数已分区对象一样)。此外,还应注意如何将统计信息复制到已重新定义的表上(如以上查询中的 NUM_RWS 值所示);您不必为新建的表或分区重新生成统计信息。
 
2/2 首页 上一页 1 2 |