Jeg har også skrevet om det førORAKLE11g ny artikkel om nye funksjoner, nåORAKLE11g har blitt mainstreamORAKLEdatabaseversjon, forstå og lærORAKLEDe nye funksjonene i 11G er avgjørende, og det er jeg også.ORAKLEFor nybegynnere med 11Gs nye funksjoner, vil jeg gjerne dele min læringsprosess og erfaring her.
Denne artikkelen registrerer hovedsakelig at:ORAKLEEn ny funksjon i 11g som lar DDL-låser vente på DML-låser, noe som også er et tema delt av Mr. Zhang Leyi (kamus) på ACOUG-arrangementet 30. juni.
I versjoner før 11g venter som standard ikke DDL-låser på DML-låser, og hvis du utfører DDL-operasjoner på en tabell med DML-låser, vil den umiddelbart returnere en feil (bortsett fra for samme SESSION), la oss gjøre et enkelt eksperiment, sett inn data i tabellen STREAM i SESSION1, ikke send inn, på dette tidspunktet vil tabell-STREAM ha en DML-lås, og utføre TRUNCATE-tabellen STREAM-operasjonen i SESSION2, og den vil umiddelbart returnere en feil:
SESSION1 >sett inn i strømmen velg * fra dbdream; 10 rader opprettet. SESSION2 >forkorte tabellstrømmen; trunkere tabellstrøm * FEIL på linje 1: ORA-00054: ressurs opptatt og hent med NOWAIT spesifisert eller timeout utløpt i versjon 11g,ORAKLEIntroduserte DDL_LOCK_TIMEOUT parameter, som tillater DDL-låser å vente på DML-låser, som kontrollerer tiden DDL-låser må vente på DML-låser, i sekunder er standardverdien 0, det vil si DDL-låser venter ikke på DML-låser, maksimal verdi er 1 million, det vil si 11,5 dager, denne parameteren kan settes globalt eller på SESSION-nivå.
SESSION2 >vis parameter ddl_lock_timeout NAVNETYPEVERDI ----------------------- ----------- ------ ddl_lock_timeout heltall 0 SESSION2 >endre sesjonssett ddl_lock_timeout=2000000; FEIL: ORA-00068: ugyldig verdi 20000000 for parameter ddl_lock_timeout, må være mellom 0 og 1000000 Følgende demonstrerer effekten av følgende DDL_LOCK_TIMEOUT parameter, og tar også STREAM-tabellen ovenfor som eksempel, den nåværende STREAM-tabellen har fortsatt en DML-lås, i SESSION2 vil være DDL_LOCK_ TIMEOUT settes til 60 sekunder, og deretter utføres TRUNCATE-operasjonen, og feilen vil ikke bli returnert umiddelbart, men vil vente i 60 sekunder, og hvis DL-låsen i STREAM-tabellen ikke frigjøres innen 60 sekunder, vil den returnere en feil.
SESSION2 >alter session sett ddl_lock_timeout=60; Økt endret. SESSION2 >sett timing på SESSION2 >avkorte tabellstrømmen; --På dette tidspunktet suspenderer SESSION2, venter på at SESSION1 skal frigjøre DML-låsen innen 60 sekunder, returnerer feilet etter 60 sekunder og trunkerer tabellstrømmen * FEIL på linje 1: ORA-00054: ressurs opptatt og henter med NOWAIT spesifisert eller timeout utløpt Elapsed: 00:01:00.01 Fremveksten av DDL_LOCK_TIMEOUT parametere forenkler operasjonen til DBA-er betydelig, for eksempel ønsker vi å legge til et felt i en tabell, men denne tabellen har mange DML-operasjoner, og vi kan ikke bruke ALTER SYSTEM KILL SESSION-metoden for å avslutte disse operasjonene, så hvis vi vil legge til felt i denne tabellen, må vi utføre operasjonen med å legge til felt utallige ganger, eller skrive skript for å utføre denne jobben, og nå har vi DDL_ LOCK_TIMEOUT parameter trenger vi bare å sette verdien av denne parameteren litt større, og vi trenger ikke bekymre oss for å kjøre SQL, la oss demonstrere denne prosessen nedenfor.
SESSION2 legger til felt:
SESSION2 >alter table stream legg til jpg_path varchar2(255) standard '/home/Orakel/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >forplikte; Forpliktelse fullført. SESSION2 >alter table stream legg til 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.
|