УПРАВЛЕНИЕ СНИМКАМИ ТАБЛИЦ ORACLE


ГЛАВА 16

        ----------------------------------------------------------------

        УПРАВЛЕНИЕ СНИМКАМИ ТАБЛИЦ



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

            *  создание, изменение и удаление снимков

            *  освежение снимков

            *  разрешение проблем, связанных со снимками

            *  создание, изменение, поддержка и удаление журналов
               снимков

            *  ручное дублирование таблиц


        За  исключением  ручного  дублирования  таблиц,  информация этой
        главы   применима   лишь   к   системам,   использующим   ORACLE
        одновременно с распределенной опцией и процедурной опцией.




































                                        Управление снимками таблиц  16-1


----------------

Сопровождение снимков

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

        Следующие секции  объясняют, как  создавать, изменять  и удалять
        снимки.

Подготовка к созданию снимков
-----------------------------

        Прежде, чем кто-либо сможет  создавать любые снимки или  журналы
        снимков в  базе данных,  вы должны  выполнить скрипт CATSNAP.SQL
        как на  базе данных,  содержащей главную  таблицу, так  и на тех
        базах данных,  которые будут  содержать ее  снимки; при  этом вы
        должны быть  подключены как  SYS. Имя  и местоположение  скрипта
        CATSNAP.SQL зависит от операционной системы; обратитесь к вашему
        руководству   по   инсталляции   [IUG].    Этот   скрипт  обычно
        выполняется  во  время  создания  базы  данных,  когда   имеется
        процедурная опция.

        Помимо этого, процедуры администрирования снимками,  описываемые
        в этой главе, требуют,  чтобы вы выполнили скрипт  DBMSSNAP.SQL,
        который создает пакеты процедур для освежения снимков.  Вы также
        должны выполнить этот скрипт, подключившись как SYS, как на базе
        данных, содержащей главную таблицу,  так и на тех  базах данных,
        которые будут содержать ее снимки.  Имя и местоположение скрипта
        DBMSSNAP.SQL  зависит  от  операционной  системы;  обратитесь  к
        вашему  руководству  по  инсталляции.   Этот скрипт также обычно
        выполняется  во  время  создания  базы  данных,  когда   имеется
        процедурная опция.

        Кроме   того,   если   вы   хотите,   чтобы   снимки  освежались
        автоматически, вы  можете, в  зависимости от  вашей операционной
        системы, запустить периодическое  пакетное задание или  написать
        утилиту,  которая  периодически  подключалась  бы к базе данных,
        содержащей    снимки,    и    вызывала    процедуру    с  именем
        DBMS_SNAPSHOT.REFRESH_ALL(), которая освежает снимки.  На многих
        платформах Oracle предоставляет такую утилиту; при ее запуске вы
        задаете имя  файла, указывающего  имя и  пароль, которые утилита
        должна использовать при  соединениях, и интервал,  через который
        она должна  соединяться.  Точное  имя, местоположение  и функции
        этой утилиты зависят от операционной системы; во многих  случаях
        она  называется  REFSNAP.   Обратитесь  к  вашему руководству по
        инсталляции для информации об этой утилите на вашей платформе.


Создание снимков
----------------

        Вы  создаете  локальный  снимок  с  помощью  команды  SQL CREATE
        SNAPSHOT.  Как и при создании таблицы, вы можете специфицировать
        характеристики  памяти,  размеры  и  распределение  эсктентов, а
        также табличное  пространство или  кластер, в  котором создается
        снимок (в последнем случае опции памяти неприменимы).  Вы можете
        также   указать,   как   должен   освежаться   снимок,  и задать
        распределенный  запрос,  который  определяет  этот  снимок;  это
        уникально для снимков.   Например, следующее предложение  CREATE

16-2  Руководство администратора


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

        CREATE SNAPSHOT emp_sf
            PCTFREE 5 PCTUSED 60
            TABLESPACE USERS
            STORAGE (INITIAL 50K NEXT 50K PCTINCREASE 50)
            REFRESH FAST
                    START WITH sysdate
                    NEXT sysdate + 7
            AS SELECT * FROM emp@ny;

        Когда  снимок  создается,  он  немедленно  заполняется строками,
        возвращаемыми   запросом,   который   определяет   этот  снимок.
        Впоследствии снимок периодически освежается, как специфицировано
        фразой REFRESH; см.  "Освежение снимков" на странице 16-5.


