本教程说明如何在数据库上执行各种重建和重组任务。
大约 30 分钟
本教程包括下列主题:
| 概述 | ||
| 前提条件 | ||
| 更改表定义 | ||
| 执行联机段收缩 | ||
| 重新构建索引 | ||
| 更改表的存储属性 | ||
| 总结 | ||
将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)
注意:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。您可以单击单个屏幕截图将其隐藏。
使用 Oracle 联机重新定义,可以在用户读取和更新表的同时对这些表进行更改。该特性可以确保服务的连续性,因为对最终用户没有影响。重组完成后,将自动切换到新重组的切换,且这一过程对应用程序用户是完全透明的。
开始本教程之前,您应该:
| 1. | ||
| 2. | 下载 onlredef.zip 文件并将其解压缩到您的工作目录 (c:\wkdir) 中。 |
|
在本部分中,您将重组 HR 模式中的 EMPLOYEES 表。您将执行以下操作:
| 添加一个称作 LOCATION 的新列 | ||
| 在两个新的表空间 EMP_TBS1 和 EMP_TBS2 对该表进行划分 | ||
执行以下步骤:
| 1. |
打开浏览器,启动企业管理器,如下所示: http://<your host name>:1158/em 以 system/oracl 的身份登录,然后单击 Login。
注意:可能会显示许可协议页面。如果显示,向下滚动至页面底部,然后单击 I agree。
|
|
| 4. | 选择 Administration 选项卡。
|
|
| 5. |
向下滚动至 Schema 部分。
|
|
| 6. | 单击 Tables 链接。
|
|
| 7. |
在 Schema 字段中输入 HR,在 Object Name 字段中输入 EMP。然后,单击 Go。
|
|
| 8. |
选择 EMPLOYEES 表链接。
|
|
| 9. |
请注意,EMPLOYEES 表未被分区,它没有名称为 LOCATION 的列。单击 OK。
|
|
| 10. |
要重新定义表,需要验证该表是否可以进行联机重新定义,并指定使用主键执行重新定义。以 system/oracle 身份登录到 SQL*Plus,执行 redef_emp_cand 脚本,如下所示: @c:\wkdir\redef_emp_cand BEGIN
|
|
| 11. |
您现在将创建两个表空间和一个临时表。临时表显示表重组后的外观,其中包括 LOCATION_ID 列和分区方案。在 SQL*Plus 会话中,行 redef_crobj 脚本,如下所示: @c:\wkdir\redef_crobj connect system/oracle
|
|
| 12. |
现在,您可以启动重新定义进程,定义旧列和新列的列映射并将佣金增加 1%。在 SQL*Plus 会话中,执行 redef_start 脚本,如下所示: @c:\wkdir\redef_start connect system/oracle
|
|
| 13. |
启动另一个 SQL*Plus 会话,以便在其中更改 EMPLOYEES 表。以 system/oracle 身份连接,执行 redef_test 脚本,如下所示: @c:\wkdir\redef_test connect hr/hr
注意:不要在此时提交该事务。
|
|
| 14. | 接下来,您将在临时表上自动创建触发器、索引和约束。切换回第一个 SQL*Plus 会话并执行 redef_crdep_obj 脚本: @c:\wkdir\redef_crdep_obj connect system/oracle
|
|
| 15. | 返回第二个 SQL*Plus 会话(在其中执行了 redef_test 脚本的会话),然后提交薪水更改。退出该 SQL*Plus 会话。 commit; exit
|
|
| 16. | 现在,可以对临时表进行同步,以便在其中加入您所做的薪水更改。返回第一个 SQL*Plus 会话并执行 redef_sync 脚本: @c:\wkdir\redef_sync connect system/oracle
|
|
| 17. | 现在,您将完成重组,并且表会以透明的方式进行切换。在 SQL*Plus 会话中,执行 redef_finish_drop 脚本: @c:\wkdir\redef_finish_drop connect system/oracle
|
|
| 18. | 现在,您可以在 Enterprise Manager 中查看重组后的表。回切到 Enterprise Manager 会话。单击浏览器中的 Refresh 按钮,并再次单击 EMPLOYEES。
|
|
| 19. | 注意新的 LOCATION 列。向下滚动到底部。
|
|
| 20. | 该表现在还进行了分区。单击 OK。
|
|
您可能需要执行的另一种类型的重组是恢复段空间。这涉及将段压缩以恢复空间,然后使该空间可用。该任务是联机执行的。在本教程中,您将在表中创建并生成数据活动。将该表的 Enable Row Movement 选项设置为 Yes。选择该选项使您可以对该表进行空间回收。执行以下步骤:
| 1. | 在企业管理器的 Tables 页面上,单击 Create 按钮。
|
| 2. | 接受“Standard, Heap Organized”的默认值,单击 Continue。
|
| 3. | 在 Name 域中输入 EMPLOYEES1。将 SYSTEM 指定为模式,并将 EXAMPLE 指定为表空间。在 Define Using 下拉列表中选择 SQL。在 Create Table As 字段中输入 select * from hr.employees。单击 Options 标签。
|
| 4. | 在 Enable Row Movement 列表中选择 Yes,然后单击 OK,完成表的创建。
|
| 5. | 表已创建完成。
|
| 6. | 现在您可以生成某些活动了。以 system/oracle 的身份登录 SQL*Plus。执行 genactivity01 脚本模拟 EMPLOYEES1 表上的用户活动。 @c:\wkdir\genactivity01 genactivity01.sql 文件包含以下代码: begin
for i in 1..1000 loop
insert into system.employees1
select * from hr.employees;
commit;
end loop;
end;
/
|
| 7. | 要在 EMPLOYEES1 表上模拟更多用户活动,在 SQL*Plus 会话中执行 genactivity02 脚本: @c:\wkdir\genactivity02 genactivity02.sql 文件包含以下代码: delete system.employees1 where department_id = 50; begin
for i in 1..500 loop
insert into system.employees1
select * from hr.employees;
commit;
end loop;
end;
/
|
| 8. | 要在 EMPLOYEES1 表上模拟更加多的用户活动,在 SQL*Plus 会话中执行 genactivity03.sql 脚本: @c:\wkdir\genactivity03.sql genactivity03.sql 文件包含以下代码: begin
for i in 1..500 loop
insert into system.employees1
select * from hr.employees;
commit;
end loop;
end;
/
|
| 9. | 要在 EMPLOYEES1 表上模拟更多用户活动,在 SQL*Plus 会话中执行 genactivity04 脚本: @c:\wkdirgenactivity04 genactivity04.sql 文件包含以下代码: delete system.employees1 where department_id = 30; commit; delete system.employees1 where department_id = 100; commit; delete system.employees1 where department_id = 50; commit; delete system.employees1 where department_id = 80; commit;
|
| 10. | 返回 Enterprise Manager Tables 页面。选择 EMPLOYEES1 表,然后单击 Edit。
|
| 11. | 单击 Segments 选项卡。
|
| 12. | 注意 EMPLOYEES1 表中浪费空间的百分率。可以使用 Segment Advisor 回收该表中未使用的空间。从 Actions 列表中选择 Shrink Segment ,然后单击 Go。
|
| 13. | 单击 Continue。
|
| 14. | 在 Schedule 页面上,为 Job Name 输入 Segment_Shrink_Employees1。确保选中了 Immediately,单击 Submit。
|
| 15. | 您的作业已经提交。单击 All 选项卡。
|
| 16. | 段收缩作业已经成功执行。现在,您可以查看统计信息。单击 Database Instance 路径式导航栏。
|
| 17. | 向下滚动 Administration 页面。单击 Database Objects 部分中的 Tables 链接。
|
| 18. | 为 Schema 输入 SYSTEM,并为 Object Name 输入 EMP。单击 Go。
|
| 19. | 确保选择了 EMPLOYEES1 表,然后单击 Edit。
|
| 20. | 单击 Segments 选项卡。
|
| 21. | 注意,Wasted Space(%) 已经显著减小。选择 Database Instance 路径式导航栏。
|
重新构建索引是 DBA 通常需要执行的另一个任务。在本教程中,您将联机重新构建 JHIST_JOB_IS 的索引并将它移动到一个称作 Indexes 的新表空间中。执行以下步骤:
| 1. | 以 system/oracle 身份登录到 SQL*Plus,执行 rebuild_crtblsp 脚本,创建一个新的表空间: @c:\wkdir\rebuild_crtblsp connect system/oracle
|
|
| 2. | 返回 Enterprise Manager 窗口。在 Administration 页面的 Database Objects 部分中,选择 Indexes。
|
|
| 3. | 选择 Search By 列表中的 Index Name。在 Schema 字段中输入 HR,在 Object Name 字段中输入 JHIST%。单击 Go。
|
|
| 4. | 注意,JHIST_JOB_IX 索引现在存储在 EXAMPLE 表空间中。
|
|
| 5. | 在 SQL*Plus 会话中,执行以下命令将索引移到刚刚创建的 INDEXES 表空间中: ALTER INDEX hr.jhist_job_ix REBUILD ONLINE TABLESPACE indexes;
|
|
| 6. | 返回 Enterprise Manager 会话,并刷新页面。您将看到,该索引现在已经分配给 INDEXES 表空间。单击 Database 路径式导航栏返回 Administration 页。
|
|
有时,必须更改表的存储属性。执行以下步骤:
| 1. | 向下滚动 Administration 页面。
|
|
| 2. | 在 Database Objects 下,选择 Reorganize Objects。
|
|
| 3. | 确保选择了 Schema Objects,然后单击 Next。
|
|
| 4. | 单击 Add。
|
|
| 5. | 在 Type 列表中选择 Tables,并为 Schema 输入 HR。然后,单击 Search。
|
|
| 6. | 在 Available Objects:Tables 部分中,选择 HR.DEPARTMENTS,然后单击 OK。
|
|
| 7. | 单击 Set Attributes。
|
|
| 8. | 选择 Relocate object to another tablespace,然后输入 EMP_TBS2 作为表空间的名称。单击 Storage 选项卡。
|
|
9. |
为 Initial Size of the Extents 输入 2MB。然后单击 OK。
|
|
| 10. | 单击 Next。
|
|
| 11. | 在 Method 部分中,选择 Availability (online)。单击 Next。
|
|
12. |
已经生成该脚本,并且还生成了一个不包含错误的影响报表。单击 Next。
|
|
| 13. | 输入主机凭证的用户名和密码。单击 Next。
|
|
| 14. | 显示要执行的脚本。单击 Submit Job。
|
|
| 15. | 作业已经创建。单击作业链接查看结果。
|
|
| 16. | 单击 Status 接。
|
|
| 17. | 单击 Reorganize 链接。
|
|
| 18. | 随即显示输出。已经成功完成了重组操作。滚动到页面的底部,查看整个输出日志。单击 Database 返回 Database 主页。
|
|
在本教程中,您学习了如何:
| 更改表定义 | ||
| 执行联机段收缩 | ||
| 重新构建索引 | ||
| 更改表的存储属性 | ||