Вы можете использовать пакет DBMS_REDEFINITION
, который может делать копию всей таблицы, включая комментарии и т. Д. Он также «дефрагментирует» новую копию, занимая меньше места, чем исходная таблица.
Дополнительная информацияat https://docs.oracle.com/database/121/ARPLS/d_redefi.htm#ARPLS042
Пример по запросу:
Итак, давайте создадим тестовую схему, таблицу и заполните ее некоторыми данными:
CREATE USER "TEST_SCHEMA" IDENTIFIED BY "TEST";
GRANT UNLIMITED TABLESPACE TO "TEST_SCHEMA";
CREATE TABLE "TEST_SCHEMA"."NAMES" ("ID" NUMBER, "NAME" VARCHAR2(25), PRIMARY KEY("ID"));
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (1, 'joe');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (2, 'pete');
INSERT INTO "TEST_SCHEMA"."NAMES" VALUES (3, 'mark');
Теперь мы можем проверитьсодержимое тестовой таблицы:
SELECT * FROM "TEST_SCHEMA"."NAMES";
Начнем процесс копирования с создания пустой таблицы в точности так, как выглядит исходная таблица (используя WHERE 1=0
, который не будет принимать никаких данных).
CREATE TABLE "TEST_SCHEMA"."NAMES_COPY" AS SELECT * FROM "TEST_SCHEMA"."NAMES" "A1" WHERE 1=0;
Здесь вы можете настроить паралелляцию и т. Д., Подготовить данные и т. Д. После того, как все будет сделано, давайте запустим процесс REDEFINITION:
BEGIN
DBMS_REDEFINITION.START_REDEF_TABLE('TEST_SCHEMA','NAMES','NAMES_COPY');
END;
/
Когда содержимое скопировано, нам нужно скопировать каждый объект, которыйзависит от таблицы (например, триггеры, индексы и т. д.)
DECLARE
num_errors PLS_INTEGER;
BEGIN
DBMS_REDEFINITION.COPY_TABLE_DEPENDENTS ('TEST_SCHEMA', 'NAMES', 'NAMES_COPY',
DBMS_REDEFINITION.CONS_ORIG_PARAMS, TRUE, TRUE, TRUE, TRUE, num_errors);
END;
/
Мы можем проверить, возникли ли какие-либо ошибки при копировании зависимостей с помощью этого запроса:
SELECT "OBJECT_NAME", "BASE_TABLE_NAME", "DDL_TXT" FROM DBA_REDEFINITION_ERRORS;
Есливсе в порядке, мы можем закончить процедуруss:
BEGIN
DBMS_REDEFINITION.FINISH_REDEF_TABLE ('TEST_SCHEMA', 'NAMES', 'NAMES_COPY');
END;
/
И вуаля, новая таблица похожа на клонированную овечку Долли со всем, что в ней есть:
SELECT * FROM "TEST_SCHEMA"."NAMES_COPY";
Теперь, чтобы очистить схему тестирования, запустите:
DROP TABLE "TEST_SCHEMA"."NAMES";
DROP TABLE "TEST_SCHEMA"."NAMES_COPY";
DROP USER "TEST_SCHEMA" CASCADE;
Надеюсь, это помогло.