Именование снимков

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


Создание кластеризованного снимка

        Вы  можете  создать  снимок  в  кластере,  точно  так  же, как и
        таблицу.   Например,  следующее  предложение  создает  снимок  с
        именем EMP_DALLAS в кластере EMP_DEPT:

        CREATE SNAPSHOT emp_dallas
            ...
            CLUSTER emp_dept
            ... ;

        Для  кластеризованного  снимка  используются  параметры   памяти
        сегмента данных кластера, даже  если при создании такого  снимка
        специфицированы параметры памяти.


Привилегии, требуемые для создания снимков

        Для создания снимков необходимы следующие группы привилегий:

            *  Чтобы  создать  снимок  в  своей  схеме,  вы должны иметь
               системные  привилегии  CREATE  SNAPSHOT,  CREATE   TABLE,
               CREATE VIEW и CREATE INDEX (только для простых  снимков),
               а также привилегию SELECT по главным таблицам.

            *  Чтобы  создать  снимок  в  схеме другого пользователя, вы
               должны иметь  системные привилегии  CREATE ANY  SNAPSHOT,
               CREATE  ANY  TABLE,  CREATE  ANY  VIEW и CREATE ANY INDEX
               (только для простых  снимков), а также  привилегию SELECT
               по главным таблицам.  Кроме того, владелец снимка  должен




                                        Управление снимками таблиц  16-3


               иметь  соответствующие   привилегии  SELECT   по  главным
               таблицам.

        В любом случае, владелец  снимка должен также иметь  достаточную
        квоту на табличное пространство, в котором создается снимок.

        Столь большой набор  привилегий, требуемый для  создания снимка,
        объясняется  объектами,  которые  также  должны  быть созданы от
        имени этого снимка.

Понимание внутренней реализации снимка

        Когда  создается  снимок,  ORACLE  внутренне выполняет несколько
        операций:

            *  ORACLE  (на  узле  снимка)  создает  таблицу для хранения
               строк,  извлекаемых  определяющим  запросом  снимка.  Эта
               таблица называется БАЗОВОЙ ТАБЛИЦЕЙ снимка; ее имя  имеет
               вид SNAP$_имяснимка.  (Базовая  таблица снимка не  должна
               изменяться никаким образом; нельзя добавлять триггеры или
               ограничения  целостности  в  базовую  таблицу  снимка,  и
               нельзя  непосредственно  модифицировать  данные в базовой
               таблице снимка.)

            *  ORACLE создает  только-читаемый обзор  таблицы SNAP$  для
               запросов, выдаваемых  по снимку.   Этот обзор  имеет имя,
               специфицированное  в  предложении  CREATE  SNAPSHOT.  (На
               этом обзоре не  допускается никаких операций  DML, потому
               что он только-читаемый.)

            *  ORACLE  создает  второй  локальный  обзор  по   удаленной
               главной таблице.  Он использует этот обзор при  освежении
               снимка.  Его имя имеет вид MVIEW$_имяснимка.

        Дополнительно,  если  снимок  является  простым  снимком, ORACLE
        создает индекс  по таблице  SNAP$.  Этот  индекс имеет  имя вида
        PK$_имяснимка.

        Все  эти  внутренние  объекты  создаются  в  схеме  снимка.   Не
        изменяйте эти объекты, не обновляйте и не удаляйте их вручную.


Установление параметров памяти для снимка
-----------------------------------------

        То, как  вы задаете  опции памяти  для снимка,  зависит от  типа
        этого снимка (простой или сложный):

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

               Замечание: Если простой снимок не дублирует всех столбцов
               своей  главной  таблицы,  модифицируйте  параметры памяти
               снимка соответственно.

            *  Так  как  сложный  снимок  всегда  освежается  полностью,
               установите его значение PCTFREE в 0, а PCTUSED в 100  для
               максимальной эффективности.

16-4  Руководство администратора


        Вы можете  изменять параметры  памяти снимка  с помощью  команды
        ALTER SNAPSHOT.  Например,  следующая команда изменяет  параметр
        PCTFREE снимка EMP:

        ALTER SNAPSHOT emp PCTFREE 10;

        Нельзя исправлять определяющий запрос снимка; чтобы сделать это,
        вы должны удалить снимок и создать его заново.

