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 комментариев:

nick32 комментирует...

Коллеги,
при создании зашифрованного табличного может возникать ошибка 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$ могут быть проведены без перезапуска экземпляра.

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