Текст книги "Основы программирования в Linux"
Автор книги: Нейл Мэтью
Соавторы: Ричард Стоунс
Жанры:
Программирование
,сообщить о нарушении
Текущая страница: 28 (всего у книги 67 страниц)
return (entry_to_return);
}
9. Следующая функция add_cdc_entry
добавляет новый элемент каталога:
int add_cdc_entry(const cdc_entry entry_to_add) {
char key_to_add[CAT_CAT_LEN + 1];
datum local_data_datum;
datum local_key_datum;
int result;
/* Проверяет инициализацию базы данных и корректность параметров */
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(entry_to_add.catalog) >= CAT_CAT_LEN) return (0);
/* Гарантирует включение в ключ поиска только корректной строки
и значений null */
memset(&key_to_add, ' ', sizeof(key_to_add));
strcpy(key_to_add, entry_to_add.catalog);
local_key_datum.dptr = (void*)key_to_add;
local_key_datum.dsize = sizeof(key_to_add);
local_data_datum.dptr = (void*)&entry_to_add;
local_data_datum.dsize = sizeof(entry_to_add);
result = dbm_store(cdc_dbm_ptr, local_key_datum, local_data_datum, DBM_REPLACE);
/* dbm_store() применяет 0 для успешного завершения */
if (result == 0) return (1);
return (0);
}
10. Функция add_cdt_entry
добавляет новый элемент-дорожку. Ключ доступа – это комбинация строки из каталога и номера дорожки:
int add_cdt_entry(const cdt_entry entry_to_add) {
char key_to_add[CAT_CAT_LEN + 10];
datum local_data_datum;
datum local_key_datum;
int result;
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(entry_to_add.catalog) >= CAT_CAT_LEN) return (0);
memset(&key_to_add, ' ', sizeof(key_to_add));
sprintf(key_to_add, «%s %d», entry_to_add.catalog, entry_to_add.track_no);
local_key_datum.dptr = (void*)key_to_add;
local_key_datum.dsize = sizeof(key_to_add);
local_data_daturn.dptr = (void*)&entry_to_add;
local_data_datum.dsize = sizeof(entry_to_add);
result = dbm_store(cdt_dbm_ptr, local_key_datum, local_data_datum, DBM_REPLACE);
/* dbm_store() применяет 0 в случае успешного завершения
и отрицательные числа для обозначения ошибок */
if (result == 0) return (1);
return (0);
}
11. Если вы можете вставлять строки, было бы лучше, если вы могли бы и удалять их. Следующая функция удаляет элементы каталога;
int del_cdc_entry(const char *cd_catalog_ptr) {
char key_to_del[CAT_CAT_LEN +1];
datum local_key_datum;
int result;
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (0);
memset(&key_to_del, ' ', sizeof(key_to_del));
strcpy(key_to_del, cd_catalog_ptr);
local_key_datum.dptr = (void*)key_to_del;
local_key_datum.dsize = sizeof(key_to_del);
result = dbm_delete(cdc_dbm_ptr, local_key_datum);
/* dbm_delete() применяет 0 в случае успешного завершения */
if (result == 0) return (1);
return (0);
}
12. Далее приведена аналогичная функция для удаления дорожки. Помните о том, что ключ дорожки – это сложный индекс, состоящий из строки, принадлежащей элементу каталога, и номера дорожки:
int del_cdt_entry(const char *cd_catalog_ptr, const int track_no) {
char key_to_del[CAT_CAT_LEN + 10];
datum local_key_datum;
int result;
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (0);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (0);
memset(&key_to_del, ' ', sizeof(key_to_del));
sprintf(key_to_del, «%s %d», cd_catalog_ptr, track_no);
local_key_datum.dptr = (void*)key_to_del;
local_key_datum.dsize = sizeof(key_to_del);
result = dbm_delete(cdt_dbm_ptr, local_key_datum);
/* dbm_delete() применяет 0 в случае успешного завершения */
if (result == 0) return (1);
return (0);
}
13. И последнее, но не по значимости, у вас есть простая функция поиска. Она не очень замысловата, но, тем не менее, показывает, как просматривать элементы dbm, если ключи заранее неизвестны.
Поскольку вы не знаете наперед, сколько будет элементов, вы создаете такую функцию, которая будет возвращать один элемент после каждого вызова. Если ничего не найдено, элемент будет пустым. Для просмотра всей базы данных начните с вызова этой функции с указателем на целое число *first_call_ptr
, которое должно равняться 1 при первом вызове функции. Благодаря этому функция знает, что должна начать поиск с начала базы данных. В последующих вызовах переменная равна 0 и функция возобновляет поиск следом за последним найденным элементом.
Когда вы хотите перезапустить поиск, возможно, указав другой элемент каталога, вы должны снова вызвать эту функцию с параметром *first_call_ptr
, равным true
, что приведет к выполнению нового поиска.
Между вызовами функция хранит некоторую внутреннюю информацию о состоянии. Это скрывает от клиента сложность продолжения поиска и защищает секреты реализации функции поиска.
Если искомый текст указывает на символ null
, все элементы считаются удовлетворяющими критериям поиска.
cdc_entry search_cdc_entry(const char *cd_catalog_ptr,
int *first_call_ptr) {
static int local_first_call = 1;
cdc_entry entry_to_return;
datum local_data_datum;
static datum local_key_datum; /* обратите внимание,
должна быть static */
memset(&entry_to_return, ' ', sizeof(entry_to_return));
14. Как всегда, начните с имеющих смысл проверок:
if (!cdc_dbm_ptr || !cdt_dbm_ptr) return (entry_to_return);
if (!cd_catalog_ptr || !first_call_ptr) return (entry_to_return);
if (strlen(cd_catalog_ptr) >= CAT_CAT_LEN) return (entry_to_return);
/* Защита от пропуска вызова с *first_call_ptr, равным true */
if (local_first_call) {
local_first_call = 0;
*first_call_ptr = 1;
}
15. Если эта функция была вызвана с параметром *first_call_ptr
, равным true
, вы должны продолжить (или заново начать) поиск от начала базы данных. Если *first_call_ptr
не равен true
, просто переходите к следующему ключу в базе данных:
if (*first_call_ptr) {
*first_call_ptr = 0;
local_key_datum = dbm_firstkey(cdc_dbm_ptr);
} else {
local_key_datum = dbm_nextkey(cdc_dbm_ptr);
}
do {
if (local_key_datum.dptr != NULL) {
/* Элемент был найден */
local_data_datum = dbm_fetch(cdc_dhm_ptr, local_key_datum);
if (local_data_datum.dptr) {
memcpy(&entry_to_return, (char*)local_data_datum.dptr, local_data_datum, dsize);
16. Функция поиска включает очень простую проверку, позволяющую увидеть, входит ли строка поиска в текущий элемент каталога.
/* Проверяет, входит ли строка в текущий элемент */
if (!strstr(entry_to_return.catalog, cd_catalog_ptr)) {
memset(&entry_to_return, ' ', sizeof(entry_to_return));
local_key_datum = dbm_nextkey(cdc_dbm_ptr);
}
}
}
} while (local_key_datum.dptr && local_data_datum.dptr &&
(entry_to_return.catalog[0] == ' '));
return (entry_to_return);
} /* search_cdc_entry */
Теперь вы готовы собрать все вместе с помощью следующего make-файла или файла сборки. Не слишком углубляйтесь в него сейчас, поскольку мы обсудим его работу в следующей главе. В данный момент просто наберите его и сохраните как Makefile.
all: application
INCLUDE=/usr/include/gdbm LIBS=gdbm
# В некоторых дистрибутивах вам, возможно, придется изменить предыдущую
# строку, чтобы включить библиотеку совместимости, как показано далее
# LIBS= -lgdbm_compat -lgdbm
CFIAGS=
app_ui.о: app_ui.с cd_data.h
gcc $(CFLAGS) -c app_ui.c
access.о: access.с cd_data.h
gcc $(CFLAGS) -I$(INCLUDE) -c access.с
application: app_ui.o access.о
gcc $(CFLAGS) -o application app_ui.o access.о -l$(LIBS)
clean:
rm -f application *.o
nodbmfiles:
rm -f *.dir *.pag
Для компиляции вашего нового приложения управления коллекцией компакт– дисков наберите следующую команду в командной строке:
$ make
Если все пройдет нормально, выполняемый файл application будет откомпилирован и помещен в текущий каталог.
Резюме
В этой главе вы узнали о трех аспектах управления данными. Сначала вы познакомились с системой управления памятью в ОС Linux, и убедились в простоте ее применения, несмотря на то, что на низком уровне в нее включена реализация виртуальной памяти с подкачкой страниц. Вы также увидели, как она защищает операционную систему и другие программы от попыток несанкционированного доступа к памяти.
Затем мы перешли к рассмотрению того, как блокировка файлов позволяет многочисленным программам сотрудничать при получении доступа к данным. Сначала вы познакомились с простой двоичной схемой семафора и затем более сложной ситуацией, в которой вы блокируете участки файла, устанавливая разделяемый или исключительный доступ. Далее вы рассмотрели библиотеку dbm и ее возможности хранения и эффективного извлечения блоков данных благодаря очень гибкому механизму индексирования.
В заключение, применив dbm как средство хранения данных, мы переработали проектное решение и заново переписали пример приложения, управляющего базой данных компакт-дисков.
Глава 8
MySQL
Теперь, когда вы изучили основы управления данными с помощью обычных файлов и затем посредством простой, но очень быстрой базы данных dbm, можно перейти к полнофункциональному средству работы с данными: СУРБД или системе управления реляционной базы данных (Relational Database Management System, RDBMS).
Два самых известных приложения СУРБД с открытым исходным кодом – это PostgreSQL и MySQL, хотя существует и множество других. Есть также много коммерческих СУРБД, таких как Oracle, Sybase и DB2, все они многофункциональны и могут действовать на различных платформах. Работающая только под управлением ОС Windows система Microsoft SQL Server – еще одно популярное средство на коммерческом рынке СУБД. У всех этих программных продуктов есть свои достоинства, но с учетом занимаемого пространства и принадлежности к программному обеспечению с открытым кодом авторы книги сосредоточились исключительно на СУРБД MySQL.
Появление MySQL восходит к 1984 г., а коммерческий вариант был разработан и поддерживается под покровительством компании MySQL АВ в течение последних нескольких лет. Поскольку СУРБД MySQL – это программное обеспечение с открытым исходным кодом, условия его использования часто смешивают с аналогичными условиями в других проектах с открытым программным кодом. Несмотря на то, что в большинстве случаев MySQL может применяться в соответствии с Общедоступной лицензией проекта GNU (GPL), есть обстоятельства, требующие покупки коммерческой лицензии для использования этого продукта. Следует внимательно проверить лицензионные требования на Web-сайте MySQL (www.mysql.com) и определить, какая редакция MySQL соответствует вашим потребностям.
Если вам нужна база данных с открытым программным кодом, а условия применения MySQL в соответствии с требованиями лицензии GPL для вас не приемлемы, и вы не хотите покупать коммерческую лицензию, то можете рассмотреть как альтернативу применение мощной СУРБД PostgreSQL (во время написания книги лицензионные условия использования PostgreSQL были менее строгими). Подробности можно найти на Web-сайте www.postgresql.org.
Примечание
Более подробную информацию о PostgreSQL вы можете найти в нашей книге: Neil Matthew. Beginning Databases with PostgreSQL: From Novice to Professional. Second Edition. – Apress, 2005. (Мэттью H. Базы данных на примере PostgreSQL: от новичка до профессионала. Второе издание).
В этой главе обсуждаются следующие темы:
□ установка MySQL;
□ команды администрирования, необходимые для работы с MySQL;
□ основные средства и функции MySQL;
□ API для взаимодействия ваших программ на языке С с базами данных MySQL;
□ создание реляционной базы данных, которую вы сможете применять в вашем приложении на языке С для управления коллекцией CD-дисков.
Установка
Какой бы вариант системы Linux вы не предпочли, вероятно, для него существует доступная версия MySQL, заранее откомпилированная и готовая к установке. Например, для Red Hat, SUSE и Ubuntu есть заранее откомпилированные пакеты, включенные в современные дистрибутивы этих ОС. Мы рекомендуем вам, как правило, применять заранее откомпилированные версии, поскольку они предоставляют самый легкий способ быстрых установки и запуска MySQL. Если в вашем дистрибутиве нет пакета MySQL или вы хотите получить самый свежий выпуск программного обеспечения, двоичные и исходные пакеты можно загрузить с Web-сайта MySQL.
В этой главе мы описываем установку только заранее откомпилированных версий MySQL.
Пакеты MySQLЕсли по какой-то причине вам вместо стандартной версии нужно загрузить MySQL из Интернета, для подготовки и выполнения примеров из этой книги следует применять сборку Standard общедоступной версии (community edition). Вы увидите, что в нее включены пакеты Мах и Debug. Пакет Max содержит дополнительные средства, такие как поддержка необычных типов файлов для хранения и развитых средств, например кластеризации. Пакеты Debug откомпилированы с дополнительным кодом отладки и отладочной информацией; к счастью, вам не понадобится отладка на столь низком уровне.
Примечание
Не используйте версии Debug при эксплуатации; производительность снижается из-за дополнительной поддержки отладочных средств.
Для разработки приложений на базе MySQL вам придется установить не только сервер, но и библиотеки разработки. Как правило, в вашем диспетчере пакетов (package manager) есть вариант MySQL, нужно только убедиться в том, что установлены и библиотеки средств разработки. На рис. 8.1 показан диспетчер пакетов, готовый установить MySQL с дополнительным пакетом средств разработки, выделенным и готовым к установке.
Рис. 8.1
В других дистрибутивах организация пакетов немного иная. Например, на рис. 8.2 показан объединенный диспетчер пакетов дистрибутива Ubuntu, готовый к установке MySQL.
Рис. 8.2
Установка MySQL также создает пользователя «mysql», имя которого по умолчанию применяется как имя процесса-демона сервера MySQL.
После установки пакетов необходимо проверить, запущена ли автоматически СУРБД MySQL. Во время написания книги некоторые дистрибутивы, например, Ubuntu делали это, в то время как другие, такие как Fedora, нет. К счастью, очень легко проверить, работает ли сервер MySQL:
$ ps -el | grep mysqld
Если вы видите один или несколько выполняющихся процессов mysqld, следовательно, сервер стартовал. Во многих системах вы также увидите процесс safe_mysqld, утилиту для запуска реального процесса mysqld с корректным идентификатором пользователя.
Если нужно запустить (или перезапустить либо остановить) сервер MySQL, можно использовать панель управления сервисами GUI (GUI services control panel). Панель настройки сервисов (Service Configuration pane) дистрибутива Fedora показана на рис. 8.3.
Рис. 8.3
Вам следует применить редактор настройки сервисов для того, чтобы определить, хотите ли вы, чтобы сервер MySQL автоматически стартовал при каждом запуске ОС Linux.
Настройка после установкиПредположим, что все идет как надо, СУБД MySQL установлена и стартовала с общим стандартным набором параметров. Это предположение можно проверить:
$ mysql -u root mysql
Если вы получите сообщение "Welcome to the MySQL monitor" ("Добро пожаловать в монитор MySQL") и затем приглашение mysql>
, значит, сервер выполняется. Конечно, любой пользователь вмиг может подключиться к серверу и получить права администратора, но мы рассмотрим это лишь вкратце. Попробуйте ввести s
для получения некоторой дополнительной информации о вашем сервере. Когда насмотритесь, введите quit
или q
для выхода из монитора.
Дополнительную информацию можно получить с помощью команды mysql -?
, которая выводит еще больше подробностей, касающихся сервера. В выводе есть одна деталь, которую следует проверить. После списка аргументов обычно выводится строка Default options are read from the following files in the given order:
(Текущие параметры считаны из следующих файлов в заданном порядке:). Она указывает, где найти файл конфигурации, который следует использовать для настройки вашего сервера MySQL. Стандартный файл конфигурации – /etc/my.cnf, хотя в некоторых дистрибутивах, например Ubuntu, применяется файл /etc/mysql/my.cnf.
Состояние работающего сервера можно также проверить с помощью команды mysqladmin
:
$ mysqladmin -u root version
Вывод не только подтвердит запуск, но и предоставит номер версии используемого вами сервера.
Еще один полезный аспект применения команды mysqladmin
– проверка конфигурационных параметров запущенного сервера с помощью опции variables
:
$ mysqladmin variables
Эта команда выводит длинный список значений переменных. Пара особенно полезных – переменная datadir
, сообщающая о том, где MySQL хранит данные, и переменная have_innodb
, обычно равная YES
и указывающая на то, что поддерживается универсальный механизм хранения данных (storage engine) InnoDB. MySQL поддерживает ряд механизмов хранения, представляющих собой низкоуровневую реализацию обработчиков для хранения данных. Наиболее популярные (и самые полезные) – InnoDB и MyISAM, но есть и другие, например механизм хранения в оперативной памяти (memory engine), совсем не использующий долговременную память, или CSV-механизм, применяющий файлы с переменными, разделенными запятыми. У разных механизмов хранения различные функции производительности. В настоящее время мы рекомендуем InnoDB как механизм хранения для баз данных общего назначения, представляющий собой компромиссное решение с точки зрения производительности и поддержки заданных связей между различными элементами данных. Если поддержка InnoDB не включена, проверьте файл конфигурации /etc/my.cnf, превратите в комментарий строку skip-innodb
, поместив в начало строки знак номера или решетки (#
), и воспользуйтесь редактором сервисов для перезапуска MySQL. Если это не поможет, возможно, у вас версия MySQL, откомпилированная без поддержки InnoDB, Поищите на Web-сайте MySQL версию с поддержкой InnoDB, если вам это важно. В примерах данной главы без ущерба можно применить и альтернативный механизм хранения MyISAM, во многих дистрибутивах используемый по умолчанию.
После того как вы убедитесь в том, что в двоичный файл сервера включена поддержка InnoDB, для того чтобы сделать его выбираемым по умолчанию механизмом хранения данных, вы должны задать его таковым в файле /etc/my.cnf, иначе по умолчанию будет применяться механизм хранения MyISAM. Редактирование очень простое: в раздел mysqld
вставьте строку default-storage-engine=INNODB
. К примеру, начало файла могло бы выглядеть следующим образом:
[mysqld]
default-storage-engine=INNODB
datadir=/var/lib/mysql
...
В оставшейся части данной главы мы полагаем, что по умолчанию в качества механизма хранения выбран InnoDB.
В процессе эксплуатации вам, как правило, придется также изменять установленное по умолчанию место хранения данных, задаваемое переменной datadir
. Делается это тоже с помощью редактирования раздела mysql
конфигурационного файла /etc/my.cnf. Например, если вы применяете механизм хранения InnoDB для размещения файлов данных в каталоге /vol02, а файлов регистрации – в каталоге /vol03 плюс задаете начальный размер файла данных 10 Мбайт с возможностью увеличения, можно использовать следующие конфигурационные строки:
innodb_data_home_dir = /vol02/mysql/data
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /vol03/mysql/logs
Более подробную информацию и другие конфигурационные параметры можно найти в интерактивных руководствах на Web-сайте www.mysql.com.
Примечание
Если сервер не запускается или вы не можете подключиться к базе данных после запуска сервера, см. следующий раздел, посвященный неполадкам после вашей установки сервера.
Помните об имеющейся бреши в системе безопасности, упоминавшейся несколько разделов назад и позволяющей любому подключиться без пароля как пользователь root? Сейчас самое время усовершенствовать защиту. Не дайте сбить себя с толку имени пользователя root, применяемому во время установки MySQL. Между пользователем root СУРБД MySQL и пользователем root операционной системы нет никакой связи; MySQL просто регистрирует пользователя с именем «root» как администратора, что делает и ОС Linux. Пользователи базы данных MySQL и идентификаторы пользователей ОС Linux никак не связаны; у MySQL есть собственная встроенная система управления пользователями и правами доступа. По умолчанию пользователь с учетной записью в. вашей установленной системе Linux может зарегистрироваться на вашем сервере MySQL как администратор этой СУРБД. После того как вы ограничите права пользователя root СУРБД MySQL, например, разрешив только локальному пользователю регистрироваться с именем root и установив пароль для такого доступа, вы можете добавить только тех пользователей и только те права доступа, которые абсолютно необходимы для функционирования вашего приложения.
Установить пароль можно любым возможным способом, но самый простой с помощью команды:
$ mysqladmin -u root password newpassword
Она задает начальный пароль newpassword
.
Этот метод порождает проблему, заключающуюся в том, что понятный текстовый пароль остается в протоколе или хронологии (history) вашей командной оболочки и может просматриваться кем угодно с помощью команды ps
во время выполнения вашей команды или может быть извлечен из протокола команды. Лучше еще раз применить монитор MySQL на этот раз для отправки нескольких команд на языке SQL, которые изменят ваш пароль.
$ mysql -u root
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 4
Type 'help;' or 'h' for help. Type ' c' to clear the buffer.
mysql> SET password=PASSWORD('secretpassword');
Query OK, 0 rows affected (0.00 sec)
Конечно же, выберите пароль, известный только вам, а не пример "secretpassword", использованный нами в данном случае для того, чтобы показать, куда вводить ваш собственный пароль. Если вы когда-нибудь захотите удалить пароль, можно просто задать пустую строку на месте "secretpassword", и пароль будет удален.
Примечание
Обратите внимание на то, что мы завершаем команды на языке SQL точкой с запятой (
;
). Строго говоря; она не является частью команды SQL, а применяется для того, чтобы сообщить программе-клиенту MySQL о том, что наша команда SQL готова к выполнению. Мы также пользуемся прописными буквами для ввода ключевых слов языка SQL, например,SET
. Это не обязательно, потому что действительный синтаксис MySQL допускает ввод ключевых слов как прописными, так и строчными буквами, но мы применяем первый вариант как принятое соглашение в данной книге и в нашей повседневной работе, т.к. считаем, что это облегчает чтение команд SQL.
Теперь рассмотрим таблицу прав доступа, чтобы убедиться в том, что пароль установлен. Сначала с помощью команды use переключитесь на базу данных mysql и затем запросите внутренние таблицы:
mysql> use mysql
mysql> SELECT user, host, password FROM user;
+–+–+–+
| user | host | password |
+–+–+–+
| root | localhost | 2dxf8e9c23age6ed |
| root | fc7blp4e | |
| | localhost | |
| | fc7blp4e | |
+–+–+–+
4 rows in set (0.01 sec) mysql>
Отметьте, что вы создали пароль для пользователя root, только когда подключились с компьютера localhost
. MySQL может хранить права доступа не только для пользователей, но и для классов соединений (connection classes), основанных на имени узла. Следующим шагом в защите вашей установки будет удаление ненужных пользователей, устанавливаемых MySQL по умолчанию. Приведенная далее команда удаляет из таблицы прав доступа всех пользователей с именами, отличающимися от root.
mysql> DELETE FROM user WHEREuser != 'root';
Query OK, 2 rows affected (0.01 sec)
Следующая команда удаляет все регистрации с машин, отличных от компьютера localhost
.
mysql> DELETE FROM user WHEREhost != 'localhost';
Query OK, 1 row affected (0.01 sec)
И последнее, примените следующую команду для того, чтобы убедиться в отсутствии случайных регистраций:
mysql> SELECT user, host, password FROM user;
+–+–+–+
| user | host | password |
+–+–+–+
| root | localhost | 2dxf8e9c23age6ed |
+–+–+–+
1 row in set (0.00 sec) mysql> exit
Как видно из предыдущего вывода, теперь у вас есть только один зарегистрированный пользователь, который может подключаться только с машины localhost.
Внимание! Момент истины: можете ли вы в дальнейшем регистрироваться с паролем, который установили? На сей раз вы задаете параметр -p
, который сообщает MySQL о необходимости вывести подсказку для ввода пароля:
$ mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or g.
Your MySQL connection id is 7
Type 'help;' or 'h' for help. Type 'c' to clear the buffer.
mysql>
Теперь у вас есть работающая версия MySQL, заблокированная так, что только пользователь root с паролем, установленным вами, может подключиться к серверу базы данных и только с локальной машины. Подключиться к MySQL и ввести пароль вы можете из командной строки. Делается это с помощью параметра, –password
, например, –password=secretpassword
или -psecretpassword
, но ясно, что это небезопасно, потому что пароль можно увидеть с помощью команды ps
или просмотра хронологии команды. Однако ввод пароля в командной строке иногда просто необходим, например, если вы пишете сценарии, которым нужно подключаться к базе данных MySQL.
Следующий шаг – добавление пользователя или пользователей, которые нужны. В случае системы Linux, не следует без крайней необходимости использовать учетную запись root для регистрации в базе данных MySQL, лучше создать обычного пользователя для каждодневного применения.
Как мы отмечали ранее, вы можете создать пользователей с различными правами подключения с разных машин; в примере пользователю root из соображений безопасности разрешено подключаться только с локальной машины. В данной главе создадим нового пользователя широкими правами доступа. Rick сможет подключаться тремя разными способами:
□ он сможет подключаться с локальной машины;
□ он сможет подключаться с любой машины, IP-адрес которой находится в диапазоне от 192.168.0.0 до 192.168.0.255;
□ он сможет подключаться с любой машины, входящей в домен wiley.com.
Самый легкий способ сделать это безопасно – создать трех разных пользователей с тремя разными зонами подключения. У этих пользователей по вашему желанию даже могут быть разные пароли, зависящие от того, с какого адреса они устанавливают соединение.
Создать пользователей и присвоить им полномочия можно с помощью команды grant:
. Создадим пользователя с тремя только что перечисленными зонами, подключения. Ключевое слово IDENTIFIED BY
– немного странная синтаксическая запись для задания начального пароля. Обратите внимание на способ применения кавычек; важно применять символы одинарных кавычек точно так, как показано, иначе вы не сможете создать пользователей, как намечали.
Подключитесь к MySQL как пользователь root и затем выполните следующие действия.
1. Создайте регистрацию входа с локальной машины (login) для пользователя rick.
mysql> GRANT ALL ON *.* TO rick@localhost IDENTIFIED BY 'secretpassword';
Query OK, 0 rows affected (0.03 sec)
2. Затем создайте регистрацию входа с любой машины из подсети класса С 192.168.0. Учтите, что следует использовать одинарные кавычки для защиты IP-диапазона и маску /255.255.255.0 для указания диапазона допустимых IP-адресов.
mysql> GRANT ALL ON *.* TO rick@'192.168.0.0/255.255.255.0' IDENTIFIED BY 'secretpassword';
Query OK, 0 rows affected (0.00 sec)
3. В заключение создайте такую регистрацию входа, чтобы пользователь rick мог зарегистрироваться с любой машины из домена wiley.com (и снова обратите внимание на одинарные кавычки).
mysql> GRANT ALL ON *.* ТО rick@'%.wiley.com' IDENTIFIED BY 'secretpassword';
Query OK, 0 rows affected. (0.00 sec)
4. Опять просмотрите таблицу пользователей, чтобы еще раз проверить все элементы!
mysql> SELECT user, host, password FROM mysql.user;
+–+–+–+
| user | host | password |
+–+–+–+
| root | localhost | 2dxf8e8cl7ade6ed |
| rick | localhost | 3742g6348q8378d9 |
| rick | %.wiley.com | 3742g6348q8378d9 |
| rick | 192.168.0.0/255.255.255.0 | 3742g6348q8378d9 |
+–+–+–+
4 rows in set (0.00 sec)
mysql>
Естественно, необходимо откорректировать предшествующие команды и пароли в соответствии с вашими локальными настройками. Вы должны были заметить команду GRANT ALL ON *.*
, которая, как вы наверное догадались, предоставляет пользователю rick обширные права доступа. Это хорошо для опытного пользователя, но не годится для обычных пользователей. Мы более подробно обсудим команду grant
в разд. «Создание пользователей и наделение их правами доступа» далее в этой главе, где среди прочего покажем, как создать пользователя с ограниченными правами доступа.
Теперь, когда вы установили и запустили СУРБД MySQL (если нет, см. следующий раздел), сделали установку более безопасной, и создали пользователя– неадминистратора, готового выполнять кое-какую работу, кратко обсудим поиск и устранение неисправностей после установки, а затем немного вернемся назад и дадим краткий обзор основ администрирования базы данных MySQL.