- •Кто и откуда может подключаться к серверу
- •Какой уровень привилегий должен иметь пользователь и на доступ к чему эти привилегии предоставляются
- •Как определить имя локального компьютера в таблице разрешений
- •Нужны ли пользователю административные привилегии
- •Отмена привилегий и удаление пользователей
- •Головоломка с привилегиями
- •Использование mysqlcheck для сопровождения и аварийного восстановления таблиц.
- •Mysqldump, получение дампов данных и структуры таблицы
- •Mysqlhotcopy, копирование баз данных и таблиц MySql
- •Способ хранения таблиц и баз данных
- •Выделенные разделы
- •Типы таблиц
- •Столбцы
- •Резервирование и копирование баз данных с помощью программы mysqldump
- •Использование методов прямого копирования
- •Репликация баз данных
- •Восстановление данных из архивов
- •Восстановление базы данных
- •Восстановление отдельных таблиц
- •Внутренняя безопасность: защита доступа к каталогу данных
- •Столбцы привилегий таблицы разрешений
- •Привилегии баз данных и таблиц
- •Административные привилегии
- •Как сервер управляет доступом клиентов
- •Проверка запроса
- •Как хранятся пароли в таблице user
- •Порядок сравнения столбцов
- •Как минимизировать риск при работе с таблицами разрешений
- •Установка пользователей без помощи оператора grant
- •Головоломка с привилегиями (продолжение)
Нужны ли пользователю административные привилегии
Администратор может предоставить владельцу базы данных возможность управления доступом, предоставив ему все привилегии базы данных и определив опцию WITH GRANT OPTION. Например, чтобы разрешить пользователюalicia подключаться с любого компьютера домена bigcorp.com и предоставить ему административные привилегии для работы со всеми таблицами базы данных sales, необходимо использовать оператор grant следующего вида:
GRANT ALL ON sales.* TO alicia@%.big-corp.com IDENTIFIED BY "applejuice"
WITH GRANT OPTION
Фактически, предложение with grant OPTION позволяет администратору делегировать права разрешения доступа другому пользователю. Однако следует проявлять осторожность, поскольку два пользователя с привилегиями grantмогут предоставлять другим пользователям свои права. Если предоставить одному пользователю только привилегиюSELECT, а второму, помимо select, привилегию GRANT, второй пользователь легко может сделать первого "более сильным".
Отмена привилегий и удаление пользователей
Для отмены привилегий пользователя применяется оператор revoke. Его синтаксис очень похож на синтаксис оператора GRANT с той лишь разницей, что предложение ТО заменено на предложение FROM, а предложенияIDENTIFIED BY и WITH GRANT OPTION отсутствуют вовсе:
REVOKE privileges (columns) ON what FROM user
Часть user этого оператора должна соответствовать части user исходного оператора GRANT для пользователя, привилегии которого отменяются. Частьprivileges необязательно должна соответствовать ранее определенным привилегиям. Пользуясь оператором revoke, можно отменить только некоторые из привилегий, предоставленные оператором GRANT.
Оператор revoke применяется для отмены привилегий, но не для удаления пользователей. В таблице user все равно остается запись для пользователя, даже если все привилегии для него сняты. Это означает, что пользователь все еще имеет возможность подключаться к серверу. Для полного удаления пользователя необходимо явным образом удалить его запись из таблицы user. Для этих целей применяется оператор DELETE:
% mysql -u root mysql
mysql> DELETE FROM user WHERE User = "user_name" and Host = "host_name";
mysql> FLUSH PRIVILEGES;
Оператор delete удаляет запись пользователя, а оператор FLUSH указывает серверу перезагрузить таблицы разрешений. (Таблицы перезагружаются автоматически при использовании операторов GRANT и revoke. Однако этого не происходит при непосредственном изменении таблиц разрешений.) Из описанной в следующем разделе ситуации вы узнаете, почему иногда лучше отказаться от удаления записей таблицы user.
Головоломка с привилегиями
Довольно часто начинающие администраторы MySQL попадают в следующую весьма запутанную ситуацию. Пытаясь добавить в таблицу разрешений запись для пользователей, они используют в части имени компьютера общий формат, например:
GRANT ALL ON samp_db.* TO fred@%snake.net IDENTIFIED BY "cocoa"
Назначение этого оператора — разрешить пользователю fred подключаться к серверу с любого компьютера доменаsnake.net и предоставить ему все привилегии для работы с базой данных samp_db. В результате пользователь fredполучает возможность подключиться с любого компьютера, кроме сервера. Попытка подключиться с сервера завершается выводом сообщения об отклонении доступа даже при предоставлении правильного пароля.
Такая ситуация возникает, если в таблице разрешений содержатся записи, по умолчанию инсталлированные сценарием инициализации mysql_install_db. Причина ее возникновения в том, что при попытке подключения пользователя fred к серверу большим приоритетом перед записью этого пользователя обладает одна из записей анонимного пользователя. Согласно этой записи, для подключения пароль не нужен, однако пользователь fredпытается его ввести. Важно заметить, что для устранения этой проблемы достаточно удалить запись анонимного пользователя из таблицы user. Оператор revoke для этих целей не подходит, поскольку он отменяет только привилегии. Удаление записи выполняется с помощью следующих команд:
% mysql -u root mysql
mysql> DELETE FROM user where User="";
mysql> FLUSH PRIVILEGES;
Сразу после удаления пользователь fred сможет успешно подключиться с локального компьютера.
Если база данных хранит важную информацию, опробуйте описанные в этой лекции методики до того, как в них возникнет необходимость. Лучше подготовиться заранее, чем быть захваченным врасплох.
Проверка и восстановление таблиц
Повреждения в таблицах MyISAM происходят вследствие событий, которые невозможно избежать. Различные аппаратные сбои могут оказать самое непредсказуемое влияние на базу данных. Например, если жесткий диск выйдет из строя, данные окажутся полностью потерянными. Неожиданное выключение системы из-за сбоя питания может привести к тому, что изменения в таблицу будут внесены не полностью. Даже если уничтожить серверный процесс по команде kill, у него не будет возможности корректно завершить свою работу.
Если найдена поврежденная таблица, потратьте время на выяснение причин, вызвавших повреждение. Вообще говоря, в MySQL таблицы редко оказываются поврежденными.
Существуют два способа проверки и восстановления таблиц. Первый — с помощью специальных инструкций, второй — с помощью утилиты myisamchk. Соответствующие инструкции называются CHECK TABLE, REPAIR TABLE иOPTIMIZE TABLE. Они достаточно удобны, поскольку выполняются в рамках серверного процесса. В этом смысле они ничем не отличаются, к примеру, от инструкции SELECT. Утилитаmyisamchk обладает рядом дополнительных возможностей, которые в ряде ситуаций оказываются весьма удобными.
Необходимость проверки таблицы может быть вызвана тем, что утилиты, обращающиеся к таблице, начинают себя странно вести. Например, вводимые запросы не завершаются или выдаются неожиданные сообщения об ошибках. Если при обращении к таблице возвращается номер ошибки, воспользуйтесь утилитой perror, которая отображает поясняющее сообщение, соответствующее данному номеру.
Частота проверок базы данных зависит от степени доверия к серверу. Разработчики MySQL рекомендуют делать это хотя бы раз в неделю, но если есть возможность выполнять процедуру проверки каждую ночь, то шансы на заблаговременное обнаружение ошибки возрастают. С помощью демона cron или программы-планировщика можно составить график проверок таким образом, чтобы они запускались в часы наименьшей активности системы. Сохраняйте результаты проверок в журнальном файле или направляйте их самому себе по электронной почте.
Возможно, имеет смысл изменить сценарий safe_mysql таким образом, чтобы при запуске сервера выполнялись инструкции проверки таблиц. Файл, содержащий такие инструкции, задается с помощью опции --init-file. Если повреждения произошли из-за того, что сервер внезапно прекратил работу, они будут немедленно исправлены.
Обработчики таблиц, для которых поддерживаются транзакции, содержат код, позволяющий им восстанавливать таблицы на основании журнальных файлов при запуске сервера. Если возникает сомнение в целостности таблицы, необходимо остановить и повторно запустить сервер.
Таблицы снабжены флагом, указывающим, изменилось ли содержимое таблицы с момента последней проверки. Инструкция CHECK TABLE пропустит неизмененные таблицы при наличии ключевого слова CHANGED. В утилитеmyisamchk соответствующий режим включается с помощью опции --check-only-changed. Особым образом помечаются также неправильно закрытые таблицы. Чтобы проверить только их, укажите флаг FAST (инструкцияCHECK TABLE) или опцию --fast (утилита myisamchk).
По умолчанию утилита myisamchk ищет повреждения только в индексных файлах. В инструкции CHECK TABLE этот режим включается с помощью флага QUICK. Сама инструкция CHECK TABLE по умолчанию проверяет не только индексы, но и неправильные ссылки на удаленные записи. В утилите myisamchk этот режим включается с помощью опции --medium-check. Расширенный режим проверки задается флагом EXTENDED и опцией --extended-check. В этом случае будут проверяться все индексируемые значения.
Табличные проверки занимают много времени в случае крупных таблиц, особенно если у них много ключей. Стандартные режимы проверки в обоих методах обеспечивают вполне приемлемую производительность. Более быстрые проверки удобны, когда их нужно запускать регулярно, например по ночам. Расширенные проверки приходят на помощь, если повреждение таблицы очевидно, но обычные проверки его все равно не находят.
В листинге 4.1 иллюстрируется процедура проверки и восстановления таблицы. В данном случае была создана небольшая таблица и сымитировано в ней повреждение, отредактировав табличные файлы в редакторе. Как видите, таблицу удалось восстановить.
mysql>CHECK TABLE courses;
+--------------+-------+-----------+---------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------------+-------+-----------+---------------------------------------------+
| courses | check | error | Size of indexfile is: 1924 Should be: 2048 |
| test.courses | check | error | corrupt |
+--------------+-------+-----------+---------------------------------------------+
2 rows in set (0.00 sec)
mysql>REPAIR TABLE courses;
+--------------+--------+-----------+----------+
| Table | Op | Msg_type | Msg_text |
+--------------+--------+-----------+----------+
| test.courses | repair | status | ok |
+--------------+--------+-----------+----------+
1 row in set (0.08 sec)
Листинг 4.1. (html, txt)
Таблицы можно проверять, когда сервер запущен. Программа MySQL не будет пытаться их восстановить. Но если обнаруживается поврежденная таблица, программа запрещает потокам обращаться к ней до тех пор, пока таблица не будет восстановлена. Для восстановления требуется получить монопольный доступ к таблице. В этой ситуации служебными инструкциями пользоваться удобнее, чем утилитой myisamchk, так как MySQL сможет заблокировать другие потоки на время восстановления таблицы. Утилита myisamchk может работать таким образом, только если операционная система поддерживает блокировку файлов. В Linux соответствующих функций нет, поэтому перед восстановлением таблиц нужно останавливать сервер.
Инструкция REPAIR TABLE устраняет повреждения в таблице. То же самое делает утилита myisamchk, при наличии опции --recover. Программа MySQL поддерживает три типа процедур восстановления: быструю, обычную и безопасную. В первом случае устраняются лишь проблемы с индексами. Во втором случае исправляется также большинство ошибок в табличном файле. В безопасном режиме таблица проверяется строка за строкой, а индексный файл создается заново. Это наиболее длительная процедура.
При удалении записей из таблицы программа MySQL сохраняет в ней пустые участки, которые повторно задействуются при последующем выполнении инструкций INSERT. Если таблица содержит пустые участки, то перед вставкой записей ее нужно заблокировать. Правда, когда записи вставляются в конец файла данных, программа разрешает другим потокам параллельно осуществлять чтение таблицы.
Таблицы с записями переменной длины неизбежно оказываются фрагментированными. Это происходит, когда обновляемая запись не помещается в отведенном для нее пространстве. В результате снижается производительность операций выборки, поскольку программа вынуждена искать запись в двух и более точках файла. Инструкция OPTIMIZE TABLE удаляет из таблицы пустые участки и осуществляет пересортировку записей. Аналогичные действия выполняет утилита myisamchk при наличии опции --analyze. Инструкция OPTIMIZE TABLEтакже сортирует индексы (соответствующая опция утилиты myisamchk называется --sort-index).
Резервное копирование и восстановление
Резервная копия — это образ базы данных в конкретный момент времени. К этому образу можно вернуться в случае непредвиденной потери данных. Резервные копии можно создавать сколь угодно часто. Нужно лишь помнить о том, что это достаточно трудоемкий процесс, продолжительность которого зависит от размера базы данных и скоростных характеристик оборудования.
Создание резервных копий требует от сервера значительных затрат ресурсов, вплоть до того, что работать с другими базами данных станет невозможно. Нужно спланировать этот процесс таким образом, чтобы он приходился на периоды минимальной загруженности сервера. Если используется репликация, то резервные копии лучше создавать на подчиненном сервере.
Если резервная копия была создана в полночь, а сбой базы данных произошел в полдень, половина дневных изменений окажется утерянной. В таком случае может помочь двоичный журнал. В нем фиксируются все изменения базы данных. С помощью утилиты mysqlbinlog можно преобразовать содержимое этого файла в запросы к восстановленной базе данных, которые позволят воссоздать ее состояние на момент сбоя. Таким образом, планируя схему резервного копирования, не забудьте учесть ротацию и архивирование двоичных журналов, чтобы они были синхронизированы с копиями базы данных.
Помните общие правила обращения с резервными копиями. Если они хранятся в той же файловой системе, что и сама база данных, то данные не защищены от сбоев файловой системы. Отсюда правило: копии должны находиться на отдельном носителе. Храните их на перезаписываемом компакт-диске, магнитной ленте или другом жестком диске. Резервные копии могут храниться дома у начальника или администратора компании. Их можно также пересылать по сети в другую систему. С помощью Internet это делать не сложно.
В процессе планирования необходимо предусмотреть тестирование копий и проверку возможности их восстановления на практике. Не ждите, пока случится катастрофа и вам придется учиться восстанавливать архивы. Создайте тестовую среду и потренируйтесь на ней. Можно попробовать восстановить архив во временную пустую базу данных или же воспользоваться более сложной методикой — например, запустить еще один сервер MySQL на другом порту либо на другом компьютере.
В MySQL существуют три основных способа архивирования данных. Первый — это копирование табличных файлов, второй — создание SQL-образов таблиц, третий — создание форматированных текстовых файлов. Первый способ является самым экономным и быстродействующим. Но для таблиц тех типов, которые поддерживают транзакции, последние два способа являются более гибкими. Например, все таблицы InnoDB хранятся в группе больших файлов, поэтому архивы нельзя будет сгруппировать по базам данных или таблицам.
Какой бы метод ни был выбран, не забудьте защитить таблицы от изменений на время резервного копирования. Если копируются табличные файлы, следует остановить сервер. В остальных случаях достаточно поставить блокировки чтения с помощью инструкции LOCK TABLES и выполнить инструкцию FLUSH TABLES. Последняя необходима для того, чтобы все изменения индексов были записаны в таблицы. Наличие блокировок чтения позволит другим потокам параллельно обращаться к таблицам с запросами на выборку.
Инструкции BACKUP TABLE и RESTORE TABLE копируют табличные файлы в указанный каталог. Естественно, серверный процесс должен иметь право записи в этот каталог. Программа MySQL копирует туда файлы с расширениями .frm и .MUD. Индексный файл (.MYI) можно воссоздать на основании первых двух, что позволит сэкономить место в архиве. В листинге 4.2 показан пример архивирования таблицы.
mysql>BACKUP TABLE dictionary TO '/tm/backup';
+-----------------+--------+-----------+------------------------+
| Table | Op | Msg_type | Msg_text |
+-----------------+--------+-----------+------------------------+
| test.dictionary | backup | status | ok |
+-----------------+--------+-----------+------------------------+
1 rows in set (0.27 sec)
Листинг 4.2. (html, txt)
Функции копирования файлов предоставляются операционной системой, поэтому данный способ создания резервных копий является самым быстрым. Таблица dictionary, скопированная в листинге 4.2, содержит более 100000 записей, а файл данных занимает почти 3 Мбайт. Как видите, процедура архивирования такой таблицы заняла менее секунды. Инструкция BACKUP TABLE самостоятельно заботится о блокировании таблиц и очистке табличных буферов. Это означает, что, в отличие от других методов резервного копирования, дополнительные инструкции не нужны. Инструкция RESTORE TABLE копирует архивные файлы в каталог базы данных и перестраивает индексы. Таблица не должна существовать на момент восстановления. В случае необходимости можно удалить ее с помощью инструкции DROP TABLE или же вручную удалить табличные файлы. В листинге 4.3 показаны результаты восстановления таблицы dictionary, резервная копия которой была создана в листинге 4.2. Обратите внимание на то, что процесс восстановления длился гораздо дольше, чем архивирование. Причина в том, что на перестройку индексов уходит много времени. mysql> RESTORE TABLE dictionary FROM '/tmp/backup'; +-----------------+---------+-----------+--------------------------+ | Table | Op | Msg_type | Msg_text | +-----------------+---------+-----------+--------------------------+ | test.dictionary | restore | status | ok | +-----------------+---------+-----------+--------------------------+ 1 rows in set (1 min 22.24 sec)
Листинг 4.3. (html, txt) Если резервные копии создаются вручную, то в архив можно также включить индексный файл. В этом случае в процессе восстановления таблицы индексный файл будет просто скопирован в каталог базы данных. Тем не менее его всегда можно воссоздать с помощью инструкции REPAIR TABLE. Предположим, таблица dictionary была полностью утеряна. Процесс ее восстановления начнем с копирования frm-файла обратно в каталог базы данных. Создать пустые файлы данных и индексов можно с помощью инструкции TRUNCATE TABLE. Затем необходимо скопировать старый файл данных поверх нового. После этого вводится инструкция REPAIR TABLE. В листинге 4.4показано, как программа MySQL обнаруживает расхождение в количестве записей и перестраивает индексы. mysql> REPAIR TABLE dictionary; +-----------------+---------+-----------+-----------------------------------------+ | Table | Op | Msg_type | Msg_text | +-----------------+---------+-----------+-----------------------------------------+ | state | repair | warning | number of rows changed from 0 to 104237 | | test.state | repair | status | ok | +-----------------+---------+-----------+-----------------------------------------+ 2 rows in set (1 min 25.12 sec)
Листинг 4.4. (html, txt) Для безопасного создания резервных копий лучше пользоваться специальной программой, чем делать все вручную. С этой целью в дистрибутив MySQL входит Perl-сценарий mysqlhotcopy. В листинге 4.5 показано, как с его помощью создаются копии таблиц привилегий. Команда ls позволяет убедиться, что все файлы, в том числе индексные, на месте. # mysqlhotcopy mysql /trap/hc Locked 6 tables in 0 seconds. Flushed tables(mysql.columns_priv, mysql.db, mysql.func, mysql.host, mysql.tables_priv, mysql.user) in 0 seconds. Copying 18 files… Copying indices for 0 files… Unlocked tables. Mysqlhotcopy copied 6 tables |(18 files) in 1 second (1 seconds overall). # ls /tmp/hc/mysql columns_priv.MYD db.MYD func.MYD host.MYD tables_priv.MYD user.MYD columns_priv.MYI db.MYI func.MYI host.MYI tables_priv.MYI user.MYI columns_priv.frm db.frm func.frm host.frm tables_priv.frm user.frm
Листинг 4.5. (html, txt) |
|
Сценарий mysqlhotcopy блокирует одновременно все таблицы базы данных, после чего очищает табличные буферы и копирует файлы. Сценарий можно запускать во время работы сервера, даже если в этот момент пользователи делают запросы к базе данных. Естественно, пока происходит копирование таблиц, пользователям будет запрещено вносить в них изменения.
Формат табличных файлов понятен только программе MySQL. Если же создать SQL-образы таблиц, то их можно будет перенести в другие СУБД. Кроме того, в некоторых ситуациях полезно просматривать такие SQL-инструкции. Предположим, к примеру, что потеря данных оставалась незамеченной на протяжении нескольких месяцев. Возможно, пользователи удалили какие-то записи и лишь позднее обнаружили, что это было сделано неправильно. Нужно восстановить только удаленные записи, но не известно, когда точно они были удалены. Если резервные копии хранятся в формате SQL, можно просмотреть архивы и поискать, когда последний раз встречались требуемые записи. Недостатком такого способа резервного копирования является то, что процедура восстановления занимает много времени, поскольку программа MySQL вынуждена выполнять каждую инструкцию из архива.
Для создания sql-образа таблицы предназначена утилита mysqldump. Она записывает текст инструкций в поток stdout, поэтому нужно перенаправить результаты ее работы в файл. В листинге 4.6 показан созданный этой утилитой образ таблицы db из базы данных mysql. Утилита была запущена с опцией --opt которая включает режим оптимальных установок.
# MySQL dump
#
# Host: localhost Database: mysql
#
# Server version 4.12.25-log
#
# Table structure for table 'db'
#
DROP TABLE IF EXISTS db;
CREATE TABLE db (
Host char(60) binary NOT NULL default '',
Db char(64) binary NOT NULL default '',
User char(16) binary NOT NULL default '',
Select_priv enum('N', 'Y') NOT NULL default 'N',
Insert_priv enum('N', 'Y') NOT NULL default 'N',
Update_priv enum('N', 'Y') NOT NULL default 'N',
Delete_priv enum('N', 'Y') NOT NULL default 'N',
Create_priv enum('N', 'Y') NOT NULL default 'N',
Drop_priv enum('N', 'Y') NOT NULL default 'N',
Grant_priv enum('N', 'Y') NOT NULL default 'N',
References_priv enum('N', 'Y') NOT NULL default 'N',
Index_priv enum('N', 'Y') NOT NULL default 'N',
Alter_priv enum('N', 'Y') NOT NULL default 'N',
PRIMARY KEY (Host, Db, User),
KEY User (User)
)TYPE=MyISAM COMMENT = 'Database privileges';
tt
# Dumping data for table 'db'
#
LOCK TABLES db WRITE;
INSERT INTO db VALUES
('%', 'test', '', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y'),
('%', 'test\\_%', '', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'N', 'Y', 'Y', 'Y'),
('Localhost', 'freetime', 'httpd', 'Y', 'Y', 'Y', 'Y', 'N', 'N', 'N', 'N', 'N', 'N');
UNLOCK TABLES;
Листинг 4.6. (html, txt)
He забудьте заблокировать все таблицы для чтения, прежде чем запускать утилиту mysqldump. В противном случае целостность результатов не гарантируется. Предположим, имеется приложение, которое хранит информацию о клиентах и их электронных адресах. Создание учетной записи нового клиента включает добавление записи в таблицу client и последующую вставку одной или нескольких записей в таблицу email_address. Если параллельно с этим создавать резервную копию базы данных, то может оказаться, что в промежутке между созданием образов таблиц client и email_address приложение попытается обновить обе эти таблицы. Доступ к первой таблице будет запрещен, а ко второй — нет. В результате в архиве появятся адреса, не соответствующие ни одной записи таблицы клиентов.
Чтобы восстановить данные из такого архива, достаточно выполнить SQL-сценарий в интерпретаторе mysql. Можно просто перенаправить сценарий на вход этой утилиты или же воспользоваться ее командой source. Интерпретатор выполнит все инструкции сценария так, как если бы они были введены в командной строке.
Утилита mysqldump имеет режим создания текстового образа таблицы. В этом режиме для каждой архивируемой таблицы создаются два файла. Один из них имеет расширение .sql и содержит соответствующую инструкциюCREATE TABLE. Второй файл имеет расширение .txt и содержит записи таблицы, причем для разделения полей применяются символы табуляции. В листинге 4.7 показана команда, создающая текстовый образ таблицыdictionary в каталоге /tmp.
[/tmp]# mysqldump --verbose --tab=/tmp test dictionary
# Connecting to localhost...
# Retrieving table structure for table dictionary...
# Sending SELECT query...
# Disconnecting from localhost...
Листинг 4.7. (html, txt)
Для восстановления данных из такого архива необходимо сначала создать таблицу, а затем выполнить инструкциюLOAD DATA INFILE, которая вставит записи в таблицу. Стандартный формат файла, создаваемого утилитойmysqldump, соответствует тому формату, который по умолчанию распознается инструкцией LOAD DATA INFILE. Влистинге 4.8 демонстрируется загрузка данных в таблицу dictionary в среде mysql.
mysql> source /tmp/dictionary.sql
Query OK, 0 rows affected (0.00 sec)
mysql> LOAD DATA INFILE '/tmp/dictionary.txt' INTO TABLE dictionary;
Query OK, 104237 rows affected (1 min 27.70 sec)
Records: 104237 Deleted: 0 Skipped: 0 Warnings: 0
Листинг 4.8. (html, txt)
Создать файл, понимаемый инструкцией LOAD DATA INFILE, позволяет также инструкция SELECT с предложениемINTO (листинг 4.9). Схему таблицы необходимо получить другим путем, например с помощью инструкции SHOW CREATE TABLE.
mysql> SELECT * FROM dictionary INTO OUTFILE 'tmp/dictionary.txt';
Query OK, 104237 rows affected (6.42 sec)
Листинг 4.9. (html, txt)
Один из способов восстановления таблиц заключается в использовании двоичного журнала. Достаточно преобразовать его содержимое в SQL-инструкции и выполнить их. Предварительно необходимо заблокировать все таблицы для записи или отключить всех клиентов от сервера. Преобразование двоичного журнала осуществляется с помощью утилиты mysqlbinlog (листинг 4.10). Результаты ее работы нужно направить в файл или интерпретаторуmysql. Обратите внимание: инструкция SET меняет метку текущего времени сеанса, чтобы дата создания таблицы осталась неизменной.
# mysqlbinlog --offset=1 --short-form red-bin.001
use freetime;
SET TIMESTAMP=991767105;
UPDATE session SET LastAction = now() WHERE ID='fNbbnOLBYYlqesqa';
use freetime;
SET TIMESTAMP=991767134;
UPDATE session SET LastAction = now() WHERE ID='fNbbnOLBYYlqesqa';
use freetime;
SET TIMESTAMP=991767134;
DELETE FROM project_view WHERE Project=2 AND User=2;
use freetime;
SET TIMESTAMP=991767135;
INSERT INTO project_view VALUES (2, 2, now());
Листинг 4.10. (html, txt)
Обзор серверных сценариев и утилит Все программы MySQL имеют множество различных опций. При этом каждая программа MySQL поддерживает опцию -help, которую можно использовать для получения полного описания различных опций программы. Например, попробуйте выполнитьmysql -help. Заданные по умолчанию опции для всех стандартных программ можно переопределять при помощи файла опций. В следующем списке приводятся краткие описания серверных программ MySQL.
Утилита, применяемая для описания, проверки, оптимизации и восстановления таблиц MySQL. Поскольку утилита myisamchk имеет много функций, она описывается отдельно.
Создает бинарную поставку откомпилированного кода MySQL. Эту версию при помощи FTP можно передать на сайт support.mysql.com в директорию /pub/mysql/Incoming, чтобы ею могли воспользоваться и другие пользователи MySQL.
Сценарий, составляющий отчет о возникшей в MySQL неполадке. Этот сценарий должен всегда использоваться для составления отчета для почтового списка рассылки MySQL.
Сам сервер MySQL, демон. Он должен работать постоянно.
Создает таблицы привилегий MySQL с заданными по умолчанию привилегиями. Это обычно делается только один раз, при первой инсталляции MySQL в системе. safe_mysqld, оболочка mysqld В MySQL 4.0 safe_mysqld был переименован в mysqld_safe. safe_mysqld — это сценарий, с помощью которого рекомендуется запускать демон mysqld на Unix. safe_mysqldслужит для реализации неких дополнительных функций безопасности для mysqld, таких, как возможность перезапуска сервера при обнаружении ошибки и записи в журнал информации о процессе работы mysqld. Если не указаны опции -mysqld=# или -mysqld-version=#, safe_mysqld будет использовать исполняемый файлmysqld-max, если последний существует. Если mysqld-max не существует, safe_mysqld запустит mysqld. Это позволяет легко выяснить, что даст использование mysqld-max вместо mysqld: просто скопируйте mysqld-maxповерх mysqld, и он будет работать. Как правило, редактировать сценарий safe_mysqld не следует, однако можно указать опции для safe_mysqld, поместив их в раздел [safe_mysqld] файла my.cnf. safe_mysqld будет считывать все опции из разделов файлов опций [mysqld], [server] и [safe_mysqld]. Обратите внимание: все опции, которые вводятся в командной строке для safe_mysqld, передаются mysqld. Если требуется применить в safe_mysqld какие-либо опции, которые mysqld не поддерживает, эти опции нужно определить в файле опций. Большинство опций safe_mysqld - те же, что и у mysqld. Safe_mysqld поддерживает следующие опции:
Сценарий safe_mysqld написан таким образом, чтобы можно было запустить сервер, инсталлированный как из исходного кода, так и из бинарной поставки MySQL, даже если компоненты сервера, в зависимости от используемой инсталляции, будут размещены несколько по-другому. Для safe_mysqld требуется выполнение одного из следующих условий.
Поскольку safe_mysqld будет пытаться найти сервер и базы данных относительно собственной рабочей директории, можно инсталлировать двоичный дистрибутив MySQL куда угодно, при условии, что safe_mysqld будет запускаться из директории, в которой установлен MySQL: shell> cd mysql_installation_directory shell> bin/safe_mysqld Если safe_mysqld не может запустить сервер, даже в том случае, когда он вызывается из инсталляционной директории MySQL, сценарий safe_mysqld можно модифицировать так, чтобы он использовал верный путь к mysqldи опции путей, которые являются правильными для вашей системы. Обратите внимание: если в будущем вы будете делать апгрейд MySQL, новая версия safe_mysqld будет записана поверх старой, поэтому нужно сделать копию отредактированной версии, которую вы сможете затем установить повторно. Mysqld_multi, программа для управления множеством серверов MySQL Программа mysqld_multi предназначена для управления несколькими процессами mysqld, работающих на различных сокетах Unix и портах TCP/IP. Программа будет искать группу(группы) [mysqld#] в my.cnf (или заданных при помощи -config-file=... файлах), где # — любое положительное число, начиная с 1. Мы говорим про этот номер далее как про номер группы опций, или GNR. Номера групп различают группы опций одну от другой и используются как аргумент при запускеmysqld_multi чтобы указать, какие серверы вы хотите запустить, остановить или получить статус. Эти группы должны быть такими же, как и обычная группа [mysqld], но с такими портом, сокетом и т.д., которые требуются для каждого отдельного процесса mysqld. mysqld_multi запускается в таком синтаксисе: Использование: mysqld_multi [OPTIONS] {start|stop|report} [GNR,GNR,GNR...] или mysqld_multi [OPTIONS] {start|stop|report} [GNR-GNR,GNR,GNR-GNR,...] GNR здесь означает номер группы. Можно запускать, останавливать или создавать отчеты о любом GNR или о нескольких из них одновременно. Получить пример о том, как бы вы могли настроить файл опций, можно так: shell> mysqld_multi -example В качестве разделителей в списке GNR применяются запятые, комбинации создаются при помощи тире. Последнее означает, что будут задействованы все номера GNR из диапазона GNR1-GNR2. Если не задан аргумент GNR, то все группы будут либо запущены, либо остановлены, либо будет выведен отчет об этих группах. Обратите внимание, что в списке GNR не должно быть никаких пропусков (пробелов, символов табуляции или пустых строк). Любые данные после пропуска будут игнорироваться. mysqld_multi поддерживает следующие опции:
|
||||||||||||||||||||||||||||||||||||||||||
|
myisampack, MySQL-генератор сжатых таблиц (только для чтения)
Утилита myisampack используется для сжатия таблиц MyISAM, а утилитаpack_isam — для сжатия таблиц ISAM. Поскольку таблицы ISAM являются устаревшими, здесь будет рассматриваться только myisampack.
myisampack сжимает каждый столбец в таблице по отдельности. Информация, необходимая для декомпрессии столбцов, считывается в память при открытии таблицы. В результате обеспечивается более высокая производительность при доступе к отдельным записям, поскольку нужно распаковывать только одну запись, а не значительно больший по размеру дисковый блок, как при использовании программы Stacker в MS DOS. В среднем myisampack сжимает файл данных на 40%-70%.
MySQL использует отображение в памяти (mmap()) для сжатых таблиц, а еслиmmap() не работает, возвращается назад к нормальному режиму чтения/записи.
Обратите внимание на следующее:
После сжатия таблица доступна в режиме только для чтения. Это удобно, скажем, для записи на CD.
myisampack может также сжимать столбцы c типами BLOB или TEXT.
Утилиту myisampack можно запустить следующим образом:
shell> myisampack [options] filename ...
Каждое имя файла (filename) должно быть именем индексного файла (.MYI). Если вы не находитесь в директории базы данных, необходимо указать полный путь к файлу. Допускается опускать расширение .MYI.
myisampack поддерживает следующие опции:
-b,
-backup |
Создает резервную копию таблицы, присваивая ей имя tbl_name.OLD |
-#,
-debug=debug_options |
Выводить журнал отладки. Строка debug_options часто принимает значениеd:t:o,filename |
-f,
-force |
Сжатие таблицы происходит, даже если она увеличивается или если существует временный файл. Во время сжатия таблицы myisampack создает временный файлtbl_name.TMD. Если вы вручную прекратите выполнение myisampack, может оказаться, что файл tbl_name.TMD не будет удален. Обычно если myisampack обнаруживает существующий tbl_name.TMD, она прекращает работу и выдает ошибку. При указании опции -force myisampack сжимает таблицу в любом случае |
-j big_tbl_name,
-join=big_tbl_name |
Соединяет все таблицы, указанные в командной строке, в одну таблицу big_tbl_name. Все таблицы, подлежащие объединению, должны быть идентичными (одинаковые имена и типы столбцов, одинаковые индексы и т.д.) |
-p #, -packlength=# |
Определяет разрядность поля, хранящего длину строки, в байтах. Может принимать значения 1, 2 или 3. (myisampack хранит все строки с указателями длины размером в 1, 2, или 3 байта. В большинстве случаев myisampack способна определить правильное значение длины перед началом сжатия файла, но во время сжатия она может обнаружить, что может быть использована более короткая длина. В этом случае myisampack выведет сообщение о том, что в следующий раз при сжатии данного файла можно использовать более короткую длину записи.) |
-s,
-silent |
Молчаливый режим. Сообщения выводятся только при возникновении ошибок |
-t,
-test |
Сжатие таблицы не выполняется, происходит только проверка процедуры сжатия |
-T dir_name,
-tmp_dir=dir_name |
Указанная директория используется как местоположение для создания временной таблицы |
-w,
-wait |
Если таблица уже используется, подождать повторить попытку. Если сервер mysqld был вызван с опцией -skip-external-locking, то не самая лучшая идея — вызыватьmyisampack, если таблица может модифицироваться во время процесса сжатия |
Последовательность приведенных ниже команд иллюстрирует типичный сеанс сжатия таблицы:
shell> ls -l station.*
-rw-rw-r-- 1 monty my 994128 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 monty my 53248 Apr 17 19:00 station.MYI
-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file: station
Isam-version: 2
Creation time: 1996-03-13 10:08:58
Recover time: 1997-02-02 3:06:43
Data records: 1192 Deleted blocks: 0
Datafile: Parts: 1192 Deleted data: 0
Datafile pointer (bytes): 2 Keyfile pointer (bytes): 2
Max datafile length: 54657023 Max keyfile length: 33554431
Recordlength: 834
Record format: Fixed length
table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 4 unique unsigned long 1024 1024 1
2 32 30 multip. text 10240 1024 1
Field Start Length Type
1 1 1
2 2 4
... ... ... ...
... ... ... ...
56 827 4
57 831 4
shell> myisampack station.MYI
Compressing station.MYI: (1192 records)
- Calculating statistics
normal: 20 empty-space: 16 empty-zero: 12 empty-fill: 11
pre-space: 0 end-space: 12 table-lookups: 5 zero: 7
Original trees: 57 After join: 17
- Compressing file
87.14%
shell> ls -l station.*
-rw-rw-r-- 1 monty my 127874 Apr 17 19:00 station.MYD
-rw-rw-r-- 1 monty my 55296 Apr 17 19:04 station.MYI
-rw-rw-r-- 1 monty my 5767 Apr 17 19:00 station.frm
shell> myisamchk -dvv station
MyISAM file: station
Isam-version: 2
Creation time: 1996-03-13 10:08:58
Recover time: 1997-04-17 19:04:26
Data records: 1192 Deleted blocks: 0
Datafile: Parts: 1192 Deleted data: 0
Datafilepointer (bytes): 3 Keyfile pointer (bytes): 1
Max datafile length: 16777215 Max keyfile length: 131071
Recordlength: 834
Record format: Compressed
table description:
Key Start Len Index Type Root Blocksize Rec/key
1 2 4 unique unsigned long 10240 1024 1
2 32 30 multip. text 54272 1024 1
Field Start Length Type Huff tree Bits
1 1 1 constant 1 0
2 2 4 zerofill(1) 2 9
3 6 4 no zeros, zerofill(1) 2 9
4 10 1 3 9
5 11 20 table-lookup 4 0
6 31 1 3 9
7 32 30 no endspace, not_always 5 9
... ... ... ...
... ... ... ...
53 805 1 17 1
54 806 1 3 9
55 807 20 no empty 3 9
56 827 4 no zeros, zerofill(2) 2 9
57 831 4 no zeros, zerofill(1) 2 9
Листинг 5.1. (html, txt)
Ниже приведено описание вывода myisampack:
normal |
Количество столбцов, для которых не используется никакого дополнительного сжатия |
empty-space |
Количество столбцов, содержащих пустые значения; они занимают по 1 биту |
empty-zero |
Количество целочисленных столбцов, в которых содержатся только двоичные нули (ascii 0); каждый из них будет занимать 1 бит |
empty-fill |
Количество целочисленных столбцов, значения которых не полностью занимают отведенную для них разрядность в байтах; тип этих столбцов изменяется на тип с меньшей разрядностью (например, столбец INTEGERможет быть изменен на MEDIUMINT) |
pre-space |
Количество десятичных столбцов, которые хранятся с начальными пробелами. В этом случае каждое значение будет содержать число ведущих пробелов |
end-space |
Количество столбцов, имеющих много оконечных пробелов. В этом случае каждое значение будет содержать число таких пробелов |
table-lookup |
Столбец имеет только небольшое количество различающихся значений, которые перед сжатием Хаффмана (Huffman) конвертируются в ENUM |
zero |
Количество столбцов, все значения которых являются нулями |
Original trees |
Начальное количество деревьев Хаффмана |
After join |
Количество различных деревьев Хаффмана, оставленных после соединения деревьев для сохранения небольшого пространства в заголовках |
После сжатия таблицы myisamchk -dvv выводит дополнительную информацию по каждому полю.
Type
Тип поля может содержать следующие дескрипторы:
-
constant
Все строки содержат одинаковое значение
no endspace
Не сохраняются замыкающие пробелы
no endspace,
not_always
Не сохраняются замыкающие пробелы и не производится сжатие за счет замыкающих пробелов для всех значений
no endspace,
no empty
Не сохраняются замыкающие пробелы. Не сохраняются пустые значения
table-lookup
Столбец был преобразован к ENUM
zerofill(n)
В значении n главных байтов всегда являются 0 и не сохранены.
no zeros
Не сохраняются нули.
always zero
Значения 0 хранятся в 1 бите.
Huff tree
Дерево Хаффмана, связанное с полем.
Bits
Количество битов, используемых в дереве Хаффмана.
После запуска pack_isam/myisampack нужно запустить isamchk/myisamchk для повторного создания индекса. В это время можно также отсортировать индексные блоки и создать статистику, необходимую для более эффективной работы оптимизатора MySQL:
myisamchk -rq -analyze -sort-index table_name.MYI
isamchk -rq -analyze -sort-index table_name.ISM
После установки сжатой таблицы в директорию базы данных MySQL нужно проделать операцию mysqladmin flush-tables, чтобы сервер mysqld начал использовать новую таблицу.
Для распаковки сжатой таблицы можно использовать опцию -unpack isamchk или myisamchk.
Обзор клиентских сценариев и утилит
Все клиенты MySQL, которые взаимодействуют с сервером с помощью библиотеки mysqlclient, используют следующие переменные окружения:
Имя |
Описание |
MYSQL_UNIX_PORT |
Сокет, используемый по умолчанию для локальных подсоединений |
MYSQL_TCP_PORT |
Устанавливаемый по умолчанию порт TCP/IP |
MYSQL_PWD |
Устанавливаемый по умолчанию пароль |
MYSQL_DEBUG |
Опции пошаговой отладки программ |
TMPDIR |
Каталог для создания временных таблиц/файлов |
Клиент mysql использует файл, указанный в переменной окружения MYSQL_HISTFILE, для хранения истории командной строки. Значение по умолчанию для этого файла истории — $HOME/.mysql_history, где $HOME — значение переменной окружения HOME.
Все программы MySQL принимают множество различных опций.
Для всех стандартных клиентских программ можно переопределить значения опций по умолчанию, задействуя файл опций.
В приведенном ниже списке дано краткое описание клиентских программ MySQL.
msql2mysql |
Сценарий оболочки операционной системы, преобразующий программы базы данных mSQL к виду, приемлемому для MySQL. Он не обрабатывает всех случаев, но с него хорошо начинать такое преобразование |
mysqlaccess |
Сценарий, который проверяет привилегии доступа для комбинации значений хоста, пользователя и базы данных |
mysqladmin |
Утилита для выполнения административных функций, таких, как создание или удаление баз данных, перезагрузка таблиц привилегий, запись на диск содержимого таблиц, находящегося в буфере, повторное открытие файлов журналов. Утилита mysqladmin может также использоваться для получения информации с сервера о номере версии, процессах и состоянии сервера |
mysqldump |
Выводит содержимое базы данных MySQL в виде файла с SQL-операторами или в виде текстовых файлов с символом табуляции в качестве разделителя |
mysqlimport |
Импортирует текстовые файлы в соответствующие таблицы, используя команду LOAD DATA INFILE |
>mysqlshow |
Отображает информацию о существующих базах данных, таблицах, полях и индексах |
replace |
Служебная программа, использующаяся в сценарии msql2mysql, но имеющая также более широкое применение. Утилита replace изменяет строки, находящиеся в файлах или в стандартных входных данных. Использует принцип конечного автомата, чтобы в первую очередь найти соответствие длинных строк. Может применяться для замены строк |
Утилита командной строки mysql
Утилита командной строки mysql является простой SQL-оболочкой (с возможностями библиотеки readline проекта GNU). Она поддерживает интерактивный и неинтерактивный режимы. В интерактивном режиме результаты запроса представляются в ASCII-формате. При использовании в неинтерактивном режиме (например, в качестве фильтра) результат представляется в текстовом формате с символом табуляции в качестве разделителя (выходной формат можно изменить при помощи параметров командной строки). Сценарии можно запускать, как показано ниже:
shell> mysql database < script.sql > output.tab
Если возникают проблемы из-за недостатка памяти на данном клиенте, применяйте параметр -quick! Это заставит mysql использовать функцию mysql_use_result() вместо функции mysql_store_result() для получения результирующей выборки данных.
Использовать mysql очень легко. Запустите mysql database или mysql -user=user_name -password=your_password database. Наберите SQL-команду прямо в командной строке, завершив ее одним из символов: ';', '\g' или '\G', и нажмите клавишу "Ввод".
Утилита командной строки mysql поддерживает следующие параметры.
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
mysqladmin, администрирование MySQL-сервера. Утилита для выполнения административных операций. Ее синтаксис: shell> mysqladmin [ПАРАМЕТРЫ] command [command-option] command ... Список опций, поддерживаемых вашей конкретной версией mysqladmin, можно получить, выполнив команду mysqladmin -help. Текущая версия mysqladmin поддерживает следующие команды:
Создать новую базу данных.
Удалить базу данных и все ее таблицы.
Выдает расширенный отчет о состоянии сервера (более полный, чем при команде status ).
Сбросить и перезагрузить хосты.
Сбросить на диск и переоткрыть все журналы.
Закрыть все открытые таблицы.
Перечитать таблицы привилегий.
Завершить потоки mysql с указанными thread-id.
Установить новый пароль для сервера баз данных. Изменить старый пароль на новый.
Проверить, работает ли сервер mysqld.
Показать список активных потоков на сервере.
Перезагрузить таблицы привилегий.
Выполнить все табличные операции, находящиеся в буфере, закрыть и открыть заново все системные журналы.
Завершить работу сервера баз данных.
Запустить подчиненный дублирующий поток.
Остановить подчиненный дублирующий поток.
Выдает краткий отчет о состоянии сервера.
Вывести доступные для использования переменные.
Вывести данные о версии сервера. Все команды могут сокращаться до их уникальных префиксов. Например: shell> mysqladmin proc stat +----+-------+-----------+----+-------------+------+-------+------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------+-----------+----+-------------+------+-------+------+ | 6 | monty | localhost | | Processlist | 0 | | | +----+-------+-----------+----+-------------+------+-------+------+ Uptime: 10077 Threads: 1 Questions: 9 Slow queries: 0 Opens: 6 Flush tables: 1 Open tables: 2 Memory in use: 1092K Max memory used: 1116K Результат команды mysqladmin status выводится в виде следующих столбцов:
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
При выполнении mysqladmin shutdown через сокет (другими словами, через компьютер с запущенным mysqld) mysqladmin будет ожидать, пока на сервере MySQL не будет удален файл pid-file (в котором содержится идентификатор процесса pid запущенного сервера), чтобы убедиться, чтосервер остановлен должным образом.