Экземпляр базы данных (Database Instance) Oracle представляет собой совокупность сложного комплекса взаимодействующих процессов и определенных структур оперативной памяти. Каждая база данных Oracle имеет связанный с ней экземпляр, причем до тех пор, пока не будут использоваться опции Oracle Parallel Server, для базы данных формируется только один экземпляр. Организация экземпляра позволяет СУБД обслуживать множество типов транзакций, инициируемых одновременно большим количеством пользователей, и в то же время обеспечивать высокую производительность, целостность и безопасность данных.
Процессы экземпляра. Все процессы, работающие с базой данных Oracle, можно разделить на две группы: системные процессы и пользовательские процессы. Системные процессы Oracle делятся на две категории: серверные процессы и фоновые процессы. Пользовательские процессы запускаются пользователями базы данных, которые для осуществления доступа к базе данных используют прикладные средства Oracle, такие как, например, интерактивную среду SQL*Plus, генератор отчетов Oracle Reports, генератор форм Oracle Forms, или различные прикладные программы. Каждый процесс пользователя подключается к процессу сервера, который либо может быть жестко связан с одним процессом пользователя, либо разделяться между многими пользовательскими процессами. Серверный процесс анализирует и выполняет переданные ему операторы SQL и возвращает результаты пользовательскому процессу. Кроме того, серверный процесс считывает блоки данных из файлов данных и размещает их в кэш-буфере данных. Фоновые процессы Oracle работают в фоновом режиме. Они выполняют различные функции, необходимые для поддержания работы базы данных, а также осуществляют асинхронный ввод-вывод данных. Фоновые процессы делятся на обязательные процессы и необязательные.
Обязательные фоновые процессы присутствуют в любой конфигурации экземпляра Oracle и к ним относятся четыре процесса.
Процесс DBWR (Database Writer), осуществляющий запись модифицированных блоков данных из кэш-буфера данных обратно в базу данных.
Процесс LGWR (Log Writer), осуществляющий запись информации из буфера журнала транзакций, расположенного в оперативной памяти, в оперативные файлы журнала транзакций.
Процесс SMON (System Monitor) – системный монитор, осуществляющий мониторинг экземпляра базы данных.
Процесс PMON (Process Monitor) – монитор процессов, контролирующий процессы экземпляра.
Опишем необязательные фоновые процессы.
CKPT (Checkpoint Process) – процесс контрольной точки. Он обрабатывает событие “контрольная точка”, возникающее в системе при определенных условиях.Этот процесс может присутствовать в любой конфигурации экземпляра Oracle.
ARCH (Archiver) – процесс записи журнала архива. Он обеспечивает копирование оперативных файлов журналов транзакции в архивные файлы при их заполнении. Этот процесс может присутствовать в любой конфигурации экземпляра Oracle.
Dnnn (Dispatcher), n=0, 1, …, 9, – процессы-диспетчеры. При обслуживании пользовательских процессов разделяемыми серверными процессами, одним или несколькими, они выполняют синхронизацию взаимодействия серверных и пользовательских процессов.
RECO (Recoverer) – процесс восстановления. Он отвечает за восстановление незавершенных транзакций в распределенной базе данных в конфигурация экземпляра Oracle Distributed.
SNPn (Snapshots Process), n=1, 2, …, 9, A, …, Z, – эти процессы используются для получения снимков удаленных баз данных в случае распределенной базы данных в конфигурация экземпляра Oracle Distributed.
LCKn (Parallel Server Lock Process), n=0, 1, …, 9, – процессы блокировки. Эти процессы в конфигурации экземпляра Oracle Parallel Server отвечают за координацию блокировок базы данных, устанавливаемых различными экземплярами Oracle.
Pnnn, n=0, 1, …, 9, – процессы параллельных запросов. Эти процессы используются в конфигурации экземпляра Oracle Parallel Query для обслуживания параллельно выполняемых частей запросов.
Структуры памяти экземпляра. Рассмотрим используемые в системе структуры памяти.Каждому пользовательскому процессу выделяется область памяти, которая называется глобальной областью процесса (process global area) и сокращенно обозначается PGA. Содержимое PGA зависит от режима подключения пользовательского процесса к процессу сервера. Если пользовательский процесс взаимодействует с выделенным серверным процессом, то в PGA размещается информация о текущем сеансе работы пользователя, стек и информация о состоянии курсора. Информация о текущем сеансе, в свою очередь, включает данные, необходимые для системы обеспечения безопасности, и данные об используемых ресурсах. В стеке содержаться локальные переменные, а в области состояния курсора – текущая информация о положении курсора, возвращаемые строки и возвращаемый код курсора. Если же пользовательский процесс связан с разделяемым серверным процессом, то информация о текущем сеансе и текущем состоянии курсора хранится в глобальной системной области.
Кроме того, для всех процессов выделяется общая область памяти, которая называется глобальной областью системы (system global area – SGA). В SGA хранятся структуры памяти, необходимые для манипулирования данными, анализа предложений SQL и кэшированием транзакций. Эта область – разделяемая, т.е. к ней одновременно имеет доступ множество процессов, которые могут считывать и модифицировать содержащиеся в ней данные.
Глобальная область системы состоит из следующих компонентов:
1) разделяемый пул (shared pool);
2) кэш-буфер базы данных (database buffer cache);
3) буфер журнала транзакций (redo log buffer);
Кратко опишем назначение каждого из этих разделов глобальной области системы.
Разделяемый пул кэширует информацию, используемую при разборе и выполнении операторов SQL. Разделяемый пул содержит два основных раздела: кэш библиотек и кэш словаря данных.
Кэш библиотек хранит текст SQL-выражений, форматы лексического анализатора и план выполнения предложений SQL. Кроме того, здесь же содержатся заголовки пакетов PL/SQL и процедур, которые могут совместно использоваться пользовательскими процессами. Сервер Oracle использует кэш библиотек для повышения скорости выполнения операторов SQL. Когда передается очередное SQL-выражение, сервер, в первую очередь, просматривает кэш в поисках такого же выражения, переданного ранее. Если оно найдено, то используется соответствующее ему дерево лексического анализа и план выполнения запроса, что избавляет от необходимости формировать их повторно. Кэш-библиотек содержит и разделяемые области SQL, и локальные области SQL. Разделяемая область SQL включает дерево лексического анализа и план выполнения SQL-выражения, а локальная область – информацию, зависящую от текущего сеанса работы. Это могут быть присоединенные переменные, параметры окружения, стеки и буферы, необходимые при выполнении. Локальная область формируется для каждой инициируемой транзакции и освобождается после того, как закрывается соответствующий курсор. Используя эти структуры памяти, сервер Oracle может повторно использовать информацию, общую для всех выражений SQL, а информация, специфичная для данного сеанса, может быть выбрана из локальной области. Локальная область SQL делится в свою очередь на переходящую (persistent) область и область времени выполнения (runtime). При этом переходящая область содержит информацию, которая сохраняет свое значение и может быть использована несколькими выражениями SQL, а область времени выполнения – только информацию для выражения, выполняемого в текущий момент.
Кэш словаря – хранит строки словаря данных, которые были использованы для лексического анализа SQL-выражений. В этой области находятся данные, касающиеся сегментирования, привилегий доступа и размеров свободной памяти. При запуске экземпляра он загружается некоторым начальным набором элементов и в процессе работы пополняется необходимыми данными из словаря.
Кэш-буфер данных состоит из буферов базы данных и хранит информацию, загружаемую из базы данных серверными процессами. Все модификации над данными реализуются в кэш-буфере. Имеется список, отслеживающий частоту обращений к хранящимся в кэш-буфере блокам данных. Сервер переносит данные на диск в соответствии с порядком их размещения в списке LRU(Least Recently Used, дословно – наиболее давно использовавшиеся). Этот список отслеживает обращение к блокам данных и учитывает частоту обращений. Когда выполняется очередное обращение к блоку данных, хранящемуся в кэш-буфере, он помещается в тот конец списка, который называется MRU (Most Recently Used – только что использованные). Если серверу требуется место в кэш-буфере для загрузки нового блока с диска он обращается к списку LRU и решает, какой из блоков перенести на диск, чтобы освободить место для нового блока. Блоки, наиболее удаленные в списке от MRU, самые вероятные кандидаты на удаление из кэш-буфера. Таким образом, дольше всего остаются в кэш-буфере те блоки, к которым обращение выполняется чаще всего. Модифицированные блоки называются “грязными” (dirty) и помещаются в соответствующий dirty-список. В этом списке отслеживаются все модификации блоков данных, выполненные за время их нахождения в кэш-буфере и не зафиксированные на диске. Когда Oracle получает запрос на изменение данных, соответствующие изменения выполняются в области кэш-буфера, а сведения об изменениях в блоках заносятся в dirty-список; одновременно данные о выполненных операциях вносятся в журнал транзакций. В дальнейшем при обращении к блокам данных, попавшим в dirty-список, будут считываться уже модифицированные значения, хотя сами данные могут к этому времени еще не быть записаны на диск. Сервер использует отложенную многоблочную процедуру записи на диск с целью повышения производительности. Отложенная означает, что обновление данных, выполненное Oracle, не фиксируется немедленно в дисковой памяти. Перенос этих dirty-блоков назад в базу данных осуществляется процессов DBWR при наступлении одного из определенных событий, таких как, например “контрольная точка”, “выгрузка файла” и так далее.
Буфер журнала транзакций. Данные о транзакциях хранятся в буфере журнала транзакций до тех пор, пока не будут переписаны в оперативный файл журнала транзакций. Это типичный циклический буфер – он заполняется от начала до конца, и затем новая информация снова записывается в начало буфера. После заполнения содержимое буфера процессом LGWR переносится в оперативный файл журнала транзакций. Для того чтобы гарантировать последовательный характер записи в буфер журнала, сервер Oracle управляет доступом к нему при помощи защелок (latch). Такая защелка представляет собой не что иное, как блокировку процессом Oracle некоторой структуры в памяти – аналогично блокировке файла или строки таблицы. Процесс блокирует посторонние обращения к памяти, выделенной для буфера журнала транзакций. Таким образом, если один процесс наложил защелку на буфер, другие не могут обратиться к нему до тех пор, пока защелка не будет снята. Сервер Oracle ограничивает количество транзакций, данные о которых заносятся в журнал одновременно.