Введение в СУБД учебный курс Сабитов Андрей Альбертович sabitov@sabitov.su, р.т. 326 94 81 Пирогов Сергей Анатольевич s.a.pirogov@gmail.com Новосибирский Государственный Университет Физический факультет, кафедра ФТИ Архитектура СУБД Oracle @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» Общая архитектура СУБД Oracle В рамках данного курса для общего знакомства с архитектурой современных реляционных СУБД будет рассмотрена СУБД Oracle – одной из популярных и производительный СУБД. Общая архитектура СУБД Oracle Клиент Сервер На рисунке схематично представлена общая архитектура СУБД Oracle: ● ● База данных ● Экземпляр @Сабитов А.А. & @Пирогов С.А. & @НГУ Клиентское приложение взаимодействует с серверным процессом в режиме запрос-ответ. Серверный процесс взаимодействует с базой данных и выполняет запрошенные клиентом операции. При обработке запроса данные кешируются в специальных областях памяти экземпляра. Фоновые процессы экземпляра обеспечивают функционирование базы данных (на рисунке не указаны, т. к. являются составной частью экземпляра). «Введение в СУБД» 3 Экземпляр Oracle: процессы SMON PMON RECO QMNn JobQueue System Global Area DBWn CKPT ARCH LGWR Экземпляр Oracle (Oracle instance) состоит из большой области оперативной памяти, называемой SGA (System Global Area), структура которой будет описана ниже и фоновых процессов, число и состав которых может варьироваться от настроек СУБД. Задача фоновых процессов – обеспечение функционирования внутренних механизмов СУБД. Процесс PMON – удаляет ненормально завершённые соединения; откатывает незаконченные транзакции; освобождает блокировки, принадлежащие завершённым процессам; освобождает ресурсы в SGA, аллоцированные аварийно закончившимся процессом; перезапускает аварийно закончившийся диспетчер или shared server. Процесс SMON – выполняет автоматическое восстановление экземпляра; объединяет смежные области свободного пространства в файлах данных; высвобождает пространство из под временных объектов. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 4 Экземпляр Oracle: процессы SMON PMON RECO QMNn JobQueue System Global Area DBWn CKPT ARCH LGWR Процесс RECO – автоматически очищает неудавшиеся и отложенные распределённые транзакции. Процесс QMNn – мониторинг очередей сообщений подсистемы Oracle Streams. Процесс JobQueue – планировщик выполнения команд по расписанию. Процесс LGWR – записывает информацию из буфера журнала во все копии текущего журнального файла на диске. Процесс ARCH – сохраняет резервную копию текущего журнального файла, сразу после того, как LGWR переключается на следующий журнальный файл. Процесс CKPT – обновляет заголовки файлов данных после установки контрольной точки. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 5 Экземпляр Oracle: процессы SMON PMON RECO QMNn JobQueue System Global Area DBWn CKPT ARCH LGWR Процесс DBWn – записывает блоки данных из кеша буферов SGA в файлы данных. Очень часто этот процесс в литературе называют DBWR. Запись блоков из кеша на диск может происходить по двум основным причинам: Для установки контрольной точки, т. е. для обновления блоков в файлах данных, с тем чтобы они «догнали» журнал. Oracle записывает в журнал информацию, необходимую для повторного выполнения транзакции, а позже сохраняет сами блоки. Периодически Oracle выполняет процедуру выставления контрольной точки, чтобы привести содержимое файлов данных в соответствие с информацией из журнала транзакций. Когда надо прочитать блоки данных с диска, а свободного места в SGA нет. Тогда на диск сбрасываются блоки данных по LRU-алгоритму. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 6 Экземпляр Oracle: SGA System Global Area Shared pool Shared SQL Cache Redo log buffer Database buffer cache Data Dictionary Cache Java pool System (Shared) Global Area — часть оперативной памяти компьютера, совместно используемая процессами СУБД Oracle. В UNIX-системах является разделяемой памятью (shared memory), за счет чего не подвержена механизму своппирования. Для получения аналогичного эффекта под Windows-системами SGA через специальные вызовы помечается «защёлками», запрещающими сбрасывать SGA на диск. Самой большой структурой в SGA является кеш блоков базы данных (database buffer cache), который содержит копии блоков данных, зачитанных с диска. Все пользователи, работающие в данный момент с базой данных, разделяют доступ к кешу блоков базы данных. Буфер журнала (redo log buffer) – буфер с информацией об изменениях в БД: все изменения записываются в буфер журнала. На его основе можно реконструировать изменения, сделанные в БД и сегменте отката, когда требуется восстановление. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 7 Экземпляр Oracle: SGA System Global Area Shared pool Shared SQL Cache Redo log buffer Database buffer cache Data Dictionary Cache Java pool Shared pool – область в SGA, состоящая из двух частей: Shared SQL Cache и Data Dictionary Cache. SQL-кеш (Shared SQL Cache) – область памяти содержащая: текст предложения SQL или PL/SQL, результат работы парсера для данного предложения и его план исполнения. Предложения в SQLкеше располагаются на основе хеш-функции. Т. о., предложения, полностью совпадающие по тексту будут отображаться на одну и ту же структуру, и повторной обработки предложения не будет. Кеш словаря базы данных (Data Dictionary Cache) – область памяти кеширующая обращения к словарю базы данных. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 8 Экземпляр Oracle: SGA System Global Area Shared pool Shared SQL Cache Redo log buffer Database buffer cache Data Dictionary Cache Java pool Рассмотренные области SGA являются ключевыми для понимания алгоритмов работы СУБД, но кроме них SGA содержит еще несколько структур, рассматриваться которые не будут. Например: ● Java pool, содержащий память выделенную JVM, которая работает с составе СУБД. ● Фиксированный пул, содержащий переменные, которые указывают на другие части SGA, а также переменные, содержащие значения различных параметров. ● Large pool, используемый Oracle Parallel Server. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 9 Экземпляр Oracle: файлы Oracle различает шесть типов файлов: ● ● ● ● ● Файлы параметров. Файлы данных, содержащие данные как таковые. Файлы журнала. Временные файлы, использующиеся для хранения временных объектов и при больших сортировках. Файлы паролей, использующиеся для аутентификации пользователей, выполняющих административные функции. К экземпляру Oracle относится только первая группа файлов, непосредственно определяющая параметры его работы, например, размер SGA. Все остальные файлы образуют базу данных Oracle. Наиболее интересны для нас файлы данных и файлы журнала, т. к. именно в них хранится информация. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 10 Экземпляр Oracle: структура БД Физическая структура базы данных: ● ● ● Для хранения объектов в файлах данных каждому объекту выделяется соответствующий сегмент. Для данных в таблице – сегмент данных, для индекса – индексный сегмент и т. д. Экстент – это непрерывный фрагмент пространства в файле. Каждый сегмент состоит, как минимум, из одного экстента. Если в сегменте не хватает пространства для размещения информации, выделяется следующий экстент. Блок – наименьшая единица выделения пространства в Oracle. Структура блока данных представлена на рисунке (на следующем слайде). Логическая структура базы данных: ● В рамках СУБД, контейнером для хранящихся объектов является табличное пространство. Любое табличное пространство строится либо на основе одного или нескольких файлов данных, расположенных на файловой системе, либо на «сырых» дисках, т. е. когда не форматированный раздел диска отдаётся Oracle'у для хранения данных. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 11 Экземпляр Oracle: блок БД Заголовок Блок базы данных имеет определённую структуру, показанную на рисунке. Каталог таблиц Каталог строк Свободное пространство Данные Заголовок блока содержит информацию о типе блока, о текущих и прежних транзакциях, затронувших блок, адрес блока на диске. Каталог таблиц содержит информацию о таблицах, строки которых хранятся в этом блоке (в случае кластера в блоке могут храниться строки из разных таблиц). Каталог строк содержит описание строк, хранящихся в блоке (это массив указателей на строки). Для каждого сегмента Oracle поддерживает списки занятых и свободных блоков: ● Если в блоке остаётся меньше свободного пространства, чем указано в параметре PCTFREE, блок помечается как занятый. ● Если из занятого блока удаляются данные, блок будет считаться занятым, пока размер данных не опустится ниже значения параметра PCTUSED. ● При необходимости параметры PCTFREE и PCTUSED можно указать явно при создании хранимых объектов. ● PCTFREE и PCTUSED – красные линии на рисунке. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 12 Экземпляр Oracle: блок ДБ PCTFREE и PCTUSED указываются в процентах, их сумма должна всегда быть меньше 100%. Зачем существует PCTFREE и почему заполнять блок данных «подзавязку» не самая хорошая идея? Допустим, в таблице есть колонка VARCHAR(1000), и в конкретной ячейке из данной колонки лежит строка '1'. Данная строка занимает один байт, и, формально, мы имеем право дописать в эту строку еще 999 байт. Что будет при этом, если места в блоке данных не хватит? В этом случае на месте строки оставляется специальный маркер с указанием нового месторасположения строки. Это приводит к дополнительным операциям ввода-вывода, что снижает производительность. Данное явление носит название миграции строк. Миграцию строк ни в коем случае нельзя путать с нормальным явлением под названием row chaining: в случае, если размер строки превосходит размер блока данных, Oracle разделит данные на несколько частей, и запишет данные в несколько блоков данных. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 13 Обработка DML команд Рассмотрим, как работает Oracle при обработке DML команд. Прежде всего! Транзакция в Oracle начинается с любой из команд: INSERT, UPDATE, DELETE, SELECT FOR UPDATE, MERGE, LOCK TABLE и заканчивается либо командами DDL, либо командами ROLLBACK/COMMIT. Допустим, выполняем операцию вставки данных. С диска в SGA будет поднят блок базы данных, в который будет выполнена вставка (записаны новые данные). Такой блок принято называть «грязным». Перед записью новых данных в блок, СУБД создаст записи в redo-журнале и в undo-сегменте. Первой будет достаточно, чтобы воспроизвести изменения повторно, а второй – для отмены изменений в случае отката транзакции. Вся информация при этом кешируется (и грязный блок и redo-, undo-записи). Если прямо после это случится крах системы, то всё хорошо – транзакция не закончилась, следовательно, при восстановлении мы должны ее откатить, но откатывать еще нечего, т. к. данные не были записаны. Если буферный кеш переполняется, и наш блок данных должен быть записан на диск: процесс DBWR, который должен записать «грязные» данные на диск даёт указание процессу LGWR записать на диск все redo-записи, связанные с нашим блоком данных. В том числе будут записаны redo-записи для undo-записей. Если в этот момент случится крах системы, то на основе redo-информации можно будет восстановить и «грязный» блок и undo-записи, с ним связанные. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 14 Обработка DML команд Аналогично выглядит работа и для остальных команд DML. Что будет при ROLLBACK? СУБД на основе undo-записей восстановит исходные значения блоков данных, и со временем они будут записаны в файлы данных. Redo-информация при этом вообще не затрагивается! А при COMMIT? Кеш redo-журнала будет записан на диск, а транзакция помечена как завершённая: ● Если при этом произойдёт крах, мы сможем восстановить транзакцию полностью. ● Если есть параллельные транзакции использующие старые данные, они будут брать их из undo-информации. ● По завершению всех транзакций, которые используют старые данные, undoинформация очищается. ● Новые данные из кеша данных будут записаны на диск «по случаю». @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 15 Серверный процесс Серверный процесс обеспечивает взаимодействие клиентской программы с СУБД. Для СУБД Oracle существует два режима серверных процессов: ● ● Выделенный (dedicated) сервер – в такой конфигурации для каждого входящего соединения со стороны клиентской программы СУБД порождает отдельный серверный процесс. Эта конфигурация используется при небольшом числе одновременных соединений. Разделяемый (shared) сервер – в такой конфигурации СУБД заранее порождает несколько серверных процессов, которые совместно обслуживают все входящие соединения со стороны клиентских программ. Эта конфигурация используется при большом числе одновременных соединений. @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 16 Архитектура СУБД PostgreSQL9.0 Любопытно, что архитектура СУБД PostgreSQL9.0 похожа на архитектуру СУБД Oracle. Очевидно, сходные технические требования приводят к сходным техническим решениям. Оригинал картинки: http://raghavt.blogspot.co.uk/2011/04/postg resql-90-architecture.html @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 17 Контрольные вопросы. Обсуждение ● Что такое SGA? ● Как выполняется транзакция? ● Какие курсоры называются параметризованными? ● Чем отличается серверны процесс от фонового? ● Что храниться в shared pool? ● Зачем нужен redo log? @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 18 Список литературы 1. Oracle® Database Concepts 11g Release 1 (11.1) Part Number B28318-05 2. Oracle® Database Administrator's Guide 11g Release 1 (11.1) Part Number B28310-04 3. Т. Кайт. «Oracle для профессионалов. Архитектура, методики программирования и основные особенности версий 9i и 10g.» // – M: Вильямс, 2007. – 848 c. 4. Oracle Internals: http://www.juliandyke.com/Presentations/Presentations.html @Сабитов А.А. & @Пирогов С.А. & @НГУ «Введение в СУБД» 19