Toad for Oracle, Mysql, Sql server

Το καλύτερο εργαλείο για την διαχείριση των βάσεων. Πλέον κάτω από την ομπρέλα της Dell.

Ανοίξτε λογαριασμό στο site υποστήριξης της ORACLE(MOS-Metalink).

Η Oracle προσφέρει support και χρήσιμες πληροφορίες σε προβλήματα και bugs μέσω του συγκεκριμένου site.

Μπορείτε από το eDelivery της Oracle να κατεβάσετε Μysql και Oracle λογισμικό

Mysql μια open source βάση με support πλέον επι πληρωμή, από την Oracle.

Το support της microsoft για όλα τα προιόντα της

Χρήσιμες πληροφορίες-guides που αφορούν τόσο προβλήματα όσο και τρόπους εγκατάστασης του database λογισμικού.

Oracle Documentation

Εδώ υπάρχει το επίσημο documentation της Oracle.

Πέμπτη 4 Αυγούστου 2016

ASM διαχείριση χώρου – Εργαλεία, χρήσιμα queries


Στο άρθρο αυτό θα μιλήσουμε για την διαχείριση χώρου μέσω ASM.Η oracle δίνει την δυνατότητα στους χρήστες της να μην ασχολούνται με την διαχείριση του χώρου που καταλαμβάνει η βάση στο δίσκο, αλλά να κάνει την διαχείριση η oracle μόνη της με την χρήση του automatic storage management. Το εργαλείο αυτό απαιτεί προχωρημένες γνώσεις, για αυτό θα προσπαθήσω να κάνω μια απλή αναφορά στα πιο κρίσιμα ζητήματα που προκύπτουν από την χρήση του.

Η διαχείριση και παραμετροποίηση του ASM γίνεται μέσω του asmtoolg tool. Εκτενής αναφορά στο ASM δεν γίνεται στο συγκεκριμένο ebook, απλά στην συνέχεια παρατίθενται κάποια χρήσιμα queries.

Τα 3 queries που ακολουθούν δίνουν πληροφορίες σχετικά με τους δίσκους που έχουν δοθεί στο ASM να διαχειριστεί.

SQL> select * from v$asm_diskgroup;
SQL> select * from v$asm_file;
SQL>select name,group_number,disk_number,mount_status,state,path
from v$asm_disk
order by group_number;


Η επόμενη εντολή δίνει την δυνατότητα να δει κάποιος πως προστίθεται datafile σε ASM περιβάλλον.

SQL>alter tablespace trs_trans_data_2009 add datafile
'+oradata/orcl/oradata2/dbfiles/prtrs/trs_trans_data_2009.dbf' size 500m
autoextend on next 50m maxsize 20000m;



Δημιουργία Private Database link σε χρήστη από τον διαχειριστή της βάσης



Στο άρθρο αυτό θα μιλήσουμε για το πως η εκτέλεση της παρακάτω εντολής δημιουργεί ένα database link για την επικοινωνία της βάσης με μία άλλη βάση. Το link αυτό μπορεί να χρησιμοποιηθεί μόνο από συγκεκριμένο χρήστη.To query πρέπει να τρέξει με ισχυρά δικαιώματα (DBA privileges)

