adminisztrációs feladatok ORACLE ORDBMS adminisztrációs feladatok 7. rész 2004 dr. Kovács László
további csomagok DBMS_PIPE Kommunikációs csatorna egy instance processzei között Pipe store session buffer CREATE_PIPE csatorna létrehozása PACK_MESSAGE üzenet létrehozása SEND_MESSAGE üzenet küldése RECEIVE_MESSAGE üzenet fogadása UNPACK_MESSAGE üzenet kibontása RESET_BUFFER buffer törlése PURGE csatorna tisztítása REMOVE_PIPE csatorna megszüntetése
timeout INTEGER DEFAULT MAXWAIT; meret INTEGER DEFAULT 8092; priv BOOLEAN DEFAULT TRUE; DBMS_PIPE.RESET_BUFFER; proba := DBMS_PIPE.UNIQUE_SESSION_NAME; szoveg := ‘UZEN’; DBMS_PIPE.CREATE_PIPE(proba,merert,priv); DBMS_PIPE.PACK_MESSAGE(szoveg); DBMS_PIPE.SEND_MESSAGE(proba,timeout); DBMS_PIPE.RECEIVE_MESSAGE(proba, timeout); DBMS_PIPE.UNPACK_MESSAGE(szoveg2); DBMS_PIPE.REMOVE_PIPE(proba);
DBMS_LOCK felhasználó vezérelt zárolás (user lock <–> oracle lock) kompatibilitási mátrix igényelt mód NL SS SX S SSX X I NL I I I I I SS I I I I I N meglévő mód I I I N SX N N S I I I N N N SSX N I I N N N N X I N N N N
DBMS_LOCK ALLOCATE_UNIQUE id generálása REQUEST zárolás elhelyezés CONVERT zárolás átminősítés RELEASE zárolás felengedés SLEEP session felfüggesztés zárolási mód kódok: NL 1 SS 2 SX 3 S 4 SSX 5 X 6
minta
Véletlenszám generálás DBMS_RANDOM INITIALIZE inicializálás SEED generálási érték beállítás RANDOM szám előállítás TERMINATE csomag bezárás CREATE PROCEDURE G1 (DB IN NUMBER, SS IN NUMBER) AS BEGIN DBMS_RANDOM. INITIALIZE(SS); FOR I=1..DB LOOP DBMS_OUTPUT.PUT_LINE(TO_CHAR(DBMS_RANDOM.RANDOM)) END LOOP; END; SET SERVEROUTPUT ON EXECUTE G1(5,23);
Levélküldés Jserver, TCP modulokra épül fő struktúrák: connection (host, port) reply (code, text) open_connection kapcsolat felvétel helo szinkronizálás mail levél kezdet rcpt cimzett megadása data üzenet törzs quit kapcsolat zárás
execute levelez (‘<kovacs@iit.uni-miskolc.hu>’,…); CREATE PROCEDURE LEVELEZ (KULDO IN VARCHAR2, CIMZETT IN VARCHAR2, UZENET IN VARCHAR2) AS MAILHOST VARCHAR2(30) := ‘mail.ab.dom’; MAIL_CONN UTL_SMTP.CONNECTION; VALA UTL_SMTP.REPLAY; BEGIN MAIL_CONN := UTL_SMTP.OPEN_CONNECTION(MAILHOST,25); VALA := UTL_SMTP.HELO(MAIL_CONN, MAILHOST); DBMS_OUTPUT.PUT_LINE(VALA.TEXT); UTL_SMTP.MAIL(MAIL_CONN,KULDO); UTL_SMTP.RCPT(MAIL_CONN,CIMZETT); UTL_SMTP.DATA(MAIL_CONN,UZENET); UTL_SMTP.QUIT(MAIL_CONN); EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUTLINE(SQLERRM); END execute levelez (‘<kovacs@iit.uni-miskolc.hu>’,…);
Particionált táblák a tábla / index rekordjainak szétbontása csoportokra típusai: Tartomány alapú (range) : a rekordokat a kulcs alapján ossza szét. Az egyes kulcs érték tartományok külön partícióba kerülnek Hash alapú: egy egyenletesebb elosztást biztosító hash függvény alapján rendel a különböző kulcs értékekhez egy partíciót Vegyes módszer (composite partitioning) : előbb tartomány alapú szétválogatás, majd egy hash alapú finomabb szétbontás A különböző partíciók különböző szegmensekben, tablespace-ben helyezkednek el
Előnyök hatékonyság: - az egyes partíciók bizonyos esetekben kihagyhatók - párhuzamosítás - gyorsabb hozzáférés karbantartás - önálló adminisztráció - egyedi tárolási paraméterek adatvédelem - önálló állományszintű védelmi lehetőség nem lehet CLUSTER-ben nem lehet LONG mező saját zárolási szint
CREATE TABLE sales ( invoice_no NUMBER, sale_year INT NOT NULL, sale_month INT NOT NULL, sale_day INT NOT NULL ) PARTITION BY RANGE (sale_year, sale_month, sale_day) ( PARTITION sales_q1 VALUES LESS THAN (1997, 04, 01) TABLESPACE tsa, PARTITION sales_q2 VALUES LESS THAN (1997, 07, 01) TABLESPACE tsb, PARTITION sales_q3 VALUES LESS THAN (1997, 10, 01) TABLESPACE tsc, PARTITION sales_q4 VALUES LESS THAN (1998, 01, 01) TABLESPACE tsd );
CREATE TABLE product( ... ) STORAGE (INITIAL 10M) PARTITION BY HASH(column_list) ( PARTITION p1 TABLESPACE h1, PARTITION p2 TABLESPACE h2 ); CREATE TABLE orders( ordid NUMBER, orderdate DATE, productid NUMBER, quantity NUMBER) PARTITION BY RANGE(orderdate) SUBPARTITION BY HASH(productid) SUBPARTITIONS 8 STORE IN(ts1,ts2,ts3,ts4,ts5,ts6,ts7,ts8) ( PARTITION q1 VALUES LESS THAN('01-APR-1998'), PARTITION q2 VALUES LESS THAN('01-JUL-1998'), PARTITION q3 VALUES LESS THAN('01-OCT-1998'), PARTITION q4 VALUES LESS THAN(MAXVALUE) );
ALTER TABLE admin.patient_visits DROP PARTITION pv_dec92; SELECT * FROM sales PARTITION (s_nov97) s WHERE s.amount_of_sale > 1000; leírók: DBA_TAB_PARTITIONS DBA_TAB_SUBPARTITIONS DBA_IND_PARTITIONS DBA_IND_SUBPARTITIONS DBA_PART_COL_STATISTICS
LOB objektumok kezelése típusai: - DB-ben tárolt - táblában - külön TABLESPACE - külön állományban (BFILE) egy táblában több LOB mező is lehet BLOB CLOB NCLOB LOB locator
LOB kezelő csomag DBMS_LOB OPEN LOB megnyitása CLOSE LOB lezárása GETLENGTH LOB elem hossza READ LOB elem olvasása WRITE LOB elem irása FILEOPEN BLOB nyitása FILECLOSE BLOB zárás LOADFROMFILE BLOB betöltése SUBSTR LOB részlet INSTR LOB részlet keresése APPEND hozzáfűzés ERASE tartalom törlés
CREATE OR REPLACE PROCEDURE Example_l2f IS lobd BLOB; fils BFILE := BFILENAME('SOME_DIR_OBJ','file specifikáció'); amt INTEGER := 4000; BEGIN SELECT b_lob INTO lobd FROM lob_table WHERE key_value = 42 FOR UPDATE; dbms_lob.fileopen(fils, dbms_lob.file_readonly); dbms_lob.loadfromfile(lobd, fils, amt); COMMIT; dbms_lob.fileclose(fils); END;
CREATE OR REPLACE PROCEDURE Example2a IS lob_1, lob_2 BLOB; retval INTEGER; BEGIN SELECT b_col INTO lob_1 FROM lob_table WHERE key_value = 45; SELECT b_col INTO lob_2 FROM lob_table WHERE key_value = 54; retval := dbms_lob.compare(lob_1, lob_2, 5600, 33482, 128); IF retval = 0 THEN …. ELSE … END IF; END;
CREATE OR REPLACE PROCEDURE Example_13a IS src_lob BLOB; buffer RAW(32767); amt BINARY_INTEGER := 32767; pos INTEGER := 2147483647; BEGIN SELECT b_col INTO src_lob FROM lob_table WHERE key_value = 21; LOOP dbms_lob.read (src_lob, amt, pos, buffer); … pos := pos + amt; END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN dbms_output.put_line('End of data'); END;
Hibakezelő csomag debug session <---> target session debug információk beépítése: ALTER SESSION SET PLSQL_DEBUG = true; ALTER [PROCEDURE | FUNCTION | PACKAGE | TRIGGER | TYPE] <name> COMPILE DEBUG; Target session DBMS_DEBUG DBMS_DEBUG.INITIALIZE regisztrálás DBMS_DEBUG.DEBUG_ON elindítás DBMS_DEBUG.DEBUG_OFF leállítás
Debug session DBMS_DEBUG.ATTACH_SESSION kapcsolódás DBMS_DEBUG.DETACH_SESSION leválás DBMS_DEBUG.SET_BREAKPOINT töréspont DBMS_DEBUG.DELETE_BREAKPOINT DBMS_DEBUG.SHOW_BREAKPOINTS DBMS_DEBUG.SYNCHRONIZE első esemény DBMS_DEBUG.CONTINUE folytatás DBMS_DEBUG.GET_VALUE változó kezelés DBMS_DEBUG.SET_VALUE DBMS_DEBUG.SHOW_SOURCE DBMS_DEBUG.EXECUTE végrehajtás a targetben
minta