Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Базы данных. Лекции по курсу. В 4 частях. Ч.4. Учебное пособие

.pdf
Скачиваний:
0
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
данных с момента создания последней резервной копии. Журнал тран­закций необходим для восстановления изменений в базе данных после резервной копии.
Как часто следует проводить резервное копирование? Ответ на этот во­прос зависит от многих факторов. Для небольшой базы данных можно со­здавать полную резервную копию несколько раз в день без ущерба
для пользователей. Для больших и интенсивно использующихся баз данных полное резервное копирование проводят один-два раза в неделю и допол­няют ежедневными дифференциальными или инкрементальное копиями.
5.2.2. ЖУРНАЛИЗАЦИЯ. ВОССТАНОВЛЕНИЕ ДАННЫХ
Одной из функций СУБД является надежное хранение данных. Под надежностью хранения понимается способность СУБД восстано­вить последнее согласованное состояние базы данных после любого ап­паратного или программного сбоя.
Наличие буферного кеша СУБД, а также других буферов в опера­тивной памяти увеличивает производительность, но уменьшает надеж­ность. При сбое питания или СУБД
содержимое буферного кеша в опе­ративной памяти пропадает и данные, измененные и находящиеся в бу­фере, но еще не записанные на диск, теряются. Это недопустимо и про­тиворечит свойству долговечности транзакций.
Поэтому для восстановления базы данных нужно располагать некото­рой дополнительной информацией (избыточностью), и эта информация должна храниться особо надежно.
Методом поддержания такой избыточ­ной информации является аппарат журнализации изменений базы дан­ных. В процессе работы СУБД постоянно помещает записи в журнал транзакций, позволяющий в случае необходимости повторно выполнить потерянные операции и восстановить данные в согласованном состоянии.
Журнализация изменений – функция СУБД, обеспечивающая восста-
новление базы данных в предыдущее согласованное состояние в
случае логических или физических отказов. Журнал (log) – особая часть базы данных, недоступная пользователям и поддерживаемая с особой тща­тельностью (иногда поддерживаются две копии журнала, располагае­мые на разных физических дисках), в которую поступают записи обо всех изменениях основной части базы данных. Журнал транзакций за­щищает все объекты, работа с которыми
ведется в оперативной памяти:
таблицы, индексы и другие объекты, статус транзакций.
61
При выполнении любой операции формируется запись журнала, со­держащая минимально необходимую информацию для того, чтобы опе­рацию можно было выполнить повторно. Такая запись должна попасть в журнал во внешней памяти раньше, чем будут записаны изменяемые операцией данные в таблицы. Только после этого информация об изме­нениях переносится из оперативной во внешнюю
память в таблицы дан­ных (протокол Write Ahead LogWAL). По журналу можно восстано­вить базу данных после сбоя.
Однако в журнал транзакций не попадают данные о временных таб- лицах (такие таблицы доступны только создавшему их пользователю и только на время сеанса или транзакции) и о нежурнализируемых табли- цах (такие таблицы ничем
не отличаются от обычных, кроме того, что
не защищены журналом).
Журнал транзакций содержит копию каждой записи или страницы базы данных перед ее изменением (исходные образы) и копии всех за­писей после их изменения (конечные образы данных). В записи журнала хранятся:
порядковый номер;
идентификатор транзакции;
тип операции;
объект
изменений;
указатель вперед;
указатель назад;
старое значение (исходный образ);
время начала и завершения.
Ниже приведен пример содержимого журнала транзакций.
Иденти-
п/п
фикатор
1 ОТ1 0 2 9:12 START 2 ОТ1 1 4 9:13 UPDATE Заказчик Ста-
3 ОТ2 0 8 9:16 START
Указа-
тель
назад
Указа-
тель
вперед
Время Операция
Объект
измене-
ний
Ста-
значе-
рое значе­ние
рое
ние
Новое значе-
ние
Новое значе­ние
62
Окончание таблицы
Иденти-
п/п
фикатор
4 ОТ1 2 5 9:17 UPDATE Товар 10 Ста-
5 ОТ1 4 7 9:17 INSERT Заказ 12 Значе-
6 КТ1 0 9 9:18 START 7 ОТ1 5 0 9:19 COMMIT 8 ОТ2 3 0 9:20 COMMIT 9 КТ1 6 10 9:21 UPDATE Заказ 85 Ста-
10 КТ2 9 0 9:21 COMMIT
Указа-
тель
назад
Указа-
тель
вперед
Время Операция
Объект
измене-
ний
Ста-
значе-
рое значе­ние
рое значе­ние
рое
ние
Новое значе-
ние
Новое значе­ние
ние
Новое значе­ние
В приведенных обозначениях START – начало транзакции, COMMIT – ее окончание, INSERT, UPDATE, DELETE – действия тран­закции. Все операции каждой транзакции связаны между собой указате­лями. Например, в строке 7 транзакция ОТ1 ссылается на строку 5, ко­торая является предыдущим действием этой транзакции. Указатель впе­ред ссылается на следующее изменение, выполненное данной транзак­цией.
В строке 4 указатель вперед указывает на строку 5. Нуль в поле
указателя означает конец списка.
Как вы понимаете, объем журнала транзакций за время работы сер­вера может достигнуть гигантских размеров. Хранить его целиком и просматривать при сбое совершенно нереально. Для уменьшения вре­мени на повторное выполнение транзакций используют контрольные
точки (КТ – checkpoint
). Это точка времени синхронизации между базой
данных и журналом транзакций. Для создания контрольной точки СУБД несколько раз в час прерывает обработку текущих запросов, принуди­тельно сбрасывает на диск все буферы с данными, включая буферы, в которых хранится состояние транзакций (рис. 5.1). Это гарантирует, что изменения всех транзакций до момента контрольной точки
63
находятся на диске. В журнале транзакций делается запись о контроль­ной точке.
Рис. 5.1. Использование аппарата контрольных точек
Процесс создания контрольной точки может занимать много вре­мени, но при этом резко сокращает время на восстановление данных в случае сбоя. Собственно, «точка», о которой говорится, – это начало процесса, но точка считается выполненной только после того как запи­саны все буферы с данными, которые имелись на момент начала про­цесса.
Таким
образом, использование журнала транзакций гарантирует по­падание на диск всех изменений до контрольной точки, а использование аппарата контрольных точек ограничивает размер журнала транзакций.
Во второй части курса лекций отмечалось, что различают:
так называемые мягкие сбои, характеризуемые потерей одной или нескольких транзакций, но физически не разрушающие базу данных си­стемы
в целом (например, в случае аварийного выключения питания);
жесткие сбои, характеризуемые потерей информации на носите- лях внешней памяти.
При жестком сбое используется метод наката (rollforward), при мягком – метод отката (rollback).
В случае мягкого сбоя СУБД проверяет журнал транзакций и запус­кает процесс восстановления, начиная с последней контрольной точки. Процесс
восстановления состоит из двух этапов: повторного выполне­ния завершенных транзакций (REDO) и отмены незавершенных (UNDO). В первом случае повторно выполняются транзакции, сведения о кото­рых записаны в журнал транзакций, но изменения не внесены в область данных. Во втором случае изменения, выполненные незавершенной транзакцией, о чем можно судить по записям в
журнале транзакций, от-
меняются – происходит откат транзакции.
64
Решение вопроса о том, какую транзакцию следует отменить, а ка­кую выполнить повторно, при перезагрузке системы после мягкого сбоя заключается в следующем. На рис. 5.2 показаны пять возможных вари­антов выполнения транзакций до аварийного сбоя системы.
Рис. 5.2. Пример анализа транзакций
Очевидно, что при перезагрузке системы транзакции T3 и T5 должны быть отменены (они еще не закончились); транзакции T2 и T4 – выпол­нены повторно (не закончились до КТ), а транзакции типа T1 вообще не включаются в процесс перезагрузки, так как обновления попали в БД еще до момента T
, т. е. зафиксированы еще до КТ.
c
Алгоритм восстановления выглядит следующим образом.
1.  Создаются два списка транзакций: UNDO (отменить) и REDO (по-
вторить). В список UNDO заносятся все транзакции, выполняющиеся в момент T
(Т2, Т3), а список REDO остается пустым.
c
2.  Осуществляется поиск в журнале транзакций, начиная с записи
контрольной точки.
3.  Если в журнале транзакций обнаружена запись Begin Transaction о начале транзакции T, то эта транзакция также добавляется в список UNDO (T4 и T5).
4.  Если в журнале транзакций обнаружена запись Commit об окон-
чании
транзакции T, то эта транзакция добавляется в список REDO
(T2 и T4) и исключаются из UNDO.
5.  Когда достигается конец журнала транзакций, в REDO остаются T2 и T4, в списке UNDO остаются T3 и T5.
6.  После этого система просматривает журнал транзакций, отменяя
транзакции из списка UNDO, а затем просматривает снова вперед, по­вторно выполняя транзакции
из списка REDO.
65
При восстановлении после жесткого сбоя используется метод
наката (rollforward): cначала база данных восстанавливается до состо-
яния, сохраненного в резервной копии. После этого выполняются все правильные (зафиксированные) изменения в базе данных по журналу транзакций, как описано выше.
5.2.3. АУДИТ БАЗЫ ДАННЫХ
Угроза безопасности данных может исходить как от неавторизован­ных, так и от авторизованных пользователей базы данных. Это могут быть и злоумышленники извне, пытающиеся получить доступ к дан­ным, и несанкционированные действия работающих или ранее работав­ших сотрудников. Поэтому отслеживание информации о том, кто, когда и какие действия выполнял с базой данных
, очень важно, поскольку поз­воляет вовремя обнаружить и предотвратить инцидент либо расследо­вать его. Одним из способов сбора и накопления такой информации яв­ляется аудит баз данных.
Аудит базы данных – процедура выявления некорректных или неав­торизованных действий пользователей. Все коммерческие СУБД имеют специальные средства аудита базы данных, позволяющие отслеживать все
выполняемые операции в базе данных и связывать каждую опера­цию с определенным пользователем и определенным сеансом работы. Хранится эта информация в специальных контрольных журналах. Эти журналы используются для обнаружения источника нарушений безопасности системы.
К базовым методам аудита относят:
трассировку; анализ журналов транзакций;  мониторинг работы сервера и сетевого трафика
сервера баз дан-
ных.
К числу протоколируемых событий в методе трассировки относятся:
аутентификация пользователей (как успешная, так и неудачная); предоставление прав доступа к базе данных;  создание, изменение и удаление объектов базы данных, вставка,
редактирование и удаление данных;
нарушения ссылочной целостности при модификации данных;  выполнение хранимых
процедур;
66
попытки осуществить потенциально опасные операции без нали-
чия соответствующих прав;
различного рода исключительные ситуации и ошибки в работе
программного обеспечения.
Недостатком метода трассировки является снижение производи-
тельности в нагруженных системах.
Каждая современная СУБД использует журналы транзакций для ре­гистрации всех изменений в базе данных с целью восстановления. Жур­налы
транзакций могут быть также использованы для интерпретации и анализа, чтобы определить, какие данные были изменены, когда и ка­кими пользователями.
В случае аудита, основанного на мониторинге сервера баз данных, перехват и анализ SQL-инструкций выполняются не на уровне сети, а непосредственно на уровне сервера. Этот подход позволяет отслежи­вать все SQL-инструкции,
выполняемые ядром СУБД. Такой подход не влияет на производительность системы и допускает гибкую настройку аудита на уровне определения интересующих инструкций.
5.3. ЗАЩИТА ДАННЫХ СРЕДСТВАМИ ЯЗЫКА SQL
К этой группе средств защиты можно отнести представления, хра-
нимые процедуры и функции, триггеры.
5.3.1. ПРЕДСТАВЛЕНИЯ
Представления – это виртуальные таблицы, с помощью которых действительная структура базы данных может быть скрыта от тех или иных групп пользователей. В результате некоторые пользователи не бу­дут иметь сведений о таблицах, атрибутах или строках таблиц, которые недоступны через данное представление. Применение представлений позволяет предоставить каждому пользователю или группе пользовате­лей
ограниченный набор данных, скрывая поля и записи с конфиденци­альной информацией. Тем самым ограничивается доступ к данным на уровне записей, в дискреционной модели разграничения доступа. Раз­решение на доступ к представлению должно быть явно предоставлено или отозвано, независимо от прав доступа к таблицам, из которых оно строится, реализуя тем самым принцип
минимальных привилегий.
67
Представления создаются оператором языка SQL CREATE VIEW
и широко используются в многопользовательских СУБД MS SQL
Server, DB2, Oracle, PostgreSQL.
С помощью представлений можно ограничить доступ к данным, вы-
давая только часть из них. Это может быть:
подмножество строк базовой таблицы. Например, можно опреде- лить представление, которое содержит информацию о студентах кон­кретного факультета, и при этом скрыть
информацию о студентах дру-
гих факультетов;
подмножество столбцов базовой таблицы. Например, можно определить представление, которое содержит все столбцы таблицы сту­дентов, за исключением столбцов с конфиденциальной информацией;
подмножество строк и столбцов базовой таблицы;
подмножество столбцов, являющихся соединением более чем од-
ной базовой таблицы;
статистическая сводка данных по
базовой таблице. Например,
можно определить представление, содержащее только среднюю успева­емость по группам.
Перечислим преимущества использования представлений.
Повышение защищенности данных. Это позволяет ужесточить контроль доступа отдельных категорий пользователей к информации в базе данных.
Обеспечение целостности данных. Если в операторе CREATE VIEW будет указана фраза WITH CHECK OPTION, то СУБД будет кон
-
тролировать, чтобы в исходные таблицы базы данных не была введена ни одна из строк, не удовлетворяющих предложению WHERE в опреде­ляющем запросе.
Ограничение доступа к данным. Пользователь видит некоторую упрощенную модель с необходимыми ему данными.
Упрощение структуры сложных запросов.
5.3.2. ПРОЦЕДУРЫ, ФУНКЦИИ, ТРИГГЕРЫ
Хранимые процедуры и функции – это объекты базы данных, кото­рые компилируются и хранятся в ней наряду с таблицами данных. При этом одна процедура может быть использована в любом количестве клиентских приложений. что позволяет существенно экономить трудо-
68
затраты на создание прикладного программного обеспечения и эффек­тивно применять стратегию повторного использования кода.
Использование хранимых процедур и функций, как и использование представлений, позволяет повысить защищенность данных. Доступ пользователям к данным может быть предоставлен исключительно через ограниченный набор хранимых процедур, прямой доступ к таб­лицам предоставляется исключительно узкому кругу пользователей
(
администраторам базы данных, разработчикам программного обеспе­чения). Хранимые процедуры могут также поддерживать дополни­тельную логику при выполнении операций над данными, связанную с проверкой нетривиальных ограничений или с формированием ауди­торского следа. Помимо основного преимущества – повышения без­опасности можно отметить следующие достоинства использования хранимых процедур:
повышение производительности: процедуры хранятся в скомпи
-
лированном и оптимизированном виде, а следовательно, выполнение процедуры происходит быстрее, чем запуск аналогичного кода динами­ческого SQL;
использование хранимых процедур позволяет снизить объем пе- редаваемых данных: для вызова хранимой процедуры достаточно ука­зать ее имя и значения параметров, а не передавать полный текст за­проса;
хранимые процедуры, выполняющие однотипные
действия, могут переноситься между базами данных с незначительной модификацией, что позволяет повторно использовать код процедур.
Триггер запускается сервером автоматически при попытке измене­ния данных в таблице, с которой он связан. Триггеры в основном пред­назначены для обеспечения целостности и непротиворечивости данных, а также для отката транзакций.
С точки зрения безопасности данных
триггеры в первую очередь стоит рассматривать как дополнительный инструмент обеспечения це­лостности данных. Их используют, когда ограничения целостности и значений по умолчанию не позволяют добиться нужного уровня функ­циональности. Часто требуется реализовывать сложные алгоритмы про­верки данных, отслеживать изменения значений таблицы, чтобы нуж­ным образом изменять связанные данные. Кроме того,
триггеры могут
69
использоваться для формирования аудиторского следа, например, при операциях модификации данных записывать в таблицу аудита пользо­вателя факт изменения данных и время изменения.
5.3.3. ПРОТИВОДЕЙСТВИЕ SQL-ИНЪЕКЦИЯМ
Ранее отмечалось, какой урон могут нанести SQL-инъекции. К ме-
тодам противодействия SQL-инъекциям относятся следующие.
1. Фильтрация пользовательского ввода
Самым очевидным решением противодействия SQL-инъекциям яв­ляется фильтрация пользовательского ввода перед формированием ис­полняемых запросов.
Например, для числовых значений можно использовать преобразо­вание ввода пользователя к целому типу данных, для строковых данных выполнять
фильтрацию спецсимволов и ключевых слов или фильтра-
цию по регулярным выражениям и т. п.
Такой подход подразумевает либо использование готовых классов фильтрации данных, либо их самостоятельную разработку. Недостат­ком этого подхода можно назвать то, что существуют определенные ме­тоды, позволяющие обойти такого рода фильтры, так называемая обфускация SQL-инъекций.
Обфускация – это
приведение неполного текста или исполняемого кода программы к виду, сохраняющему ее функциональность, но за­трудняющему анализ, понимание алгоритмов работы и декомпиляцию при модификации. В контексте SQL-инъекций использование этого тер­мина предполагает маскировку спецсимволов и ключевых слов в тексте пользовательского ввода.
Для обходов различных известных фильтров существуют различные
приемы, например:
замена
логических операций AND и OR их символьными анало-
гами && и ||;
использование кодов вместо их прямого написания;  двойное кодирование символов, использование строковых функ-
ций, добавление SQL-комментариев в текст пользовательского ввода;
вложенное дублирование ключевых слов.
70