sql >> Databasteknik >  >> RDS >> Oracle

SQL-fel:ORA-14006:ogiltigt partitionsnamn

Du kan inte partitionera en befintlig tabell på det sättet. Det uttalandet ändrar partitionen som inte har skapats ännu. Jag vet inte det automatiska sättet att göra den här operationen och jag är inte säker på att du kan göra det.

Även om jag har gjort det här många gånger men med manuella steg. Gör följande om du inte kan hitta en automatiserad lösning:

  1. Skapa en partitionerad tabell med namnet tabellnamn_del med dina satser och alla dina inställningar.
  2. Infoga alla rader från den ursprungliga tabellen i denna partitionerade tabell. Var uppmärksam på kompression. Om du har en viss komprimering på tabellen (Basic eller HCC) måste du använda + APPEND ledtråd.
  3. Skapa på en partitionerad tabell dina begränsningar och index från den ursprungliga tabellen.
  4. Byt namn på tabellerna och släpp den ursprungliga tabellen. Tappa det inte förrän du räknar lite med dem.

Jag såg att din tabell har möjlighet att automatiskt skapa en partition om den inte finns. (NUMTOYMINTERVAL(1,'MÅNAD')) Så du måste skapa din tabell med endast den första partitionen. Jag antar att du har mycket skrivskyddad data här, så du kommer inte ha några problem med konsekvens istället för förra månaden. Förmodligen finns det en del läs-skrivdata så där måste du vara mer försiktig med ögonblicket när du vill infoga data i ny tabell och byta tabell.

Hoppas kunna hjälpa dig. Så vitt jag vet kan det finnas ett paket som heter DBMS_REDEFINITION som kan hjälpa dig med en automatiserad version av mina steg. Om du behöver mer information eller behöver hjälp med min metod, tveka inte.

UPPDATERING: Från Oracle 12c R2 kan du konvertera en tabell från en opartionerad till en partitionerad med din metod. Hitta en länk nedan. Nu är detta en utmaning för mig och jag försöker konvertera, men jag tror att det inte finns något sätt att göra den här konverteringen online i 12c R1.

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

Lösning

Jag hittade en lösning för dig. Här kommer du att ha alla mina steg som jag kör för att konvertera tabell 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');

I slutet av skriptet ser du att den ursprungliga tabellen är partitionerad.



  1. postgresql vad är det bästa sättet att exportera en specifik kolumn från en specifik tabell från en DB till en annan

  2. ogiltig minnesadress eller noll pekare dereference golang databas

  3. Hur SUBSTR()-funktionen fungerar i MySQL

  4. Hur man lägger till ett sidhuvud och en sidfot i ett formulär i Microsoft Access