Olen myös kirjoittanut siitä aiemminORACLE11G Uudet ominaisuudet -artikkeli, nytORACLE11g on tullut valtavirtaanORACLETietokantaversio, ymmärrä ja opiORACLE11G:n uudet ominaisuudet ovat ratkaisevan tärkeitä, samoin minäORACLE11G:n uusien ominaisuuksien aloittelijoille haluaisin jakaa oppimisprosessini ja kokemukseni täällä.
Tämä artikkeli mainitsee pääasiassa seuraavaa:ORACLE11g:n uusi ominaisuus, joka sallii DDL-lukkojen odottaa DML-lukkoja, ja tämä on myös teema, jonka herra Zhang Leyi (kamus) jakoi ACOUG-tapahtumassa 30. kesäkuuta.
Versioissa ennen 11g:tä DDL-lukot eivät oletuksena odota DML-lukkoja, ja jos suoritat DDL-operaatioita DML-lukkoja sisältävällä taulukolla, se palauttaa välittömästi virheen (paitsi saman SESSIONin kohdalla), tehdään yksinkertainen koe, lisätään data taulukkoon STREAM SESSION1, ei lähetä, tällä hetkellä taululla STREAM on DML-lukko, ja suoritetaan TRUNCATE-taulun STREAM-operaatio SESSION2:ssa, jolloin se palauttaa välittömästi virheen:
SESSION1 >lisää stream selectiin * dbdreamista; 10 riviä luotu. SESSION2 >lyhennetty taulukkovirta; Trunkcate table stream * ERROR rivillä 1: ORA-00054: resource busy and acquire with NOWAIT (NOWAIT) tai aikakatkaisu versiossa 11g,ORACLEDDL_LOCK_TIMEOUT-parametri, joka sallii DDL-lukkojen odottaa DML-lukkoja, jotka säätelevät DDL-lukkojen odotusaikaa, sekunneissa oletusarvo on 0, eli DDL-lukot eivät odota DML-lukkoja, maksimiarvo on 1 miljoona, eli 11,5 päivää, tämä parametri voidaan asettaa globaalisti tai SESSION-tasolla.
SESSION2 >näytä parametri ddl_lock_timeout NIMITYYPIN ARVO ----------------------- ----------- ------ ddl_lock_timeout kokonaisluku 0 SESSION2 >muuta istuntojoukkoa ddl_lock_timeout=2000000; VIRHE: ORA-00068: virheellinen arvo 2000000 parametrille ddl_lock_timeout, täytyy olla välillä 0 ja 1000000. Seuraava havainnollistaa seuraavan DDL_LOCK_TIMEOUT-parametrin vaikutuksen ja ottaa myös yllä olevan STREAM-taulukon esimerkkinä, nykyisessä STREAM-taulukossa on edelleen DML-lukko, SESSION2 on DDL_LOCK_ TIMEOUT asetetaan 60 sekunniksi, minkä jälkeen TRUNCATE-operaatio suoritetaan, eikä epäonnistumista palauteta heti, vaan odotetaan 60 sekuntia, ja jos STREAM-taulukon DL-lukkoa ei vapauteta 60 sekunnin kuluessa, se palauttaa virheen.
SESSION2 >alter session setin ddl_lock_timeout=60; Istunto muutettu. SESSION2 >aseta ajoitus SESSION2 >lyhennettyyn taulukkovirtaan; --Tässä vaiheessa SESSION2 keskeytetään, odottaa, että SESSION1 vapauttaa DML-lukon 60 sekunnin sisällä, palautukset epäonnistuvat 60 sekunnin jälkeen, tauluvirran karsiminen * VIRHE rivillä 1: ORA-00054: resurssi varattu ja hanki NOWAIT määritellyllä tai aikakatkaisu päättyy Kulunut: 00:01:00.01 DDL_LOCK_TIMEOUT parametrien syntyminen yksinkertaistaa huomattavasti DBA:iden toimintaa, esimerkiksi haluamme lisätä kentän taulukkoon, mutta tässä taulukossa on paljon DML-operaatioita, emmekä voi käyttää ALTER SYSTEM KILL SESSION -metodia näiden operaatioiden lopettamiseen, joten jos haluamme lisätä kenttiä tähän taulukkoon, meidän täytyy lisätä kenttiä lukemattomia kertoja tai kirjoittaa skriptejä tätä varten, ja nyt meillä on DDL_ LOCK_TIMEOUT parametrin vuoksi meidän tarvitsee vain asettaa tämän parametrin arvo hieman suuremmaksi, eikä tarvitse huolehtia SQL:n suorittamisesta, näytetään tämä prosessi alla.
SESSION2 lisää kenttiä:
SESSION2 >alter table stream add jpg_path varchar2(255) default '/home/oraakkeli/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >sitoumus; Sitoudu valmiiksi. SESSION2 >alter table stream add jpg_path varchar2(255) default '/home/oraakkeli/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/oraakkeli/ 2 18-0221-003 1 /home/oraakkeli/ 3 18-0221-003 2 /home/oraakkeli/ 4 18-0221-003 3 /home/oraakkeli/ 5 18-0223-005 1 /home/oraakkeli/ 6 18-0223-005 2 /home/oraakkeli/ 7 18-0223-005 3 /home/oraakkeli/ 8 18-0223-005 4 /home/oraakkeli/ 9 18-0223-005 5 /home/oraakkeli/ 10 18-0223-005 6 /home/oraakkeli/ 10 rows selected.
|