Вот интересная вещь о SYS, он не может использовать SERIALIZABLE транзакции. Это также относится к пользователям, подключенным как SYSDBA. Узнать больше .
Уровень изоляции SERIALIZABLE означает, что все операторы в транзакции считываются согласованными. По умолчанию для Oracle используется READ COMMITTED, который применяется на уровне операторов. Разница заключается в следующем: если мы запустим select * from T1
, а затем select * from T2
на уровне изоляции READ COMMITTED, то мы внесем любые изменения, зафиксированные в T2
, пока мы запрашиваем T1
. То есть наборы результатов для T1
и T2
являются согласованным набором записей, но мы могли бы увидеть разные результаты, если бы мы выполняли запросы наоборот. Принимая во внимание, что в SERIALIZABLE наборы результатов соответствуют началу транзакции. Не имеет значения, в каком порядке мы запрашиваем таблицы, результаты стабильны.
Вы можете понять, почему это важно для экспорта. Весь набор экспортируемых таблиц должен быть согласованным, чтобы гарантировать реляционную целостность последующего импорта. Мы не хотим экспортировать дочернюю таблицу с записями, которые зависят от записей, добавленных в родительскую таблицу после ее экспорта. (Старая утилита экспорта позволяла нам установить consistency=N
- это действительно было по умолчанию! - но Data Pump защищает нас от нас самих).
Так вот почему мы не можем запускать экспорты как SYS или пользователи SYSDBA. К счастью, есть простое решение: отзовите SYSDBA от вашего пользователя и вместо этого предоставьте ему роли DATAPUMP_EXP_FULL_DATABASE
и DATAPUMP_IMP_FULL_DATABASE
. [Find out more][2]
.