Привилегии, требуемые для изменения снимков

        Чтобы изменить параметры  памяти снимка, вы  должны иметь его  в
        своей  схеме,  либо  обладать  системными привилегиями ALTER ANY
        SNAPSHOT и ALTER ANY TABLE.


Освежение снимков
-----------------

        Каждый снимок индивидуально  освежается в отдельной  транзакции,
        чтобы  отражать  более  свежее  состояние  своих главных таблиц.
        Есть два  типа освежений:  быстрое и  полное.  БЫСТРОЕ ОСВЕЖЕНИЕ
        использует журнал снимков главной таблицы для освежения простого
        снимка (быстрое освежение  может выполняться только  для простых
        снимков).   ПОЛНОЕ  ОСВЕЖЕНИЕ  полностью  заменяет  существующие
        данные в простом или  сложном снимке.  Кроме того,  снимки могут
        освежаться автоматически или вручную.

        Решая, как освежать снимок, рассмотрите следующие вопросы:

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


Конфигурирование автоматических освежений

        Чтобы  конфигурировать  снимки  для  автоматического  освежения,
        выполните следующие шаги:

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

        2. Запустите утилиту освежения на базе данных, содержащей снимки
           (не на базе данных с главной таблицей).

        Чтобы  конфигурировать  конкретный  снимок  для  автоматического
        освежения,  специфицируйте  опции  освежения  в  фразе REFRESH в
        предложении  CREATE  SNAPSHOT  или  ALTER SNAPSHOT.  Допустимыми
        опциями освежения являются  FAST (быстрое), COMPLETE  (полное) и
        FORCE.    Умалчиваемое   значение,   FORCE,   выполняет  быстрое
        освежение,  если  это  возможно,  а  в  противном  случае полное
        освежение.  Параметр START WITH указывает момент времени  начала
        автоматического  освежения;  если  он  опущен,  момент   первого
        автоматического освежения снимка  вычисляется исходя из  времени

                                        Управление снимками таблиц  16-5


        создания  и  параметра  NEXT.   Параметр  NEXT  задает  интервал
        автоматического освежения для снимка.  NEXT всегда отсчитывается
        от последнего освежения, автоматического или ручного.

        Характеристики автоматического освежения для снимка  сохраняются
        в  словаре  данных.   Характеристики  освежения в словаре данных
        обновляются при  их изменении  командой ALTER  SNAPSHOT, а также
        при  каждом  освежении   снимка  (автоматическом  или   ручном).
        Устанавливая   характеристики   освежения   снимка,   примите во
        внимание следующее поведение:

            *  Календарные  выражения  в  параметрах  START  WITH и NEXT
               должны вычисляться как будущие моменты времени; если  это
               не так, возвращается  сообщение об ошибке.   Литерал даты
               должен  заключаться  в  апострофы,  тогда как календарные
               выражения не требуют апострофов (см. пример ниже).

            *  Если снимок должен освежаться периодически через заданный
               интервал,  специфицируйте  параметр  NEXT как календарное
               выражение,  подобное  "SYSDATE+7".   Например,  если   вы
               установили   интервал   автоматического   освежения   как
               "SYSDATE+7" в понедельник, а потом вручную освежили  этот
               снимок в четверг, то "SYSDATE+7" будет теперь вычисляться
               как  каждый  четверг,   а  не  как   каждый  понедельник.
               Альтернативно,  если   вы  всегда   хотите  автоматически
               освежать  снимок  в  определенное  время,  независимо  от
               последнего освежения  (например, каждый  понедельник), то
               параметр   NEXT   должен   специфицировать    календарное
               выражение, подобное "NEXT_DAY(TRUNC(SYSDATE),'MONDAY')".

        Табл.16-1 показывает  некоторые типичные  календарные выражения,
        применяемые для интервалов освежения снимков.

