Błąd w bazie Oracle

W konstruowanych dawno temu bazach danych Oracle mogą wystąpić problemy związane z dużym wzrostem wartości licznika SCN. Dostępne aktualizacje nie zawsze są skuteczne. Jak sobie z tym poradzić?

Istotą Oracle jest wykorzystywanie licznika zwanego System Change Number (SCN). Jest on swoistym znacznikiem czasu, służącym do określenia spójności danych, zwiększanym po każdej operacji, w tym także wewnętrznej. Gdy bazy danych są łączone między sobą, utrzymywanie spójności danych wymaga stałej synchronizacji do wspólnej wartości licznika SCN, najwyższej dostępnej pośród wszystkich połączonych baz. Do podwyższenia wartości tego licznika wystarczą podstawowe uprawnienia dostępu.

Główny licznik bazy

W praktyce w połączonych bazach wartość SCN zwiększa się o wiele szybciej niż w pojedynczej instancji. Architekci tworzący bazę Oracle przewidzieli, że SCN może być bardzo dużą liczbą - wybrali dla niej aż 48-bitową reprezentację całkowitą (281 474 976 710 656, czyli 2,81 x 10 ^ 14). W normalnych warunkach przekroczenie tej wartości byłoby wręcz niemożliwe (wymagałoby to ponad 350 tys. operacji na sekundę przez 25 lat ciągłej pracy). W mechanizmie bazy wprowadzone zostało jednak programowe ograniczenie, które w zamyśle konstruktorów miało zmniejszyć ryzyko niestabilności bazy w przypadku za wysokiej wartości SCN. Graniczna wartość odpowiada liczbie sekund od 1 stycznia 1988 przemnożonej przez 16 tys. operacji na sekundę. W praktyce tak eksploatowana baza nie istnieje, ale jeśli wystąpi błąd skutkujący radykalnym wzrostem wartości SCN, problem staje się realny. Po przekroczeniu wartości granicznej SCN baza staje się niedostępna lub niestabilna.

Błąd w bazie przyspiesza wzrost SCN

Przykładowo, taki błąd może wystąpić przy kopiowaniu plików. Oprogramowanie Oracle od dawna obsługuje wykonywanie kopii bezpieczeństwa plików bazy podczas jej pracy. Opcja ta jest często stosowana przez administratorów. Do tego celu można wykorzystać polecenie ALTER DATABASE BEGIN BACKUP lub odpowiednie narzędzia, także firm trzecich. Po zakończeniu kopiowania wydawane jest polecenie ALTER DATABASE END BACKUP, które przywraca normalny tryb pracy bazy.

Niestety, baza Oracle zawiera błąd, który objawia się radykalnym przyrostem wartości SCN po wydaniu komendy ALTER DATABASE BEGIN BACKUP. Nawet po zakończeniu kopiowania i przełączeniu bazy w normalny tryb pracy wartość SCN nadal szybko rośnie. Przeprowadzany w ten sposób gorący backup bazy może spowodować przyrost licznika SCN o miliony lub miliardy za każdym razem.

W większości przypadków limit wartości SCN jest na tyle wysoki, że okazjonalny szybki przyrost nie ma znaczenia, ale jeśli w środowisku firmy pracuje wiele baz, błąd zwiększa ryzyko problemów. Kolejno przeprowadzane operacje gorącego backupu za każdym razem podnoszą wartość SCN, która następnie jest synchronizowana do wszystkich połączonych ze sobą baz. Możliwy jest zatem wzrost rzędu bilionów miesięcznie, a nawet więcej. Dalszy przyrost jest możliwy w wyniku działań intruza, któremu wystarczy dostęp administracyjny do jednej z połączonych ze sobą baz, nawet jeśli link służy tylko do odczytu.

Co robić

Ponieważ nie ma możliwości zmniejszenia wartości SCN, to nawet odtworzenie z kopii bezpieczeństwa fizycznych plików dbf i odtworzenie danych z logów (RECOVER DATABASE) nie rozwiązuje problemu, gdyż każda taka transakcja wiąże się ze zwiększeniem SCN. Nawet odtworzenie do pewnej wartości w czasie (RECOVER DATABASE UNTIL TIME) tylko częściowo może pomóc przy usuwaniu problemu.

Należy zatem niezwłocznie zaaplikować aktualizację dostarczoną przez Oracle (poprawka błędu 12371955: "High SCN growth rate from ALTER DATABASE BEGIN BACKUP in 11g"), a następnie monitorować proces wzrostu SCN. Jeśli nie przekracza 16 tys. na sekundę, wszystko jest w porządku. Gdy jednak wzrost ten jest wyższy, należy zamknąć bazę do stanu SHUTDOWN i uruchomić ją ponownie. Jeśli firma korzysta z wielu baz, należy je zamknąć, wliczając serwery rezerwowe, repliki itp. Pozostawienie jednej z nich w stanie szybkiego wzrostu skutkuje radykalnym wzrostem SCN we wszystkich połączonych bazach. Wyłączenie baz umożliwia przedłużenie czasu pracy baz, by oddalić w czasie przekroczenie limitu SCN - na przykład wyłączenie na weekend umożliwi zyskanie około 10 mld kroków SCN.

Ponieważ wartości graniczne SCN są wysokie, ryzyko problemów w małych firmach jest niewielkie, ale w dużych instalacjach, gdzie występuje wiele baz, ryzyko to znacząco wzrasta. Takie firmy nie zdecydowałyby się jednak na wyłączenie baz na weekend z przyczyn biznesowych. Co mogą zatem zrobić?

Aktualizacja dostarczona przez Oracle podwyższa wartość graniczną, sprawiając, że teraz wynosi ona 32 768 razy liczba sekund od 1 stycznia 1988, przy czym wartość mnożnika może być zdefiniowana przez administratora. Problemem nadal pozostają starsze bazy, dla których Oracle nie dostarczy aktualizacji.

Aby wyzerować SCN, należy przeprowadzić ręcznie eksport danych za pomocą starego narzędzia exp, wykreować nową instancję, a następnie zaimportować bazę do nowej instancji za pomocą opcji imp, a starą instancję trzeba usunąć. Jeśli IT wykorzystuje wiele połączonych baz, proces ten musiałby być przeprowadzony na każdym z węzłów, co w przypadku baz o rozmiarach liczonych w terabajtach zajmuje dużo czasu i wymaga dużego wysiłku administratorów.