DBOD v3 - работа над ошибками

В ходе демонстрации опций БД у нас произошли три сбоя. Ошибки возникли по двум причинам. Как я и обещал: более подробно расскажу об этих причинах.

1) При демонстрации доступа к архиву Flashback Archive, пользователем, который не является владельцем базовой таблицы, возникла странная ошибка ORA-00942.
Давайте посмотрим повнимательнее, что произошло:

--выдаем права пользователю SCOTT на чтение исторических данных
SQL> conn ttdemo/ttdemo
Connected.
SQL> GRANT FLASHBACK ON plans TO scott;

Grant succeeded.


После этого пользователь SCOTT пытается прочитать архивные данные:

SQL> conn scott/tiger
Connected.
SQL> SELECT COUNT(*) FROM ttdemo.plans AS OF TIMESTAMP sysdate - 600/(24*3600)
*
ERROR at line 4:
ORA-00942: таблица или представление пользователя не существует


Анализ показывает, что SQL-engine честно переписал запрос, перенаправив его на архивную таблицу (вернее на две таблицы: ttdemo.SYS_FBA_TCRV_66452 и ttdemo.SYS_FBA_HIST_66452), но пользователь SCOTT НЕ имеет к ним прав!

То есть баг заключется в том, что операция GRANT FLASHBACK ON plans TO scott; "забывает" дать права на FBA-таблицы.
На самом деле проблема зарыта более глубоко: в общем случае FBA-таблиц может еще не существовать, т.е. процесс FBDA еще не успел их создать (как вы помните: для таблиц архива используется отложенное создание сегмента); и непонятно как давать гранты на несуществующий объект...

Путь обхода этой проблемы заключается в явной выдаче прав на FBA-таблицы пользователю (перечень нужных FBA-таблиц можно узнать по внутреннему номеру в представлении USER_FLASHBACK_ARCHIVE_TABLES).

SQL> conn ttdemo/ttdemo
Connected.

SQL> GRANT SELECT ON SYS_FBA_TCRV_66452 TO scott;

Grant succeeded.

SQL> GRANT SELECT ON SYS_FBA_HIST_66452 TO scott;

Grant succeeded.


После этого все работает как надо:

SQL> conn scott/tiger
Connected.

SQL> SELECT COUNT(*) FROM ttdemo.plans AS OF TIMESTAMP sysdate - 600/(24*3600)

COUNT(*)
----------
40

1 row selected.


2) Второй сбой произошел при демонстрации создания зашифрованного табличного пространства (Tablespace TDE). Кстати говоря, по этой же причине произошел сбой и в демонстрации Николая Данюкова.
Перед созданием зашифрованного табличного пространства я попытался создать wallet:

SQL>
SQL> alter system set encryption key authenticated by "dbod-3";
alter system set encryption key authenticated by "mode3"
*
ERROR at line 1: ORA-28353: сбой при открытии футляра


При этом я удалил все зашифрованные табличные пространства.
Удаление wallet-а вроде бы решило эту проблему:

SQL> alter system set encryption key authenticated by "dbod-3";

System altered.


Но теперь создание зашифрованного табличного пространства вызывает ошибку:

SQL> CREATE TABLESPACE ttdemo_secure
DATAFILE '/oradata/orcl/ttdemo_secure01.dbf' SIZE 20M REUSE
ENCRYPTION USING '3DES168' DEFAULT STORAGE (ENCRYPT);
2 3 CREATE TABLESPACE ttdemo_secure
*
ERROR at line 1:
ORA-28374: типизированный главный ключ не найден в футляре



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

Решение простое: нужно удалить зашифрованные табличные пространства, закрыть wallet-а и его удалить, после этого нужно перегрузить экземпляр.
После этого все работает как часы !