SQL> declare
uid number;
sqltext varchar2(10000) := 'CREATE DATABASE LINK
"DEVWWW1MYSQLCRM1.HELEX.GR" CONNECT TO "crm1" IDENTIFIED BY
"password" USING ''mysql2''';
myint integer;
begin
select user_id into uid from all_users where username like 'PORTAL_VIEWER';
myint:=sys.dbms_sys_sql.open_cursor();
sys.dbms_sys_sql.parse_as_user(myint,sqltext,dbms_sql.native,UID);
sys.dbms_sys_sql.close_cursor(myint);
end ;



Διαγραφή Oracle Service από Windows σύστημα


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να διαγράψουμε ένα oracle service από ένα Windows συστημα. Η εκτέλεση της παρακάτω εντολής σβήνει το oracle service ολοκληρωτικά από ένα windows σύστημα (το σβήνει και από την registry).

CMD>sc delete Service_nameOracleOraDb11g_homER_NSROM;


Κρυφές παράμετροι βάσης


Στο άρθρο αυτό θα μιλήσουμε για το query που εμφανίζει τις τιμές των κρυφών παραμέτρων μιας oracle βάσης.

SQL> select a.ksppinm name,b.ksppstvl value,b.ksppstdf deflt,
decode
(a.ksppity, 1,'boolean', 2,'string', 3,'number', 4,'file', a.ksppity) type,
a.ksppdesc description
from sys.x$ksppi a,sys.x$ksppcv b
where a.indx = b.indx and a.ksppinm like '\_%' escape '\'
order by name;



Concatenation μέσω sql εντολών


Στο άρθρο αυτό θα μιλήσουμε για  ένα oracle query που δίνει τον  τρόπος να κάνουμε concatenation με την χρήση του συμβόλου ||.


SQL>select 'SSP.' || TABLE_NAME from sys.all_tables where OWNER='SSP' and TABLE_NAME LIKE 'BAL_%'


Default τιμές για τα προφίλ ασφαλείας των χρηστών


Στο άρθρο αυτό θα μιλήσουμε για τον τρόπο που μπορεί κάποιος να  δει τις default τιμές που έχουν οριστεί σε μια βάση δεδομένων oracle. Στο query που ακολουθεί εμφανίζονται όλες οι default τιμές των profile ασφαλείας των χρηστών της βάσης .Το query το τρέχουμε με dba privileges.

SQL>select * from sys.dba_profiles;


Grant σε views ισχυρών λογαριασμών sys, system


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να  δώσουμε την δυνατότητα σε ένα χρήστη να δει τα περιεχόμενα συστεμικών πινάκων. Όταν επιθυμούμε να δώσουμε την δυνατότητα σε ένα χρήστη της βάσης να κάνει select από ένα συστεμικό view πχ v$session θα πρέπει να γίνει Grant το privilege στο πχ v_$session.

SQL>grant select on v_$session to hr;




MAIL - Ρύθμιση της βάσης ώστε να μπορεί να στείλει email (utl_mail)



Στο άρθρο αυτό θα μιλήσουμε για το πωσ μπορεί μια βάση δεδομένων oracle να ρυθμιστεί σωστά ώστε να μπορεί να στείλει email. Για να μπορέσει μια βάση να στείλει email θα πρέπει να εγκαταστήσουμε το πακέτο UTL_MAIL και να ορίσουμε κατάλληλα την παράμετρο SMTP_OUT_SERVER. Για να εγκαταστήσουμε το UTL_MAIL πρέπει να τρέξουμε με έναν ισχυρό λογαριασμό τα παρακάτω μέσω sqlplus.

SQL>sqlplus sys/<pwd>
SQL> @$ORACLE_HOME/rdbms/admin/utlmail.sql
SQL> @$ORACLE_HOME/rdbms/admin/prvtmail.plb


Στην συνέχεια θα πρέπει να ορίσουμε την παράμετρο SMTP_OUT_SERVER στο παραμετρικό αρχείο εκκίνησης της βάσης (pfile). Για να το κάνουμε αυτό εκτελούμε την παρακάτω εντολή.

SQL> alter system set smtp_out_server = 'mail.helex.gr:25' scope=both;
(Δυναμική παράμετρος – Αλλάζει χωρίς να χρειαστεί να κατέβει η βάση)

Δίνουμε το δικαίωμα να εκτελεί το συγκεκριμένο πακέτο είτε ο χρήστης PUBLIC οπότε όλοι οι χρήστες της βάσης, είτε συγκεκριμένοι χρήστες που θέλουμε. Οι παρακάτω εντολές εκτελούνται από χρήστη με ισχυρά δικαιώματα στην βάση (DBA δικαιώματα).

SQL> grant execute on utl_mail to public;
SQL> grant execute on utl_mail to <user>;


Τέλος, θα πρέπει να δημιουργηθεί ένα ACL για τον email server και να επιδοθούν τα απαραίτητα δικαιώματα στους χρήστες που θέλουμε να μπορούν να στείλουν email. Χωρίς την δημιουργία ACL θα εμφανίζεται το παρακάτω error: “ORA-24247: network access denied by access control list (ACL)“.

SQL> BEGIN
DBMS_NETWORK_ACL_ADMIN.CREATE_ACL (
acl => 'utl_mail.xml',
description => 'Permissions to access e-mail server.',
principal => 'SCHEMA_NAME',
is_grant => TRUE,
privilege => 'connect');
COMMIT;
END;


DBMS_NETWORK_ACL_ADMIN.ASSIGN_ACL (
acl => 'utl_mail.xml',
host => 'mailrelay.helex.gr',
lower_port => 25,
upper_port => 25);
COMMIT;
END;



Δημιουργία/Διαχείριση ACL (Access Control List)


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε και να διαχειριστούμε Access Control Lists. Από την έκδοση 11g και μετά για να υπάρχει η δυνατότητα η βάση να επικοινωνεί απευθείας είτε με email server για να στέλνει email, είτε με εξωτερικά sites για να στέλνει και να παίρνει διάφορες πληροφορίες, δημιουργήθηκε μια λίστα πρόσβασης κάτι σαν εσωτερικό firewall. Αν λοιπόν θέλουμε η βάση μας να αποκτήσει επικοινωνία με εξωτερικά sites ή servers απευθείας θα πρέπει να γίνει η κατάλληλη καταχώρηση στην συγκεκριμένη λίστα. Περισσότερες πληροφορίες σχετικά με το πώς κάποιος δημιουργεί και διαχειρίζεται τέτοιου είδους λίστες μπορεί να δει στο ακόλουθο Link.

http://www.morganslibrary.org/reference/pkgs/dbms_network_acl_admin.html

Στην συνέχεια ακολουθούν οι κατάλληλες εντολές δημιουργία μιας τέτοιας λίστας μαζί με την εντολή εκχώρησης δυνατότητας σύνδεσης στον server link2.athexnet.gr.


SQL>begin
dbms_network_acl_admin.create_acl (
acl => 'utl_mail.xml',
description => 'Allow mail to be send',
principal => 'DB_USER',
is_grant => TRUE,
privilege => 'connect'
);
commit;
end;


SQL>begin
dbms_network_acl_admin.assign_acl(
acl => 'utl_mail.xml',
host => 'link2.athexnet.gr'
);
commit;
end;


Τέλος υπάρχουν τα παρακάτω 4 queries που μας δίνουν την δυνατότητα να δούμε χρήσιμες πληροφορίες σχετικά με τις access control lists της βάσεως και να κάνουμε χρήσιμες ενέργειες που αφορούν τα acls.

Με το παρακάτω query βλέπουμε όλα τα acls που έχουν δημιουργηθεί στην βάση.

SQL>select * from dba_network_acls
Με το ακόλουθο query βλέπουμε σε ποιους χρήστες της βάσης έχει δοθεί πρόσβαση και σε ποια acls.

SQL>select acl,principal,privilege,is_grant from dba_network_acl_privileges;

Έλεγχος αν συγκεκριμένο acl δουλεύει σωστά και επιτρέπει την πρόσβαση εκεί που θέλουμε.

SQL>select dbms_network_acl_admin.check_privilege_aclid (
'9f9b59d32d942527e04016ac15c74bbd', 'cypowner', 'connect')
from dual;


Με την παρακάτω εντολή δίνουμε το δικαίωμα σε κάποιον χρήστη να έχει πρόσβαση σε συγκεκριμένο ACL.

SQL>exec dbms_network_acl_admin.add_privilege(acl => 'utl_ftp_iplink2.xml',
principal => 'DERIVPROD', is_grant => TRUE, privilege => 'connect');




Δημιουργία προφίλ ασφαλείας χρηστών (security profile)


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε ένα προφιλ ασφαλείας σε μία βάση δεδομένων Oracle. Πολλές φορές θέλουμε οι χρήστες της βάσης να έχουν συγκεκριμένα δικαιώματα ασφαλείας. Δικαιώματα που εκχωρούνται σε αυτούς μέσω κατάλληλων προφίλ ασφαλείας. Τα προφίλ αυτά δημιουργούνται και στην συνέχεια εκχωρούνται στους αντίστοιχους χρήστες. Η παρακάτω εντολή είναι ένα χαρακτηριστικό παράδειγμα δημιουργίας προφίλ ασφαλείας. 

SQL>create profile "default" limit
sessions_per_user unlimited
cpu_per_session unlimited
cpu_per_call unlimited
connect_time unlimited
idle_time unlimited
logical_reads_per_session unlimited
logical_reads_per_call unlimited
composite_limit unlimited
private_sga unlimited
failed_login_attempts unlimited
password_life_time unlimited
password_reuse_time unlimited
password_reuse_max unlimited
password_lock_time unlimited
password_grace_time unlimited
password_verify_function null;


Γενικότερα το προφίλ ορίζει παραμέτρους που αφορούν το password του χρήστη καθώς και τα resources της βάσης που θα μπορεί να χρησιμοποιήσει.

Μεταφορά πινάκων και Indexes από ένα tablespace σε ένα άλλο


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί κάποιος να μεταφέρει πίνακες και indexes από ένα Tablespace σε ένα άλλο σε μια βάση δεδομένων Oracle.Τρέχουμε τις παρακάτω εντολές για να δημιουργήσουμε τα scripts που θα τρέξουμε στην συνέχεια ώστε να γίνει η μεταφορά όλων των αντικειμένων του χρήστη σε νέο tablespace. Αν θέλουμε να μεταφέρουμε συγκεκριμένα αντικείμενα του χρήστη επιλέγουμε τα αντικείμενα που θέλουμε να μεταφέρουμε. Τρέχουμε τα scripts που έχουν προκύψει. 

SQL>select 'alter table ' || user_tables.table_name || ' move tablespace ' || 'M_DATA;' 
 from user_table;

SQL>select 'alter index ' || user_tables.table_name || ' rebuild tablespace ' || 'M_DATA;' 
 from user_tables;



Τετάρτη 3 Αυγούστου 2016

Processes Βάσης


Στο άρθρο αυτό βλέπουμε δυο χρήσιμες Linux administration commands.
Με την παρακάτω εντολή βλέπουμε όλα τα oracle process που τρέχουν στον server.

Ps –ef | grep ora*

Με την παρακάτω εντολή σκοτώνουμε όλα τα process-connection που έχουν μείνει ανοιχτά στον server.

> Ps –ef | grep “(LOCAL=NO)” | awk ‘{print “kill -9 “ $2 }’ > y.sh
> ./y.sh

Sql Statements που τρέχει κάθε χρήστης την συγκεκριμένη στιγμή


Στο άρθρο αυτό θα παρουσιάσουμε ένα query το οποίο τρέχοντάς το εμφανίζονται όλα τα sql statements που τρέχουν στην βάση .Το query το τρέχουμε με dba privileges.


SQL>select module, sql_text, username, disk_reads_per_exec, buffer_gets, disk_reads,
parse_calls, sorts, executions, rows_processed, hit_ratio, first_load_time,
sharable_mem, persistent_mem, runtime_mem, cpu_time, elapsed_time, address,
hash_value
from (SELECT module, sql_text , u.username ,
round((s.disk_reads/decode(s.executions,0,1, s.executions)),2) disk_reads_per_exec,
s.disk_reads , s.buffer_gets , s.parse_calls , s.sorts , s.executions ,
rows_processed , 100 - round(100 * s.disk_reads/greatest(s.buffer_gets,1),2) hit_ratio,
s.first_load_time , sharable_mem , persistent_mem , runtime_mem, cpu_time,
elapsed_time, address, hash_value
FROM gv$sql s, sys.all_users u
WHERE s.parsing_user_id=u.user_id and UPPER(u.username) not in
('SYS','SYSTEM') and s.SQL_TEXT like '% MM_LF_LASTETS_NBR %'
ORDER BY 4 desc)
WHERE rownum <= 20;

Εύρεση Invalid objects βάσης



Στο άρθρο αυτό θα μιλήσουμε για δύο πολύ χρήσιμα queries.Στο πρωτο query εμφανίζονται όλα τα invalid objects της βάσης.Το query το τρέχουμε με dba privileges.

SQL>select count(*) from dba_objects where status ='INVALID';

Στο δεύτερο query εμφανίζονται όλα τα invalid objects του sys,system μόνο .Το query το τρέχουμε με dba privileges.

SQL>select owner, object_name, object_type from dba_objects
where owner in ('SYS','SYSTEM') and status='INVALID';

Όγκος archives που έχει βγάλει μια βάση


Στο άρθρο αυτό δίνουμε έα χρήσιμο query για να μπορεί κάποιος να δει τον όγκο των archives που βγάζει μια oracle βάση σε archive log mode.Στο query που ακολουθεί ορίζουμε το χρονικό διάστημα που θέλουμε να μελετήσουμε το μέγεθος των archives που έχει βγάλει μία βάση.

SQL>select sum(GB_USED_PER_DAY)/count(GB_USED_PER_DAY) from (SELECT
TO_CHAR(completion_time,'YYYY-MM-DD') completion_date,
round (SUM(block_size*(blocks+1)) / 1024 / 1024 / 1024 , 2)
GB_USED_PER_DAY
from v$archived_log
where TRUNC(completion_time) BETWEEN
TRUNC(SYSDATE-30) AND TRUNC(SYSDATE)
group by TO_CHAR(completion_time,'YYYY-MM-DD')
order by 1 desc);

Κλειδώματα αντικειμένων της βάσης (Library cache Lock)


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί κάποιος να εντωπίσει κλειδώματα σε αντικείμενα (procedures, functions, tables) σε μια βάση Oracle. Τα κλειδώματα αυτά εμφανίζονται όταν κάποιο compile ενός αντικειμένου στην βάση έχει κολλήσει. Βλέπουμε με τα παρακάτω queries ποιος το κλειδώνει και προσπαθούμε να επιλύσουμε το κλείδωμα.

SQL>select decode(lob.kglobtyp, 0, 'NEXT OBJECT', 1, 'INDEX', 2, 'TABLE', 3,
'CLUSTER',4, 'VIEW', 5, 'SYNONYM', 6, 'SEQUENCE',7, 'PROCEDURE', 8,
'FUNCTION', 9, 'PACKAGE',11, 'PACKAGE BODY', 12, 'TRIGGER',13, 'TYPE',
14, 'TYPE BODY',19, 'TABLE PARTITION', 20, 'INDEX PARTITION', 21, 'LOB',
22, 'LIBRARY', 23, 'DIRECTORY', 24, 'QUEUE',28, 'JAVA SOURCE', 29, 'JAVA
CLASS', 30, 'JAVA RESOURCE',32, 'INDEXTYPE', 33, 'OPERATOR',34, 'TABLE
SUBPARTITION', 35, 'INDEX SUBPARTITION',40, 'LOB PARTITION', 41, 'LOB
SUBPARTITION', 42, 'MATERIALIZED VIEW', 43, 'DIMENSION', 44,
'CONTEXT', 46, 'RULE SET', 47, 'RESOURCE PLAN', 48, 'CONSUMER
GROUP',51, 'SUBSCRIPTION', 52, 'LOCATION', 55, 'XML SCHEMA', 56, 'JAVA
DATA',57, 'SECURITY PROFILE', 59, 'RULE', 62, 'EVALUATION
CONTEXT','UNDEFINED') object_type, lob.KGLNAOBJ object_name,
pn.KGLPNMOD lock_mode_held, pn.KGLPNREQ lock_mode_requested,
ses.sid, ses.serial#,ses.username
from x$kglpn pn, v$session ses, x$kglob lob, v$session_wait vsw
where pn.KGLPNUSE = ses.saddr and pn.KGLPNHDL = lob.KGLHDADR
and lob.kglhdadr = vsw.p1raw and vsw.event = 'library cache pin'
order by lock_mode_held desc/



SQL>select distinct ses.ksusenum sid, ses.ksuseser serial#, ses.ksuudlna
username,KSUSEMNM module,ob.kglnaown obj_owner, ob.kglnaobj obj_name
,lk.kgllkcnt lck_cnt, lk.kgllkmod lock_mode, lk.kgllkreq lock_req, w.state, w.event,
w.wait_Time, w.seconds_in_Wait
from x$kgllk lk, x$kglob ob,x$ksuse ses , v$session_wait w
where lk.kgllkhdl in (select kgllkhdl from x$kgllk where kgllkreq >0 )
and ob.kglhdadr = lk.kgllkhdl and lk.kgllkuse = ses.addr and w.sid = ses.indx
order by seconds_in_wait desc

Κλειδώματα Χρηστών


Στο άρθρο αυτό θα μιλήσουμε για κλειδώματα χρηστών που γίνοντε μεταξύ χρηστών σε μία βάση oracle. Για να εντοπίσουμε ποιος χρήστης κλειδώνει ποιον στην βάση τρέχουμε το παρακάτω query. Βλέποντας τα κλειδώματα μπορούμε να λύσουμε την διένεξη σκοτώνοντας το κατάλληλο session.

SQL> select sL.username sL_user, sL.osuser sL_osuser, sL.machine sL_mach,
sL.status LStat,L.SID LSid, sL.serial# LSerial, L.type,L.CTIME LCtime, L.lmode 
Lmode,L.REQUEST LReq,L.Inst_id ||'-'|| W.Inst_ID "N-N",W.SID WSid,W.CTIME 
WCtime, sW.username sW_user, sW.osuser sW_osuser, sW.status WStat,W.type, 
W.LMODE WLmode, W.Request WReq,sW.machine sW_mach,sWo.name 
sWo_name,sW.row_wait_obj# objid, sW.row_wait_file# Fl#,sW.row_wait_block# 
blk#,sW.row_wait_row# Row#
from sys.obj$ sWo, gv$session sW, gv$lock W, gv$session sL, gv$lock L
where
-- (L.lmode != 0 and L.request =0 and W.lmode = 0 and W.request != 0)
(L.lmode != 0 and W.request != 0) and sL.inst_id = L.inst_id and sL.sid = 
L.sid and W.id1 = L.id1 and W.id2 = L.id2 and sW.inst_id(+) = 
W.inst_id and sW.sid(+) = W.sid and sWo.obj#(+) = sW.row_wait_obj#
order by "N-N", wctime desc

Query που δίνει πια tablespaces είναι έτοιμα να γεμίσουν



Στο άρθρο αυτό θα μιλήσουμε για ένα χρήσιμο query που μπορούμε να τρέξουμε σε μία βάση Oracle ώστε να δούμε τα tablespaces που είναι έτοιμα να γεμίσουν.

SQL> select to_char (sp.begin_interval_time,'dd-mm-yyyy') days, ts.tsname
, max(round((tsu.tablespace_size* dt.block_size )/(1024*1024),2) ) cur_size_mb
, max(round((tsu.tablespace_usedsize* dt.block_size )/(1024*1024),2)) 
usedsize_mb
from dba_hist_tbspc_space_usage tsu, dba_hist_tablespace_stat ts, 
dba_hist_snapshot sp, dba_tablespaces dt
where tsu.tablespace_id= ts.ts# and tsu.snap_id = sp.snap_id
and ts.tsname = dt.tablespace_name and ts.tsname not in ('sysaux','system')
group by to_char (sp.begin_interval_time,'dd-mm-yyyy'), ts.tsname

Trace file - tkprof


Στο άρθρο αυτό θα μιλήσουμε επιγραμματικά για το πολύ χρήσιμο εργαλείο της oracle tkprof. Όταν εμφανίζεται ένα πρόβλημα στην βάση συχνά παράγεται και ένα trace file σχετιζόμενο με το error. Πολλές φορές το oracle support ζητάει να αποσταλεί το trace file αφού πρώτα γίνει ανάλυση του με το εργαλείο tkprof. Για να τρέξουμε την συγκεκριμένη εντολή πρέπει να την τρέξουμε από το φάκελο μέσα στον οποίο έχουν εγκατασταθεί τα εκτελέσιμα της oracle. Η εντολή συντάσσεται όπως φαίνεται στην συνέχεια


CMD>tkprof filename1 filename2

όπου filename1=το trace file προς ανάλυση και filename2=το outpout του tkprof εργαλείου.

Εμφάνιση μηνυμάτων alert log file (βάσης-listener)


Στο άρθρο αυτό θα μιλήσουμε για το πόσο σημαντικό είναι να μπορούμε να εντοπίζουμε γρήγορα τα μηνύματα λάθους που εμφανίζει η Oracle βάση ώστε να προχωρούμε άμεσα σε διερεύνηση και επίλυσή τους. Το βασικότερο εργαλείο για να γίνει αυτό είναι το alert log της βάσης. Το alert log εμφανίζει μηνύματα που αφορούν την ορθή και την μη ορθή λειτουργία της βάσης. Τα errors στην βάση ξεκινάνε με ORA- και δίνουνε χρήσιμες πληροφορίες για το που εμφανίζεται το πρόβλημα για να προχωρήσουμε στην επίλυσή του. Το alert log υπάρχει από την 11 έκδοση και μετά σε δύο μορφές (text file και xml file) σε μονοπάτι αντίστοιχο με το παρακάτω

/u01/app/oracle/diag/rdbms/db/db1/trace/

και έχει την μορφή alert_DB1.log. Όμοια το xml αρχείο έχει μορφή log.xml και βρίσκεται σε μονοπάτι στο δίσκο αντίστοιχο με το παρακάτω

/u01/app/oracle/diag/rdbms/db/db1/alert/

Ένα επίσης σημαντικό που πρέπει κάποιος να ελέγξει είναι και το log file του (ή των) Listener της βάσης. Έχει την μορφή listener_name.log και βρίσκεται στο παρακάτω μονοπάτι

/u01/app/oracle/diag/tnslsnr/hostname/listener/trace

Τα μονοπάτια που βρίσκονται αυτά τα τόσο χρήσιμα αρχεία εξαρτώνται από το που έχει στηθεί το oracle software. Χρήσιμες πληροφορίες για να εντοπίσει κανείς την ακριβή τοποθεσία βρίσκονται στο Note:438148.1 – Finding alert.log file in 11g του oracle support ή εκτελώντας το παρακάτω query στην βάση με λογαριασμό με ισχυρά δικαιώματα (DBA).

SQL> select * from v$diag_info;


Με το παρακάτω query και ορίζοντας το χρονικό διάστημα που θέλουμε να δούμε, μπορούμε να δούμε μέσα από την βάση τα μηνύματα λάθους που έχουν καταγραφεί στο alert log της βάσης. Η δυνατότητα αυτή ισχύει για βάση 11g και πάνω και το query μπορεί να το τρέξει χρήστης με ισχυρά δικαιώματα (dba privileges.)

SQL>select * from sys.x$dbgalertext
where ORIGINATING_TIMESTAMP > sysdate - 26/24



Δευτέρα 13 Ιουνίου 2016

Διαχείριση Jobs βάσης Oracle



Στο άρθρο αυτό θα μιλήσουμε για την διαχείριση των jobs στην oracle.

1. Δημιουργία απλού Job και δοκιμή αν είναι ενεργοποιημένα τα jobs

Παρακάτω ακολουθεί ένα script δημιουργίας καινούργιου job. Γίνεται μία εκτέλεση του, ώστε να τσεκάρουμε αν είναι ενεργοποιημένα τα Jobs στην βάση.

SQL>begin
dbms_scheduler.create_job ( job_name => 'test_job',
job_type => 'plsql_block',
job_action => 'null;',
enabled => true);
end;
/
-- wait a while
SQL> select * from user_scheduler_job_run_details where job_name='TEST_JOB';


2. Σβήσιμο job-s χρήστη


Σβήσιμο όλων των Jobs του χρήστη. Συνδεόμαστε με ισχυρό λογαριασμό με dba privileges και τρέχουμε την παρακάτω εντολή

SQL> execute dbms_ijob.DROP_USER_JOBS('satowner');

Σβήσιμο συγκεκριμένου Job χρήστη

SQL> execute dbms_ijob.remove(94);


3. Εύρεση job-s που τρέχουν αυτή την στιγμή στην βάση

Εύρεση των jobs που τρέχουν αυτή την στιγμή στην βάση, είτε μέσω του παλιού dbms_jobs είτε μέσω του καινούργιου από την 11 έκδοση και μετά scheduler_jobs. Χρήσιμα queries:

SQL> select sid, r.job, log_user, r.this_date, r.this_sec from dba_jobs_running r, dba_jobs j
where r.job = j.job;

SQL>select job, schema_user, to_char(last_date, 'hh24:mi dd/mm/yy') last_run,
to_char(next_date, 'hh24:mi dd/mm/yy') next_run, failures fails, broken, substr(what, 1, 15) what
from dba_jobs
order by 4;

SQL>select * from dba_scheduler_jobs

Το καλύτερο view στο οποίο φαίνονται μέσα όλες οι πληροφορίες αναλυτικά για όλα τα jobs που έτρεξαν μέσω του scheduler_jobs (και ποια jobs έσκασαν).

SQL>select * from DBA_SCHEDULER_JOB_RUN_DETAILS


Παρασκευή 10 Ιουνίου 2016

Διαχείριση sessions - συνδέσεων βάσης Oracle



Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί να γίνει η διαχείριση των συνδέσεων σε μια βάση Oracle, τόσο μέσα από την ίδια την βάση όσο και μέσα από τα διάφορα λειτουργικά.

1.Τερματισμός session-s μέσα από την βάση

Τρέχουμε το παρακάτω query και με βάση τα αποτελέσματα σκοτώνουμε το session-s που δημιουργούν πρόβλημα στην βάση με την επόμενη εντολή.

SQL> select se.username username,se.SID sid, se.serial# serial#,
se.status status, se.sql_hash_value, se.prev_hash_value,se.machine machine,su.TABLESPACE tablespace,su.segtype,su.CONTENTS CONTENTS
from v$session se, v$sort_usage su
where se.saddr=su.session_addr;

SQL> alter system kill session '41,259';

2.Τερματισμός session-s σε Windows περιβάλλον

Τρέχουμε την παρακάτω εντολή από command prompt και όπου SID_VASIS βάζουμε το sid της βάσης στην οποία είναι συνδεδεμένο το process ακολουθούμενο από process id. Σημαντική εντολή όταν δεν παίζει τίποτα άλλο.

CMD>orakill SID_VASIS SPID_PROCESS

3.Τερματισμός session-s σε LINUX περιβάλλον

Τρέχουμε την παρακάτω εντολή από command prompt. Σημαντική εντολή όταν δεν παίζει τίποτα άλλο.

bash>kill -9 process SID


Δευτέρα 11 Απριλίου 2016

Oracle - Χρήστες/Users Βάσης Δεδομένων



Στο άρθρο αυτό θα μιλήσουμε για τους χρήστες μιας βάσης Oracle. Θα δοθούν χρήσιμα scripts που αφορούν την δημιουργία χρηστών και την διαχείρισή τους.


1. Δημιουργία Χρήστη

SQL>create user db_user
          identified by <password>
          default tablespace users
          temporary tablespace temp
          profile default
          account unlock;



Όταν θέλουμε να δημιουργήσουμε έναν καινούργιο χρήστη θα πρέπει πρώτα να ορίζουμε το όνομα του χρήστη μαζί με το password του καθώς και το default tablespace στο οποίο θα μπορεί να γράφει. Μαζί ορίζουμε και το προφίλ ασφαλείας του χρήστη είμαστε έτοιμοι να προχωρήσουμε στην δημιουργία του.

SQL>drop user db_user cascade;

Για να σβήσουμε έναν χρήστη μαζί με τα δεδομένα του τρέχουμε την παραπάνω εντολή.


2. Δικαιώματα Χρηστών
 

SQL>grant execute on SYS.DBMS_MONITOR to db_user;

Όταν θέλουμε να δώσουμε την δυνατότητα σε ένα χρήστη να μπορεί να εκτελεί ενέργειες σε αντικείμενα (πίνακες, functions,procedure) άλλου χρήστη, εκτελούμε την παραπάνω εντολή και εκχωρούμε στον χρήστη το δικαίωμα να εκτελεί συγκεκριμένη ενέργεια. Οι ενέργειες που μπορούμε να εκχωρήσουμε είναι: ALTER, CREATE, DROP, DELETE, INSERT, SELECT, UPDATE, EXECUTE. 

SQL>revoke drop any table from db_user;


Για να αφαιρέσουμε κάποιο δικαίωμα από έναν χρήστη τρέχουμε την πιο πάνω εντολή.

3.Ρόλοι Χρηστών 

SQL>create role connect not identified;
          grant create session to connect;


Όταν θέλουμε να ομαδοποιήσουμε δικαιώματα τα οποία στην συνέχεια θα δοθούν σε μια ομάδα χρηστών τότε χρήσιμη είναι η δημιουργία ενός ρόλου. Δημιουργούμε τον ρόλο με την πρώτη εντολή και στην συνέχεια εκχωρούμε στον ρόλο δικαιώματα όπως στο 2.8.2 εκχωρούμε δικαιώματα σε χρήστη. Όπως περιγράφεται στο 2.8.2 μπορούμε να αφαιρέσουμε και δικαιώματα από έναν ρόλο. 

SQL>drop role connect;
Για να σβήσουμε έναν ρόλο τρέχουμε την παραπάνω εντολή.


4. Αλλαγή password χρήστη


SQL>alter user db_user identified by test


Όταν θέλουμε να αλλάξουμε το password ενός χρήστη εκτελούμε την παραπάνω εντολή όπου db_user είναι ο χρήστης που θέλουμε να αλλάξουμε το password και test είναι το νέο password που θέλουμε να του δώσουμε.


5. Script δημιουργίας χρηστών μαζί με τους κωδικούς πρόσβασης (Oracle 11g)


Για να μπορέσουμε στην 11g να πάρουμε από την βάση το script δημιουργίας των χρηστών της βάσης μαζί με τα κωδικοποιημένα passwords τρέχουμε με έναν λογαριασμό με ισχυρά δικαιώματα το παρακάτω:

SQL> set head off
           set pages 0
           set long 9999999
           select dbms_metadata.get_ddl('USER', username) || ';' usercreate from dba_users;



6. Στοιχεία Χρηστών Βάσης

Με το παρακάτω query βλέπουμε όλα τα στοιχεία των χρηστών-σχημάτων της βάσης (το τρέχουμε με ισχυρά δικαιώματα).

SQL> select * from sys.user$











Τετάρτη 16 Μαρτίου 2016

Oracle Temporary Tablespace - Σβήσιμο και ξανά δημιουργία


Στο άρθρο αυτό θα μιλήσουμε για το temporary tablespace μιας βάσης δεδομένων oracle. Δημιουργούμε ένα καινούργιο TEMP1 (default temporary tablespace). Σβήνουμε το παλιό (TEMP), το ξαναδημιουργούμε πιο μικρό και το κάνουμε default temporary για την βάση. Τέλος σβήνουμε το παλιό TEMP1. Έτσι καταλήγουμε με ένα μικρότερο temporary tablespace με το ίδιο όνομα αλλά με πολύ μικρότερο μέγεθος.

SQL> create temporary tablespace temp1 tempfile '/u02/dbfiles/aylo/temp101_u02.dbf' size 2000m 

SQL> alter database default temporary tablespace TEMP1

SQL> drop tablespace TEMP including contents and datafiles

SQL> create temporary tablespace temp tempfile '/u02/dbfiles/aylo/temp.dbf' size 2000m 

SQL> alter database default temporary tablespace TEMP

SQL> drop tablespace TEMP1 including contents and datafiles


Σε περίπτωση που σκάει η εντολή σβησίματος του TEMP tablespace, τρέχουμε το παρακάτω query και με βάση τα αποτελέσματα σκοτώνουμε το session-s που δημιουργούν το πρόβλημα και προχωράμε στην οριστική διαγραφή.

SQL> select se.username username,se.SID sid, se.serial# serial#, se.status status, se.sql_hash_value, se.prev_hash_value,se.machine machine, su.TABLESPACE 
tablespace,su.segtype,su.CONTENTS CONTENTS
from v$session se, v$sort_usage su
where se.saddr=su.session_addr;

SQL> alter system kill session 'sid,serial'; (πχ ‘23,342’ )

Oracle Database - Δημιουργία/Διαγραφή Index Πίνακα


Στο άρθρο αυτό θα μιλήσουμε για την δημιουργία index πίνακα δεδομένων σε μια βάση Oracle. Ακολουθεί ένα ενδεικτικό παράδειγμα και η ανάλυσή του. 

SQL> create index όνομα χρήστη.όνομα index on όνομα χρήστη.όνομα πίνακα
           (πεδίο 1 πίνακα, πεδίο 2 πίνακα)
           logging
           tablespace mm_idx
           pctfree 10
           initrans 2
           maxtrans 255
           storage (
           initial 304k
           next 1m
           minextents 1
           maxextents unlimited
           pctincrease 0
          buffer_pool default
          flash_cache default
         cell_flash_cache default
          )
         noparallel;


Όταν θέλουμε να δημιουργήσουμε έναν index θα πρέπει πρώτα να ορίζουμε το όνομα του index-ευρετηρίου μαζί με το σχήμα στο οποίο θα ανήκει (full name – σχήμα.όνομα index). Στην συνέχεια ορίζουμε τα πεδία του πίνακα στα οποία θα δημιουργηθεί o index. Αφού γίνει αυτό ορίζουμε το tablespace στο οποίο θα αποθηκεύεται ο index και άλλα χαρακτηριστικά που αφορούν αν θα γίνεται log, αν θα είναι parallel κτλ.

SQL>drop index nikos.mm_bf_day_stats;


Για να σβήσουμε έναν index τρέχουμε την παραπάνω εντολή.

Τρίτη 15 Μαρτίου 2016

Oracle Database - Δημιουργία Partition Πίνακα


Στο άρθρο αυτό θα μιλήσουμε για την δημιουργία partition πίνακα δεδομένων σε μια βάση Oracle. Ακολουθεί ένα ενδεικτικό παράδειγμα και η ανάλυσή του. 

SQL>create tablespace mm_data_cy_2011d
          logging
          datafile '/oradata2/dbfiles/surv/mm_data_cy_2011d.dbf' size 50m
          autoextend on next 100m
          extent management local
          uniform size 500k
          segment space management auto

Πρώτα φτιάχνω τα Tablespaces και μετά τρέχω τις ακόλουθες εντολές ανάλογα με τον πίνακα που θέλω να προσθέσω το συγκεκριμένο partition.

SQL>alter table nikos.mm_bf_day_stats add partition part_date_2012d 
          values less than (to_date(' 2013-01-01 00:00:00', 'syyyy-mm-dd 
          hh24:mi:ss','nls_calendar=gregorian'))
          logging
          nocompress
          tablespace mm_data_cy_2011d
          pctfree 10
          initrans 1
          maxtrans 255
          storage (
          initial 2m
          next 2m
          minextents 1
          maxextents unlimited
          pctincrease 0
          buffer_pool default
          )


Τετάρτη 9 Μαρτίου 2016

Oracle Database - Δημιουργία/Διαγραφή πίνακα


Στο άρθρο αυτό θα μιλήσουμε για την δημιουργία πίνακα δεδομένων σε μια βάση Oracle. Ακολουθεί ένα ενδεικτικό παράδειγμα και η ανάλυσή του. 

SQL> create table όνομα χρήστη.όνομα πίνακα (
           stocks_code number(10),
           companies_code number(10),
           ashscode char(25 byte),
           en_abbreviation varchar2(40 byte),
           listing_date date,
           share_type varchar2(4 byte),
           adts number(25,2),
           a number(5,2),
          smss number(10,2),
          )
          tablespace mm_data
          result_cache (mode default)
          pctused 0
          pctfree 10
          initrans 1
         maxtrans 255
         storage (
            initial 40k
            next 1m
            minextents 1
            maxextents unlimited
           pctincrease 0
           buffer_pool default
           flash_cache default
          cell_flash_cache default
            )
         logging
         nocompress
         nocache
         noparallel
         monitoring;

Όταν θέλουμε να δημιουργήσουμε ένα πίνακα θα πρέπει πρώτα να ορίζουμε το όνομα του πίνακα μαζί με το σχήμα στο οποίο θα ανήκει (full name – σχήμα.όνομα πίνακα). Στην συνέχεια ορίζουμε τα πεδία του πίνακα και τι τύπου θα είναι ανάλογα με το τι θα αποθηκεύσουμε μέσα (αριθμό, αλφαριθμητικό, ημερομηνία). Αφού γίνει αυτό ορίζουμε το tablespace στο οποίο θα αποθηκεύεται ο πίνακας και άλλα χαρακτηριστικά που αφορούν αν θα γίνεται log, αν θα είναι compress κτλ.


SQL>drop table nikos.mm_bf_day_stats cascade constraints purge;

Για να σβήσουμε ένα πίνακα τρέχουμε την παραπάνω εντολή είτε προσθέτοντας την επιλογή cascade constraints (σβήνει όλα τα referential contraints) είτε την επιλογή purge (συμπιέζει και αποδεσμεύει το χώρο που καταλάμβανε ο πίνακας).


Παρασκευή 4 Μαρτίου 2016

Oracle Tablespaces - Χρήσιμα scripts


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορούμε να δημιουργήσουμε oracle tablespaces (λογικός χώρος όπου θα αποθηκεύοντε τα δεδομένα μας) και πως μπορούμε να τα διαχειριστούμε και να τα τροποποιήσουμε κατάλληλα. 

Δημιουργία Oracle Tablespace

             SQL> create tablespace BO_REP_DATA datafile
                       '/oradata/dbfiles/SSP/bo_rep_data.dbf'
                       size 50M
                       autoextend on next 50M
                       maxsize 30000M
                       logging
                       online
                       extent management local autoallocate
                       blocksize 8K
                       segment space management auto
                       flashback on;


Το μονοπάτι στο δίσκο όπου θα αποθηκεύονται τα δεδομένα πρέπει να οριστεί για linux (/oradata/dbfiles/SSP/bo_rep_data.dbf) ή για windows (H:\ORADATA\DBFILES\MPWDB\HERDS_APEX.DBF) λειτουργικό αναλόγως.

Προσθήκη Datafile σε Tablespace

         SQL> alter tablespace USERS add datafile                                                                                '/oradata2/dbfiles/PRTRS/TRS_TRANS_DATA_2009.dbf'
                    size 500M
                    autoextend on
                    next 50M
                    maxsize 20000M


Προσθήκη καινούργιου datafile στο tablespace USERS μεγέθους 500ΜΒ το οποίο γίνεται autoextend όταν φτάσει στο όριό του αυτόματα κατά 50 ΜΒ κάθε φορά και μπορεί να φτάσει μέχρι τα 20GB.

Αλλαγή θέσης Datafile στο file system

         SQL> alter database rename file 
                  '/oradata/dbfiles/PRTRS/trs_trans_data_2007.dbf' to                                                   '/oradata2/dbfiles/PRTRS/trs_trans_data_2007.dbf'

Βάζουμε την βάση σε mount state (περιγράφετε στο 2.1) και εκτελούμε την παρακάτω εντολή με κάποιον χρήστη που να έχει δικαίωμα να το κάνει (DBA privileges)

Αφαίρεση δυνατότητας εγγραφής στοιχείων από χρήστη σε tablespace

        SQL> revoke resourse role;
                 (για να μην μπορεί να γράψει σε όλα τα tablespaces εκτός από τα defaults)
       SQL> alter user DERIVPROD quota 0M on system;
                (για να μην μπορεί να γράψει στο συγκεκριμένο tablespace)


Τρίτη 23 Φεβρουαρίου 2016

Oracle Audits - Χρήσιμα Queries


Στο άρθρο αυτό θα μιλήσουμε για χρήσιμα queries που αφορούν το auditing μιας βάσης oracle. 

1. Με το παρακάτω query μπορούμε να δούμε πότε αλλάχτηκε τελευταία φορά το password όλων των χρηστών της βάσης:

SQL>select name,ptime passwd_change_time from sys.user$ where type#='1';

2. Με το παρακάτω query μπορούμε να δούμε πότε συνδέθηκαν τελευταία φορά οι χρήστες στην βάση:

SQL>select userid, max(nvl(ntimestamp#, sysdate)) last_logon from sys.aud$ where action#=100 and returncode=0 group by userid;

3. Με το επόμενο query μπορούμε να δούμε όλες τις εγγραφές που έχουν καταγραφεί στον audit table: 

SQL>select * from SYS.AUD$ where LOGOFF$TIME > to_date('2010/07/12', 'yyyy/mm/dd') and
rownum<10;


Με το παρακάτω query μπορούμε να δούμε όλες τις IPs και τα τερματικά που έχουν συνδεθεί στην βάση με χρήση auditing και sys λογαριασμό (από τα πιο χρήσιμα). 

SQL>select userid, terminal, spare1, substr(s1,1,instr(s1,')')-1) IP,returncode, count(*) from
(select A.*, substr(comment$text,instr(comment$text,'HOST=')+5,100) s1 from aud$ a where action# in (100,101) )
group by userid, terminal, spare1, substr(s1,1,instr(s1,')')-1), returncode
order by IP;


Με το ακόλουθο query μπορούμε να δούμε όλα τα τερματικά που έχουν συνδεθεί στην βάση με χρήση auditing και sys λογαριασμό και έχουν κάνει delete ή select (βλέπουμε ότι ορίσουμε στο ACTION_NAME και για το χρονικό διάστημα που θέλουμε να δούμε). 

SQL>select os_username,username,timestamp,owner,obj_name,action_name
from dba_audit_trail
where extended_timestamp > to_date('2011/07/19
17:56:00', 'yyyy/mm/dd hh24:mi:ss') and extended_timestamp <
to_date('2011/07/19 18:07:00', 'yyyy/mm/dd hh24:mi:ss')and
action_name='delete';


Τέλος με τα παρακάτω queries μπορούμε να δούμε όλα τα audits options που έχουν ενεργοποιηθεί στην βάση μας:

SQL>select * from dba_priv_audit_opts;
SQL>select * from dba_stmt_audit_opts;



Δευτέρα 22 Φεβρουαρίου 2016

Αλλαγή Tablespace για τα audits


Στο άρθρο αυτό θα μιλήσουμε για την αλλαγή του tablespace που αποθηκεύοντε τα audits μιας oracle βάσης. Σε περίπτωση που δεν επιθυμούμε τα audits να αποθηκεύονται στο default συστεμικό tablespace αλλά σε δικό τους ξεχωριστό, ώστε σε περίπτωση που γεμίσει να μην επηρεαστεί η ορθή λειτουργία της βάσης εκτελούμε τα παρακάτω (προτείνεται σαν πρακτική να γίνεται σε όλες τις βάσεις παραγωγής):

Τρέχουμε την παρακάτω διαδικασία στην βάση ορίζοντας το νέο tablespace στο οποίο θα μεταφερθούν οι υπάρχουσες εγγραφές και θα γράφονται οι καινούργιες εγγραφές (με ισχυρά δικαιώματα).

Για παράδειγμα:

SQL>begin
   dbms_audit_mgmt.set_audit_trail_location(
   audit_trail_type => dbms_audit_mgmt.audit_trail_aud_std,
   audit_trail_location_value => 'aud_aux');
end;

Στο παράδειγμα αυτό:

· AUDIT_TRAIL_TYPE: Αναφέρεται στον τύπο του audit trail.

o DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD: Αναφέρεται στην μεταφορά του standard audit trail πίνακα, AUD$.

o DBMS_AUDIT_MGMT.AUDIT_TRAIL_FGA_STD: Αναφέρεται στην μεταφορά του fine-grained audit trail πίνακα, FGA_LOG$.

o DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD: Αναφέρεται στην μεταφορά και των δύο παραπάνω πινάκων

· AUDIT_TRAIL_LOCATION_VALUE: Ορίζει το tablespace στο οποίο θα μεταφερθούν τα δεδομένα και στον οποίο θα γράφονται στο εξής. Στο παράδειγμα είναι το AUD_AUX.

Προτεινόμενη Πολιτική Auditing


Στο άρθρο αυτό θα μιλήσουμε για την προτεινώμενη πολιτική auditing σε μια oracle βάση δεδομένων. Στην συνέχεια ακολουθεί μια προτεινόμενη πολιτική auditing που μπορεί να οριστεί στην βάση και να τροποποιηθεί ανάλογα. Η πολιτική ορίζει ποιες ενέργειες θα γίνονται auditing.

SQL>audit all privileges by access;
SQL>audit DELETE TABLE by system by access;
SQL>audit EXECUTE PROCEDURE by system by access;
SQL>audit INSERT TABLE by system by access;
SQL>audit SELECT SEQUENCE by system by access;
SQL>audit SELECT TABLE by system by access;
SQL>audit UPDATE TABLE by system by access;



Τα έξι τελευταία τα κάνουμε για κάθε σημαντικό χρήστη της βάσης (συνήθως χρήστες με ισχυρά δικαιώματα). Από εκεί και πέρα υπάρχουν και κάποια audits τα οποία δεν ενεργοποιούνται αυτόματα με τα «audit all privileges by access, audit all by access» και πρέπει να δοθούν ένα ένα. 

SQL>audit ALTER JAVA CLASS by access;
SQL>audit ALTER JAVA RESOURCE by access;
SQL>audit ALTER JAVA SOURCE by access;
SQL>audit ALTER SEQUENCE by access;
SQL>audit ALTER TABLE by access;
SQL>audit ANALYZE ANY DICTIONARY by access;
SQL>audit COMMENT TABLE by access;
SQL>audit CREATE JAVA CLASS by access;
SQL>audit CREATE JAVA RESOURCE by access;
SQL>audit CREATE JAVA SOURCE by access;
SQL>audit DEBUG PROCEDURE by access;
SQL>audit DROP JAVA CLASS by access;
SQL>audit DROP JAVA RESOURCE by access;
SQL>audit DROP JAVA SOURCE by access;
SQL>audit EXEMPT ACCESS POLICY by access;
SQL>audit EXEMPT IDENTITY POLICY by access;
SQL>audit GRANT DIRECTORY by access;
SQL>audit GRANT PROCEDURE by access;
SQL>audit GRANT SEQUENCE by access;
SQL>audit GRANT TABLE by access;
SQL>audit GRANT TYPE by access;
SQL>audit LOCK TABLE by access;
SQL>audit NETWORK by access;
SQL>audit exempt access policy by access; 

 
Το συγκεκριμένο privilege δίνει την δυνατότητα να μπορεί κάποιος να βλέπει όλα τα δεδομένα όλων των χρηστών άσχετα το επίπεδο ασφαλείας που έχει δοθεί σε συγκεκριμένο πίνακα. Παρακάμπτει τα πάντα σε επίπεδο δικαιωμάτων. Δεν το κάνουμε εύκολα grant και auditing. ΠΡΟΣΟΧΗ γιατί η χρήση του μπορεί να οδηγήσει σε χαμηλό performance της λειτουργίας της βάσης. Σε περίπτωση που επιθυμούμε να κάνουμε auditing μόνο συγκεκριμένους πίνακες και όχι χρήστες μπορούμε να χρησιμοποιήσουμε το παρακάτω πακέτο DBMS_FGA package για την ενεργοποίηση πολιτικών audit log σε συγκεκριμένους πίνακες και σχήματα. Περισσότερες πληροφορίες υπάρχουν στον παρακάτω ιστότοπο:

http://psoug.org/reference/dbms_fga.html



Πέμπτη 11 Φεβρουαρίου 2016

Oracle Audits - Ενεργοποιηση/Απενεργοποιηση


Στο άρθρο αυτό θα μιλήσουμε για το πως θα μπορέσουμε να καταγράψουμε τις ενέργειες που γίνοντε από τους χρήστες στην βάση δεδομένων oracle. Τα audits χρησιμοποιούνται για να αποθηκεύονται στην βάση σε κατάλληλους πίνακες οι διάφορες ενέργειες που έχουν γίνει στην βάση. Οι ενέργειες αυτές περιλαμβάνουν εισαγωγή και τροποποίηση δεδομένων καθώς και διαγραφή χρηστών και αλλαγή δικαιωμάτων. Τα audits είναι ενεργοποιημένα από την εγκατάσταση της βάσης. Η παράμετρος που ορίζει τον τύπο των audits που θα κρατάει η βάση λέγεται AUDIT_TRAIL και τρέχοντας την παρακάτω εντολή με ισχυρά δικαιώματα μπορεί να πάρει τις παρακάτω τιμές.

SQL> alter system set audit_trail=db,extended scope=spfile;

DB

Η επιλογή αυτή ενεργοποιεί το auditing στην βάση και κατευθύνει τις εγγραφές του auditing στον πίνακα SYS.AUD$ , εξαιρώντας τις εγγραφές εκείνες που γράφονται πάντοτε στο audit trail του λειτουργικού συστήματος. Αυτή είναι η τιμή που έχει η παράμετρος by default.Αν η βάση ξεκινήσει σε read-only κατάσταση με την τιμή της παραμέτρου σε DB, τότε η βάση εσωτερικά ορίζει την τιμή της σε OS (να γράφονται τα audits στον δίσκο).

DB, EXTENDED

Κρατάει ακριβώς ότι κρατάει με την DB επιλογή συν ολόκληρο το sql κείμενο που εκτέλεσε ο χρήστης στην βάση όταν αυτό είναι διαθέσιμο. Υπάρχουν δύο πεδία τα οποία γεμίζουν μόνο όταν η συγκεκριμένη τιμή έχει οριστεί. Η επιλογή DB,EXTENDED πιάνει και το Sql statement που ενεργοποιείται από κάποιο audit.Μπορεί να καταγράψει τόσο το SQL statement που προκαλεί το audit όσο και κάθε συσχετιζόμενη bind μεταβλητή. Δεν μπορεί να καταγράψει δεδομένα από αντικείμενα τύπου LOBS, CLOBS, BLOBS, ή κολώνα που ο τύπος της έχει οριστεί από τον χρήστη. Αν η βάση ξεκινήσει σε read-only κατάσταση με την τιμή της παραμέτρου σε DB,EXTENDED τότε η βάση εσωτερικά ορίζει την τιμή της σε OS (να γράφονται τα audits στον δίσκο). 

OS

Η επιλογή αυτή ενεργοποιεί το auditing στην βάση και κατευθύνει τις εγγραφές του σε αρχεία στο λειτουργικό σύστημα. Οποιαδήποτε auditing πληροφορία καταγράφετε στην βάση μπορεί να γίνει ορατή και να αλλαχτεί μόνο από τους διαχειριστές της βάσης. Για να ορίσουμε σε πιο μέρος στο λειτουργικό σύστημα θα βγαίνουν τα audits θα πρέπει να ορίσουμε την παράμετρο εκκίνησης AUDIT_FILE_DEST. Το default directory είναι το $ORACLE_BASE/admin/$DB_UNIQUE_NAME/adump

XML

Γράφει στο λειτουργικό σύστημα audit εγγραφές σε XML format. Γράφει όλες τις εγγραφές του audit εκτός από το κείμενο του sql statement και τις bind μεταβλητές.

XML, EXTENDED

Κρατάει ακριβώς ότι κρατάει με την XML επιλογή συν ολόκληρο το sql κείμενο που εκτέλεσε ο χρήστης στην βάση όταν αυτό είναι διαθέσιμο. Υπάρχουν δύο πεδία τα οποία γεμίζουν μόνο όταν η συγκεκριμένη τιμή έχει οριστεί.

NONE

Απενεργοποίηση του auditing στην βάση

Η αλλαγή της παραμέτρου για να ενεργοποιηθεί απαιτεί το ανεβοκατέβασμα της βάσης από λογαριασμό με ισχυρά δικαιώματα. Σημαντικό είναι να γνωρίζει κάποιος ότι η ενεργοποίηση του auditing οδηγεί σε αύξηση της παραγωγής των archives.

Δευτέρα 8 Φεβρουαρίου 2016

Archivelog mode - Ενεργοποιηση/Απενεργοποιηση


Στο άρθρο αυτό θα μιλήσουμε για το πως ενεργοποιείται και απενεργοποιείται το archive log mode σε μια βάση δεδομένων Oracle. Όταν ζητηθεί η χρειαστεί μια βάση να μπει σε ARCHIVELOG mode τότε πρέπει αρχικά και πριν από όλα να δούμε αν έχει ενεργοποιηθεί η επιλογή για flash back queries, δηλαδή η επιλογή του flash recovery area. Αυτό μπορούμε πολύ εύκολα να το διαπιστώσουμε με την παρακάτω εντολή.

SQL>SELECT * FROM v$recovery_file_dest ;

Αν η εντολή αυτή δεν επιστρέψει τίποτα τότε δεν έχει ενεργοποιηθεί το flash recovery area και μπορούμε να προχωρήσουμε στην διαδικασία που περιγράφεται πιο κάτω για την ενεργοποίηση της βάσης σε ARCHIVELOG mode. Αν είναι ενεργοποιημένο πάμε απευθείας στην εντολή που σηματοδοτείται με (*).

Κάθε βάση δεδομένων που περιέχει σημαντικά (παραγωγικά) δεδομένα θα πρέπει να τρέχει σε ARCHIVELOG mode. Το να τρέχει σε ARCHIVELOG mode δίνει την δυνατότητα να παίρνουμε hot backups και να εκτελούμε επαναφορά της βάσης σε συγκεκριμένη χρονική στιγμή (πχ επαναφορά βάσης πριν από corruption δίσκου).

Για να βάλουμε μια βάση σε ARCHIVELOG mode εκτελούμε με την σειρά τα παρακάτω:

SQL>alter system set log_archive_dest_1='location=/u01/oradata/MYSID/archive/ mandatory' scope=spfile;

SQL>alter system set log_archive_format='redo<ORACLESID>_%r_%T_%S.arc' scope=spfile;
SQL>shutdown immediate; (*)
SQL>startup mount;
SQL>archive log start;


(ΠΡΟΣΟΧΗ Η παραπάνω εντολή δεν πρέπει να τρέξει σε εκδόσεις 11G,12c )

SQL>alter database archivelog; (**)
SQL>alter database open;
SQL>alter system switch logfile;


Σε όλες τις παραπάνω εντολές πρέπει να καθοριστούν τα μονοπάτια και το SID της βάσης (που φαίνονται με bold) να ταιριάζουν στο περιβάλλον μας. 

Υπάρχουν φορές που το να είναι η βάση σε ARCHIVELOG mode δεν είναι απαραίτητο, για παράδειγμα σε ένα περιβάλλον ανάπτυξης. Όταν λοιπόν απαιτηθεί μια βάση να μπει σε NOARCHIVELOG mode πρέπει να είμαστε ιδιαίτερα προσεκτικοί γιατί όταν εμφανιστεί μια αποτυχία στον δίσκο ενώ η βάση είναι σε NOARCHIVELOG mode, το μόνο που μπορεί να γίνει είναι restore της βάσης δεδομένων στο σημείο εκείνο για το οποίο έχουμε το πιο πρόσφατο full database backup. Για να κάνουμε εναλλαγή μεταξύ ARCHIVELOG και NOARCHIVELOG mode, επαναλαμβάνουμε τα παραπάνω βήματα ορίζοντας στην κατάλληλη εντολή (που σηματοδοτείται με (**)) όπου ARCHIVELOG ,NOARCHIVELOG: 

SQL>alter database noarchivelog;

Αφού τελειώσει η διαδικασία και για να ελέγξουμε ότι όλα πήγαν καλά μπορούμε να εκτελέσουμε την παρακάτω εντολή η οποία μας δείχνει σε τι Mode τρέχει η βάση!!

SQL>select log_mode from v$database;

Πολύ σημαντική σημείωση:

Δυναμική Μεταβλητή ARCHIVE_LAG_TARGET ( Ορίζεις σε πόση ώρα θα βγάζει archives η βάση, είτε γεμίσει είτε όχι το redo log, η τιμή της ορίζεται σε δευτερόλεπτα βάζουμε συνήθως 15 λεπτά => 900)

SQL>alter system set archive_lag_target=900 scope=both;



Παρασκευή 5 Φεβρουαρίου 2016

Στατικες Μεταβλητες Περιβαλλοντος (Oracle)


Στο άρθρο αυτό θα μιλήσουμε για τις στατικές μεταβλητές περιβάλλοντος των oracle βάσεων δεδομένων.Υπάρχουν μεταβλητές μέσα στην βάση που δεν αλλάζουν δυναμικά χωρίς να χρειαστεί να ανεβοκατέβει το instance της βάσης, πολύ χαρακτηριστικές και χρήσιμες τέτοιες μεταβλητές είναι οι παρακάτω:

UTL_FILE_DIR είναι μια μεταβλητή η οποία μπορεί να χρησιμοποιηθεί για τον ορισμό φακέλων στο δίσκο στα οποία θα μπορεί να γράψει η βάση αρχεία. 

Περιγραφή Παραμέτρου:
UTL_FILE_DIR
Τύπος Παραμέτρου: Αλφαριθμητικό
Σύνταξη UTL_FILE_DIR= ‘/u01/app’
Default Τιμή: ‘’
Τροποποιείτε με : ALTER SYSTEM

SQL>alter system set utl_file_dir='/tmp','/oradata','/home' scope=spfile;

Τρέχουμε την εντολή χωρίς / στο τέλος είτε είναι ένα dir είτε περισσότερα και κάνουμε restart την βάση . Η αλλαγή ισχύει μετά το restart. Με την χρήση της συγκεκριμένης μεταβλητής μπορεί μέσω κώδικα της βάσης να γράφονται αρχεία στα directories που έχουν οριστεί στην συγκεκριμένη μεταβλητή.

MEMORY_ΜΑΧ_TARGET είναι μια μεταβλητή (η οποία εμφανίζεται από την έκδοση Oracle 11g και μετά) και η οποία μπορεί να χρησιμοποιηθεί για τον ορισμό της μέγιστης δυνατής μνήμης RAM που θα μπορεί να χρησιμοποιήσει η βάση. 

Περιγραφή Παραμέτρου:
MEMORY_ΜΑΧ_TARGET
Τύπος Παραμέτρου: Μεγάλος Ακέραιος Αριθμός
Σύνταξη MEMORY_ΜΑΧ_TARGET = integer [K | M | G]
Default Τιμή: 0
Τροποποιείτε με : ALTER SYSTEM
Βασική: OXI Πεδίων Τιμών: 152 MB μέχρι το μέγεθος της μνήμης RAM της μηχανής

SQL>alter system set memory_max_target='800M' SCOPE=both;

Δυναμικες Μεταβλητες Περιβαλλοντος (Oracle)


Στο άρθρο αυτό θα μιλήσουμε για τις δυναμικές μεταβλητές περιβάλλοντος των oracle βάσεων δεδομένων. Υπάρχουν μεταβλητές μέσα στην βάση που αλλάζουν δυναμικά χωρίς να χρειαστεί να ανεβοκατέβει το instance της βάσης, πολύ χαρακτηριστικές και χρήσιμες τέτοιες μεταβλητές είναι οι παρακάτω:

LOCAL_LISTENER είναι μια μεταβλητή η οποία χρησιμοποιείτε για να οριστεί ο listener στον οποίο θα ακούει η βάση.

Περιγραφή Παραμέτρου:
LOCAL_LISTENER
Τύπος Παραμέτρου: Αλφαριθμητικό
Σύνταξη LOCAL_LISTENER = 'listener_alias'
Default Τιμή: ‘’
Τροποποιείτε με: ALTER SYSTEM
Βασική: Όχι (αν δεν οριστεί η βάση γίνεται register με τον default listener στο 1521 )

SQL> alter system set local_listener='listener_alias'

Σε ένα μηχάνημα που έχουμε πολλές βάσεις και listeners σε διαφορετικά Ports από το 1521(που είναι το default) θα πρέπει να ορίσουμε στην βάση την μεταβλητή LOCAL_LISTENER και βάζουμε το 'listener_alias' στο tnsnames.ora 

Αν θέλουμε να γίνει η βάση register πχ σε δύο Listeners η εγγραφή στο tnsnames θα είναι ως εξής:

listener_alias =
(description =
(address=(protocol=tcp)(host=host1)(port=1521))
(address=(protocol=tcp)(host=host1)(port=1522))
)
Τέλος τρέχουμε την παρακάτω εντολή για να καταχωρηθούν οι αλλαγές. Σε περίπτωση που δεν γίνουν δεκτές οι αλλαγές ανεβοκατεβάζουμε το instance (2.1)

SQL> alter system register;

JOB_QUEUE_PROCESSES είναι μια μεταβλητή η οποία χρησιμοποιείτε για να οριστεί ο αριθμός των jobs που μπορεί να τρέχουν ταυτόχρονα στην βάση.

Περιγραφή Παραμέτρου:
JOB_QUEUE_PROCESSES
Τύπος Παραμέτρου: Ακέραιος Αριθμός
Σύνταξη JOB_QUEUE_PROCESSES = integer
Default Τιμή: 1000
Τροποποιείτε με: ALTER SYSTEM
Βασική: Ναι
SQL> alter system set job_queue_processes = 1000 scope=both; 

Σε περίπτωση που θέλουμε να ανεβάσουμε μια βάση και να απενεργοποιήσουμε την δυνατότητα να τρέχει jobs, θα πρέπει να την ανεβάσουμε σε mount mode (2.1 παράγραφο) και να τρέξουμε την παρακάτω εντολή. Αυτό συνήθως απαιτείται όταν γίνεται restore η βάση σε ένα development ή σε ένα τεστ σύστημα και δεν θέλουμε να τρέξουν τα Jobs.

SQL> alter system set job_queue_processes = 0;
SQL> alter database open;


SGA_TARGET είναι μια μεταβλητή (η οποία εμφανίζεται από την έκδοση Oracle 10g και μετά) και η οποία μπορεί να χρησιμοποιηθεί για την αυτόματη αύξηση η μείωση της μνήμης RAM που θα χρησιμοποιήσει η βάση.

Περιγραφή Παραμέτρου:
SGA_TARGET
Τύπος Παραμέτρου: Μεγάλος Ακέραιος Αριθμός
Σύνταξη SGA_TARGET = integer [K | M | G]
Default Τιμή: 0
Τροποποιείτε με : ALTER SYSTEM
Βασική: Ναι

SQL>alter system set sga_target='800M' scope=spfile;


MEMORY_TARGET είναι μια μεταβλητή (η οποία εμφανίζεται από την έκδοση Oracle 11g και μετά) και η οποία μπορεί να χρησιμοποιηθεί για τον ορισμό και τον αυτόματο χειρισμό της μνήμης RAM που θα χρησιμοποιεί η βάση. 

Περιγραφή Παραμέτρου:
MEMORY_TARGET
Τύπος Παραμέτρου: Μεγάλος Ακέραιος Αριθμός
Σύνταξη MEMORY_TARGET = integer [K | M | G]
Default Τιμή: 0
Τροποποιείτε με : ALTER SYSTEM
Βασική: OXI Πεδίων Τιμών: 152 MB μέχρι το μέγεθος της στατικής μεταβλητής
MEMORY_MAX_TARGET (παρ. 4.3.2)

SQL>alter system set memory_target='800M' SCOPE=both;

Η MEMORY_TARGET μεταβλητή μας προσφέρει:
Μια μοναδική παράμετρος για το συνολικό μέγεθος SGA και PGA
Αυτόματο καθορισμό SGA και PGA
Η μνήμη μεταφέρετε εκεί που χρειάζεται περισσότερο
Χρησιμοποιεί πληροφορίες φόρτου
Χρησιμοποιεί εσωτερικές συμβουλευτικές προβλέψεις
Μπορεί να ενεργοποιηθεί κατά την δημιουργία της βάσης μέσω DBCA

Χρησιμοποιώντας την συγκεκριμένη παράμετρο δεν χρειάζεται να χρησιμοποιήσουμε παραμέτρους σχετικές με SGA και PGA όπως οι ακόλουθες DB_CACHE_SIZE, SHARED_POOL_SIZE, 
LARGE_POOL_SIZE,JAVA_POOL_SIZE,PGA_AGGREGATE_TARGET

Τέσσερα πιο περισσότερο κοινά στοιχεία που ορίζουν το size, ρυθμίζονται πλέον αυτόματα με την συγκεκριμένη μεταβλητή : Shared Pool, Large Pool, Java Pool, Pga_Aggregate_Target, STATISTICS_LEVEL πρέπει να είναι TYPICAL, Buffer Cache(DEFAULT buffer pool)

SEC_CASE_SENSITIVE_LOGON είναι μια μεταβλητήοποία εμφανίζεται από την έκδοση Oracle 11g και μετά) και η οποία μπορεί να χρησιμοποιηθεί για την ενεργοποίηση της δυνατότητας τα passwords των χρηστών να είναι case sensitive.

Περιγραφή Παραμέτρου:
SEC_CASE_SENSITIVE_LOGON
Τύπος Παραμέτρου: TRUE/FALSE
Σύνταξη SEC_CASE_SENSITIVE_LOGON=False
Default Τιμή: TRUE
Τροποποιείτε με : ALTER SYSTEM
Βασική: Ναι

SQL>alter system set sec_case_sensitive_logon =false;


Πέμπτη 4 Φεβρουαρίου 2016

Σταμαστημα Listener βασης δεδομενων Oracle


Στο άρθρο αυτό θα μιλήσουμε για το πως μπορεί να κατεβάσει κανείς έναν Listener για μια βάση δεδομένων oracle.Για να γίνει το σταμάτημα του Listener της βάσης δεδομένων, ώστε να μην είναι δυνατή η σύνδεση χρηστών στην βάση, θα πρέπει να συνδεθούμε σαν oracle χρήστης σε ένα linux σύστημα ή σαν τον χρήστη που έκανε την εγκατάσταση σε ένα windows σύστημα και να τρέξουμε τα ακόλουθα: 

(Linux)
[oracle@p-xnet1 admin]$ su – oracle
[oracle@p-xnet1 admin]$ cd $ORACLE_HOME/bin
[oracle@p-xnet1 admin]$ ./lsnrctl stop <όνομα Listener-default LISTENER>

(Windows)

CMD>lsnrctl stop <όνομα Listener-default LISTENER>

Ο Listener στα windows μπορεί να σταματήσει και κάνοντας stop το αντίστοιχό service.