Oracle DBA
Досега в тази глава бяхте запознати с компонентите на системата от бази данни Oracle, необходимите файлове и разпределението на паметта и как да ги конфигурирате. Сега е време да разгледаме как Oracle обработва потребителските заявки и как прави промени в данните. Важно е да се разбере механизмът за обработка на SQL транзакции, тъй като цялото взаимодействие с базата данни на Oracle се осъществява или под формата на SQL заявки, които четат данни, или SQL (или PL/SQL) операции, които променят, вмъкват или изтриват данни.
Транзакцията е логическа единица работа в база данни на Oracle, състояща се от един или повече SQL изрази. Транзакцията започва при първия изпълнен SQL оператор и завършва, когато извършите или прекратите транзакцията. Извършването на транзакция ангажира вашите промени и връщането назад, разбира се, ги отменя. След като извършите транзакция, всички други транзакции на други потребители, които са започнали след нея, ще могат да видят промените, направени от вашите транзакции.
Когато дадена транзакция изобщо не може да завърши (да речем, поради прекъсване на захранването), тогава цялата транзакция трябва да бъде върната назад. Oracle връща всички промени, направени от предишни SQL изрази, връщайки данните в първоначалното им състояние (както е било преди началото на транзакцията). Целият процес е предназначен да поддържа целостта на данните - т.е. концепцията "всичко или нищо".
Следният прост пример за вмъкване на ред описва как Oracle обработва транзакция.
Комитиране и връщане назад
Трябва да сте наясно с два основни термина по отношение на транзакциите: ангажиране и връщане назад на транзакции. И двата термина са обяснени накратко по-долу.
Извършване на транзакция
Когато извършите транзакция, да речем с оператор COMMIT, Oracle прави всички промени, направени от всички SQL изрази в тази транзакция, постоянна част от базата данни. Преди Oracle да ангажира резултатите от транзакция, той прави следното.
- Генерира информация за отмяна, която се състои от стойностите на данните, които трябва да бъдат модифицирани, преди промените. Тези данни се съхраняват в сегмента за отмяна, разположен в табличното пространство за отмяна.
- Той също така генерира данни за повторение, съдържащи промени в блокове с данни и блокове за връщане към буфера на журнала за повторение. Базата данни може да запише съдържанието на буферите на журнала за повторение на диска, преди да извърши транзакции.
- Прави промени в буферите на базата данни, намиращи се в SGA. Базата данни може да запише модифицирани буфери на диска, преди да извърши транзакцията.
Базата данни може да запише първите промени на транзакцията от буферите на базата данни в SGA във файловете с данни веднага или известно време след извършването на транзакцията или дори преди да бъде ангажирана. Когато базата данни извърши транзакция, тя прави следното:
- Базата данни присвоява и записва SCN за ангажираната транзакция.
- Регистраторът записва записите в журнала за повторение в журналния файл за повторение на диска от буфера за журнал за повторение в SGA: той също така записва SCN на транзакцията в журналния файл за повторение, като по този начин маркира официалното ангажиране на транзакцията.
- Базата данни освобождава всички блокировки на таблици и редове.
- Базата данни маркира транзакцията като завършена.
Отмяна на транзакция
Отмяна на промените, направени от транзакция, която все още не е извършенафиксиран с помощта на командата ROLLBACK. Докато журналът за повторение съдържа всички промени, направени в транзакцията, сегментът за отмяна съдържа всички стари стойности, които са съществували преди промените да бъдат направени. Можете или да отмените промените, направени от цялата транзакция, или просто да се върнете към токен, който сте поставили по-рано в транзакцията, наречен точка за запазване. Има няколко вида връщане назад, сред които са изброени по-долу:
- Връщането, поискано от потребителя.
- Връщане назад, възникнало поради необичайно прекъсване на процес или екземпляр.
- Отмяна на неизвършени транзакции по време на възстановяване.
- Връщане назад на ниво израз, възникнало поради грешка при изпълнение на този оператор.
Независимо от причината за връщането назад, процедурата винаги е една и съща.
- Базата данни използва данните, каквито са били преди промяната в табличното пространство за отмяна, за да отмени всички промени, направени по време на транзакцията.
- Базата данни освобождава всички блокировки на транзакции и таблици.
- Базата данни завършва транзакцията
Цялост на данните и паралелизъм на данните
Базата данни не би била много полезна, ако множество потребители не могат да имат достъп и да променят данните едновременно. Паралелността на данните е способността на базата данни да осигурява паралелен достъп за множество потребители. За да осигури последователни резултати, базата данни се нуждае от механизъм, който да гарантира, че потребителите няма да се натъкнат на промените един на друг. Целостта на данните е способността на потребителя да получи последователен изглед на данните, включително всичкипромени, направени в тях от други потребители.
Oracle използва заключващ механизъм, за да осигури едновременност на данните. Като позволява на един потребител да заключва отделни редове или цели таблици, това гарантира на този потребител изключителното използване на таблицата за целите на актуализирането. Важна характеристика на заключващите механизми на Oracle е, че те са предимно автоматични. Не е нужно да се притеснявате за детайлите на заключването на обектите, които искате да модифицирате - Oracle се грижи за това зад кулисите.
Заключванията на Oracle са сложни и ще научите за тях подробно в Глава 8, заедно с това как Oracle налага последователност и паралелност на данните.
Писател на бази данни и протокол за предварително записване
Когато потребител извърши транзакция, процесът на запис на журнал незабавно записва ангажимента в регистрационните файлове за повторение. Пълният набор от записи, засегнати от ангажирана транзакция, може да не бъде записан във файловете с данни едновременно. Механизмът за бързо записване, заедно с регистрационния файл за предварително записване, гарантира, че базата данни не трябва да чака всички физически записи да завършат след всяка транзакция. Както можете да си представите, огромни OLTP бази данни с многобройни промени през деня не биха могли да функционират оптимално, ако трябваше да записват на диска след всяка извършена промяна на данните.
При наличието на огромен брой транзакции и, като резултат, огромен брой заявки за ангажиране, процесът на писане на журнал може да не запише веднага всяка ангажирана транзакция в журнала за повторение. Може да натрупа няколко заявки за ангажиране, ако е много зает в момента. Така опакованзаписването на информация за набор от ангажирани транзакции се нарича групово ангажиране.
Номер на системна промяна
Номерът на системната промяна или SCN (номер на системната промяна) е важен фактор за оценяване, използван от базата данни на Oracle за проследяване на състоянието във всеки един момент. Когато ИЗБИРАТЕ данни в таблици, вие не засягате състоянието на базата данни, но когато модифицирате, вмъкнете или изтриете ред, състоянието на базата данни е спрямо това, което е било преди операцията. Oracle използва SCN, за да следи всички промени, направени в базата данни с течение на времето. SCN е логическо времево клеймо, използвано от Oracle за подреждане на събитията, които се случват в базата данни. SCN е много важен поради няколко причини, не на последно място е възстановяването при срив на базата данни.
SCN са като нарастващи поредни номера и Oracle ги увеличава първо в SGA. Когато транзакция модифицира или вмъква данни, Oracle първо записва нов SCN в сегмента за връщане назад. След това процесът на записване на журнал незабавно записва ангажимента на транзакцията в журнала за повторение и на ангажимента се присвоява уникален SCN в сегмента за връщане назад. След това процесът на записване на журнал незабавно записва ангажимента на транзакцията в журнала за повторение и този запис получава уникалния SCN на новата транзакция. Всъщност записването на този SCN в журнала за повторение маркира извършена транзакция в базата данни на Oracle.
SCN помага на Oracle да определи дали е необходимо възстановяване след срив, след внезапно прекъсване на екземпляр на база данни или след подаване на команда SHUTDONW ABORT. Всеки път, когато базата данни извършва операция на контролна точка, Oracle записва команда START SCN в заглавките на файла с данни.Контролният файл поддържа SCN стойност за всеки файл с данни, наречена STOP SCN, която обикновено е настроена на безкрайност и всеки път, когато екземплярът е спрян нормално (чрез командата SHUTDOWN NORMAL или SHUTDOWN IMMEDIATE). Oracle копира START SCN в заглавките на файла с данни в STOP SCN за файловете с данни в контролния файл. Когато рестартирате базата данни след успешно изключване, няма нужда от възстановяване, тъй като SCN във файловете с данни и контролните файлове съвпадат. От друга страна, внезапното прекъсване на екземпляра не оставя време за съгласуване на SCN и Oracle намира за необходимо да възстанови екземпляра, тъй като SCN се различават във файловете с данни, от една страна, и контролния файл, от друга. Те играят ключова роля при възстановяването на база данни. Oracle определя колко да се върне назад, като използва архивирани журнали за повторение по време на базирани на SCN възстановявания.
Управление на анулиране
Когато правите промени в база данни, трябва да можете да отмените или върнете промяната, ако е необходимо. Информацията, необходима за отмяна или връщане назад на промените в транзакция, която се състои главно от информация от таблица преди промяната, се нарича данни за отмяна (вектори за промяна) и се съхранява в записи за отмяна. Когато издава команда ROLLBACK, Oracle използва тези записи за отмяна, за да замени променените данни с оригиналните им версии. Записите за отмяна са жизненоважни за възстановяването на базата данни, когато чакащите или неизпълнените транзакции трябва да бъдат върнати, за да остави базата данни в последователно състояние.
Oracle силно препоръчва използването на инструмент за автоматизирано управлениепромени (Automatic Undo Management - AUM), при които самият сървър на oracle ще поддържа и управлява сегменти за отмяна (връщане назад). Всичко, което трябва да направите, е да предоставите разпределеното таблично пространство за отмяна и да зададете опцията за инициализация UNDO_MANAGEMENT на auto. Oracle ще създаде необходимия брой сегменти за отмяна, които са структурно подобни на традиционните сегменти за връщане назад, и ще ги разшири, ако е необходимо. Не е необичайно да се създават нови сегменти за отмяна и да се деактивират стари въз основа на броя транзакции в базата данни.
Тъй като Oracle управлява размера на отделните сегменти за отмяна, двете решения, които трябва да вземете, са размера на пространството за таблици за отмяна и настройката на параметъра за инициализиране UNDO_RETINTION (който определя колко дълго Oracle ще се опитва да запази записи за отмяна вместо вас в пространството за таблици за отмяна). Не забравяйте, че табличното ви пространство за отмяна трябва не само да побира всички дълготрайни транзакции, но и да е достатъчно голямо, за да позволи на всички ретроспективни функции, които можете да внедрите във вашата база данни, да работят; Инструментите за ретроспекция на Oracle ви позволяват да отмените промените в данните на различни нива. Някои от тях, като Flashback Query, Flashback Versions Query и Flashback Table използват данни за отмяна.
Можете да използвате съветника за отмяна на Oracle чрез OEM, за да намерите идеалния размер на табличното пространство за отмяна и идеалната продължителност за указване на опцията UNDO_RETENTION. Използвайки текущата статистика за използване на пространството за отмяна, можете да прецените оптималните опции за генериране на отмяна за вашето копие.