Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Основное / Письменные лекции по дисциплине «Базы данных»

.pdf
Скачиваний:
98
Добавлен:
29.01.2021
Размер:
939.56 Кб
Скачать

Проверка данных таблиц на наличие ошибок для таблиц MyISAM и BDB выполняется функцией CHECK TABLE. Если найдена ошибка в таблице данных или индексов, таблица помечается как дефектная и не может быть использована до тех пор, пока не будет восстановлена.

Анализ ключей можно провести с помощью утилиты myisamchc -a,

проверку данных таблиц — с помощью myisamchc -m.

Функция ANALYZE TABLE проверяет состояние индексов в таблицах для MyISAM и BDB. На время проверки таблица обычно блокируется «на чтение».

7.8. Просмотр таблиц, доступных в БД

SHOW TABLES — выводит список существующих таблиц.

7.9. Получение информации о статусе сервера

SHOW STATUS — выводит список runtime-переменных, по которым

можно судить о состоянии сервера MySQL.

7.10. Получение информации о переменных

В SQL Server имеется более 30 глобальных переменных, не имеющих параметров, которые определяются и поддерживаются системой. Все глобальные переменные имеют префикс в виде двух символов @@. Вы можете извлечь значение любой из них с помощью простого запроса SELECT, как в следующем примере:

SELECT @@СONNECTIONS

Здесь используется глобальная переменная @@CONNECTIONS для извлечения количества подключений к SQL Server со времени запуска программы.

@@ERROR — содержит номер ошибки, возникшей при выполнении последнего оператора T-SQL в текущем соединении. Если ошибка не обнаружена, содержит 0. Значение этой системной переменной переустанавливается после выполнения каждого очередного оператора.

Если требуется сохранить содержащееся в ней значение, то это значение следует переносить в локальную переменную сразу же после выполнения оператора, для которого должен быть сохранен код ошибки.

@@IDENTITY — содержит последнее идентификационное значение, вставленное в базу данных в результате выполнения последнего оператора INSERT. Если в последнем операторе INSERT не произошла выработка идентификационного значения, системная переменная @@IDENTITY содержит NULL. Это утверждение остается справедливым, даже если отсутствие идентификационного значения было вызвано аварийным завершением при выполнении оператора. А если с помощью одного оператора осуществляется несколько операций вставки, этой системной переменной присваивается только последнее идентификационное значение.

@@ROWCOUNT — одна из наиболее широко используемых системных переменных. Возвращает информацию о количестве строк, затронутых последним оператором. Обычно применяется для контроля ошибок, отличных от тех, которые относятся к категории ошибок этапа прогона программы. Например, если в программе обнаруживается, что после вызова на выполнение оператора DELETE с конструкцией WHERE количество затронутых строк равно нулю, то можно сделать вывод, что произошло нечто непредвиденное. После этого сообщение об ошибке может быть активизировано вручную.

Следует отметить, что с версии SQL Server 2000 глобальные переменные принято называть функциями. Название глобальные сбивало пользователей с толку, позволяя думать, что область действия таких переменных шире, чем у локальных. Глобальным переменным часто ошибочно приписывалась возможность хранить информацию, независимо от того, включена она в пакет либо нет, что, естественно, не соответствовало действительности.

7.11. Получение информации о процессах

SHOW PROCESSLIST выводит информацию о выполняющихся потоках. Для того, чтобы видеть все потоки, пользователю нужно иметь привилегии PROCESSLIST, иначе он сможет увидеть только свои собственные потоки. Без указания опции FULL выводятся только первые

100 или меньше символов запроса потока. Прервать выполнение потока можно с помощью функции KILL.

7.12. Получение информации о привилегиях

Важно не только давать и отбирать привилегии, но и иметь информацию о том, какими правами доступа обладает каждый из субъектов.

PRIVILEGES записывает и заново открывает информацию о привилегиях пользователей. Это делается для вступления в силу изменений, сделанных в политике привилегий.

7.13. Структура SQL

7.14. Завершение потока

Команда KILL thread_id