Табл.16-1
Примеры типичных интервалов освежения

        г===========================================T==================¬
        ¦ Календарное выражение                     ¦ Означает         ¦
        ¦===========================================+==================¦
        ¦ SYSDATE + 7                               ¦ Ровно через 7    ¦
        ¦                                           ¦ дней после пос-  ¦
        ¦                                           ¦ леднего освежения¦
        ¦-------------------------------------------+------------------¦
        ¦ NEXT_DAY(TRUNC(SYSDATE),'MONDAY')+15/24   ¦ Каждый понедель- ¦
        ¦                                           ¦ ник в 15:00      ¦
        ¦-------------------------------------------+------------------¦
        ¦ NEXT_DAY(ADD_MOTHTS(TRUNC(SYSDATE,'Q'),3),¦ В первый четверг ¦
        ¦          'THURSDAY')                      ¦ каждого квартала ¦
        L===========================================¦==================-

        Следующие примеры фразы REFRESH показывают допустимые комбинации
        опций освежения и календарные выражения:

        CREATE SNAPSHOT snap
          . . .
          REFRESH COMPLETE
                  START WITH '01-SEP-92'
                  NEXT sysdate + 7
          AS . . . ;

        ALTER SNAPSHOT snap REFRESH FAST;


16-6  Руководство администратора


        ALTER SNAPSHOT snap
          REFRESH COMPLETE
                  NEXT next_day(trunc(sysdate), 'MONDAY') + 15/24;

        Первое предложение создает снимок SNAP и специфицирует для  него
        полные автоматические освежения, первое из которых назначено  на
        1  сентября   1992,  с   7-дневным  интервалом   автоматического
        освежения  после   последнего  освежения   (автоматического  или
        ручного).   Второе  предложение  указывает,  что  автоматическое
        освежение  должно  быть   быстрым.   Третье  предложение   снова
        изменяет  автоматическое  освежение  на  полное, и устанавливает
        интервал автоматического  освежения как  каждый понедельник  в 3
        часа пополудни.

        Чтобы выполнять автоматические освежения, на сервере базы данных
        работает утилита освежения,  поставляемая вместе с  ORACLE.  Эта
        утилита  уведомляет  ORACLE  об  автоматическом освежении ЛЮБОГО
        подходящего  снимка.   При   запуске  утилиты  освежения   можно
        специфицировать  интервал,  который  указывает,  как  часто  эта
        утилита  "просыпается"  для  проверки  снимков на автоматическое
        освежение.   Точное  имя  и  местоположение  утилиты   освежения
        зависят от операционной системы.

    Решение проблем автоматического освежения

        Автоматическому освежению снимков могут препятствовать несколько
        факторов: отсутствие  утилиты освежения,  прерывающий сбой  сети
        или  инстанции,  или  останов  инстанции.   Когда  любой из этих
        факторов помешал автоматическому  освежению снимка, этот  снимок
        остается  "обязанным"  для  освежения.   Снимки,  обязанные  для
        освежения, автоматически освежаются,  как только будет  запущена
        утилита освежения и будут устранены сбои.


Ручное освежение снимков

        Вы  можете   освежить  снимок   вручную,  независимо   от  того,
        освежается  ли  он  автоматически.   Вы освежаете индивидуальный
        снимок, вызывая хранимую процедуру REFRESH пакета DBMS_SNAPSHOT,
        которая имеет следующий синтаксис:

        dbms_snapshot.refresh ('[схема.]имя' [, 'опция_освежения'])

        Аргумент    схема.имя    задает    имя    освежаемого    снимка.
        Необязательный   аргумент   опция_освежения   специфицирует  тип
        выполняемого освежения: 'F' или 'f' обозначает быстрое, 'C'  или
        'c' - полное, а '?' обозначает умалчиваемую опцию освежения  для
        данного снимка.

        Например, следующее  предложение EXECUTE,  выданное из  SQL*DBA,
        вызывает быстрое освежение снимка EMP:

        EXECUTE dbms_snapshot.refresh('emp', 'f');

        Вы  можете  освежить  все  снимки, обязанные для автоматического
        освежения  (но  еще  не  освеженные  утилитой освежения), вызвав
        хранимую  процедуру   REFRESH_ALL  пакета   DBMS_SNAPSHOT.   Эта
        процедура освежает каждый снимок, помеченный как "обязанный" для





                                        Управление снимками таблиц  16-7


        автоматического  освежения,   согласно  опциям   автоматического
        освежения для этого снимка:

        EXECUTE dbms_snapshot.refresh_all;

        Процедура REFRESH_ALL не принимает аргументов.  Эта процедура не
        затрагивает  тех   снимков,  которые   не  конфигурированы   для
        автоматического  освежения.   Один  вызов  процедуры REFRESH_ALL
        освежает все  снимки, обязанные  для автоматического  освежения,
        причем каждый  такой снимок  освежается в  отдельной транзакции.
        Если эта  процедура прерывается  системным сбоем,  часть снимков
        могут остаться не освеженными;  в таком случае просто  повторите
        вызов процедуры REFRESH_ALL.

