16 сентября 2008 г.

Как узнать старый пароль дблинка (если он был изменен недавно)?

Как вы думаете, как можно узнать старый пароль дблинка (database link), который был изменен совсем недавно?
Один мой коллега (НЕ ДБА!) предложил суперский вариант, как это можно сделать: посмотреть флешбеком (flashback) состояние системной таблицы, в которой хранится информация о дблинках.
Смотрим, к каким системным таблицам обращается вьюшка dba_db_links:

create or replace view dba_db_links
(owner, db_link, username, host, created)
as
select u.name, l.name, l.userid, l.host, l.ctime
from sys.link$ l, sys.user$ u
where l.owner# = u.user#
Дальше, флешбеком смотрим состояние системной таблицы sys.link$ на час назад:
SQL> select name, userid, password
from sys.link$ as of timestamp(sysdate-1/24)
where name ='MYDBLINK';

NAME USERID PASSWORD
-------------------- ---------- ----------
MYDBLINK USERNAME OLDPASSWD
OLDPASSWD - это наш старый пароль. Чтоб убедиться, что мы нашли то, что нужно посмотрим текущий пароль:
SQL> select name, userid, password
from sys.link$ as of timestamp(sysdate)
where name ='KI_ICR002';

NAME USERID PASSWORD
-------------------- ---------- ----------
MYDBLINK USERNAME NEWPASSWD
Вот так вот нашли только что измененный пароль. А я уже хотела логмайнером (logminer) порыться в реду-логах (redo). Правда, описанный выше метод сработает только если изменения были сделаны совсем недавно, то есть в пределах undo_retention (не всегда гарантированно).

1 сентября 2008 г.

Flush buffer cache

Эта команда используется и в Oracle 9i и в 10g для сброса разделяемого пула.

alter system flush shared_pool
В Oracle 10g есть аналогичная команда, сбрасывающая буферный кеш:
alter system flush buffer_cache;
Только было бы замечательно уточнить, что именно происходит при сбросе буферного кеша: во-первых, записываются измененные блоки в файлы данных. Может вся хеш-таблица буферного кеша тоже чистится?

В Oracle 9i такой команды нет, но, оказывается можно сбросить буферный кеш установкой события:
alter session set events = 'immediate trace name flush_cache';