Каждое подключение к MySQL выполняется в отдельном потоке. При необходимости можно определить поток командой SHOW PROCESSLIST и отключить соединение с ним.

Для того, чтобы видеть все потоки, необходимо иметь привилегии Process_priv, иначе видны только потоки текущего пользователя.

7.15. Очистка КЭША MySQL

Синтаксис:

FLUSH [HOSTS]

[.LOGS]

[.PRIVILEGES]

[.[TABLE | TABLES] table_name [, table_name.]]

[. TABLES WITH READ LOCK]

[.STATUS]

Очистка КЭШа MySQL сбрасывает всю информацию, находящуюся в КЭШе данных MySQL, на диск. Для выполнения этой операции необходимы привилегии Reload_priv.

Ключевое слово HOST указывает MySQL очистить информацию о клиентских площадках. Применяется при смене клиентского IP-адреса или появлении ошибок связи с сервером.

LOGS закрывает и повторно открывает все журналы. Если определен журнал изменений или binary-журнал без расширения, то номер в расширении имени журнала будет увеличен на 1 относительно предыдущего файла.

PRIVILEGES записывает и заново открывает информацию о привилегиях пользователей. Это делается для вступления в силу изменений, сделанных в политике привилегий.

Использование TABLES без перечисления имен таблиц закрывает и открывает все открытые таблицы. При этом записываются все изменения,

внесенные в таблицы. При перечислении имен таблиц будет перезагружена информация только из указанных таблиц.

FLUSH TABLES WITH READ LOCK закрывает все открытые таблицы и блокирует их чтение до тех пор, пока не будет выполнена команда UNLOCK TABLES. Блокирование базы данных подобным образом позволяет выполнять резервное копирование базы данных.

STATUS обнуляет runtime-переменные сервера.

7.16. Файлы журналов

Одно из основных требований к СУБД — надежное хранение данных во внешней памяти. Под надежностью хранения понимается то, что СУБД должна быть в состоянии восстановить последнее согласованное состояние БД после любого аппаратного или программного сбоя. Обычно рассматриваются два возможных вида аппаратных сбоев: так называемые мягкие сбои, которые можно трактовать как внезапную остановку работы компьютера (например, аварийное выключение питания), и жесткие сбои, характеризуемые потерей информации на носителях внешней памяти. Примерами программных сбоев могут быть: аварийное завершение работы СУБД (по причине ошибки в программе или в результате некоторого аппаратного сбоя) или аварийное завершение пользовательской программы, в результате чего некоторая транзакция остается незавершенной. Первую ситуацию можно рассматривать как особый вид мягкого аппаратного сбоя; при возникновении последней требуется ликвидировать последствия только одной транзакции.

Понятно, что в любом случае для восстановления БД нужно располагать некоторой дополнительной информацией. Другими словами, поддержание надежности хранения данных в БД требует избыточности хранения данных, причем та часть данных, которая используется для восстановления, должна храниться особо надежно. Наиболее

распространенным методом поддержания такой избыточной информации является ведение журнала изменений БД.

Журнал — это особая часть БД, недоступная пользователям СУБД и поддерживаемая с особой тщательностью (иногда поддерживаются две копии журнала, располагаемые на разных физических дисках), в которую поступают записи обо всех изменениях основной части БД. В разных СУБД изменения БД журнализуются на разных уровнях: иногда запись в журнале соответствует некоторой логической операции изменения БД (например, операции удаления строки из таблицы реляционной БД), иногда — минимальной внутренней операции модификации страницы внешней памяти; в некоторых системах одновременно используются оба подхода.

SHOW LOGS выводит информацию о существующих журналах.

7.17. Как обезопасить MySQL от хакеров

При подключении к серверу MySQL используется, как правило, пароль. По линии связи пароль не передается в виде открытого текста, но алгоритм шифрования не очень сложный. Толковый хакер, если ему удастся перехватить трафик между клиентом и сервером, при определенной настойчивости может взломать пароль. Поэтому если связь между клиентом и сервером осуществляется по ненадежной сети, для шифрования связи следует использовать SSH-туннель.