Привилегии, требуемые для ручного освежения снимков

        Чтобы  вручную  освежить  снимок  или  изменить   характеристики
        освежения  снимка,  вы  должны  либо  владеть этим снимком, либо
        иметь системную привилегию ALTER ANY SNAPSHOT.  Если вы  вручную
        освежаете снимок, используя быстрый метод, вы должны также иметь
        доступ  к  журналу  снимков  по  главной таблице: вы должны либо
        владеть журналом снимков, либо иметь для него привилегию SELECT.
        (Журнал  снимков  имеет  имя  MLOG$_имяглавной  таблицы.)    Для
        дополнительной информации см.  "Управление журналами снимков" на
        странице 16-10.

        Любой пользователь  с системной  привилегией ALTER  ANY SNAPSHOT
        может выполнить  процедуру REFRESH_ALL,  чтобы вручную  освежить
        все снимки, обязанные для автоматического освежения.


Освежение снимков и ссылочная целостность

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

        Например,  рассмотрим  главные  таблицы  EMP  и  DEPT, связанные
        ссылочной   целостностью   через   столбец   DEPTNO.   Ссылочная
        целостность таблиц EMP и DEPT распространится на соответствующие
        снимки EMP_SNAP и DEPT_SNAP лишь в том случае, если вы вы можете
        освежать EMP_SNAP и DEPT_SNAP так,  чтобы таблицы EMP и DEPT  не
        были модифицированы между индивидуальными освежениями.

        Чтобы  освежить  одиночный  снимок  по  главной таблице, имеющей
        ограничение  самоссылочной  целостности,  используйте  следующие
        шаги:

        1. Заблокируйте в  монопольном режиме  главную таблицу,  имеющую
           ограничение самоссылочной целостности:

           LOCK TABLE emp IN EXCLUSIVE MODE;










16-8  Руководство администратора


        2. Освежите   снимок,   используя   процедуру   REFHESH   пакета
           DBMS_SNAPSHOT.    Например,   вызовите   SQL*DBA   и  введите
           следующее предложение:

           EXECUTE dbms_snapshot.refresh('emp', '?');

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

        1. Запустите сессию  в интерактивном  инструменте (SQL*Plus  или
           SQL*DBA), и  установите соединение  с базой  данных в системе
           распределенных баз данных, содержащей главные таблицы.

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

           LOCK TABLE emp, dept IN EXCLUSIVE MODE;

        3. Запустите  еще  одну   сессию  в  интерактивном   инструменте
           (SQL*Plus  или  SQL*DBA),  и  установите  соединение  с базой
           данных,  содержащей   снимки,  которые   требуется  освежить.
           Заметьте, что первая сессия должна оставаться активной, чтобы
           удерживать блокировки таблиц, полученные на шаге 2.

        4. Освежите снимки, соответствующие таблицам, заблокированным на
           шаге 2.  Например, следующие предложения освежают снимки  EMP
           и DEPT:

           EXECUTE dbms_snapshot.refresh('emp', '?');

           EXECUTE dbms_snapshot.refresh('dept', '?');


Декларативные ограничения и снимки
----------------------------------

        Не создавайте декларативных ограничений по снимкам или  журналам
        снимков.


Индексирование снимков
----------------------

        Чтобы   увеличить   производительность   запросов,  использующих
        снимок,  вы  можете  создать  индексы  для  этого снимка.  Чтобы
        индексировать столбец  (или группу  столбцов) снимка,  вы должны
        создать  индекс  по  соответствующей  базовой  таблице "SNAP$_",
        созданной   для   хранения   строк   снимка.    Не   используйте
        декларативных  ограничений  для  создания  индекса; вместо этого
        используйте предложение CREATE INDEX.


Операции на главной таблице, затрагивающие снимки
-------------------------------------------------

        Все изменения, сделанные в главной таблице предложениями INSERT,
        UPDATE и  DELETE, отражаются  в ассоциированных  снимках при  их
        освежении.

        Однако, изменения, осуществляемые  на главных таблицах  командой
        TRUNCATE, не распространяются  на простые снимки  автоматически;
        они  распространяются  на  сложные  снимки.   Если  вы  усекаете

                                        Управление снимками таблиц  16-9


        главную таблицу, полностью освежите все ассоциированные  простые
        снимки.

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

