sql >> Base de Datos >  >> RDS >> Oracle

Error de SQL:ORA-14006:nombre de partición no válido

No puede particionar una tabla existente de esa manera. Esa declaración está modificando la partición que aún no se ha creado. No conozco la forma automática de hacer esta operación y no estoy seguro de que puedas hacerlo.

Aunque he hecho esto muchas veces pero con pasos manuales. Haga lo siguiente si no puede encontrar una solución automatizada:

  1. Cree una tabla particionada llamada table_name_part con sus cláusulas y todas sus preferencias.
  2. Inserte en esta tabla particionada todas las filas de la tabla original. Preste atención a la compresión. Si tiene alguna compresión en la tabla (Básica o HCC), debe usar + APPEND pista.
  3. Cree en una tabla particionada sus restricciones e índices a partir de la tabla original.
  4. Cambie el nombre de las tablas y elimine la tabla original. No lo dejes caer hasta que hagas algunos conteos sobre ellos.

Vi que su tabla tiene la opción de crear automáticamente una partición si no existe. (NUMTOYMINTERVAL(1,'MES')) Por lo tanto, debe crear su tabla solo con la primera partición. Supongo que aquí tiene muchos datos de solo lectura, por lo que no tendrá ningún problema con la coherencia en lugar del mes pasado. Probablemente hay algunos datos de lectura y escritura, por lo que debe tener más cuidado con el momento en que desea insertar datos en una nueva tabla y cambiar de tabla.

Espero poder ayudarte. Por lo que sé, podría haber un paquete llamado DBMS_REDEFINITION que pueda ayudarlo con una versión automatizada de mis pasos. Si necesita más detalles o necesita ayuda con mi método, no lo dude.

ACTUALIZACIÓN: Desde Oracle 12c R2, puede convertir una tabla de una sin particiones a una con particiones con su método. Encuentre un enlace a continuación. Ahora bien, esto es un desafío para mí y estoy tratando de convertir, pero creo que no hay manera de hacer esta conversión en línea en 12c R1.

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

Solución

Encontré una solución para ti. Aquí tendrá todos mis pasos que ejecuto para convertir la tabla en línea. :)

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

Al final del script, verá que la tabla original está particionada.