OBE 主页 > 10gR2 单实例 > 可用性

联机重新构建数据库对象

本教程说明如何在数据库上执行各种重建和重组任务。

大约 30 分钟

本教程包括下列主题:

将鼠标置于此图标上可以加载和查看本教程的所有屏幕截图。(警告:因为此操作会同时加所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注意:此外,您还可以在下列步骤中将鼠标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。您可以单击单个屏幕截图将其隐藏。

使用 Oracle 联机重新定义,可以在用户读取和更新表的同时对这些表进行更改。该特性可以确保服务的连续性,因为对最终用户没有影响。重组完成后,将自动切换到新重组的切换,且这一过程对应用程序用户是完全透明的。

返回主题列表

开始本教程之前,您应该:

1.

完成了教程在 Windows 上安装 Oracle 数据库 10g

2.

下载 onlredef.zip 文件并将其解压缩到您的工作目录 (c:\wkdir) 中。

 

在本部分中,您将重组 HR 模式中的 EMPLOYEES 表。您将执行以下操作:

在两个新的表空间 EMP_TBS1EMP_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
DBMS_REDEFINITION.CAN_REDEF_TABLE('HR','employees',
dbms_redefinition.cons_use_pk);
END;
/

 

11.

您现在将创建两个表空间和一个临时表。临时表显示表重组后的外观,其中包括 LOCATION_ID 列和分区方案。在 SQL*Plus 会话中,行 redef_crobj 脚本,如下所示:

@c:\wkdir\redef_crobj

connect system/oracle
CREATE TABLESPACE EMP_TBS1;
CREATE TABLESPACE EMP_TBS2;
CREATE TABLE hr.int_employees
(employee_id NUMBER(6) ,
first_name VARCHAR2(20) ,
last_name VARCHAR2(25) ,
email VARCHAR2(25) ,
phone_number VARCHAR2(20) ,
location NUMBER(4),
hire_date DATE DEFAULT (sysdate),
job_id VARCHAR2(10),
salary NUMBER(8,2),
commission_pct NUMBER (2) DEFAULT(10),
manager_id NUMBER(6),
department_id NUMBER(4) )
PARTITION BY RANGE(employee_id)
(PARTITION emp1000 VALUES LESS THAN (1000) TABLESPACE EMP_TBS1,
PARTITION emp2000 VALUES LESS THAN (2000) TABLESPACE EMP_TBS2);

 

12.

现在,您可以启动重新定义进程,定义旧列和新列的列映射并将佣金增加 1%。在 SQL*Plus 会话中,执行 redef_start 脚本,如下所示:

@c:\wkdir\redef_start

connect system/oracle
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('hr', 'employees','int_employees',
'employee_id employee_id, first_name first_name, last_name last_name, email email, phone_number phone_number, 0 location, hire_date hire_date, job_id job_id, salary salary, commission_pct+1 commission_pct, manager_id manager_id, department_id department_id' , dbms_redefinition.cons_use_pk);
END;
/

 

13.

启动另一个 SQL*Plus 会话,以便在其中更改 EMPLOYEES 表。以 system/oracle 身份连接,执行 redef_test 脚本,如下所示:

@c:\wkdir\redef_test

connect hr/hr
UPDATE employees set salary = 25000 where employee_id=200;

注意:不要在此时提交该事务。

 

14.

接下来,您将在临时表上自动创建触发器、索引和约束。切换回第一个 SQL*Plus 会话并执行 redef_crdep_obj 脚本:

@c:\wkdir\redef_crdep_obj

connect system/oracle
set serveroutput on
DECLARE
no_errors int;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('hr', 'employees','int_employees',1, TRUE, TRUE, TRUE, FALSE, no_errors);
DBMS_OUTPUT.put_line ('No of errors during copy of dependents ' || no_errors );
END;
/

 

15.

返回第二个 SQL*Plus 会话(在其中执行了 redef_test 脚本的会话),然后提交薪水更改。退出该 SQL*Plus 会话。

commit;
exit

 

16.

现在,可以对临时表进行同步,以便在其中加入您所做的薪水更改。返回第一个 SQL*Plus 会话并执行 redef_sync 脚本:

@c:\wkdir\redef_sync

connect system/oracle
BEGIN
DBMS_REDEFINITION.SYNC_INTERIM_TABLE('hr', 'employees', 'int_employees');
END;
/

 

17.

现在,您将完成重组,并且表会以透明的方式进行切换。在 SQL*Plus 会话中,执行 redef_finish_drop 脚本:

@c:\wkdir\redef_finish_drop

connect system/oracle
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE('hr', 'employees', 'int_employees');
END;
/
DROP TABLE hr.int_employees CASCADE CONSTRAINTS PURGE;

 

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
CREATE TABLESPACE indexes;

 

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 主页。

 

在本教程中,您学习了如何:

更改表定义
执行联机段收缩
重新构建索引
更改表的存储属性

返回主题列表

将鼠标移到该图标上可以隐藏所有屏幕截图。