Снимки и сбой носителя
----------------------

        Как  следствие  сбоя  носителя,  либо  база  данных,  содержащая
        главную  таблицу,  либо  база  данных,  содержащая снимок, могут
        потребовать восстановления.  Если в вашей базе данных, требующей
        восстановления, имеется главная таблица либо снимок,  обратитесь
        к секции  "Восстановление баз  данных со  снимками" на  странице
        19-5.

Удаление снимков
----------------

        Вы можете удалить снимок  независимо от его главной  таблицы или
        журнала снимков.   Чтобы удалить  локальный снимок,  используйте
        команду SQL DROP SNAPSHOT.  Например:

        DROP SNAPSHOT emp;

        Если  вы  удаляете  снимок  по  главной  таблице,  который   был
        единственным, то  вы должны  также удалить  журнал снимков  этой
        главной таблицы, если он существует.


Привилегии, требуемые для удаления снимков

        Чтобы удалить снимок, необходимо  быть его владельцем или  иметь
        системные привилегии DROP  ANY SNAPSHOT, DROP  ANY TABLE и  DROP
        ANY VIEW.


----------------

Управление журналами снимков

        Журнал снимков - это таблица, ассоциированная с главной таблицей
        снимков  и  находящаяся  в  той  же  базе  данных, что и главная
        таблица.  Строки журнала снимков содержат изменения, внесенные в
        главную таблицу, и информацию  о том, какие снимки  уже освежены
        или еще не были  освежены после этих изменений.   Журнал снимков
        может  использоваться  только  для  быстрого  освежения  простых
        снимков; он не может использоваться в сложных снимках.

        Следующие  секции  объясняют,  как  создавать,  поддерживать   и
        удалять журналы снимков.


Порядок создания простого снимка и журнала снимков
--------------------------------------------------

        Если вы создаете простой снимок, более эффективно создать журнал
        снимков  перед  созданием  снимка.   Рис.16-1  иллюстрирует  два
        порядка создания.

16-10  Руководство администратора


Рис.16-1
Порядок создания простого снимка и журнала снимков

            г====================================¬
            ¦ г============¬         ------------+----------¬
            ¦ ¦            ¦         ¦           ¦          ¦
        ------------T----¦---T-----------T----¦-----T----+-----¬
        ¦Create Master¦ Create ¦  Create    ¦   1-е    ¦   2-е    ¦
        ¦    Table    ¦Snapshot¦Snapshot Log¦освежение ¦освежение ¦
        L-------------+--------+------------+----------+-----------

    -----------+----------+----------+-----------+----------+--------->
    Время
        --------------T------------T--------T----------T----------¬
        ¦Create Master¦  Create    ¦ Create ¦   1-е    ¦   2-е    ¦
        ¦    Table    ¦Snapshot Log¦Snapshot¦освежение ¦освежение ¦
        L------------+----------+---T----+----T-----+----T------
              ¦           ¦  ¦         ¦         ¦          ¦
              ¦           ¦  L---------+----------          ¦
              ¦           L------------+---------------------
              L========================-

                                           ======  Полное освежение

                                           ------  Быстрое освежение


        При  методе  A,  первое  освежение  снимка не может использовать
        журнал,  так  как  журнал  не  может  отразить  всех обновлений,
        произошедших между созданием снимка и созданием журнала снимков;
        поэтому необходимы два полных освежения.

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


Создание журнала снимков
------------------------

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

        Создавайте  журнал  снимков  в  одной  базе  данных  с   главной
        таблицей, используя команду SQL  CREATE SNAPSHOT LOG. Вы  можете
        установить   опции   памяти   для   блоков   данных,  размеров и
        распределения  экстентов,  а  также  табличное  пространство для







                                       Управление снимками таблиц  16-11


        журнала снимков.  Например, следующее предложение создает журнал
        снимков, ассоциированный с таблицей EMP:

        CREATE SNAPSHOT LOG ON emp
            TABLESPACE users
            STORAGE (INITIAL 10K NEXT 10K PCTINCREASE 50)
            PCTFREE 5;


Именование журналов снимков

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


