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