Pisałem też o tym wcześniejWYROCZNIAArtykuł o nowych funkcjach 11g, terazWYROCZNIA11G stało się powszechneWYROCZNIAWersja bazy danych, zrozum i ucz sięWYROCZNIANowe funkcje 11G są kluczowe, podobnie jak jaWYROCZNIADla początkujących w nowych funkcjach 11G chciałbym podzielić się tutaj moim procesem nauki i doświadczeniem.
W tym artykule głównie odnotowano:WYROCZNIANowa funkcja 11g pozwala zamkom DDL czekać na zamki DML, co jest również motywem podzielanym przez pana Zhang Leyi (kamus) podczas wydarzenia ACOUG 30 czerwca.
W wersjach sprzed 11g, domyślnie blokady DDL nie czekają na blokady DML, a jeśli wykonasz operacje DDL na tabeli z blokadami DML, natychmiast zwróci się niepowodzenie (z wyjątkiem tej samej SESSION), przeprowadźmy prosty eksperyment, wstaw dane do tabeli STREAM w SESSION1, nie wysyłaj, w tym momencie STREAM tabeli będzie miał blokadę DML i wykonasz operację TRUNCATE table STREAM w SESSION2, a natychmiast zwróci niepowodzenie:
SESSION1 >wstaw do wyboru strumienia * z dbdream; Utworzono 10 wierszy. SESSION2 >strumień tabeli skracaj; strumień tabeli tniąć * BŁĄD na linii 1: ORA-00054: zasób zajęty i nabytek z określoną NOWAIT lub wygasł limit czasu w wersji 11g,WYROCZNIAWprowadzono DDL_LOCK_TIMEOUT parametr, pozwalający zamkom DDL czekać na zamki DML, które kontrolują czas oczekiwania zamków DDL na blokady DML; w sekundach wartość domyślna wynosi 0, czyli zamki DDL nie czekają na blokady DML, maksymalna wartość to 1 milion, czyli 11,5 dnia, parametr ten można ustawić globalnie lub na poziomie SESSION.
SESSION2 >pokaż parametr ddl_lock_timeout NAZWA TYPU WARTOŚĆ ----------------------- ----------- ------ ddl_lock_timeout CAŁKOWITA 0 SESSION2 >alter zestaw sesji ddl_lock_timeout=2000000; BŁĄD: ORA-00068: nieprawidłowa wartość 2000000 dla parametru ddl_lock_timeout, musi być między 0 a 1000000. Poniżej przedstawiono wpływ poniższego parametru DDL_LOCK_TIMEOUT, a także jako przykład podana była powyższa tabela STREAM, aktualna tabela STREAM nadal ma blokadę DML, w SESSION2 będzie DDL_LOCK_ TIMEOUT jest ustawiony na 60 sekund, następnie wykonywana jest operacja TRUNCATE, a niepowodzenie nie zostanie natychmiast zwrócone, lecz poczeka 60 sekund, a jeśli blokada DL tabeli STREAM nie zostanie zwolniona w ciągu 60 sekund, zwróci się niepowodzenie.
SESSION2 >alter sesja ddl_lock_timeout=60; Sesja zmieniona. SESSION2 >ustaw timing na strumień SESSION2 >tablicy obcięcia; --W tym momencie SESSION2 zawiesza, czeka, aż SESSION1 zwolni blokadę DML w ciągu 60 sekund, zwroty nie powiodły się po 60 sekundach strumień tabeli skracania * BŁĄD na linii 1: ORA-00054: zasób zajęty i nabytek z NOWAIT określonym lub timeout wygasł: Upływ: 00:01:00.01 Pojawienie się parametrów DDL_LOCK_TIMEOUT znacznie upraszcza działanie DBA, na przykład chcemy dodać pole do tabeli, ale ta tabela zawiera wiele operacji DML i nie możemy użyć metody ALTER SYSTEM KILL SESSION do zakończenia tych operacji, więc jeśli chcemy dodawać pola do tabeli, musimy wykonywać operację dodawania pól niezliczoną ilość razy lub napisać skrypty do wykonania tego zadania, i teraz mamy DDL_ LOCK_TIMEOUT parametrze wystarczy ustawić wartość tego parametru nieco większą i nie musimy się martwić o wykonywanie SQL, pokażmy ten proces poniżej.
SESSION2 dodaj pola:
SESSION2 >alter table stream add jpg_path varchar2(255) domyślnie '/home/Wyrocznia/'; 此时挂起,等待STREAM表的DML锁释放,SESSION1提交释放DML锁后,SESSION2操作便成功了。
SESSION1 >zobowiązuj się; Zobowiązanie zakończone. SESSION2 >alter table stream add jpg_path varchar2(255) domyślnie '/home/Wyrocznia/'; Table altered. SESSION2 >select * from stream; ID IDENTIFIER PIC_NO JPG_PATH ---------- --------------- ------ --------------- 1 18-0220-003 1 /home/Wyrocznia/ 2 18-0221-003 1 /home/Wyrocznia/ 3 18-0221-003 2 /home/Wyrocznia/ 4 18-0221-003 3 /home/Wyrocznia/ 5 18-0223-005 1 /home/Wyrocznia/ 6 18-0223-005 2 /home/Wyrocznia/ 7 18-0223-005 3 /home/Wyrocznia/ 8 18-0223-005 4 /home/Wyrocznia/ 9 18-0223-005 5 /home/Wyrocznia/ 10 18-0223-005 6 /home/Wyrocznia/ 10 rows selected.
|