Jag har också skrivit om det tidigareORAKEL11g ny artikel, nuORAKEL11G har blivit mainstreamORAKELdatabasversion, förstå och lära digORAKELDe nya funktionerna i 11G är avgörande, och det är jag ocksåORAKELFör nybörjare med 11G:s nya funktioner vill jag dela med mig av min inlärningsprocess och erfarenhet här.
Denna artikel berättar främst att:ORAKELEn ny funktion i 11g som gör att DDL-lås kan vänta på DML-lås, vilket också är ett tema som delas av Mr. Zhang Leyi (kamus) vid ACOUG-evenemanget den 30 juni.
I versioner före 11g väntar DDL-lås som standard inte på DML-lås, och om du utför DDL-operationer på en tabell med DML-lås kommer det omedelbart att returnera ett fel (förutom samma SESSION), låt oss göra ett enkelt experiment, infoga data i tabellens STREAM i SESSION1, skicka inte, vid denna tidpunkt kommer tabellens STREAM att ha ett DML-lås, och utför TRUNCATE-tabellen STREAM-operationen i SESSION2, och den kommer omedelbart att returnera ett fel:
SESSION1 >infoga i strömmen välj * från dbdream; 10 rader skapade. SESSION2 >trunkera tabellströmmen; trunkera tabellström * FEL på rad 1: ORA-00054: resurs upptagen och hämta med NOWAIT specificerad eller timeout har gått ut i version 11g,ORAKELInförde DDL_LOCK_TIMEOUT parameter som tillåter DDL-lås att vänta på DML-lås, som styr tiden DDL-lås väntar på DML-lås, i sekunder är standardvärdet 0, det vill säga DDL-lås väntar inte på DML-lås, maxvärdet är 1 miljon, det vill säga 11,5 dagar, denna parameter kan ställas in globalt eller på SESSION-nivå.
SESSION2 >visa parameter ddl_lock_timeout NAMNTYPVÄRDE ----------------------- ----------- ------ ddl_lock_timeout heltal 0 SESSION2 >ändra sessionsmängd ddl_lock_timeout=20000000; FEL: ORA-00068: ogiltigt värde 20000000 för parameter ddl_lock_timeout, måste vara mellan 0 och 1000000 Följande visar effekten av följande DDL_LOCK_TIMEOUT parameter, och tar även ovanstående STREAM-tabell som exempel, den nuvarande STREAM-tabellen har fortfarande ett DML-lås, i SESSION2 kommer att vara DDL_LOCK_ TIMEOUT sätts till 60 sekunder, och sedan utförs TRUNCATE-operationen, och felet returneras inte omedelbart, utan väntar i 60 sekunder, och om DL-låset i STREAM-tabellen inte släpps inom 60 sekunder, kommer det att returnera ett fel.
SESSION2 >alter session set ddl_lock_timeout=60; Sessionen ändrad. SESSION2 >ställ in tidpunkten på SESSION2 >förkorta tabellströmmen; --Vid denna punkt pausar SESSION2, väntar på att SESSION1 ska släppa DML-låset inom 60 sekunder, returnerar misslyckad efter 60 sekunder trunkerar tabellströmmen * FEL på rad 1: ORA-00054: resurs upptagen och förvärv med NOWAIT specificerad eller timeout utgången Förflutit: 00:01:00.01 Framväxten av DDL_LOCK_TIMEOUT parametrar förenklar avsevärt DBAs operation, till exempel vill vi lägga till ett fält i en tabell, men denna tabell har många DML-operationer, och vi kan inte använda metoden ALTER SYSTEM KILL SESSION för att avsluta dessa operationer, så om vi vill lägga till fält i denna tabell måste vi utföra operationen att lägga till fält otaliga gånger eller skriva skript för att utföra detta jobb, och nu har vi DDL_ LOCK_TIMEOUT parameter behöver vi bara sätta värdet på denna parameter något större, och vi behöver inte oroa oss för att köra SQL, låt oss demonstrera denna process nedan.
SESSION2 lägger till fält:
SESSION2 >ändra tabellström lägg till jpg_path varchar2(255) standard '/home/Orakel/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >förplikta; Commit slutförd. SESSION2 >ändra tabellström lägg till jpg_path varchar2(255) standard '/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.
|