Thursday, September 25, 2014

Oracle DB - User sessions monitoring


Evo par SQL upita pomoću koji je moguće vidjeti korisne informacije o korisničkim sesijama na Oracle bazi podataka.



Broj trenutnih sesija na na bazi:

set lin 1000
select count(s.status) TOTAL_SESSIONS
from v$session s;

Ukupan broj NEAKTIVNIH korisničkih sesija:

set lin 1000
select count(s.status) INACTIVE_SESSIONS
from v$session s, v$process p
where
p.addr=s.paddr and
s.status='INACTIVE';

Broj sesija koje su NEAKTIVNE više od jedan sat:

select count(s.status) "INACTIVE SESSIONS > 1HOUR "
from gv$session s, v$process p
where
p.addr=s.paddr and
s.last_call_et > 3600 and
s.status='INACTIVE';

Broj svih AKTIVNIH korisničkih sesija:

select count(s.status) ACTIVE_SESSIONS
from gv$session s, v$process p
where
p.addr=s.paddr and
s.status='ACTIVE';

Detalji o svim korisničkim sesijama koje su NEAKTIVNE duže od jedan sat:

set pagesize 40
col INST_ID for 99
col spid for a10
set linesize 150
col PROGRAM for a10
col action format a10
col logon_time format a16
col module format a13
col cli_process format a7
col cli_mach for a15
col status format a10
col username format a10
col last_call_et_Hrs for 9999.99
col sql_hash_value for 9999999999999col username for a10
set linesize 152
set pagesize 80
col "Last SQL" for a60
col elapsed_time for 999999999999
select p.spid, s.sid,s.last_call_et/3600 last_call_et_Hrs ,s.status,s.action,s.module,s.program,t.disk_reads,lpad(t.sql_text,30) "Last SQL"
from gv$session s, gv$sqlarea t,gv$process p
where s.sql_address =t.address and
s.sql_hash_value =t.hash_value and
p.addr=s.paddr and
s.status='INACTIVE'
and s.last_call_et > (3600)
order by last_call_et;


Na kraju ukoliko odlučite da prekinete neku NEAKTIVNU korisničku sesiju uradite sledeće.

Saznajte potrebne parametre:

spool Inactive_sessions.txt
set lin 1000
select sid, serial#, username, lockwait, status, schemaname, logon_time, seconds_in_wait, state from v$session where status='INACTIVE';
spool off

Zabilježite parametre SID i SERIAL# za onu sesiju koju želite prekinuti i izvršite komandu:

ALTER SYSTEM KILL SESSION 'sid,serial#';


 

Friday, September 5, 2014

Oracle DB - Error ORA-01110 pri eksportu podataka


Prilikom izvršenja procedure eksporta podataka jedne schema-e iz Oracle baze podataka dobio sam grešku:


Očigledno da nešto nije bilo uredu sa datafajlom C:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF koji pripada tablespace-u SYSAUX. Provjerom alert.log fajla ustanovio sam da stvarno postoji problem sa navedenim datafajlom. Greške u alert.log fajlu su bile oblika:

ORA-00604: error occurred at recursive SQL level 1
ORA-00376: file 2 cannot be read at this time
ORA-01110: data file 2: 'C:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF'

Dakle, potrebno je uraditi media recovery navedenog datafajla.

Postupak je sledeći:

1. Provjeriti trenutno stanje Oracle baze podataka:

SQL> select name, open_mode, checkpoint_change#, ARCHIVE_CHANGE# from v$database;

NAME      OPEN_MODE            CHECKPOINT_CHANGE# ARCHIVE_CHANGE#
--------- -------------------- ------------------ ---------------
ORA11G    READ WRITE                    138707138       138707134


2. Provjeriti u kakvom je stanju datafajl nad kojim je potrebno odraditi media recovery proceduru:

SQL> select * from v$recover_file;

FILE#   ONLINE    ONLINE_ERROR               CHANGE#    TIME
---------- -------         --------------------------           --------            -----
         2  OFFLINE   OFFLINE                             138029207    12.08.14


3. Provjeriti stanje svih datafajlova u bazi:

SQL> select substr(name,1,50), recover, fuzzy, checkpoint_change# from v$datafil
e_header;

SUBSTR(NAME,1,50)                                                    REC   FUZ CHECKPOINT_CHANGE#
--------------------------------------------------                       ---      ---     ------------------
C:\ORACLE\ORADATA\ORA11G\SYSTEM01.DBF   NO  YES          138707176
C:\ORACLE\ORADATA\ORA11G\SYSAUX01.DBF   YES YES          138029207
C:\ORACLE\ORADATA\ORA11G\UNDOTBS01.DBF  NO  YES          138707176
C:\ORACLE\ORADATA\ORA11G\USERS01.DBF      NO  YES          138707176
C:\ORACLE\ORADATA\ORA11G\IDC_SYSTEM.DBF    NO  YES          138707176


4. Provjeriti koji nam je archive log potreban da bi smo uradili recovery navedenog datafajla:

SQL> select * from v$recovery_log;

   THREAD#  SEQUENCE# TIME     ARCHIVE_NAME
---------- ---------- -------- -------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----------------------------------------------------------------
         1       1225 12.08.14 C:\ORACLE\FLASH_RECOVERY_AREA\ORA11G\ARCHIVELOG\2
014_08_13\O1_MF_1_1225_9YP26W7Q_.ARC

Utvrditi da li je navedeni archive log fajl dostupan. Ako jeste može se nastaviti sa procedurom recovery-a.


5. Restartovati bazu u MOUNT modu i izvršiti komandu:

SQL> recover datafile 2;


6. Provjeriti da li je potrebno uraditi recovery još nekog datafajla:

SQL> select * from v$recover_file;

no rows selected

7. Ako nije potrebno uraditi recovery drugog datafajla baza se može otvoriti za rad u READ WRITE modu. Ali prvo je potrebno vratiti datafajl SYSAUX01.DBF u ONLINE status:

SQL> alter database datafile 2 online;

8. I na kraju otvoriti bazu za pristup svim korisnicima:

SQL> alter database open;

Database altered.


Sada je moguće izvršiti eksport podataka bez problema.