1 комментарий:

  1. Коллеги,
    при создании зашифрованного табличного может возникать ошибка ORA-28374 и это правда. Подобная проблема возникает в случае, когда созданный и открытый wallet не содержит специального ключа, используемого при шифровании tablespace:

    >$ orapki wallet display -wallet /mnt/hgfs/wallet/ -pwd qwerty;
    Requested Certificates:
    Subject: CN=oracle
    User Certificates:
    Oracle Secret Store entries:
    ORACLE.SECURITY.DB.ENCRYPTION.AUS0BFjLhE+sv+NG97VDnhYAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY
    Trusted Certificates:

    Пароль на открытие wallet не остается «…в "мозгах" экземпляра…» (т.к. он в памяти не хранится, а используется только при открытии wallet), ключ шифрования после команды “alter system set encryption wallet close;” стирается из SGA, а удаление зашифрованного табличного пространства помогает, но не всегда.
    В чем причина? Что мешает создать нужный ключ в wallet?
    После удаления зашифрованного табличного пространства, ключ от которого мы «потеряли», в базе данных может остаться информация о наличии зашифрованных табличных пространств и она (база данных) не позволяет создавать другие ключи шифрования. Игорю Мельникову повезло, а как быть, когда подобное удаление не приводит к желаемому результату?
    Проанализируем данные TS$ в части зашифрованных tablespace.
    В моем примере после удаления EXAMPLE_ENC информация о нем осталась в системе

    SQL> select t.ts#, t.name, t.flags from TS$ t;
    TS# NAME FLAGS
    ---------- ---------------- ----------
    0 SYSTEM 12289
    1 SYSAUX 4129
    2 UNDOTBS1 4113
    3 TEMP 4098
    4 USERS 4129
    5 UNDOTBS2 4113
    6 EXAMPLE 4129
    7 EXAMPLE_ENC 61473
    Результат запроса:
    SQL> select t.ts#, t.name, t.flags from TS$ t where t.online$ = 3 and bitand(flags,16384) = 16384;

    TS# NAME FLAGS
    ---------- ------------------------------ ----------
    7 EXAMPLE_ENC 61473 указывает, что flag 16384 установлен - в системе есть зашифрованное табличное пространство…
    Снять флаг можно так:
    SQL> update TS$ t set t.flags = t.flags - 16384 where t.online$ = 3 and bitand(flags,16384) = 16384;
    1 row updated
    SQL> commit;
    Commit complete
    и в итоге:
    SQL> select t.ts#, t.name, t.flags from TS$ t;
    TS# NAME FLAGS
    ---------- ---------------- ----------
    0 SYSTEM 12289
    1 SYSAUX 4129
    2 UNDOTBS1 4113
    3 TEMP 4098
    4 USERS 4129
    5 UNDOTBS2 4113
    6 EXAMPLE 4129
    7 EXAMPLE_ENC 45089

    После проведенных операций команда создания нового ключа в wallet :

    SQL> alter system set encryption key identified by "qwerty";
    System altered

    Проверка содержимого wallet указывает, что все получилось…

    SQL>
    [oracle@ora11g ~]$ orapki wallet display -wallet /mnt/hgfs/wallet/ -pwd qwerty;
    Requested Certificates:
    Subject: CN=oracle
    User Certificates:
    Oracle Secret Store entries:
    ORACLE.SECURITY.DB.ENCRYPTION.ARmXSYqfjU8Rv+mzNnAFl8wAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    ORACLE.SECURITY.DB.ENCRYPTION.ATf76q7vd08uv+i36KwibwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
    ORACLE.SECURITY.DB.ENCRYPTION.MASTERKEY
    ORACLE.SECURITY.TS.ENCRYPTION.BV8T5ug8YY5XsB6k0AP+AsYCAwAAAAAAAAAAAAAAAAAAAAAAAAAA
    Trusted Certificates:
    [oracle@ora11g ~]$
    … имеется ключ с префиксом TS и создание нового зашифрованного табличного пространства становится возможным:

    create tablespace example_enc
    datafile '/app/oracle/oradata/orcl/example01_enc.dbf'
    size 50m
    encryption using 'AES192'
    default storage(encrypt)
    /
    Tablespace created

    Операции по корректировке TS$ могут быть проведены без перезапуска экземпляра.

    С уважением, Николай Данюков

    ОтветитьУдалить