
- •Письменные лекции по дисциплине «Базы данных»
- •Лекция 1. Понятие субд. Модели данных. Реляционная модель
- •1.1. Бд и субд
- •1.2. Классификация бд
- •1.3. Классификация субд
- •1.3.1. Состав субд и работа бд
- •1.4. Язык sql
- •1.5. Основные типы sql запросов по их видам
- •1.6. Основные функции субд
- •1.7. Модели данных
- •1.8. Реляционная модель данных
- •1.9. Информационный объект
- •1.10. Нормализация отношений
- •1.10.1. Первая нормальная форма
- •1.10.2. Вторая нормальная форма
- •Лекция 2. Продолжение прошлой лекции
- •2.1. Третья нормальная форма
- •2.2. Отношения
- •2.3. Ключ
- •2.4. Пример выгрузки данных
- •2.5. Заполнение таблиц
- •2.6. Реляционные операции
- •1. Выборка
- •2. Проекция
- •3. Объединение
- •4. Пересечение
- •5. Разность
- •6. Произведение
- •7. Деление
- •8. Соединение
- •2.7. Соединение таблиц
- •2.8. Изменение таблицы
- •2.9. Типы данных MySql
- •2.10. Параллелизм
- •Лекция 3. Хранимые процедуры и функции
- •3.1. Хранимая процедура MySql
- •3.2. Переменные
- •3.3. Параметры процедуры
- •3.4. Операторы if и case
- •3.5. Оператор return
- •Лекция 4. Транзакции. Уровни изоляции. Блокировки.
- •4.1. Понятие транзакции
- •4.2. Операторы транзакции
- •4.3. Уровни изоляции (изолированности) транзакций
- •4.4. Тест acid
- •4.5. Механизм блокировок
- •4.6. Взаимоблокировки
- •4.7. Ведение журнала транзакций
- •Лекция 5. Ссылочная целостность данных. Внешние ключи. Индексирование.
- •5.1. Ссылочная целостность данных
- •5.2. Внешний ключ
- •5.2.1. Условия обеспечения целостности данных при помощи внешнего ключа
- •5.2.2. Практический пример
- •5.2.3. Синтаксис объявления внешнего ключа
- •5.3. Индекс
- •5.3.1. Для каких полей нужно создавать индексы
- •5.3.2. Принцип работы индексов
- •5.3.3. Виды индексов
- •5.3.4. Индексирование таблиц MySql
- •5.3.5. Создание индекса в MySql
- •5.3.6. Типы индексов в MySql
- •5.3.7. Удаление индекса в MySql
- •5.3.8. Преимущества использования индексов
- •5.3.9. Недостатки использования индексов
- •5.3.10. Практический пример
- •5.4. Курсор
- •Лекция 6. Администрирование баз данных
- •6.1. Резервирование и восстановление вручную
- •6.2. Команды grant и revoke
- •6.3. Утилита mysqldump
- •6.3.1. Создание дампа
- •6.3.2. Развертывание дампа
- •6.4. Утилита mysqlhotcopy
- •6.5. Утилита mysqlcheck
- •Лекция 7. Администрирование бд
- •7.7. Статус таблиц
- •7.8. Просмотр таблиц, доступных в бд
- •7.9. Получение информации о статусе сервера
- •7.10. Получение информации о переменных
- •7.16. Файлы журналов
- •7.17. Как обезопасить MySql от хакеров
- •Указатели на страницы с ответами
5.4. Курсор
Курсор — это поименованная область в памяти базы данных.
Курсор отслеживает позицию в результирующем наборе и позволяет выполнять несколько операций по строкам в результирующем наборе с возвратом к исходной таблице или без него. Курсор имеет имя, так как указывает на текущую позицию в результирующем наборе, так же как курсор на экране компьютера указывает на текущую позицию.
Например, рассмотрим приложение, которое отображает список доступных продуктов для потенциального покупателя. Покупатель прокручивает список, чтобы просмотреть сведения о продукте и стоимость, и, наконец, выбирает продукт для покупки. В оставшейся части списка появляется дополнительная прокрутка и выбор. С точки зрения покупателя продукты появятся по одному за раз, но приложение использует прокручиваемый курсор для просмотра результирующего набора.
Курсор не может использоваться сам по себе в MySQL. Это важный компонент в хранимых процедурах. Также курсоры часто применяются в операторах SQL, встроенных в написанные на языках процедурного типа прикладные программы.
Операторы управления курсором:
1. DECLARE — выполняет объявление явного курсора для отдельного оператора SELECT или для отдельной процедуры.
2. OPEN — открывает курсор, создавая новый результирующий набор на базе указанного запроса.
3. FETCH — выполняет последовательное извлечение строк из результирующего набора (в том числе передвигает указатель курсора вперед). Обычно это конструкция помещается в цикл, который прерывается по некоторому условию.
4. CLOSE — закрывает курсор и освобождает занимаемые им ресурсы.
Скорость выполнения операций обработки данных посредством курсора заметно ниже, чем у стандартных средств SQL.
Синтаксис объявления курсора:
DECLARE <имя курсора>
[SENSITIVE | INSENSITIVE | ASENSITIVE]
[SCROLL | NO SCROLL] CURSOR
[ WITH HOLD | WITHOUT HOLD]
[ WITH RETURN | WITHOUT RETURN]
FOR <выражение запроса SQL>
[ ORDER BY <выражение сортировки>]
[ FOR {READ ONLY | UPDATE [ OF <список столбцов>]}]
Основной частью объявления курсора является:
DECLARE <имя курсора> FOR <выражение sql-запроса>
Пример:
DECLARE cur_users CURSOR FOR SELECT id, name FROM users WHERE active = 'Alex';
Лекция 6. Администрирование баз данных
Резервирование и восстановление вручную
Команды GRANT и REVOKE;
Утилита mysqldump;
Утилита mysqlhotcopy;
Утилита mysqlcheck.
6.1. Резервирование и восстановление вручную
Поскольку таблицы MySQL хранятся в виде файлов, то резервное копирование выполняется легко. Чтобы резервная копия была согласованной, нужно выполнить на выбранных таблицах LOCK TABLES, а затем FLUSH TABLES. При этом требуется блокировка только на чтение; поэтому другие потоки смогут продолжать запросы на таблицах в то время, пока будут создаваться копии файлов из каталога базы данных. Команда FLUSH TABLE обеспечивает гарантию того, что все активные индексные страницы будут записаны на диск прежде, чем начнется резервное копирование.
Синтаксис LOCK TABLES:
LOCK TABLES tbl_name {READ [LOCAL] | [LOW_PRIORITY] WRITE} [, tbl_name {READ [LOCAL] | [LOW_PRIORITY] WRITE} ...]
...
UNLOCK TABLES
Различие между READ LOCAL и READ состоит в том, что READ LOCAL позволяет выполнять неконфликтующие команды INSERT во время существования блокировки.
Можно использовать блокировки LOW_PRIORITY WRITE, позволяющие другим потокам получать блокировки READ в то время, как основной поток находится в состоянии ожидания блокировки WRITE.
Пример LOCK TABLES:
// Блокировка table1 на чтение и table2 на запись
LOCK TABLES table1 READ, table2 WRITE;
// Какие-либо действия
UNLOCK TABLES; // Разблокировка
Т. е. никакой другой поток управления не может обновить таблицу table1 с блокировкой READ или прочитать таблицу table2 с блокировкой WRITE.
Синтаксис FLUSH:
FLUSH flush_option [,flush_option] ...
Примеры FLUSH:
FLUSH TABLES — закрываются все открытые таблицы и принудительно закрываются все используемые таблицы. Также сбрасывается кэш запросов.
FLUSH [TABLE | TABLES] tbl_name [,tbl_name...] — производится сброс только указанных таблиц.
FLUSH TABLES WITH READ LOCK — блокировать все таблицы во всех базах данных блокировкой READ.
Рабочий пример:
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
WHERE customer_id=some_id;
mysql> UNLOCK TABLES;
Без использования LOCK TABLES существует вероятность того, что какой-либо иной поток управления может вставить новую строку в таблицу trans между выполнением операций SELECT и UPDATE.
Если есть необходимость провести резервное копирование на уровне SQL, то можно воспользоваться SELECT ... INTO OUTFILE или BACKUP TABLE:
Оператор SELECT может быть представлен в форме SELECT ... INTO OUTFILE 'file_name'. Эта разновидность команды SELECT осуществляет запись выбранных строк в файл, указанный в file_name. Данный файл создается на сервере и до этого не должен существовать (таким образом, предотвращается разрушение таблиц и файлов). Форма SELECT ... INTO OUTFILE главным образом предназначена для выполнения очень быстрого дампа таблицы на серверном компьютере.
BACKUP TABLE tbl_name[,tbl_name...] TO '/path/to/backup/directory' — копирует в каталог резервного копирования тот минимум табличных файлов, который достаточен для восстановления таблицы, после сброса на диск всех изменений. Работает только для таблиц MyISAM. В процессе резервного копирования будет установлена блокировка чтения отдельно для каждой таблицы на время ее копирования. Если необходимо сделать резервное копирование в виде мгновенного образа нескольких таблиц, необходимо сначала запросить LOCK TABLES установки блокировки чтения для каждой таблицы в группе.
Восстановление:
LOAD DATA INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE table1 — читает строки из текстового файла file_name.txt и вставляет их в таблицу table1. Команда LOAD DATA INFILE является дополнительной к SELECT ... INTO OUTFILE.
RESTORE TABLE tbl_name [,tbl_name...] FROM '/path/to/backup/directory' — восстанавливает таблицу(ы) из резервной копии, созданной с помощью BACKUP TABLE. Существующие таблицы не перезаписываются: при попытке восстановления поверх существующей таблицы будет выдана ошибка. Восстановление занимает больше времени, нежели BACKUP — из-за необходимости повторного построения индекса. Чем больше в таблице будет ключей, тем больше времени заберет реконструкция. Эта команда, так же как и BACKUP TABLE, в настоящее время работает только для таблиц MyISAM.