Category Archives: oracle, mysql & unix

lOOKING BACK

A long long time ago, v roku 2008 ( http://noire.dreams.sk/?p=9 ) ked som tento server zakladal dalo by sa povedat ze bol iny svet. Iny clovek, ine priority. Zda sa, ze vsetko bolo ine. Byval som kdesi uplne inde, tento server bola stara Pentium 4 sunka poskladana s nahradnych dielov, polepena lepiacou paskou a bezala kdesi v kute prenajateho bytu. Neskor prisiel skutocny hardware.. AMD 6 core, 16gb RAM, nejaky ten raid array a server denebola.dreams.sk beziaci ako virtualny stroj kdesi v nom. Hostovali sa domeny moje, kamaratove, bolo zopar shell kont, webdir v case svojho primu mal okolo 150 GB;) Pribudlo UPS, uptimy boli celkom obstojne…

Takto to bezalo zopar rokov, az som sa raz rozhodol svoj neekologicky ( 200w idle )server predat kamaratovi ( nech ti sluzi;) a data odmigrovat na prenajatu masinu do nemecka. Denebola II bola virtualka beziaca na fyzickom zeleze vo Falkensteine ktory sa pysil 3TB mirrorom, 8 core CPU a 24 GB RAM. Ekologicke, pohanane z veternych turbin;) a takto to bolo dobre…

Neskor zacal zaujem upadat, sluzby sa postupne vypinali, webdiry zanikali…az z velkeho stroja co sa dalo islo na komercny hosting u websupportu, co sa nedalo ostalo zit v malom VPS ( 2 core, 2gb ram ) nazvanom taraxacum.. takto to bolo dobre..a lacne;)

Looking back… priority su ine.. cas je iny…miesto je ine… moje sny uz niesu ciernobiele..

jabber bol jednou s prvych sluzieb co tu bezali. v roku 2008 ak si pametnici pametaju jabber bol “the thing”.. google bezal talk na jabberi, facebook bezal jabber, jabber sa zdal byt tym univerzalnym decentralizovanym protokolom.. co dnes je uz minulost.. 2008 boli casy ked ICQ pomaly umieralo..2019 su casy ked je jabber uz takmer mrtvy..

A dnes teda padlo rozhodnutie…

Prva sluzba ktora kedy bezala s tejto domeny sa vypina…

po viac ako 10 rokoch zanikne jabber.dreams.sk, sluzba sa vypne, server taraxacum zahynie… a ostane vsetko uz len na komercnom hostingu…

it was fun!

RIP

Oracle TEMP tablespace – usage scripts

Total used

SELECT   A.tablespace_name tablespace, D.mb_total,
 SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_used,
 D.mb_total - SUM (A.used_blocks * D.block_size) / 1024 / 1024 mb_free
FROM     v$sort_segment A,
 (
 SELECT   B.name, C.block_size, SUM (C.bytes) / 1024 / 1024 mb_total
 FROM     v$tablespace B, v$tempfile C
 WHERE    B.ts#= C.ts#
 GROUP BY B.name, C.block_size
 ) D
WHERE    A.tablespace_name = D.name
GROUP by A.tablespace_name, D.mb_total;

By session

SELECT   S.sid || ',' || S.serial# sid_serial, S.username, 
 S.program, SUM (T.blocks) * TBS.block_size / 1024 / 1024 mb_used,
 COUNT(*) sort_ops
FROM     v$sort_usage T, v$session S, dba_tablespaces TBS, v$process P
WHERE    T.session_addr = S.saddr
AND      S.paddr = P.addr
AND      T.tablespace = TBS.tablespace_name
GROUP BY S.sid, S.serial#, S.username, S.osuser, P.spid, S.module,
 S.program, TBS.block_size, T.tablespace
ORDER BY sid_serial;

By SQL

SELECT   S.sid || ',' || S.serial# sid_serial, S.username,
 T.blocks * TBS.block_size / 1024 / 1024 mb_used, T.tablespace,
 T.sqladdr address, Q.hash_value, Q.sql_text
FROM     v$sort_usage T, v$session S, v$sqlarea Q, dba_tablespaces TBS
WHERE    T.session_addr = S.saddr
AND      T.sqladdr = Q.address (+)
AND      T.tablespace = TBS.tablespace_name
ORDER BY mb_used;

Kuriozita pri jednom importe

Vcera, okolo 10tej vecer sa pomaly ale isto finishoval jeden task. Uloha spocivala v migracii jednej databazy z 9i a znakovej sady EE8ISO8859P2 na 10g a znakovu sadu EE8MSWIN1250 koli podpore € znaku (sa cudujem ze to vobec moja mfpicisticky vycreatovana mysql-ka na tomto stroji zozere;]])

Migracia prebehla v poriadku niekolkokrat na testovackach, procedura bola doklepana a takmer foolproof, neocakaval som vela postmigracnych problemov..mala to byt skor rutinna operacia…v tom sa udialo mierne wtf

IMP-00017: following statement failed with ORACLE error 1843:
" ALTER TABLE "TOJEJEDNO" MODIFY ("DATUM" DEFAULT '01.01.1900' )"
IMP-00003: ORACLE error 1843 encountered
ORA-01843: not a valid month

nedokazal som pochopit co je na tom datume divne, uz vobec nie preco je podla Oraclu januar neplatny mesiac, v kazdom pripade som skusil zmenit rok a skusit alter uz z naimportovanej db..co ak je niekde zadratovany valid date range…

tosh nepomohlo..pruser. treba to nejak osefovat…tak som skusal rozne triky a finty definicie toho pola az sa mi to nakoniec po vyse hodine a pol podarilo… s presne tou istou syntax ktoru mi import ofuckoval. WTF?!? dopice!!! kurva!!!!