Внутренняя реализация журнала снимков

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

            *  ORACLE создает  таблицу для  хранения ROWID'ов  и отметок
               времени  строк,  обновленных  в  главной  таблице.    Эта
               таблица имеет имя MLOG$_имяглавнойтаблицы.

            *  ORACLE создает  триггер строк  AFTER по  главной таблице,
               чтобы  вставлять  в  журнал  снимков  ROWID'ы  и  отметки
               времени  вставляемых,   обновляемых  и   удаляемых  строк
               главной    таблицы.      Этот    триггер     имеет    имя
               TLOG$_имяглавнойтаблицы.

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

        "Базовая таблица" и ассоциированный триггер для журнала  снимков
        содержатся в той же схеме, что и главная таблица.

        Не изменяйте и не обновляйте эти объекты.


Привилегии, требуемые для создания журналов снимков

        Если  вы  владеете  главной  таблицей,  то  для создания журнала
        снимков  вы  должны  иметь  системные  привилегии CREATE TABLE и
        CREATE TRIGGER.   Если вы  создаете журнал  снимков для  главной
        таблицы  другого  пользователя,  то  вы  должны  иметь системные
        привилегии  CREATE  ANY  TABLE  и  CREATE  ANY TRIGGER.  В любом
        случае, владелец журнала снимков должен иметь достаточную  квоту
        в табличном пространстве, в котором создается этот журнал.

        Привилегии,    требуемые    для    создания    журнала  снимков,
        непосредственно  определяются   привилегиями,  необходиыми   для
        создания объектов, реализующих этот журнал снимков.







16-12  Руководство администратора


Установка параметров памяти для журнала снимков
-----------------------------------------------

        Установите опции памяти для журнала снимков следующим образом:

            *  Установите PCTFREE = 0, PCTUSED = 100.

            *  Установите   параметры   экстентов   в   соответствии   с
               активностью  изменений  (предложений  INSERT,  UPDATE   и
               DELETE) по главной таблице.

        Каждая строка в журнале снимков занимает приблизительно 13  байт
        (шесть байт  для ROWID  и семь  байт для  отметки времени).  Это
        позволяет вам  вычислить, сколько  памяти требуется  для журнала
        снимков, используя процедуру, описанную в секции "Расчет  памяти
        для некластеризованных таблиц" на странице 8-17.


Изменение параметров памяти для журнала снимков

        Вы  можете  изменять  параметры  памяти  для  журнала   снимков,
        используя команду SQL ALTER SNAPSHOT LOG. Например:

        ALTER SNAPSHOT LOG sale_price
          PCTFREE 10
          PCTUSED 40;

Привилегии, требуемые для изменения журнала снимков

        Только  владелец  главной  таблицы,  или  пользователь,  имеющий
        системные привилегии ALTER ANY TABLE и ALTER ANY TRIGGER,  могут
        изменять параметры памяти для журнала снимков.


Управление использованием памяти журнала снимков
------------------------------------------------

        ORACLE автоматически отслеживает, какие строки в журнале снимков
        были  использованы  во  время  освежений  снимков, и удаляет эти
        строки из журнала снимков, так что журнал не растет  бесконечно.
        Поскольку один журнал  снимков может использоваться  несколькими
        простыми снимками, строки журнала, использованные для  освежения
        одного  снимка,  могут  еще  понадобиться  для освежения другого
        снимка; ORACLE не удаляет строк из журнала до тех пор, пока  они
        не будут использованы всеми снимками.  Однако это автоматическое
        средство может  привести к  бесконечному росту  журнала снимков,
        если  хотя  бы  один  из  ассоциированных  снимков  никогда   не
        освежается.  Рис.16-2 иллюстрирует этот случай.















                                       Управление снимками таблиц  16-13


