Поиск по этому блогу

вторник, апреля 28, 2009

Поднятие БД. Когда уже усе ...

Совет с www.sql.ru Не пробовал, но запомнить стоит.

-- Действия при падении системы (когда уже нечего не помогает ) Проверенно
-- set oracle_sid=oraSID
-- sqlplus "/ as sysdba"
-- sqlplus sys/sys@oraSID as sysdba
sqlplus sys/sys_password@oraSID as sysdba
-- create spfile from pfile;
-- монтируем диски
startup nomount;
-- отключаем все сегменты отката
alter system set "_corrupted_rollback_segments"='_SYSSMU1$','_SYSSMU2$','_SYSSMU3$','_SYSSMU4$','_SYSSMU5$','_SYSSMU6$','_SYSSMU7$','_SYSSMU8$','_SYSSMU9$','_SYSSMU10$' scope=spfile;
-- запускаем с недокументироваными параметрами
startup mount force;
-- удаляем фаел UNDO
alter database datafile 'C:\oracle\product\10.2.0\oradata\ora01d\UNDOTBS01.DBF' offline drop;
-- правим базу
recover database;
-- пытаемся открыть
alter database open;

среда, апреля 01, 2009

Зделаем wrap -у unwrap :)

Понадобилось мне как-то просмотреть wrap-ленную программку. Жадные разработчики хотели денешку за каждый чих, описания таблиц не дали. Но ведь МЫ скромные админы сами могем сделать отчет, а на каждый wrapper у нас есть свой болт с определенно насеченной резьбой. На тот момент я долго искать информацию как это зделать. Нашел капризную *.exe программу, которая ощасливила мое начальство.
Нооо! Есть путь более правильный. Сам Oracle нам в помощь. В моем случае это Oracle 10.
$ORACLE_HOME/rdbms/admin/diana.sql
$ORACLE_HOME/rdbms/admin/diutil.sql
$ORACLE_HOME/rdbms/admin/pipidl.sql – эти замечательные пакеты должны стоять в БД. Плюс процедурка дяди Пети Финнигана. До полного понимания чего происходит внутри мне еще ломать и ломать. Но того что проверено на первое время хватит. Да! источник информации вот тута.
create procedure unwrap_r(aname varchar2)
is
root sys.pidl.ptnod;
status sys.pidl.ub4;
--
procedure recurse (n sys.pidl.ptnod) is
--
seq sys.pidl.ptseqnd;
len integer;
--
begin
--
--dbms_output.put_line('Node :'||n);
--dbms_output.put_line('code (DEC) :'||pidl.ptkin(n));
--dbms_output.put_line('Node Type :'||pidl.ptattnnm(pidl.ptkin(n)));
--dbms_output.put_line('--');
if(pidl.ptkin(n) = diana.d_comp_u) then
recurse(diana.a_unit_b(n));
elsif (pidl.ptkin(n) = diana.d_s_body) then
dbms_output.put_line('CREATE OR REPLACE ');
recurse(diana.a_d_(n));
recurse(diana.a_header(n));
recurse(diana.a_block_(n));
dbms_output.put_line('END;');
dbms_output.put_line('/');
elsif(pidl.ptkin(n) = diana.di_proc) then
dbms_output.put_line('PROCEDURE '||diana.l_symrep(n));
elsif(pidl.ptkin(n) = diana.d_p_) then
recurse(diana.as_p_(n));
elsif(pidl.ptkin(n) = diana.ds_param) then
-- not implemented
null;
elsif(pidl.ptkin(n) = diana.d_block) then
dbms_output.put_line('IS ');
recurse(diana.as_item(n));
dbms_output.put_line('BEGIN');
recurse(diana.as_stm(n));
recurse(diana.as_alter(n));
elsif(pidl.ptkin(n) = diana.ds_item) then
-- not implemented
null;
elsif(pidl.ptkin(n) = diana.ds_stm) then
seq := diana.as_list(n);
len := pidl.ptslen(seq) - 1;
for i in 0..len loop
recurse(pidl.ptgend(seq,i));
end loop;
elsif(pidl.ptkin(n) = diana.d_null_s) then
dbms_output.put_line('NULL;');
elsif(pidl.ptkin(n) = diana.ds_alter) then
-- not implemented
null;
else
dbms_output.put_line('****ERROR*****');
end if;
--
end recurse;
--
begin

dbms_output.put_line('Start up');
sys.diutil.get_diana(
aname, NULL, NULL,
NULL, status, root,
1);

if (status <> sys.diutil.s_ok) then
sys.dbms_output.put_line('Error: couldn''t find diana; status: ' ||
to_char(status));
raise sys.diutil.e_subpNotFound;
end if;
--
-- recurse through the DIANA nodes
--
recurse(root);
--
end unwrap_r;

Остается только выполнить пару действий, которые каждый может сделать по своему.
SQL>set serveroutput on size 1000000
SQL>exec unwrap_r(‘’);
Вах! Получили результат