spokojny s vysledkom ze som sa aspon pohol dalej som postupom vyreplikoval dependent objects (constraints, triggers, indexy  apodobne). Nakoniec vsetko dopadlo ako malo. az z rozdielom planovaneho konca ktory mal byt povodne 20:00 ale bol 00:11 ;]

moralne ponaucenie do checklistu:

1;) NEVER Oracle sqldeveloperu a jeho export data in import syntax (jebe kktiny a namiesto bodkociarkoveho delimiteru pouziva bodku..co kym som pochopil kolka bije bolo 11;]

2;)predtym ako z konzoly insertujes do tabulky nezabudni vypnut triggere na insert;]]

3;)ak zlyha import tabulky zhyhaju vsetky dependent objekty vcetne grantov. na tie nabuduce nezabudni

4;)checkuj df -k inak schytas infarkt ked ti po 5tich hodinach spadne import a possibly nejake produkcne veci koli nedostatku miesta na disku. to by uz fakt bolo moc;]

ORACLE: Klonovanie privilegii uzivatelov medzi databazami

nieje zle mat na ociach tento skript:]

set lines 150;
set pages 200;
spool duplicate.sql
select 'grant '|| GRANTED_ROLE ||' to '||GRANTEE||';' from dba_role_privs where grantee='&grantee';
select 'grant '|| PRIVILEGE ||' to '||GRANTEE||';' from dba_sys_privs where grantee='&grantee';
select 'grant '|| PRIVILEGE ||' on '||OWNER||'.'||TABLE_NAME|| ' to ' ||GRANTEE|| ';' from dba_tab_privs where grantee='&grantee';
spool off

ORACLE: sessions

Poznate to..

Vo svete IT sa casto vyskytuju situacie, ked nieco (aplikacia, skript, query) nebezi tak ako by podla ocakavani mala..a je to potrebne killnut. Vo vacsine pripadov to nieje ziadna extra velka issue..v OS Windows je mozne zabit svoje procesy a procesy ktore by ma mohli zauimat, prekticky bez problemov, v unixovych prostrediach tiez..ale v databazovych prostrediach je (pokial nechcete dat kazdemu userovi privilegium na alter system) trochu problem. DBA su v principe lenivy ludia a to posledne, co chcu je dat privilegia ktore su schopne rozhasit databazu uzivatelom ale tiez nechcu, aby sa nikto bez nich nezaobysiel.

riesenie?: funkcia killsid. procedura a funkcia  moze mat dva mody operacie a to dedit privilegia toho, kto ju spusti alebo dedit privilegia schemy v ktorej je zapisana. ak teda zapisem funkciu do systemovej schemy ktora ma grant na alter system, pridelim jej public synonymum a dam uzivatelom na nu pravo na select, dorobim do nej pre istotu nejake logovanie a checky ze kazdy moze zostrelit len vlastnu session prakticky mam po probleme. a voila: hotovy skript:

grant select on sys.v_$session to ops$oracle;
grant select on sys.v_$mystat to ops$oracle;

——————


CREATE TABLE "OPS$ORACLE"."KILLSID_LOG"
(    "KTO" VARCHAR2(30 BYTE),
"ODKIAL" VARCHAR2(30 BYTE),
"SID_OWNER" VARCHAR2(20 BYTE),
"SCHEMANAME" VARCHAR2(20 BYTE),
"SID" NUMBER,
"KEDY" VARCHAR2(50 BYTE)
);

create or replace FUNCTION          "OPS$ORACLE"."kill_sid" (
SID_TO_KILL IN NUMBER
)
RETURN VARCHAR2

AS
PRAGMA AUTONOMOUS_TRANSACTION;
USR varchar(50);
PROC_OWNER varchar(50);
PROC_STAT varchar(50);
SNUMBER integer;
queryna varchar(2000);
log_schemaname varchar(2000);
log_machine varchar(2000);
datum varchar(50);

begin

SELECT USERNAME into USR FROM sys.v_$session WHERE sid = ( SELECT sid FROM sys.v_$mystat WHERE rownum = 1);
select USERNAME,STATUS,SERIAL#, machine, schemaname into PROC_OWNER,PROC_STAT,SNUMBER, log_machine, log_schemaname from sys.v_$session where sid=SID_TO_KILL and serial#!=1 and username!=' ' and rownum = 1;
SELECT TO_CHAR(SYSDATE, 'DD-MON-YYYY HH:MI:SS') into datum FROM dual;
if (sql%found) then
dbms_output.put_line('My username:' || USR);
dbms_output.put_line('SID OWNER:' || PROC_OWNER);
dbms_output.put_line('SID STAT:' || PROC_STAT);
dbms_output.put_line('SNUMBER:' || SNUMBER);
DBMS_OUTPUT.ENABLE;

execute immediate 'insert into KILLSID_LOG (SID,KTO,ODKIAL,SID_OWNER,SCHEMANAME,KEDY) values (:1,:2,:3,:4,:5,:6)' using SID_TO_KILL,USR,log_machine,PROC_OWNER,log_schemaname,datum;
commit;
if USR <> PROC_OWNER then
RAISE_APPLICATION_ERROR (-20000,'nemozem zabit session ktora nieje tvoja!');
else
queryna:='Alter system kill session ''' || SID_TO_KILL|| ',' || SNUMBER||'''';
dbms_output.put_line(queryna);
execute immediate queryna;
return 'ok,killed';
end if;
end if;

EXCEPTION when NO_DATA_FOUND then return 'cant find this SID';
end;

——————–
grant alter system to OPS$ORACLE;
CREATE PUBLIC SYNONYM KILL_SID FOR "OPS$ORACLE"."kill_sid";