Рис.16-2
Управление журналом снимков


                   -----------¬   -----------¬
                   ¦ Снимок A ¦   ¦ Снимок B ¦
                   L-----------   ¦          ¦
                                  ¦          ¦
                                  ¦          ¦
                                  L-----------


         Журнал снимков
        ---T------------T------------T------------¬  Растет бесконечно
        ¦--¦            ¦            ¦            ¦
        ¦--¦            ¦            ¦            ¦  ----
        L--+------------+------------+-------------


                        ---¬
                        ¦--¦ Строки, применимые к обоим снимкам A и B
                        L---

                        ---¬
                        ¦  ¦ Строки, применимые только к снимку B
                        L---

        Снимок B освежается регулярно.   Однако ORACLE не может  удалить
        строки, использованные  для освежения  снимка B,  потому что эти
        строки небходимы для очередного освежения снимка A. Эта ситуация
        возникает, когда у вас есть несколько простых снимков по одной и
        той же главной таблице, и имеет место одно из следующих условий:

            *  Один  из  снимков  не  конфигурирован для автоматического
               освежения; он должен освежаться вручную.

            *  Один из  снимков имеет  очень большой  интервал освежения
               (скажем, каждый год).

            *  Сбой сети  помешал автоматическому  освежению одного  или
               нескольких снимков.

        Поддерживайте   журнал   снимков   как   можно   меньшим,  чтобы
        минимизировать  занимаемую  им  память.   Чтобы  сократить число
        строк  в  журнале  снимков,  вы  можете  либо  освежить  снимки,
        ассоциированные с  этим журналом,  либо сжать  журнал, удалив из
        него строки, необходимые лишь  N самым "старым" снимкам.   Чтобы
        сделать последнее, выполните хранимую процедуру PURGE_LOG пакета
        DBMS_SNAPSHOT, используя следующий синтаксис:

        dbms_snapshot.purge_log('таблица', количество [, 'DELETE'])

        Здесь "таблица"  - имя  главной таблицы.   Аргумент "количество"
        указывает число снимков, освежавшихся наиболее давно, чьи строки
        вы  хотите  удалить  из  журнала  снимков.   Например, следующее








16-14  Руководство администратора


        предложение удаляет строки, необходимые для освежения двух самых
        старых снимков:

        EXECUTE dbms_snapshot.purge_log('master_table', 2);

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

        EXECUTE dbms_snapshot.purge_log('master_table', 9999);

        Это    предложение    полностью    очистит    журнал    снимков,
        соответствующий  главной  таблице  MASTER_TABLE,  если  на  этой
        таблице базируется менее 9999 снимков.

        Замечание: Простой снимок, чьи  строки были вычищены из  журнала
        снимков, должен быть полностью освежен при следующем освежении.

        Необязательный  аргумент  DELETE  гарантирует,  что  из  журнала
        снимков будут удалены строки хотя бы для одного снимка, и  может
        перекрыть значение аргумента "количество".  Например,  следующее
        предложение удаляет  строки для  самого старого  снимка, который
        действительно имеет зависимые строки в журнале снимков:

        EXECUTE dbms_snapshot.purge_log('master_table', 0, 'DELETE');


Сокращение распределения памяти для журнала снимков

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

Привилегии, требуемые для удаления строк из журнала снимков

        Владелец журнала  снимков, или  пользователь, имеющий  системную
        привилегию DELETE  ANY TABLE,  могут удалять  строки из  журнала
        снимков с помощью процедуры PURGE_LOG.


Удаление журналов снимков
-------------------------

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

            *  Все простые снимки главной таблицы были удалены.

            *  Все простые снимки главной таблицы должны быть  полностью
               (а не быстро) обновлены.

        Чтобы удалить локальный журнал снимков, используйте команду  SQL
        DROP SNAPSHOT LOG, например:

        DROP SNAPSHOT LOG emp_log;




                                       Управление снимками таблиц  16-15


Привилегии, требуемые для удаления журнала снимков

        Чтобы  удалить  журнал  снимков,  необходимо быть владельцем его
        главной таблицы или иметь системную привилегию DROP ANY TABLE.


----------------

Ручное копирование таблиц между узлами распределенной базы данных

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

        Чтобы  создать  локальную   копию  удаленной  главной   таблицы,
        используйте предложение CREATE TABLE:

        CREATE TABLE локальная_копия
            AS SELECT * FROM удаленная_главная;

        Вы  можете  назначать  локальные  привилегии по локальной копии,
        создавать ассоциированные с ней таблицы и обзоры, и т.п.

        Когда  вы  хотите  обновить  локальную  копию  удаленной главной
        таблицы, удалите и  пересоздайте ее.  Однако,  обратите внимание
        на следующие моменты:

            *  Удаляя локальную копию, вы удаляете и все ассоциированные
               с  ней  индексы,  триггеры  и  ограничения   целостности.
               Поэтому  все  такие  объекты  вы  должны будете создавать
               заново.

            *  При удалении  локальной копии  все объектные  привилегии,
               назначенные по ней  пользователям или ролям,  отзываются.
               Поэтому  после  пересоздания  локальной  копии  вы должны
               заново назначить такие привилегии.

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

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










16-16  Руководство администратора