Текст книги "Основы программирования в Linux"
Автор книги: Нейл Мэтью
Соавторы: Ричард Стоунс
Жанры:
Программирование
,сообщить о нарушении
Текущая страница: 29 (всего у книги 67 страниц)
Если при использовании mysql нет подключения к базе данных, проверьте с помощью системной команды ps, запущен ли серверный процесс. Если его нет в списке, попробуйте запустить mysql_safed -log
. В этом случае в регистрационный каталог MySQL должен быть записан файл с дополнительной информацией. Можно конечно попытаться явно запустить процесс mysqld; используйте команду mysqld –verbose –help
для получения полного списка опций командной строки.
Вполне возможно, что сервер функционирует, но просто отвергает ваше подключение. Если так, далее следует проверить наличие базы данных, особенно базы данных стандартных прав доступа MySQL (default permissions database). В дистрибутивах Red Hat она обычно по умолчанию располагается в /var/lib/mysqlis, другие дистрибутивы используют разные каталоги. Проверьте сценарий запуска MySQL (например, в файле /etc/init.d) и конфигурационный файл /etc/my.cnf. В противном случае запустите программу явно с помощью команды mysqld –verbose –help
и найдите переменную datadir
. После того как вы определили каталог базы данных, проверьте, содержит ли он хотя бы базу данных стандартных прав доступа (с именем mysql) и что именно ее, заданную в файле my.cnf, использует процесс-демон сервера.
Если вы все еще не подключились, воспользуйтесь редактором сервисов (service editor) для остановки сервера, убедитесь в том, что не выполняется ни один процесс mysqld, и затем перезапустите его снова и попробуйте подключиться. Если вы все– таки никуда не попали, можно полностью деинсталлировать MySQL и установить ее с нуля еще раз. Для выяснения некоторых известных только посвященным возможностей очень полезной может оказаться документация MySQL на Web-сайте (более свежая, чем интерактивное руководство на локальной машине, кроме того, в ней есть редактируемые пользователями подсказки, и предложения, и форум).
Администрирование MySQL
Группа программ-утилит, включенных в дистрибутив MySQL, облегчает процесс администрирования базы данных. Самая популярная из них – программа mysqladmin. В следующем разделе мы опишем эту и другие утилиты.
КомандыВсе команды MySQL, за исключением mysqlshow
, принимают как минимум три стандартных параметра, описанных в табл. 8.1.
Таблица 8.1
-u | username | По умолчанию утилиты mysql будут пытаться использовать то же username MySQL, что и текущее имя пользователя Linux. Применяйте параметр -u для задания другого имени пользователя |
-р | [password] | Если параметр -р задан, а пароль пропущен, он запрашивается. Если параметра -p нет в командной строке, команды MySQL полагают, что пароль не нужен |
-h | host | Применяется для подключения к серверу на другой машине (для локальных серверов всегда можно опускать) |
Примечание
И снова не советуем вам помещать пароль в командную строку, поскольку его можно увидеть с помощью команды
ps
.
myisamchk
Утилита myisamchk
разработана для проверки и корректировки любых таблиц данных, применяющих стандартный табличный формат MYISAM, исходно поддерживаемый СУРБД MySQL. Обычно утилиту myisamchk
следует запускать от имени пользователя mysql, созданного во время установки, из каталога, в котором размещаются таблицы. Для проверки базы данных выполните команду su mysql
, измените название каталога в соответствии с именем базы данных и запустите утилиту myisamchk
с одной или несколькими опциями, предложенными в табл. 8.2. Например,
myisamchk -e -r *.MYI
Самые популярные опции команды приведены в табл. 8.2.
Таблица 8.2
-с | Ищет ошибки в таблицах |
-e | Выполняет расширенную проверку |
-r | Исправляет найденные ошибки |
Дополнительную информацию можно получить, запустив myisamchk
без параметров и просмотрев подробные сообщения системы помощи. Данная утилита никак не влияет на таблицы формата InnoDB.
mysql
Это основное и очень мощное средство командной строки СУРБД MySQL. С его помощью тем или иным способом можно выполнить любую административную или пользовательскую задачу. Запустить монитор mysql
можно из командной строки; добавив заключительный дополнительный параметр, имя базы данных, вы сможете в мониторе обойтись без команды use <база_данных>
. Далее приведен пример запуска монитора от имени пользователя rick, запроса пароля (обратите внимание на пробел после -p
) и применения базы данных foo
по умолчанию.
$ mysql -u rick -р foo
Для постраничного просмотра других опций командной строки монитора mysql примените команду mysql –help | less
.
Если вы запускаете СУРБД MySQL без указания базы данных, для выбора одной из баз данных можно использовать опцию use <база_данных>
, приведенную в списке команд в табл. 8.3.
Монитор mysql
можно выполнить и в неинтерактивном режиме, собрав команды во входном файле и считывая его из командной строки. В этом случае вы должны задать пароль в командной строке.
$ mysql -u rick –password=secretpassword foo < sqlcommands.sql
После считывания и выполнения ваших команд mysql выведет на экран строку приглашения.
Во время подключения программы-клиента mysql к серверу в дополнение к стандартному набору команд SQL92 поддерживается ряд специфических команд, перечисленных в табл. 8.3.
Таблица 8.3
help или ? | h или ? | Отображает список команд |
edit | е | Редактирует команду. Применяемый редактор задается переменной окружения $EDITOR |
exit или quit | q | Завершает программу-клиент MySQL |
go | g | Выполняет команду |
source <имя_файла> | . | Выполняет команды SQL из заданного файла |
status | s | Отображает информацию о состоянии сервера |
system <команда> | ! | Выполняет системную команду |
tee <имя_файла> | T | Добавляет в конец заданного файла копию всего вывода |
use <база_данных> | u | Использует заданную базу данных |
Очень важная команда в этом наборе – use
. Сервер mysqld
предназначен для поддержки множества различных баз данных, обслуживаемых и управляемых одним серверным процессом. Во многих других серверах баз данных, таких как Oracle и Sybase, применяется термин «схема», а в СУРБД MySQL чаще используется термин «база данных». (В обозревателе запросов (Query Browser) MySQL, к примеру, применяется термин «схема».) Каждая база данных (в терминологии MySQL) представляет собой в основном независимый набор таблиц. Это позволяет настраивать разные базы данных для различных целей и назначать разных пользователей различным базам данных, используя для эффективного управления ими один и тот же сервер баз данных. С помощью команды use
можно при наличии соответствующих прав переключаться между различными базами данных.
Особая база данных mysql
, создаваемая автоматически при каждой установке СУРБД MySQL, применяется как основное хранилище сведений о пользователях и правах доступа.
Примечание
SQL92 – наиболее часто применяемая версия стандарта ANSI языка SQL. Ее назначение – формирование единообразия способов управления базами данных с применением SQL, обеспечивающего взаимодействие и взаимосвязь баз данных разных производителей.
mysqladmin
Эта утилита – основное средство быстрого администрирования базы данных MySQL. В дополнение к обычным параметрам она поддерживает основные команды, перечисленные в табл. 8.4.
Таблица 8.4
create <база_данных> | Создает новую базу данных |
drop <база_данных> | Удаляет базу данных |
password <новый_пароль> | Изменяет пароль (как вы уже видели) |
ping | Проверяет, работает ли сервер |
reload | Повторно загружает таблицы полномочий, управляющие правами доступа |
status | Предоставляет сведения о состоянии сервера |
shutdown | Выключает сервер |
variables | Отображает переменные, управляющие работой MySQL, и их текущие значения |
version | Выводит номер версии сервера и время его работы |
Запустите из строки приглашения утилиту mysqladmin
без параметров, чтобы увидеть полный список опций. Вам потребуется применить | less
.
mysqlbug
Если чуть повезет, вам никогда не представится шанс применить эту утилиту. Судя по имени, это средство создает отчет об ошибках для отправки в группу технической поддержки MySQL. Перед отправкой есть возможность отредактировать сформированный файл, включив в него дополнительную информацию, которая может оказаться полезной разработчикам.
mysqldump
Это крайне полезная утилита, позволяющая получить частичный или полный дамп базы данных в виде единого файла с набором команд языка SQL, которые могут быть считаны обратно в MySQL или в другую СУРБД. Она принимает как параметр стандартную информацию о пользователе и пароль, а также имена базы данных и таблиц. Дополнительные опции, приведенные в табл. 8.5, существенно расширяют функциональные возможности этой утилиты.
Таблица 8.5
–add-drop-table | Вставляет в файл вывода операторы SQL для удаления любых таблиц перед командой их создания |
-e | Применяет расширенный синтаксис вставки. Это нестандартный язык SQL, но если вы получаете дамп больших объемов информации, это поможет гораздо быстрее повторно загрузить дамп вашей базы в СУРБД MySQL |
-t | Получает дамп только данных из таблиц, а не информации, необходимой для создания таблиц |
-d | Получает дамп только структуры таблиц, а не реальных данных |
По умолчанию mysqldump
посылает эти данные в стандартный вывод, поэтому вам потребуется перенаправление их в файл.
Эта утилита очень удобна для перемещения данных или быстрого создания резервных копий, и благодаря клиент-серверной реализации MySQL ее даже можно использовать для выполнения сложного удаленного резервного копирования с помощью клиента mysqldump
, установленного на другой машине. Далее для примера приведена команда подключения пользователя rick и получения дампа базы данных myplaydb
:
$ mysqldump -u rick -p myplaydb > myplaydb.dump
Результирующий файл, у которого в нашей системе только одна таблица в базе данных, выглядит следующим образом:
– MySQL dump 10.11
–
– Host: localhost Database: myplaydb
– –
– Server version 5.0.37
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0*/;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO'*/;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
–
– Table structure for table 'children'
–
DROP TABLE IF EXISTS 'children';
CREATE TABLE 'children' (
'childno' int(11) NOT NULL auto_increment,
'fname' varchar(30) default NULL,
'age' int(11) default NULL,
PRIMARY KEY ('childno')
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
–
– Dumping data for table 'children'
–
LOCK TABLES 'children' WRITE;
/*!40000 ALTER TABLE 'children'DISABLE KEYS */;
INSERT INTO 'children' VALUES
(1,'Jenny',21),(2,'Andrew',17),(3,'Gavin',8), (4,'Duncan',6),(5,'Emma',4),
(6,'Alex',15),(7,'Adrian',9);
/*!40000 ALTER TABLE 'children'ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
– Dump completed on 2007-0.6-22 20:11:48
mysqlimport
Команда mysqlimport
применяется для загрузки в таблицу большого количества данных. С помощью mysqlimport
вы можете считывать из файла ввода большие объемы текстовых данных. Этой команде требуются только имена файла и базы данных; mysqlimport
загрузит данные в базу данных, в таблицу с тем же именем, что и имя файла (за исключением расширения файла). Вы должны убедиться в том, что в текстовом файле столько же столбцов данных, сколько их в таблице, заполняемой данными, и типы данных совместимы. По умолчанию данные следует разделять знаком табуляции.
Можно также выполнять команды SQL из текстового файла, просто запустив mysql
с перенаправлением ввода из файла, как мы упоминали ранее.
mysqlshow
Эта маленькая утилита может быстро предоставить информацию о вашей установке MySQL и составляющих ее базах данных.
□ Без параметров она отображает все имеющиеся базы данных.
□ С базой данных в качестве параметра она выводит таблицы этой базы данных.
□ С именами базы данных и таблицы утилита отображает перечень столбцов заданной таблицы.
□ Если заданы база данных, таблица и столбец, утилита выводит подробную информацию о заданном столбце.
Создание пользователей и наделение их правами доступаВ роли администратора MySQL вам чаще всего придется обслуживать пользователей: добавлять, и удалять пользователей СУРБД MySQL и управлять их полномочиями. Начиная с версии MySQL 3.22, правами доступа или полномочиями пользователей управляют в мониторе MySQL с помощью команд grant
и revoke
– задача, гораздо менее устрашающая, чем непосредственная корректировка таблиц прав доступа, которая требовалась в ранних версиях MySQL.
grant
Команда MySQL grant
почти, хотя и не полностью, соответствует синтаксису стандарта SQL92. Далее приведен общий формат:
grant <привилегия> on <объект> to <пользователь> [identified by user-password] [with grant option];
В табл. 8.6 перечислено несколько значений прав доступа, которые могут быть предоставлены.
Таблица 8.6
alter | Изменять таблицы и индексы |
create | Создавать базы данных и таблицы |
delete | Удалять данные из базы данных. |
drop | Удалять базы данных и таблицы |
index | Управлять индексами |
insert | Вставлять данные в базу данных |
lock tables | Разрешает блокировать таблицы |
select | Извлекать данные |
update | Изменять данные |
all | Все вышеперечисленные |
У некоторых прав доступа есть дополнительные опции. Например, create view
дает пользователю право создавать представления. Для получения полного списка прав доступа обратитесь к документации MySQL, относящейся к вашей версии СУРБД, поскольку эта область расширяется с каждой новой версией MySQL. Существует также несколько специальных административных прав доступа, но здесь мы их не рассматриваем.
Объект, которому вы предоставляете данные права, обозначается как
databasename.tablename
и в лучших традициях Linux *
– ссылка на любое имя, поэтому *.*
означает все объекты в каждой базе данных, a foo.*
– все таблицы в базе данных foo
.
Если заданный пользователь уже существует, права доступа корректируются с учетом вносимых вами изменений. Если такого пользователя нет, он создается с заданными правами доступа. Как вы уже видели, пользователей можно задавать на определенных компьютерах. Пользователя и компьютер следует задавать в одной команде для того, чтобы в полной мере использовать гибкость схемы предоставления прав доступа MySQL.
В синтаксисе языка SQL специальный символ %
– символ подстановки, во многом сходный, с символом *
в среде командной оболочки. Вы можете формировать отдельные команды для каждого требуемого набора прав доступа, но если, например, вы хотите предоставить доступ пользователю rick с любого компьютера в домене wiley.com, пользователя rick можно описать как
rick@'%.wiley.com'
Символ подстановки %
всегда следует заключать в кавычки для того, чтобы отделить его от остальных текстовых данных.
Вы также можете применять нотацию IP/Netmask (N.N.N.N/M.M.M.M), задающую сетевой адрес для управления доступом.
Также, как раньше вы использовали описание rick@'192.163.0.0/255.255.255.0'
для предоставления пользователю rick доступа с любого сетевого компьютера, можно задать rick@'192.168.0.1'
для ограничения доступа пользователя rick единственной рабочей станцией или ввести rick@'192.0.0.0/255.0.0.0'
, расширив область действия прав до любой машины в сети 192 класса А.
В еще одном примере команда
mysql> GRANT ALL ON foo.* TO rick@'%' IDENTIFIED BY 'bar';
создает пользователя rick с полным набором прав доступа к базе данных foo
для подключения с любой машины с начальным паролем bar
.
Если базы данных foo
до сих пор не существует, у пользователя rick теперь появится право создать ее с помощью команды SQL create database
.
Ключевые слова IDENTIFIED BY
– не обязательная часть команды, но убедиться в том, что у всех пользователей во время их создания появляются пароли, совсем неплохо.
Следует быть особенно внимательными, имея дело с именами пользователей, компьютеров или баз данных, содержащими знак подчеркивания, поскольку символ _
в языке SQL соответствует любому одиночному символу во многом так же, как знак %
соответствует любой строке символов. Везде, где это возможно, старайтесь избегать использования символа подчеркивания в именах пользователей и баз данных.
Обычно ключевые слова with grant option
применяются только для создания вспомогательного административного пользователя, но они также могут использоваться для разрешения вновь созданному пользователю получить права доступа, предоставляемые ему другими пользователями. Всегда применяйте ключевые слова with grant option
обдуманно.
revoke
Естественно, администратор не может только предоставлять права, но также и лишает прав. Делается это с помощью команды revoke
.
revoke <привилегия> on <объект> from <пользователь>
и с применением почти такого же формата, как в команде grant
. Например:
mysql> REVOKE INSERT ON foo.* FROM rick@'%';
Но команда revoke
не удаляет пользователей. Если вы хотите удалить пользователя окончательно, не просто измените его права доступа, а примените команду revoke
для удаления его прав. Затем вы сможете полностью удалить его из таблицы пользователей user
, переключившись на внутреннюю базу данных mysql
и удалив соответствующие строки из таблицы user
.
mysql> use mysql
mysql> DELETE FROM user WHERE user = «rick»
mysql> FLUSH PRIVILEGES;
Отказавшись от указания компьютера, вы обеспечите удаление всех записей, относящихся к пользователю MySQL, в данном случае rick, которого хотите удалить. После этого убедитесь в том, что вы вернулись в вашу базу данных (с помощью команды use
), иначе вы можете случайно продолжить работу с собственной внутренней базой данных MySQL.
ПаролиПримечание
Имейте в виду, что команда
delete
не относится к группе командgrant
иrevoke
. Синтаксис SQL делает ее применение необходимым из-за способа обработки прав доступа в MySQL. Вы напрямую обновляете таблицы прав доступа MySQL (поэтому первой применяется командаuse mysql
) для внесения нужных вам изменений эффективным способом.После обновления таблиц, как показано в примерах, вы должны применить команду
FLUSH PRIVILEGES
, чтобы сообщить серверу MySQL о необходимости перезагрузки таблиц с правами доступа.
Если вы хотите задать пароли для уже существующих пользователей, не имевших их до сих пор, или изменить собственный или чей-то пароль, следует подключиться к серверу MySQL как пользователь root и напрямую обновить данные пользователя. Например,
mysql> use mysql
mysql> SELECT host, user, password FROM user;
Вы должны получить перечень, похожий на следующий:
+–+–+–+
| host | user | password |
+–+–+–+
| localhost | root | 67457e226a1a15bd |
| localhost | foo | |
+–+–+–+
2 rows in set (0.00 sec)
Если вы хотите присвоить пароль bar пользователю foo, можно сделать следующее:
mysql> UPDATE user SET password = password('bar') WHERE user = 'foo';
Для проверки выведите снова соответствующие столбцы таблицы пользователей user
:
mysql> SELECT host, user, password FROM user;
+–+–+–+
| host | user | password |
+–+–+–+
| localhost | root | 65457e236glalwbq |
| localhost | foo | 7c9e0a41222752fa |
+–+–+–+
2 rows in set (0.00 sec) mysql>
Теперь наверняка у пользователя foo есть пароль. Не забудьте вернуться в свою исходную базу данных.
Начиная с версии MySQL 4.1, схема формирования паролей обновлена по сравнению с более ранними версиями. Но для обратной совместимости вы все еще можете задавать пароль, применяя старый алгоритм с функцией OLD_PASSWORD('password to set')
, если вам это нужно.
Следующий ваш шаг – создание базы данных. Предположим, что вам нужна база данных с именем rick
. Напоминаем о том, что вы уже создали пользователя с тем же именем. Сначала надо предоставить пользователю rick широкий ряд полномочий, чтобы он мог создавать новые базы данных. В среде разработки это особенно полезно, т. к. обеспечивает больше гибкости.
mysql> GRANT ALL ON *.* TO rick@localhost IDENTIFIED BY 'secretpassword';
Теперь протестируйте набор прав доступа, зарегистрировавшись как rick, и создайте базу данных:
$ mysql -u rick -р
Enter password:
...
mysql> CREATE DATABASE rick;
Query OK, 1 row affected (0.01 sec).
mysql>
Далее сообщите MySQL о том, что вы хотите переключиться на вашу новую базу данных:
mysql> use rick
Сейчас вы можете ввести в вашу базу данных таблицы и нужные вам данные. Во время последующих регистрации вы сможете задавать базу данных в конце командной строки и избежать применения команды use
.
$ mysql -u rick -p rick
Введя после подсказки пароль, вы автоматически, в ходе процесса подключения, переключитесь на использование базы данных rick по умолчанию.