Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Kesalahan SQL:ORA-14006:nama partisi tidak valid

Anda tidak dapat mempartisi tabel yang ada seperti itu. Pernyataan itu memodifikasi partisi yang belum dibuat. Saya tidak tahu cara otomatis untuk melakukan operasi ini dan saya tidak yakin Anda bisa melakukannya.

Meskipun saya telah melakukan hal ini berkali-kali tetapi dengan langkah-langkah manual. Lakukan hal berikut jika Anda tidak dapat menemukan solusi otomatis:

  1. Buat tabel yang dipartisi bernama table_name_part dengan klausa Anda dan semua preferensi Anda.
  2. Masukkan ke dalam tabel yang dipartisi ini semua baris dari tabel asli. Perhatikan kompresi. Jika Anda memiliki beberapa kompresi pada tabel (Dasar atau HCC), Anda harus menggunakan + APPEND petunjuk.
  3. Buat pada tabel yang dipartisi batasan dan indeks Anda dari tabel asli.
  4. Ganti nama tabel dan hapus tabel aslinya. Jangan menjatuhkannya sampai Anda menghitungnya.

Saya melihat bahwa tabel Anda memiliki opsi untuk membuat partisi secara otomatis jika tidak ada. (NUMTOYMINTERVAL(1,'MONTH')) Jadi Anda harus membuat tabel dengan partisi pertama saja. Saya berasumsi bahwa Anda memiliki banyak data hanya-baca di sini, jadi Anda tidak akan memiliki masalah dengan konsistensi daripada bulan lalu. Mungkin ada beberapa data baca-tulis sehingga Anda harus lebih berhati-hati saat ingin memasukkan data ke tabel baru dan beralih tabel.

Berharap untuk membantu Anda. Sejauh yang saya tahu mungkin ada paket bernama DBMS_REDEFINITION yang dapat membantu Anda dengan versi otomatis langkah saya. Jika Anda memerlukan detail lebih lanjut atau memerlukan bantuan tentang metode saya, jangan ragu.

PERBARUI: Dari Oracle 12c R2 Anda dapat mengonversi tabel dari yang tidak dipartisi ke yang dipartisi dengan metode Anda. Temukan tautan di bawah ini. Sekarang ini merupakan tantangan bagi saya dan saya mencoba untuk mengonversi, tetapi menurut saya tidak ada cara untuk membuat konversi ini secara online di 12c R1.

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

Solusi

Saya menemukan solusi untuk Anda. Di sini Anda akan memiliki semua langkah yang saya jalankan untuk mengonversi tabel online. :)

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');

Di akhir skrip, Anda akan melihat bahwa tabel asli telah dipartisi.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dalam satu kueri SQL, berapa banyak indeks yang dapat digunakan kueri dari satu tabel?

  2. Memisahkan baris ke kolom di Oracle

  3. Bagaimana cara menampilkan 0 ketika tidak ada baris yang ditemukan?

  4. Entri pencarian orang SQL memiliki anjing paling banyak

  5. Plsql untuk mengeja nomor (mata uang) ke mata uang Italia tanpa hardcode nomor terjemahan