Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Lỗi SQL:ORA-14006:tên phân vùng không hợp lệ

Bạn không thể phân vùng một bảng hiện có như vậy. Câu lệnh đó đang sửa đổi phân vùng chưa được tạo. Tôi không biết cách tự động để thực hiện thao tác này và tôi không chắc rằng bạn có thể thực hiện được.

Mặc dù tôi đã làm điều này nhiều lần nhưng với các bước thủ công. Làm như sau nếu bạn không thể tìm thấy giải pháp tự động:

  1. Tạo một bảng được phân vùng có tên table_name_part với các mệnh đề và tất cả các tùy chọn của bạn.
  2. Chèn vào bảng được phân vùng này tất cả các hàng từ bảng gốc. Chú ý đến độ nén. Nếu bạn có một số nén trên bảng (Cơ bản hoặc HCC), bạn phải sử dụng + APPEND gợi ý.
  3. Tạo trên bảng đã phân vùng các ràng buộc và chỉ mục của bạn từ bảng gốc.
  4. Đổi tên bảng và bỏ bảng ban đầu. Đừng bỏ nó cho đến khi bạn thực hiện một số tính trên chúng.

Tôi thấy rằng bảng của bạn có tùy chọn tự động tạo phân vùng nếu nó không tồn tại. (NUMTOYMINTERVAL (1, 'MONTH')) Vì vậy, bạn phải tạo bảng của mình chỉ với phân vùng đầu tiên. Tôi giả định rằng bạn có rất nhiều dữ liệu chỉ đọc ở đây, vì vậy bạn sẽ không gặp bất kỳ vấn đề nào về tính nhất quán thay vì tháng trước. Có thể có một số dữ liệu đọc-ghi nên bạn phải cẩn thận hơn khi muốn chèn dữ liệu vào bảng mới và chuyển đổi bảng.

Hi vọng sẽ giúp ích cho bạn. Theo như tôi biết có thể có một gói có tên DBMS_REDEFINITION có thể giúp bạn với phiên bản tự động của các bước của tôi. Nếu bạn cần thêm chi tiết hoặc cần một số trợ giúp về phương pháp của tôi, xin đừng ngần ngại.

CẬP NHẬT: Từ Oracle 12c R2, bạn có thể chuyển đổi một bảng từ một bảng chưa được phân vùng thành một bảng được phân vùng bằng phương thức của mình. Tìm một liên kết bên dưới. Bây giờ đây là một thách thức đối với tôi và tôi đang cố gắng chuyển đổi, nhưng tôi nghĩ rằng không có cách nào để thực hiện chuyển đổi này trực tuyến trong 12c R1.

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

Giải pháp

Tôi đã tìm thấy một giải pháp cho bạn. Ở đây bạn sẽ có tất cả các bước của tôi mà tôi chạy để chuyển đổi bảng trực tuyến. :)

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

Ở cuối tập lệnh, bạn sẽ thấy rằng bảng gốc đã được phân vùng.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn đệ quy Oracle - Ngày tháng

  2. Hàm HEXTORAW () trong Oracle

  3. Các truy vấn hàng đầu để tìm Bản vá được áp dụng trong các ứng dụng Oracle

  4. Tham gia bên trong hai bảng, tổng hợp các trường varchar

  5. Trình nghe Oracle không chạy và sẽ không khởi động