Oracle 11g переименуйте. Гарантированно быть атомным? - PullRequest
4 голосов
/ 15 декабря 2009

У меня есть несколько (5) операторов переименования в скрипте plsql

drop table new;
rename old to new;

«старые» таблицы содержат очень ценную информацию.

На мой взгляд, если команда переименования гарантированно будет атомарной, тогда у меня будет одна проблема.

Это атомно? Если нет, есть ли способ сделать «безопасное» переименование?

Заранее спасибо

Ответы [ 5 ]

7 голосов
/ 15 декабря 2009

RENAME - команда DDL. Так что это отдельная отдельная транзакция, если это то, что вы подразумеваете под атомарным в этом контексте. Следовательно, он настолько безопасен, насколько это возможно. Я не могу представить, как переименование может привести к потере ваших данных. Но если вы чувствуете себя параноиком, просто помните, что именно поэтому Природа дала нам резервную копию и восстановление.

редактировать

Чтобы быть уверенным, что вы не потеряете данные, если DROP завершится успешно и RENAME завершится неудачей, нужно дважды развернуть RENAME:

SQL>  rename old_table to something_else;
SQL>  rename new_table to old_table;
SQL>  drop table something_else;

Таким образом, ваши данные онлайн. Это также минимизирует время простоя.

3 голосов
/ 16 декабря 2009

С учетом ваших комментариев "Это ежедневный процесс" и "Да, я беспокоюсь о ляпсусе между операторами отбрасывания и переименования"

Сколько у вас денег (или, точнее, есть ли у вас возможность разделения)? Если это так, посмотрите на раздел обмена

У вас есть постоянная таблица, состоящая из одного раздела. В конце дня вы меняете этот раздел таблицей (как единое атомарное утверждение). Не удаляя / не переименовывая основную таблицу, вы не должны делать недействительными какие-либо пакеты и т. Д. (Хотя это может зависеть от версии БД).

В случае неудачи при использовании вида и выполнении СОЗДАНИЯ ИЛИ ЗАМЕНЫ ВИДА ОСНОВНОГО КАК ВЫБРАТЬ * ОТ table_a, и каждую ночь вы заменяете представление новым на другой таблице. Это, вероятно, сделает пакеты недействительными.

1 голос
/ 23 декабря 2009

Если вас беспокоит время между удалением и переименованием, вот еще одна идея: используйте представление, которое указывает на «правильную базовую таблицу».

Вы бы начали с

CREATE VIEW someName as Select * From OldTable;

Тогда вы можете настроить свой новый стол. Когда будешь готов, тогда просто

CREATE OR REPLACE View someName as Select * From NewTable;

Тогда вы можете оставить свой OldTable. В следующий раз, когда вы получите какие-то новые данные, создайте другую NewTable_2 (или повторно используйте OldTable .. тогда, вероятно, лучше использовать Table1 и Table2) и переопределите представление снова.

Представление настолько простое, насколько это возможно, поэтому оно должно быть легко обновляемым. Единственная сложность заключается в том, чтобы всегда создавать новую таблицу (или переключаться между двумя таблицами), но это не должно быть слишком сложно для настройки и, вероятно, проще, чем полное избежание проблем, которые могут возникнуть с вашим исходным предложением.

1 голос
/ 16 декабря 2009

Полагаю, вы беспокоитесь, что одновременный DML (вставки / обновления / удаления) в старой таблице может быть пропущен во время переименования? В этом случае не беспокойтесь - RENAME - это DDL, и он блокирует таблицу на время.

1 голос
/ 15 декабря 2009

Rename будет атомарным, так что все будет в порядке. Как отметил APC,

Я не могу представить, как переименование может привести к потере ваших данных.

Единственное, что я могу увидеть в вашем скрипте, это время после удаления и до переименования таблицы new нет, поэтому потенциально может произойти сбой некоторого SQL. Однако это время будет довольно коротким, а что-то более сложное (например, Insert From Select) будет еще более проблематичным.

...