Каков наилучший способ сделать «снимок» базы данных Oracle, которая постоянно обновляется? - PullRequest
6 голосов
/ 30 октября 2010

Я хочу сделать непротиворечивый снимок базы данных Oracle, которая постоянно обновляется адаптером БД TIBCO.

Обычно TIBCO обновляет сразу несколько таблиц, а затем COMMIT. Если я переберу все таблицы, делая снимок один раз в день, то я смогу получить данные из таблицы A до фиксации и из таблицы B после фиксации - но если между A и B есть связь, то они больше не будут совпадать должным образом.

Является ли "SET TRANSACTION READ ONLY" подходом?
например

COMMIT
SET TRANSACTION READ ONLY
SELECT * FROM A WHERE A.ADB_UPDATEDDATE > TODAY()-1 
SELECT * FROM B WHERE B.ADB_UPDATEDDATE > TODAY()-1 
etc.
COMMIT

(синтаксис СЕГОДНЯ может быть неправильным, не важно!)

Или есть что-то лучшее, что я могу сделать?

Ответы [ 6 ]

7 голосов
/ 30 октября 2010

Если под «снимком» вы подразумеваете полную копию базы данных в согласованном режиме, то я бы восстановил базу данных из резервной копии и восстанавливал ее до нужного момента времени. Процессы восстановления Oracle позаботятся о согласованности (отслеживаются по номеру системного изменения или SCN).

Если вы используете RMAN для резервного копирования и восстановления, есть команда «DUPLICATE DATABASE» с условием времени, которая сделает это относительно безболезненным.

С другой стороны, если вы просто хотите извлечь несколько таблиц в согласованном режиме, я могу подумать о двух вариантах:

  • Экспорт группы таблиц с непротиворечивый = y вариант (старого) опыта утилита
  • Используйте более новую утилиту expdp с опцией flashback_time
4 голосов
/ 31 октября 2010

Это очень легко сделать, используя функцию Oracle под названием Flashback . Если вы знаете, когда была предыдущая версия (time или scn) и она была в окне воспоминания, вы можете просто запросить ее.

1 голос
/ 30 октября 2010

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

0 голосов
/ 28 декабря 2015

Прежде всего, как говорили другие парни, в Oracle есть специальные инструменты для «моментального снимка» , и лучше использовать его для этой задачи для меня. Но если мы посмотрим на проблему в частности, то увидим, что это неповторяющиеся чтения и фантомные чтения проблема [1], так что все дело в транзакции уровни изоляции . У нас есть SERIALISABLE уровень в Oracle , чтобы избежать (но это не значит, что это хорошо для вашей задачи в общем случае) этих проблем [2], так что если вы не хотите получать некоторые удивляет и вы хотите привести вашу базу данных в согласованное состояние в определенный момент времени (время начала вашей транзакции), вы должны сделать это:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE

Ссылки:

  1. https://en.wikipedia.org/wiki/Isolation_(database_systems)
  2. http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_10005.htm#SQLRF01705
0 голосов
/ 30 января 2013

Вы также можете использовать снимки, основанные на «уровне хранилища», хотя оракул, похоже, считает, что использование RMAN - лучший способ: http://www.oracle.com/technetwork/database/features/availability/rman-fra-snapshot-322251.html

0 голосов
/ 04 ноября 2010

Может быть, поможет экспорт в согласованном режиме. Взгляните на http://www.dba -oracle.com / tips_oracle_export_utility.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...