在线分区

时间:2013-01-08 06:24:07

标签: oracle11g partitioning

我有大量数据的表格,并且在客户端正在制作。我必须做在线分区,这意味着我可以暂停生产,表应该被分区。我有脚本来做它。但我不知道如何在网上做到这一点。他们以任何方式实现这一目标。请建议..

1 个答案:

答案 0 :(得分:3)

按照以下步骤

  1. 在与主表相同的结构中创建临时表(例如TABLE_P for TABLE),并在必需列上对此临时表进行分区。不要将主表的主键和其他索引添加到此临时表中。

    create table TABLE_P
        (
          COL1        VARCHAR2(35 CHAR) not null,
          COL2        VARCHAR2(35 CHAR) not null,
        )
        --add partition (Example taken here is Range partitioning)  from here
         PARTITION BY RANGE (COL1) (
         PARTITION p0 VALUES LESS THAN (5),
         PARTITION p1 VALUES LESS THAN (10),
         PARTITION p2 VALUES LESS THAN (15),
         PARTITION p3 VALUES LESS THAN (MAXVALUE)
        --add partition till here
    
  2. 使用所需列为此表创建索引。

    create index IX01_TABLE on TABLE_P (COL1) local;         
    
  3. 运行以下脚本进行重定义。替换为实际的模式名称。

    begin
    dbms_redefinition.can_redef_table( 'SCHEMA', 'TABLE' );
    end;
    /
    
    begin
    dbms_redefinition.start_redef_table('SCHEMA', 'TABLE','TABLE_P' );
    end;
    /
    
    declare
      error_count pls_integer := 0;
    BEGIN
      dbms_redefinition.copy_table_dependents(uname      => 'SCHEMA',
                                              orig_table => 'TABLE',
                                              int_table  => 'TABLE_P',
                                              num_errors => error_count);
      dbms_output.put_line('errors := ' || to_char(error_count));
    END;
    /
    
    begin
    dbms_redefinition.finish_redef_table('SCHEMA', 'TABLE','TABLE_P');
    end;
    /
    
  4. 请注意,这将使依赖对象在模式中变为INVALID,因此请准备好一些停机时间以清除这些残留物。