Онлайн разделы
У меня есть таблица с огромными данными, которая находится на производстве на стороне клиента. Я должен сделать онлайн разделение этого означает, что я могу остановить производство, и таблица должна быть разделена. У меня есть сценарий, чтобы сделать это. Но я не знаю, как это сделать онлайн. Есть ли у них какой-нибудь способ, которым я могу добиться этого. Пожалуйста, предложите..
1 ответ
Выполните следующие шаги,
Создайте временную таблицу в той же структуре, что и основная таблица (например, TABLE_P для TABLE), и разбейте эту временную таблицу на необходимый столбец. Не добавляйте первичные ключи и другие индексы главной таблицы в эту временную таблицу.
create table TABLE_P ( COL1 VARCHAR2(35 CHAR) not null, COL2 VARCHAR2(35 CHAR) not null, ) --add partition (Example taken here is Range partitioning) from here PARTITION BY RANGE (COL1) ( PARTITION p0 VALUES LESS THAN (5), PARTITION p1 VALUES LESS THAN (10), PARTITION p2 VALUES LESS THAN (15), PARTITION p3 VALUES LESS THAN (MAXVALUE) --add partition till here
Создайте индекс для этой таблицы с нужным столбцом.
create index IX01_TABLE on TABLE_P (COL1) local;
Запустите приведенные ниже скрипты для повторного определения. Заменить на фактическое имя схемы.
begin dbms_redefinition.can_redef_table( 'SCHEMA', 'TABLE' ); end; / begin dbms_redefinition.start_redef_table('SCHEMA', 'TABLE','TABLE_P' ); end; / declare error_count pls_integer := 0; BEGIN dbms_redefinition.copy_table_dependents(uname => 'SCHEMA', orig_table => 'TABLE', int_table => 'TABLE_P', num_errors => error_count); dbms_output.put_line('errors := ' || to_char(error_count)); END; / begin dbms_redefinition.finish_redef_table('SCHEMA', 'TABLE','TABLE_P'); end; /
Обратите внимание, что это сделает зависимые объекты недействительными в схеме, поэтому будьте готовы к простоям, чтобы очистить этих инвалидов.