Табличное пространство отката может помочь в извлечении более старых данных с помощью различных операций ретроспективного отката, но что делать при необходимости извлечь очень старые данные, скажем, шестимесячной или годичной давности? Очевидно, что в большинстве баз данных не используются табличные пространства отката, предусматривающие хранение данных отката на протяжении столь длительного периода времени. Конечно, то, насколько далеко назад по времени можно возвращаться, зависит от размера табличного пространства отката, и от того, какой объем данных отката генерирует база данных. Задачей табличного пространства отката является оказание помощи с откатом (roll back) операторов и обеспечение согласованности операций чтения в базе данных, а не предоставление хронологических сведений обо всех изменениях в данных.
Выделять одно или более табличных пространств под хранение данных обо всех переходных изменениях, происходящих в одной или нескольких конкретных таблицах, позволяет механизм Flashback Data Archive (Архив ретроспективных данных). Включать этот механизм на уровне всей базы данных нельзя, его можно включать только на уровне конкретных таблиц. Он просто идеально подходит для хранения сведений обо всех переходных изменениях, которые происходят в любой таблице базы данных за определенный период времени. Сохранять подобные сведения может быть необходимо как для удовлетворения требований по соблюдению законодательных норм, так и для нескольких других целей, которые будут перечислены чуть позже в этой главе. В следующих разделах рассказывается о том, как настраивать и использовать механизм архивации ретроспективных данных.
Управление архивом Flashback Data Archive
Для создания и удаления архива ретроспективных данных можно применять операторы CREATE FLASHBACK ARCHIVE и DROP FLASHBACK ARCHIVE соответственно, а для изменения его свойств (например, периода хранения в нем данных) — оператор ALTER FLASHBACK ARCHIVE. В следующих подразделах статьи более подробно объясняется решение различных задач, касающихся его управления.
Создание архива Flashback Data Archive
Для создания архива ретроспективных данных служит оператор CREATE FLASHBACK ARCHIVE. Прежде чем выполнять его, нужно удостоверяться в том, что указываемое в нем табличное пространство действительно существует. В частности, при создании архива ретроспективных данных можно задавать следующие детали:
- имя архива;
- имя первого табличного пространства в архиве;
- квоту, выделяемую под архив в первом табличном пространстве.
- насколько долго база данных должна сберегать данные.
Из перечисленных четырех параметров, только два — имя первого табличного пространства и период сохранности данных — являются обязательными. Ниже приведен пример создания архива данных ретроспективного отката с именем flash1:
SQL> CREATE FLASHBACK ARCHIVE flash1 TABLESPACE test_tbs RETENTION 1 YEAR;
Этот оператор создает новый архив ретроспективных данных flash1 и гарантирует, что любые включаемые в архивацию таблицы будут отслеживаться, а любые транзакционные изменения, вносимые в данные этих таблиц — сохраняться в течение года. По истечении года эти транзакционные изменения будут автоматически удаляться, а на их месте оставаться лишь те, для которых год на данный момент еще не прошел. В следующем примере показано, как создать архив данных ретроспективного отката, способный хранить данные на протяжении трех лет. Вдобавок задается параметр QUOTA для ограничения объема пространства, которое архив может использовать в табличном пространстве test_tbs. В базе данных может поддерживаться и более одного архива данных ретроспективного отката. Поэтому в данном примере еще указан параметр DEFAULT для назначения данного архива архивом ретроспективных данных, который должен использоваться для базы данных по умолчанию.
SQL> CREATE FLASHBACK ARCHIVE DEFAULT flash1 TABLESPACE test_tbs QUOTA 5g RETENTION 3 YEAR;
Изменение свойств архива Flashback Data Archive
Оператор ALTER FLASHBACK ARCHIVE позволяет изменять свойства архива ретроспективных данных, например, его размер или период хранения в нем архивных данных. В частности, при его помощи можно делать следующее.
- Назначать архив ретроспективных данных архивом по умолчанию для базы данных:
SQL> ALTER FLASHBACK ARCHIVE flash1 SET DEFAULT;
- Добавлять в архив табличное пространство:
SQL> ALTER FLASHBACK ARCHIVE flash1 ADD TABLESPACE flash2 QUOTA 10G;
- Изменять период сохранности данных в архиве:
SQL> ALTER FLASHBACK ARCHIVE flash1 MODIFY RETENTION 5 YEAR;
- Удалять все данные из архива:
SQL> ALTER FLASHBACK ARCHIVE flash1 PURGE ALL;
- Удалять из архива все данные сроком старше недели:
SQL> ALTER FLASHBACK ARCHIVE flash1 PURGE BEFORE TIMESTAMP (SYSTIMESTAMP — INTERVAL '1' DAY);
Удаление архива Flashback Data Archive
Удалять архив ретроспективных данных можно следующим оператором:
SQL> DROP FLASHBACK ARCHIVE flash1;
Показанный выше оператор приведет к удалению одного лишь архива данных ретроспективного отката. Обслуживавшее этот архив табличное пространство останется незатронутым, поскольку в нем помимо этого архива могут содержаться и другие объекты.
Просмотр данных архива Flashback Data Archive
Для просмотра деталей о данных, которые хранятся в архиве ретроспективных данных, можно использовать перечисленные ниже представления.
- DBA_FLASHBACK_ARCHIVE — показывает информацию о самом архиве данных ретроспективного отката.
- DBA_FLASHBACK_ARCHIVE_TS — показывает информацию о табличных пространствах, которые обслуживают архив данных ретроспективного отката.
- DBA_FLASHBACK_ARCHIVE_TABLES — показывает информацию о таблицах, для которых была включена функция архивации данных ретроспективного отката.
Включение архива Flashback Data Archive
Включать архивацию можно только на уровне таблицы. Включать ее на уровне всей базы данных нельзя. По умолчанию никакие изменения в базе данных не архивируются. Включать механизм архивирования ретроспективных данных для таблицы можно путем указания при создании этой таблицы конструкции FLASHBACK ARCHIVE:
SQL> CREATE TABLE test1 (name VARCHAR2(30), empno NUMBER(4)NOT NULL, salary NUMBER) FLASHBACK ARCHIVE;
В приведенном выше примере имя архива ретроспективных данных указано не было. Поэтому накапливаемые данные будут сохраняться в используемом по умолчанию архиве Flashback Data Archive. При желании указать конкретный архив Flashback Data Archive, достаточно добавить имя этого архива, как показано в следующем примере:
SQL> CREATE TABLE test1 (name VARCHAR2(30), empno NUMBER(4) NOT NULL, salary NUMBER) FLASHBACK ARCHIVE flash1;
Механизм архивирования ретроспективных данных можно также включать и для существующей таблицы, выполнив оператор ALTER TABLE, как показано ниже:
SQL> ALTER TABLE employee FLASHBACK ARCHIVE;
Отключается механизм архивирования ретроспективных данных для таблицы с помощью такого оператора:
SQL> ALTER TABLE employee NO FLASHBACK ARCHIVE;
Ограничения
Использование архива ретроспективных данных накладывает определенные ограничения на тип DDL-операторов, которые можно выполнять. В частности, в отношении таблицы, для которой был включен механизм архивирования ретроспективных данных, не разрешено выполнять DDL-операторы перечисленных ниже типов.
- Операторы ALTER TABLE, предусматривающие удаление, переименование или изменение какого-нибудь столбца таблицы.
- Операторы ALTER TABLE, предусматривающие выполнение операций по разбиению таблицы на разделы.
- Операторы DROP TABLE и TRUNCATE TABLE.
- Операторы RENAME TABLE.
Примеры использования архива Flashback Data Archive
Архив Flashback Data Archive можно использовать для запроса хронологических данных, ведения аудита, а также восстановления после ошибок с данными. Ниже приведены примеры, показывающие, как использовать такой архив в разных ситуациях.
Получение доступа к хронологическим данным
За счет использования в запросе конструкции AS_OF можно легко получить доступ к хронологическим данным, которые хранятся в архиве Flashback Data Archive:
SQL> select transaction_number, doctor_name, count from patient_info as of timestamp to_timestamp ('2009-01-01 00:00:00', 'YYYY-MM-DD HH23:MI:SS');
Конструкцию AS_OF можно применять для выполнения восстановления после логических ошибок. В следующем примере текущий доход сотрудника по имени Zlotkey составляет 10 500 долларов, как показывает следующий запрос:
SQL> SELECT username, salary FROM HR.EMPLOYEES WHERE last_name='Zlotkey'; SALARY ------- 10500 SQL>
В отделе кадров случайно допускают ошибку при обновлении таблицы EMPLOYEES, повышая зарплату сотрудника Zlotkey на 50 000 вместо 500 долларов:
SQL> UPDATE hr.employees SET salary=salary+50000 WHERE last_name='Zlotkey'; 1 row updated. SQL> commit; Commit complete. SQL>
Предположим, что администратор баз данных узнает о допущенной при обновлении ошибке два часа спустя. Чтобы исправить ее, ему достаточно выполнить следующий оператор с использованием конструкции AS_OF:
SQL> update hr.employees set salary = (select salary from hr.employees as of timestamp (systimestamp - interval '120' minute); where last_name='Zlotkey') where last_name='Zlotkey'; 1 row updated. SQL> commit; Commit complete. SQL>
Обратите внимание, что получать доступ или выполнять запрос к таблице хронологии, которая поддерживается в базе данных для отслеживания транзакционных изменений в данных таблиц, совершенно не требуется. Конструкция AS_OF автоматически гарантирует выполнение базой данных поиска интересующей информации в той таблице хронологии, которая поддерживается в архиве Flashback Data Archive. Конструкция SYSTIMESTAMP — INTERVAL '120' MINUTE приведет к извлечению значений, которые использовались два часа назад. В этой конструкции можно также указывать секунды, дни и месяцы, как показано в следующих примерах:
systimestamp — interval '60' second systimestamp — interval '7' day systimestamp — interval '12' month
Генерирование отчетов
За счет получения доступа к хронологическим данным можно легко создавать отчеты, охватывающие данные из прошлого. Конструкция VERSIONS BETWEEN TIMESTAMP позволяет извлекать старые значения столбцов таблицы, как показано в следующем примере:
SQL> SELECT * FROM patient_info VERSIONS BETWEEN TIMESTAMP to_timestamp('2009-01-01 00:00:00','YYYY-MM-DD HH23:MI:SS') AND MAXVALUE WHERE name ='ALAPATI';
Приведенный здесь запрос приведет к извлечению всех версий данных, которые выбирались за период с 1 января 2009 г. по сегодняшний день.
Управление жизненным циклом информации
Приложениям, предназначенным для управления жизненным циклом информации (Information Lifecycle Management — ILM), часто требуется множество версий строк таблицы за какой-то определенный срок. Конструкция VERSIONS BETWEEN TIMESTAMP позволяет извлекать все версии строки или строк за определенный период времени, как показано в следующем примере:
SQL> SELECT * FROM patient_info VERSIONS BETWEEN TIMESTAMP to_timestamp ('2009-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS') AND to_timestamp ('2009-06-30 00:00:00', 'YYYY-MM-DD HH24:MI:SS') WHERE name='ALAPATI';
Показанный здесь запрос приведет к извлечению всех версий строк в таблице PATIENT_INFO за период с 1 января 2009 г. по 30 июня 2009 г.