sql >> データベース >  >> RDS >> Oracle

SQLエラー:ORA-14006:無効なパーティション名

    そのような既存のテーブルをパーティション化することはできません。そのステートメントは、まだ作成されていないパーティションを変更しています。この操作を自動的に行う方法がわかりません。また、それができるかどうかもわかりません。

    私はこれを何度も行ってきましたが、手動の手順で行いました。自動化されたソリューションが見つからない場合は、次の手順を実行してください。

    1. 句とすべての設定を使用して、table_name_partという名前のパーティションテーブルを作成します。
    2. このパーティションテーブルに、元のテーブルのすべての行を挿入します。圧縮に注意してください。テーブル(基本またはHCC)に圧縮がある場合は、 + APPENDを使用する必要があります。 ヒント。
    3. パーティションテーブルに、元のテーブルから制約とインデックスを作成します。
    4. テーブルの名前を変更し、元のテーブルを削除します。あなたがそれらを数えるまでそれを落とさないでください。

    テーブルにパーティションが存在しない場合は自動作成するオプションがあることがわかりました。 (NUMTOYMINTERVAL(1、'MONTH'))したがって、最初のパーティションのみでテーブルを作成する必要があります。ここには読み取り専用のデータがたくさんあると思いますので、先月の代わりに一貫性に問題はありません。おそらくいくつかの読み取り/書き込みデータがあるので、新しいテーブルにデータを挿入してテーブルを切り替えるときは、もっと注意する必要があります。

    あなたを助けることを願っています。私の知る限り、私のステップの自動化バージョンで役立つDBMS_REDEFINITIONという名前のパッケージがあるかもしれません。詳細が必要な場合、または私の方法についてサポートが必要な場合は、遠慮なくお問い合わせください。

    更新: Oracle 12c R2から、メソッドを使用してテーブルをパーティション化されていないテーブルからパーティション化されたテーブルに変換できます。以下のリンクを見つけてください。これは私にとっての課題であり、変換しようとしていますが、12cR1でこの変換をオンラインで行う方法はないと思います。

    https://oracle-base.com/articles/12c/online-conversion-of-a-non-partitioned-table-to-a-partitioned-table-12cr2

    解決策

    私はあなたのための解決策を見つけました。ここでは、テーブルをオンラインで変換するために実行するすべての手順を説明します。 :)

    1. Create regular table and populate it.
    
    CREATE TABLE SCOTT.tab_unpartitioned
    (
        id              NUMBER,
        description     VARCHAR2 ( 50 ),
        created_date    DATE
    );
    INSERT INTO tab_unpartitioned
            SELECT LEVEL,
                   'Description for ' || LEVEL,
                   ADD_MONTHS ( TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' ),
                                -TRUNC ( DBMS_RANDOM.VALUE ( 1, 4 ) - 1 ) * 12 )
              FROM DUAL
        CONNECT BY LEVEL <= 10000;
    COMMIT;
    
    2. Create partitioned table with same structure.
    
    --If you are on 11g create table with CREATE TABLE command but with different name. ex: tab_partitioned
    
    CREATE TABLE SCOTT.tab_partitioned
    (
        id              NUMBER,
        description     VARCHAR2 ( 50 ),
        created_date    DATE
    )
    PARTITION BY RANGE (created_date)
    INTERVAL( NUMTOYMINTERVAL(1,'YEAR'))
    (PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
     PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
     PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));
    
    --this is an alter command that works only in 12c.
    ALTER TABLE tab_partitioned
        MODIFY
            PARTITION BY RANGE (created_date)
            (PARTITION part_2015 VALUES LESS THAN (TO_DATE ( '01-JAN-2016', 'DD-MON-YYYY' )),
             PARTITION part_2016 VALUES LESS THAN (TO_DATE ( '01-JAN-2017', 'DD-MON-YYYY' )),
             PARTITION part_2017 VALUES LESS THAN (TO_DATE ( '01-JAN-2018', 'DD-MON-YYYY' )));
    
    3. Check if the table can be converted. This procedure should run without any error. 
    Prerequisites: table should have an UNIQUE INDEX and a Primary Key constraint.
    
    EXEC DBMS_REDEFINITION.CAN_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED');
    
    4. Run the following steps like I have done.
    
    EXEC DBMS_REDEFINITION.START_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED'); 
    var num_errors varchar2(2000);
    EXEC DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED', 1,TRUE,TRUE,TRUE,FALSE,:NUM_ERRORS,FALSE);
    SQL> PRINT NUM_ERRORS -- Should return 0
    EXEC DBMS_REDEFINITION.SYNC_INTERIM_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
    EXEC DBMS_REDEFINITION.FINISH_REDEF_TABLE('SCOTT','TAB_UNPARTITIONED','TAB_PARTITIONED');
    

    スクリプトの最後に、元のテーブルがパーティション化されていることがわかります。



    1. Oracleのユーザーとスキーマの違いは?

    2. ajax呼び出しを介してtextareaにテキストをロードします

    3. 複数の列のString_agg

    4. アクティブレコードはすべてのJSONフィールドを更新します