Ik heb er ook eerder over geschrevenORACLE11g nieuwe artikelen, nuORACLE11g is mainstream gewordenORACLEdatabaseversie, begrijpen en lerenORACLEDe nieuwe functies van 11G zijn cruciaal, en ik ook.ORACLEVoor beginners van de nieuwe functies van 11G wil ik hier graag mijn leerproces en ervaring delen.
Dit artikel vermeldt voornamelijk dat:ORACLEEen nieuwe functie van 11g waarmee DDL-locks kunnen wachten op DML-locks, wat ook een thema is dat wordt gedeeld door de heer Zhang Leyi (kamus) tijdens het ACOUG-evenement op 30 juni.
In versies vóór 11g wachten DDL-locks standaard niet op DML-locks, en als je DDL-bewerkingen uitvoert op een tabel met DML-locks, geeft het direct een fout terug (behalve voor dezelfde SESSION), laten we een eenvoudig experiment doen: voeg gegevens in de tabel-STREAM in SESSION1, stuur het niet in, op dat moment heeft de table STREAM een DML-lock, en voer de TRUNCATE-tabel STREAM-operatie uit in SESSION2, waarna direct een fout wordt teruggegeven:
SESSION1 >Insert in stream select * uit dbdream; 10 rijen aangemaakt. SESSION2 >tabelstroom afsnijden; tabelstroom afsnijden * FOUT op regel 1: ORA-00054: resource busy and acquire met NOWAIT gespecificeerd of timeout verlopen in versie 11g,ORACLEEr werd DDL_LOCK_TIMEOUT parameter geïntroduceerd, waardoor DDL-locks kunnen wachten op DML-locks, die de tijd bepalen waarop DDL-locks op DML-locks wachten, in seconden is de standaardwaarde 0, dat wil zeggen, DDL-locks wachten niet op DML-locks, de maximale waarde is 1 miljoen, dat wil zeggen 11,5 dagen, deze parameter kan globaal of op SESSION-niveau worden ingesteld.
SESSION2 >toon parameter ddl_lock_timeout NAAMTYPEWAARDE ----------------------- ----------- ------ ddl_lock_timeout geheel getal 0 SESSION2 > sessieset wijzigen ddl_lock_timeout=20000000; FOUT: ORA-00068: ongeldige waarde 2000000 voor parameter ddl_lock_timeout, moet tussen 0 en 1000000 liggen Het volgende toont het effect van de volgende DDL_LOCK_TIMEOUT parameter, en neemt ook bovenstaande STREAM-tabel als voorbeeld, de huidige STREAM-tabel heeft nog steeds een DML-lock, in de SESSION2 zal DDL_LOCK_ TIMEOUT wordt ingesteld op 60 seconden, waarna de TRUNCATE-operatie wordt uitgevoerd, en de fout wordt niet direct teruggegeven, maar wacht 60 seconden, en als de DL-lock van de STREAM-tabel niet binnen 60 seconden wordt losgelaten, zal er een fout worden teruggegeven.
SESSION2 >alter sessie set ddl_lock_timeout=60; Sessie gewijzigd. SESSION2 >timing instellen op SESSION2 >tabelstroom afsnijden; --Op dit punt pauzeert SESSION2, wacht tot SESSION1 binnen 60 seconden de DML-lock vrijgeeft, retourneert failed na 60 seconden afkorten tabelstroom * FOUT op regel 1: ORA-00054: resource busy and acquire with NOWAIT specified of timeout expired Elapsed: 00:01:00.01 Het ontstaan van DDL_LOCK_TIMEOUT parameters vereenvoudigt de werking van DBA's aanzienlijk; bijvoorbeeld, we willen een veld aan een tabel toevoegen, maar deze tabel bevat veel DML-operaties, en we kunnen de ALTER SYSTEM KILL SESSION-methode niet gebruiken om deze bewerkingen te beëindigen, dus als we velden aan deze tabel willen toevoegen, moeten we de operatie van het toevoegen van velden ontelbare keren uitvoeren, of scripts schrijven om deze taak uit te voeren, en nu hebben we DDL_ LOCK_TIMEOUT parameter hoeven we alleen de waarde van deze parameter iets groter te zetten, en hoeven we ons geen zorgen te maken over het uitvoeren van SQL, laten we dit proces hieronder demonstreren.
SESSION2 velden toevoegen:
SESSION2 >tabelstroom wijzigen voeg toe jpg_path varchar2(255) standaard '/home/Orakel/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >committen; Commit voltooid. SESSION2 >tabelstroom wijzigen voeg toe jpg_path varchar2(255) standaard '/home/Orakel/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/Orakel/ 2 18-0221-003 1 /home/Orakel/ 3 18-0221-003 2 /home/Orakel/ 4 18-0221-003 3 /home/Orakel/ 5 18-0223-005 1 /home/Orakel/ 6 18-0223-005 2 /home/Orakel/ 7 18-0223-005 3 /home/Orakel/ 8 18-0223-005 4 /home/Orakel/ 9 18-0223-005 5 /home/Orakel/ 10 18-0223-005 6 /home/Orakel/ 10 rows selected.
|