Am scris și despre asta înainteORACLEArticol despre noutăți 11g, acumORACLE11g a devenit mainstreamORACLEVersiunea bazei de date, înțelege și învațăORACLENoile funcții ale 11G sunt cruciale, la fel și euORACLEPentru începătorii noilor funcții ale 11G, aș dori să împărtășesc aici procesul meu de învățare și experiența mea.
Acest articol consemnează în principal că:ORACLEO nouă funcție a 11g-ului care permite blocatorilor DDL să aștepte blocările DML, temă împărtășită și de domnul Zhang Leyi (kamus) la evenimentul ACOUG din 30 iunie.
În versiunile anterioare 11g, implicit, blocările DDL nu așteaptă blocările DML, iar dacă efectuezi operații DDL pe un tabel cu blocaje DML, va returna imediat un eșec (cu excepția aceleiași SESSION), să facem un experiment simplu, inserăm date în STREAM-ul tabelului în SESSION1, nu trimite, în acest moment STREAM-ul tabelului va avea un blocaj DML și rulezi operația FLUXUL TRUNCHIAT în SESSION2, iar acesta va returna imediat un eșec:
SESSION1 >inserează în stream selectează * din dbdream; 10 rânduri create. SESSION2 >scurtarea fluxului de tabele; trunchie fluxul de tabel * EROARE la linia 1: ORA-00054: resource busy and acquire cu NOWAIT specificat sau timeout expirat în versiunea 11g,ORACLEA fost introdus DDL_LOCK_TIMEOUT parametru, permițând blocajelor DDL să aștepte blocările DML, care controlează timpul pentru care blocajele DDL așteaptă blocajele DML, în câteva secunde, valoarea implicită este 0, adică blocajele DDL nu așteaptă blocările DML, valoarea maximă este 1 milion, adică 11,5 zile, acest parametru poate fi setat global sau la nivel SESSION.
SESSION2 >parametrul de arătare ddl_lock_timeout VALOAREA TIPULUI NUME ----------------------- ----------- ------ ddl_lock_timeout întreg 0 SESSION2 >alterează setul de sesiune ddl_lock_timeout=2000000; EROARE: ORA-00068: valoare invalidă 2000000 pentru parametrul ddl_lock_timeout, trebuie să fie între 0 și 1000000 Următorul lucru demonstrează efectul următorului parametru DDL_LOCK_TIMEOUT și ia ca exemplu tabelul STREAM de mai sus, tabelul curent STREAM are încă un blocaj DML, iar în SESSION2 va fi DDL_LOCK_ TIMEOUT este setat la 60 de secunde, apoi operația TRUNCATE este executată, iar eșecul nu va fi returnat imediat, ci va aștepta 60 de secunde, iar dacă blocarea DL a tabelului STREAM nu este eliberată în 60 de secunde, va returna o eșec.
SESSION2 >setul de sesiuni ddl_lock_timeout=60; Sesiune modificată. SESSION2 >setează temporizarea pe fluxul SESSION2 >trunchi al tabelului; --În acest moment, SESSION2 suspendă, așteaptă ca SESSION1 să elibereze blocarea DML în 60 de secunde, returnează eșuat după 60 de secunde trunchiază fluxul de tabelă * EROARE la linia 1: ORA-00054: resource busy and acquire cu NOWAIT specificat sau timeout expirat Elapsed: 00:01:00.01 Apariția parametrilor DDL_LOCK_TIMEOUT simplifică mult funcționarea DBA-urilor, de exemplu, vrem să adăugăm un câmp într-un tabel, dar acest tabel are multe operații DML și nu putem folosi metoda ALTER SYSTEM KILL SESSION pentru a încheia aceste operații, așa că dacă vrem să adăugăm câmpuri în acest tabel, trebuie să efectuăm operația de adăugare a câmpurilor de nenumărate ori sau să scriem scripturi pentru această treabă, iar acum avem DDL_ LOCK_TIMEOUT parametru, trebuie doar să setăm valoarea acestui parametru puțin mai mare și nu trebuie să ne facem griji pentru executarea SQL, să demonstrăm acest proces mai jos.
SESSION2 adaugă câmpuri:
SESSION2 >alter table stream add jpg_path varchar2(255) implicit '/home/oracol/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >angajat; Commit complet. SESSION2 >alter table stream add jpg_path varchar2(255) implicit '/home/oracol/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/oracol/ 2 18-0221-003 1 /home/oracol/ 3 18-0221-003 2 /home/oracol/ 4 18-0221-003 3 /home/oracol/ 5 18-0223-005 1 /home/oracol/ 6 18-0223-005 2 /home/oracol/ 7 18-0223-005 3 /home/oracol/ 8 18-0223-005 4 /home/oracol/ 9 18-0223-005 5 /home/oracol/ 10 18-0223-005 6 /home/oracol/ 10 rows selected.
|