1. У всех пользователей MySQL должны быть пароли. Для приложений клиент/сервер является общепринятым, что клиент может указывать любое имя пользователя, но если для other_user не задан пароль, то кто угодно может зайти под любым именем, просто введя mysql -u other_user db_name. Чтобы этого избежать, можно изменить пароль для всех пользователей, отредактировав скрипт mysql_install_db перед запуском приложения, или только пароль для root-пользователя MySQL, как это показано ниже:

shell> mysql -u root mysql

mysql> UPDATE user SET Password=PASSWORD('new_password')

WHERE user='root';

mysql> FLUSH PRIVILEGES;

2. Не предоставляйте привилегии PROCESS всем пользователям. Команда mysqladmin PROCESSLIST выводит текст запросов,

обрабатываемых в данный момент. Следовательно, любой пользователь, имеющий право на выполнение этой команды, получает возможность прочитать, например, такой запрос другого пользователя, как UPDATE user SET password=PASSWORD('not_secure'). mysqld резервирует добавочное подключение для пользователей, имеющих привилегию PROCESS, так что пользователь MySQL под именем root может подключиться и осуществлять контроль даже в том случае, когда все обычные подключения заняты.

3. Не предоставляйте привилегии FILE всем пользователям. Любой пользователь, имеющий такую привилегию, может записать в любом месте файловой системы файл с привилегиями демона mysqld! Чтобы обеспечить здесь хоть минимальную защиту, все файлы создаваемые с помощью команды SELECT ... INTO OUTFILE, сделаны общедоступными для записи, но перезаписать существующие файлы нельзя.

Привилегия FILE может быть также использована для чтения любого файла, доступного пользователю Unix, от имени которого запускается сервер.

Можно также прочитать любой файл в текущую базу данных. Это может быть использовано в корыстных целях. Возможно, например, с помощью команды LOAD DATA загрузить /etc/passwd в таблицу и прочитать ее позже с помощью SELECT.

4. Чтобы ограничить число подключений, доступных для отдельного пользователя, можно в mysqld задать значение переменной

max_user_connections.

Указатели на страницы с ответами

Язык SQL, схемы данных, задачи СУБД. 1.4. Язык SQL

Модели данных. 1.7. Модели данных

Понятие строк и столбцов.

1.8. Реляционная модель данных

Ключи. 2.3. Ключ

Отношения. 2.2. Отношения

Реляционные операции (8 шт). 2.6. Реляционные операции

Определение данных.

1.7. Модели данных либо 2.9. Типы данных MySQL

Вставка, обновление, удаление записей. 2.5. Заполнение таблиц

Запросы, объединения. 2.7. Соединение таблиц

Упорядочивание и группировка результатов. Ограничение числа возвращаемых строк.

2.4. Пример выгрузки данных

Изменение определения таблицы. 2.8. Изменение таблицы

Параллелизм 2.10. Параллелизм

Транзакции, их свойства. 4.1. Понятие транзакции

4.4. Тест ACID

Уровни изоляции.

4.3. Уровни изоляции (изолированности) транзакций

Блокировки.

4.5. Механизм блокировок

4.6. Взаимоблокировки

Типы данных.

2.9. Типы данных MySQL

Переменные. 3.2. Переменные

Определение ХП (ХП — хранимая процедура). 3.1. Хранимая процедура MySQL

Преимущества ХП.

3.1. Хранимая процедура MySQL

Параметры ХП.

3.3. Параметры процедуры

Хранимые функции.

3.1. Хранимая процедура MySQL

3.5. Оператор RETURN

Определение курсора. 5.4. Курсор

Синтаксис объявления внешнего ключа. 5.2.3. Синтаксис объявления внешнего ключа

Правила объявления внешнего ключа.

5.2.1. Условия обеспечения целостности данных при помощи внешнего ключа

Характеристики индексов. 5.3. Индекс

Типы индексов.

5.3.6. Типы индексов в MySQL и 5.3.3. Виды индексов