Перейти к содержимому

Какая команда задает поиск по определенному шаблону

  • автор:

Какая команда задает поиск по определенному шаблону

Запросы на выборку в Access

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

Конструирование запросов на выборку с условиями отбора

Рассмотрим запросы на выборку в Access на примере получения информации из таблицы ТОВАР базы данных Поставка товаров.

Задача 1. Пусть необходимо выбрать ряд характеристик товара по его наименованию.

  1. Для создания запроса в окне базы данных выберите вкладку ленты — Создание (Create) и в группе Запросы (Queries) нажмите кнопку Конструктор запросов (Query Design). Откроется пустое окно запроса на выборку в режиме конструктора — ЗапросN (QueryN) и диалоговое окно Добавление таблицы (Show Table) (рис. 4.2).
  2. В окне Добавление таблицы (Show Table) выберите таблицу ТОВАР и нажмите кнопку Добавить (Add). Выбранная таблица будет отображена в области схемы данных запроса. Закройте окно Добавление таблицы (Show Table), нажав кнопку Закрыть (Close).

В результате выполненных действий в окне конструктора запросов (рис. 4.1) в верхней панели появится схема данных запроса, которая включает выбранные для данного запроса таблицы. В данном случае одну таблицу ТОВАР. Таблица представлена списком полей. Первая строка в списке полей таблицы, отмеченная звездочкой (*), обозначает все множество полей таблицы. Нижняя панель является бланком запроса, который нужно заполнить.

Запросы в Access

Кроме того, на ленте появляется и автоматически активизируется новая вкладка Работа с запросами | Конструктор (Query Tools | Design) (на рис. 4.3 представлена на часть этой вкладки), на которой цветом выделен тип созданного запроса — Выборка (Select). Таким образом, по умолчанию всегда создается запрос на выборку. Команды этой вкладки представляют инструментарий для выполнения необходимых действий при создании запроса. Эта вкладка открывается, когда в режиме конструктора создается новый запрос или редактируется существующий.

Запросы на выборку в Access

  1. Для удаления любой таблицы из схемы данных запроса установите на нее курсор мыши и нажмите клавишу . Для добавления ― нажмите кнопку Отобразить таблицу ( Show Table) в группе Настройка запроса (Query Setup) на вкладке Работа с запросами | Конструктор (Query Tools | Design) или выполните команду Добавить таблицу (Show Table) в контекстном меню, вызываемом на схеме данных запроса.
  2. В окне конструктора (рис. 4.4) последовательно перетащите из списка полей таблицы ТОВАР поля НАИМ_ТОВ, ЦЕНА, НАЛИЧИЕ_ТОВ в столбцы бланка запроса в строку Поле (Field).
  3. Для включения нужных полей из таблицы в соответствующие столбцы запроса можно воспользоваться следующими приемами:
    • в первой строке бланка запроса Поле (Field) щелчком мыши вызвать появление кнопки списка и выбрать из списка нужное поле. Список содержит поля таблиц, представленных в схеме данных запроса;
    • дважды щелкнуть на имени поля таблицы в схеме данных запроса;
    • для включения всех полей таблицы можно перетащить или дважды щелкнуть на символе * (звездочка) в списке полей таблицы в схеме данных запроса.
  4. Если вы по ошибке перетащили в бланке запроса ненужное поле, удалите его. Для этого переместите курсор в область маркировки столбца сверху, где он примет вид черной стрелки, направленной вниз, и щелкните кнопкой мыши. Столбец выделится. Нажмите клавишу или выполните команду Удалить столбцы (Delete Columns) в группе Настройка запроса (Query Setup).
  5. В строке Вывод на экран (Show) отметьте поля, иначе они не будут включены в таблицу запроса.
  6. Запишите в строке Условия отбора (Criteria) наименование товара, как показа-но в бланке запроса на рис. 4.4. Так как выражение в условии отбора не содержит оператора, то по умолчанию используется оператор =. Используемое в выражении текстовое значение вводится в двойных кавычках, которые добавляются автоматически.
  7. Выполните запрос, щелкнув на кнопке Выполнить (Run) или на кнопке Режим (View) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записью из таблицы ТОВАР, отвечающей заданным условиям отбора.

Запросы на выборку в Access

ЗАМЕЧАНИЕ
Окно запроса в режиме таблицы аналогично окну просмотра таблицы базы данных. Через некоторые таблицы запроса может производиться изменение данных базовой таблицы, лежащей в основе запроса. Запрос, просматриваемый в режиме таблицы, в отличие от таблицы базы данных Access 2010, не имеет столбца Щелкнуть для добавления (Click to Add), предназначенного для изменения структуры таблицы. В этом режиме на вкладке ленты Главная (Home) доступны те же кнопки, что и при открытии таблицы базы данных.

  1. Если при вводе сложного наименования товара вы допустили неточность, товар не будет найден в таблице. Использование операторов шаблона — звездочка (*) и вопросительный знак (?) (стандарт ANSI-89, используемый для запросов по умолчанию) или знак процента (%) и подчеркивания (_) (ANSI-92, рекомендуемый как стандарт для SQL Server), упрощает поиск нужных строк и позволяет избежать многих ошибок. Введите вместо полного имени товара Корпус* или Корпус%. Выполните запрос. Если в поле наименования товара одно значение начинается со слова «Корпус», результат выполнения запроса будет таким же, как в предыдущем случае. После выполнения запроса введенное выражение будет дополнено оператором Like «Корпус*». Этот оператор позволяет использовать символы шаблона при поиске в текстовых полях.
  2. Если необходимо найти несколько товаров, используйте оператор In. Он позволяет выполнить проверку на равенство любому значению из списка, который задается в круглых скобках. Запишите в строке условий отбора In («Корпуc MiniTower»;»HDD Maxtor 20GB»;»FDD 3,5″). В таблице запроса будет выведено три строки. В операторе In не допускается использование символов шаблона.

Задача 2. Пусть надо выбрать товары, цена которых не более 1000 руб., и НДС не более 10%, а также выбрать товары, цена которых более 2500 руб. Результат должен содержать наименование товара (НАИМ_ТОВ), его цену (ЦЕНА) и НДС (СТАВКА_НДС).

  1. Создайте новый запрос в режиме конструктора, добавьте таблицу ТОВАР. В окне конструктора (рис. 4.5) последовательно перетащите из списка полей таблицы ТОВАР в бланк запроса поля НАИМ_ТОВ, ЦЕНА, СТАВКА_НДС.
  2. Запишите Условия отбора (Criteria), как показано в бланке запроса на рис. 4.5. Между условиями, записанными в одной строке, выполняется логическая операция AND. Между условиями, записанными в разных строках, выполняется логическая операция OR.
  3. Выполните запрос, щелкните на кнопке Выполнить (Run) в группе Результаты (Results). На экране появится окно запроса в режиме таблицы с записями из таблицы ТОВАР, отвечающими заданным условиям отбора.
  4. Сохраните запрос, выполнив соответствующую команду в контекстном меню запроса, которое вызывается при установке курсора на заголовок запроса. Дайте ему имя Пример2.

Запросы на выборку в Access

Задача 3. Пусть надо выбрать все накладные за заданный период. Результат должен содержать номер накладной (НОМ_НАК), код склада (КОД_СК), дату отгрузки (ДАТА_ОТГР) и общую стоимость отгруженного товара (СУММА_НАКЛ).

  1. Создайте новый запрос в режиме конструктора, добавьте таблицу НАКЛАДНАЯ. В окне конструктора последовательно перетащите из списка полей таблицы НАКЛАДНАЯ в бланк запроса все необходимые поля.
  2. Для поля ДАТА_ОТГР в строке Условия отбора (Criteria) запишите Between #11.01.2008# And #31.03.2008#. Оператор Between задает интервал дат (в ANSI-92 вместо знака # используются одинарные кавычки ‘). Кроме того, этот оператор позволяет задать интервал для числового значения.

Для закрепления смотрим видеоурок:

Вычисляемые поля в запросах Access далее.

ПОИСК, ПОИСКБ (функции ПОИСК, ПОИСКБ)

Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel для Интернета Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Excel для Mac 2011 Excel Starter 2010 Еще. Меньше

В этой статье описаны синтаксис формулы и использование функций ПОИСК и ПОИСКБ в Microsoft Excel.

Описание

Функции ПОИСК И ПОИСКБ находят одну текстовую строку в другой и возвращают начальную позицию первой текстовой строки (считая от первого символа второй текстовой строки). Например, чтобы найти позицию буквы «n» в слове «printer», можно использовать следующую функцию:

Эта функция возвращает 4, так как «н» является четвертым символом в слове «принтер».

Можно также находить слова в других словах. Например, функция

возвращает 5, так как слово «base» начинается с пятого символа слова «database». Можно использовать функции ПОИСК и ПОИСКБ для определения положения символа или текстовой строки в другой текстовой строке, а затем вернуть текст с помощью функций ПСТР и ПСТРБ или заменить его с помощью функций ЗАМЕНИТЬ и ЗАМЕНИТЬБ. Эти функции показаны в примере 1 данной статьи.

  • Эти функции могут быть доступны не на всех языках.
  • Функция ПОИСКБ отсчитывает по два байта на каждый символ, только если языком по умолчанию является язык с поддержкой БДЦС. В противном случае функция ПОИСКБ работает так же, как функция ПОИСК, и отсчитывает по одному байту на каждый символ.

К языкам, поддерживающим БДЦС, относятся японский, китайский (упрощенное письмо), китайский (традиционное письмо) и корейский.

Синтаксис

Аргументы функций ПОИСК и ПОИСКБ описаны ниже.

  • Искомый_текст Обязательный. Текст, который требуется найти.
  • Просматриваемый_текст Обязательный. Текст, в котором нужно найти значение аргумента искомый_текст.
  • Начальная_позиция Необязательный. Номер знака в аргументе просматриваемый_текст, с которого следует начать поиск.

Замечание

  • Функции ПОИСК и ПОИСКБ не учитывают регистр. Если требуется учитывать регистр, используйте функции НАЙТИ и НАЙТИБ.
  • В аргументе искомый_текст можно использовать подстановочные знаки: вопросительный знак (?) и звездочку (*). Вопросительный знак соответствует любому знаку, звездочка — любой последовательности знаков. Если требуется найти вопросительный знак или звездочку, введите перед ним тильду (~).
  • Если значение find_text не найдено, #VALUE! возвращается значение ошибки.
  • Если аргумент начальная_позиция опущен, то он полагается равным 1.
  • Если start_num больше нуля или больше, чем длина аргумента within_text, #VALUE! возвращается значение ошибки.
  • Аргумент начальная_позиция можно использовать, чтобы пропустить определенное количество знаков. Допустим, что функцию ПОИСК нужно использовать для работы с текстовой строкой «МДС0093.МужскаяОдежда». Чтобы найти первое вхождение «М» в описательной части текстовой строки, задайте для аргумента начальная_позиция значение 8, чтобы поиск не выполнялся в той части текста, которая является серийным номером (в данном случае — «МДС0093»). Функция ПОИСК начинает поиск с восьмого символа, находит знак, указанный в аргументе искомый_текст, в следующей позиции, и возвращает число 9. Функция ПОИСК всегда возвращает номер знака, считая от начала просматриваемого текста, включая символы, которые пропускаются, если значение аргумента начальная_позиция больше 1.

Примеры

Скопируйте образец данных из следующей таблицы и вставьте их в ячейку A1 нового листа Excel. Чтобы отобразить результаты формул, выделите их и нажмите клавишу F2, а затем — клавишу ВВОД. При необходимости измените ширину столбцов, чтобы видеть все данные.

Заметки начинающего администратора СУБД MySQL.

Решил сделать заметку по СУБД MySQL, в которой я постарался выделить самый важный «минимум» по администрированию СУБД MySQL, который интересовал меня на тот момент, когда я впервые установил СУБД MySQL. Заметка содержит ответы и решения стандартных административных задач, которые могут возникнуть перед любым начинающим администратором СУБД MySQL. Эта заметка не освобождает от прочтения родной документации по MySQL! 🙂

ПРИСТУПАЯ.

ОС на которой я начал осваивать премудрости администрирования СУБД MySQL — FreeBSD 5.2 , СУБД MySQL я устанавливал из «портов»:

/usr/ports/databases/mysql50-server
/usr/ports/databases/mysql50-client

версия MySQL у меня была следующая:

shell#> mysqld -V
shell#> mysqld Ver 5.0.3-beta for portbld-freebsd5.2 on i386 (FreeBSD port: mysql-server-5.0.3_1)

также версию можно просмотреть командой:

ОГЛАВЛЕНИЕ

И так для себя я выделил несколько главных пунктов по администрированию MySQL, которые интересовали меня как начинающего администратора при первом знакомстве с этой СУБД они и будут у меня содержанием оглавления.

  • Полезные команды/запросы программы клиента mysql.
  • Запуск демона mysqld при старте системы.
  • Запуск/останов/перезапуск демона mysqld вручную.
  • Идентификация и права доступа.
  • Создание MySQL пользователей и назначение привилегий.
  • mysqldump
  • Восстановление БД из «дамп» файлов
  • Проверка таблиц на наличие ошибок.
  • Исправление таблиц содержащих ошибки.
  • Восстановление INDEX файла таблицы (*.MYI).
  • Восстановление файла описания таблицы (*.frm).
  • Работа с блокировками таблиц во время ремонта.

ОСНОВНЫЕ ПОНЯТИЯ И КОМПОНЕНТЫ MySQL.

каталог данных — содержит всю информацию, которая управляется сервером «mysqld» (базы данных, таблицы, файлы состояния). Место расположение «каталога данных» можно задать при запуске сервера с помощью опции:

-h|—datadir=path Path to the database root.

Определить текущие расположение «каталог данных» можно с помощью команды:
shell#> mysqladmin variables | grep datadir

база данных — каждая БД представляет собой подкаталог в каталоге «каталога данных»

  • файл формы (описания)(.frm)
  • файл данных (.MYD)
  • файл индексов (.MYI)
  • .pid PID процесса сервера
  • .err журнал ошибок
  • .log общий журнал
  • .nnn журнал обновлений (****)

Для включения «журнала обновлений» в новых версиях используется опция —log-bin. Журнал представляет собой бинарный файл и содержит всю информацию в более эффективном формате. В нем имеется информация о времени выполнения каждого обновляющего базу запроса. Просмотр этого бинарного журнала осуществляется с помощью утилиты «mysqlbinlog».

ОСНОВНЫЕ ПРОГРАММЫ И УТИЛИТЫ MySQL.

mysqld собственно сам сервер/демон MySQL.
mysql клиент для работы с сервером MySQL.
mysqladmin программа для выполнения административных функций.
myisamchk программа для проверки и восстановления MyISAM таблиц.
mysqldump консольный клиент для создания «дампов» или резервных копии БД, таблиц и хранимых данных.
perror по номеру ошибки выводит на экран описание этой ошибки.
mysqld_safe скрипт для запуска mysqld в системах UNIX.

Перечень некоторых идущих в дистрибутиве утилит можно найти в «man mysql» в топике «SEE ALSO».

Полезные команды/запросы программы клиента mysql.

Подключение к серверу MySQL на котором хранятся БД и выполнения запросов к БД осуществляется с помощью клиента «mysql». Синтаксис для подключения следующий:

shell#> mysql -h [hostname] -P [порт] —protocol=[tcp|socket|pipe|memory] -u [username] -p[пароль] [имя_БД]

Мой список стандартных запросов/команд, которыми мне часто приходилось пользоваться при работе с «mysql».

SHOW DATABASES; выводит список всех БД обслуживаемых сервером. Аналогичную информацию можно получить, запустив утилиту «mysqlshow».
USE [имя_БД] делает базу данных [имя_БД] «текущей» (активной).
SHOW TABLES; выводит список всех таблиц в «текущей» БД Аналогичную информацию можно получить, запустив утилиту «mysqlshow [имя_БД]».
DESCRIBE [имя_таблицы]; выводит описание таблицы [имя_таблицы] (имена столбцов, типы данных, и т.п). Аналогичную информацию можно получить, запустив утилиту «mysqlshow [имя_БД] [имя_таблицы]»
CREATE DATABASE [имя_БД]; создает БД с именем [имя_БД]
SELECT DATABASE(); выводит текущую БД
SELECT USER(); выводит имя (username) текущего пользователя
SELECT VERSION(); выводит информацию о версии сервера «mysqld»
TRUNCATE TABLE [имя_таблицы]; удаляет из таблицы [имя_таблицы] все строки
SELECT выбирает и возвращает строки из заданных таблиц, но лучше ознакомиться со всеми возможностями этого запроса в документации MySQL.

Более подробное описание синтаксиса и назначения операторов можно найти в документации устанавливаемой вместе с пакетом mysql. FreeBSD чтобы найти все установленные файлы какого либо пакета, можно воспользоваться командой:
shell#> pkg_info -xL [имя_пакета]

среди этих файлов есть файлы документации:

/usr/local/share/doc/mysql/manual.html
/usr/local/share/doc/mysql/manual.txt
/usr/local/share/doc/mysql/manual_toc.html

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

Пример:

mysql#> USE mysql;
mysql#> SELECT description, example FROM help_topic WHERE name=»SHOW»;
поиск описания и примеров синтаксиса оператора SHOW.

ЗАПУСК И ОСТАНОВ СЕРВЕРА.

  1. запуск демона mysqld при старте системы с использованием конфигурационного файла rc.conf
  2. запуск/останов/перезапуск демона mysqld вручную
Запуск демона mysqld при старте системы.

Так как я устанавливал mysql из «портов» то после установки у меня появился файл: /usr/local/etc/rc.d/mysql-server.sh Это специальный скрипт для системы «rc.d», которая появилась в FreeBSD 5.X. С помощью этого скрипта можно воспользоваться главным конфигурационным файлом FreeBSD rc.conf для запуска mysqld при старте системы и задания нужных опций, с которыми демон должен стартовать. Именно этим файлом я воспользуюсь для ответа на первый вопрос:

shell#> mv /usr/local/etc/rc.d/mysql-server.sh /etc/rc.d/mysql
shell#> chmod 555 /etc/rc.d/mysql
shell#> chown root:wheel /etc/rc.d/mysql

затем в файле «/etc/rc.d/mysql» нужно изменить строчку:
# KEYWORD: shutdown

на строчку:
# KEYWORD: FreeBSD

а в файле /«etc/rc.conf» добавить строчку:
mysql_enable=»YES»

Для mysqld можно включить в /etc/rc.conf дополнительные опции, описание которых можно просмотреть в самом скрипте «/etc/rc.d/mysql», а также опции, которые поддерживаются самой системой «rc.d» можно посмотреть в«man rc.subr». ( * )

Запуск/останов/перезапуск демона mysqld вручную.

Если было выполнено то, что написано выше то демон mysqld, можно контролировать с помощью системы «rc.d»:

shell#> /etc/rc.d/mysql [fast|force](start|stop|restart|rcvar|status|poll)

или можно воспользоваться утилитами самого дистрибутива mysqladmin ( ** ), mysqld_safe
Останов:
shell#> mysqladmin shutdown
shell#> kill `cat `
если где находиться «pid» файл незнаем, то ищем PID процесса с помощью:
shell#> ps -auxww | grep mysql | grep -v grep

Запуск:
shell#> /usr/local/bin/mysqld_safe &

При таком запуске «mysqld_safe» запустить «mysqld» с параметрами по умолчанию (большая часть, которых зависит от того, как и куда устанавливался «mysqld» и от опций указанных в конфигурационном файле «my.cnf»).
Но можно самому передать нужные опции «mysqld», указав эти опции в качестве параметров «mysqld_safe». Список возможных опций можно посмотреть «man mysqld» и «man mysqld_safe» если опции нельзя передать с помощью параметров, то их можно указать в конфигурационном файле «my.cnf».

Список полезных опций, которыми мне приходилось часто пользоваться при работе с «mysqld_safe»:

—defaults-file путь и имя конфигурационного файла «my.conf».
—ledir где будет искаться исполняемый файл «mysqld»
—basedir путь до установочной директории «mysqld», обычно все «относительные» пути будут определяться от этой директории.
—user имя пользователя под которым будет работать демон «mysqld».
—datadir путь к «каталогу данных».
—pid-file путь и имя PID файла.
—log куда протоколировать события.
—err-log куда протоколировать ошибки (man mysqld_safe)

РАБОТА С УЧЕТНЫМИ ЗАПИСЯМИ ПОЛЬЗОВАТЕЛЕЙ MySQL.

Идентификация и права доступа.
  1. сервер проверяет, разрешено ли пользователю вообще подключаться к «mysqld» демону.
  2. если 1-й этап прошел успешно, то сервер начинает, проверяет каждый «запрос» пользователя на наличие привилегий для выполнения этого «запроса».

Таблицы «user», «db» и «host», «tables_priv», «columns_priv» организуют привилегии четырех уровней.
Глобальный уровень:
Глобальные привилегии применяются ко всем базам данных на указанном сервере. Эти привилегии хранятся в таблице «user».
Уровень базы данных:
Привилегии базы данных применяются ко всем таблицам указанной базы данных. Эти привилегии хранятся в таблицах «db» и «host».
Уровень таблицы:
Привилегии таблицы применяются ко всем столбцам указанной таблицы. Эти привилегии хранятся в таблице «tables_priv».
Уровень столбца:
Привилегии столбца применяются к отдельным столбцам указанной таблицы. Эти привилегии хранятся в таблице «columns_priv».

  1. поля контекста.
  2. поля привилегий.

Для более понятного понимания значения «контекста» рассмотрим следующий пример: Допустим в БД «mysql» в таблице «tables_priv» есть следующая запись.

Host Db User Table_name Grantor Timestamp Table_priv Column_priv
% testdb User1 testtb root@localhost YYY-MM-DD hh:mm:ss Select

Контекстные поля для таблицы «tables_priv» следующие «Host», «Db», «User», «Table_name» — и так расшифровываем запись исходя из контекста:

С любого компьютера «%» к БД «testdb» содержащей таблицу «testtb&raquo ; пользователю с учетной записью «user1» выдана привилегия «уровня таблицы» , которая разрешает пользователю «user1» выполнять запрос «SELECT» .

Поля привилегий определяют привилегии пользователей относительно контекста. Ниже представлена «таблица 1» возможных привилегий с кратким описанием назначений этих привилегий, с указанием типа привилегии для оператора GRANT/REVOKE и уровнем на, котором привилегия существует.

таблица 1.

название привилегии для операторов GRANT/REVOKE Название столбца/значения уровень глобальный уровень базы данных уровень таблиц уровень столбцов привилегия влияет на: описание
SELECT Select_priv X X X X tables без комментариев
INSERT Insert_priv X X X X tables без комментариев
UPDATE Update_priv X X X X tables без комментариев
DELETE Delete_priv X X X tables без комментариев
CREATE Create_priv X X X databases, tables, or indexes Привилегия CREATE позволяет создавать БД, таблицы
DROP Drop_priv X X X databases, tables, or indexes Привилегия DROP позволяет удалять БД, таблицы
RELOAD Reload_priv X server administration Позволяет выполнять reload, refresh, flush-privileges, flush-hosts, flush-logs, and flush-tables в команде mysqladmin
SHUTDOWN Shutdown_priv X server administration Позволяет выполнять опцию shutdown в команде mysqladmin
PROCESS Process_priv X server administration Привилегия PROCESS может быть использована для просмотра открытого текста запросов выполняющихся в данный момент, включая запросы на установку или изменение паролей.
FILE File_priv X file access on server host Привилегия FILE дает вам право читать и записывать файлы на сервере с помощью операторов LOAD DATA INFILE и SELECT . INTO OUTFILE. Любой пользователь, которому предоставлена такая привилегия, имеет право прочитать или записать любой файл, который может прочитать или записать сервер MySQL. Пользователь также может прочитать любой файл в каталоге текущей базы данных. Однако существующие файлы перезаписывать нельзя.
GRANT Grant_priv X X X databases, tables, or stored routines Привилегия GRANT позволяет пользователям передавать свои привилегии другим пользователям. Два пользователя с неодинаковыми привилегиями, имея привилегию GRANT, способны объединить свои привилегии
REFERENCES References_priv X X X X unused Не используется
INDEX Index_priv X X X tables Привилегия ALTER может быть использована для переименования таблиц и разрушения таким образом всей системы привилегий.
ALTER Alter_priv X X X tables Привилегия ALTER может быть использована для переименования таблиц и разрушения таким образом всей системы привилегий.
SHOW DATABASES Show_db_priv X server administration Привилегия SHOW DATABASES разрешает пользователям (account) просматривать имена баз данных используя оператор SHOW DATABASE.
SUPER Super_priv X server administration Позволяет использовать kill в mysqladmin
CREATE TEMPORARY TABLES Create_tmp_table_priv X X server administration Привилегия CREATE TEMPORARY TABLES разрешает использование слова TEMPORARY в операторе CREATE TABLE.
LOCK TABLES Lock_tables_priv X X server administration Позволяет явно использовать оператор LOCK TABLES для блокировки таблиц к которым есть привилегия SELECT.
EXECUTE Execute_priv X X stored routines
REPLICATION SLAVE Repl_slave_priv X server administration
REPLICATION CLIENT Repl_client_priv X server administration Привилегия REPLICATION CLIENT разрешает использовать операторы SHOW MASTER STATUS и SHOW SLAVE STATUS.
CREATE VIEW Create_view_priv X X views
SHOW VIEW Show_view_priv X X views
CREATE ROUTINE Create_routine_priv X X stored routines
ALTER ROUTINE Alter_routine_priv X X stored routines
CREATE USER Create_user_priv X server administration

Так как в таблицах user,host,db поля привилегий имеют тип ENUM(‘N’,’Y’) т.е значение каждого поля может быть или «Y» или «N», а в таблицах tables_priv, columns_priv поля привилегий имеют тип SET то столбец «название столбца/значения» в «таблице 1» содержит просто название столбца для таблиц с типом поля ENUM, а для таблиц с типом поля SET значение, которое может содержать это поле.

Создание MySQL пользователей и назначение привилегий.

Создавать/удалять пользователей MySQL можно используя, операторы CREATE USER, DROP USER:

CREATE USER user [IDENTIFIED BY [PASSWORD] 'password'] [, user [IDENTIFIED BY [PASSWORD] 'password']] DROP USER user [, user] .

Назначать/отнимать привилегии лучше используя, операторы GRANT и REVOKE.

GRANT priv_type [(column_list)] [, priv_type [(column_list)] . ] ON TO user_name [IDENTIFIED BY [PASSWORD] 'password'] [, user_name [IDENTIFIED BY 'password'] . ] [REQUIRE NONE | [] [CIPHER cipher [AND]] [ISSUER issuer [AND]] [SUBJECT subject]] [WITH [GRANT OPTION | MAX_QUERIES_PER_HOUR # | MAX_UPDATES_PER_HOUR # | MAX_CONNECTIONS_PER_HOUR #]] REVOKE priv_type [(column_list)] [, priv_type [(column_list)] . ] ON FROM user_name [, user_name . ]

Пример установки привилегий:

mysql#> GRANT [тип_привилегии] ON [уровень_привилегии] TO [имя_пользователя] IN IDENTIFIED BY ‘[пароль]’;
mysql#> GRANT ALL ON *.* TO «newuser@%.firma.lan» IN IDENTIFIED BY ‘qwerty’;

Где:
[тип_привилегии] — это устанавливаемые привилегии (см. таблица 1, 1-ый столбец), но также существует дополнительная привилегия «ALL» при указании, которой пользователю устанавливаются сразу все привилегии за исключением привилегии «GRANT OPTION»

[уровень_привилегий] — может быть следующим:
глобальный уровень — задается как *.*;
уровень базы данных — задается как [имя_БД].*;
уровень таблицы — задается как [имя_БД].[имя_таблицы];
уровень столбца — показано на примере ниже:

mysql#> GRANT [тип_привилегии] [имя_столбца] ON [имя_БД].[имя_таблицы]

[имя_пользователя] — возможен следующий синтаксис для имени пользователя:
«username@hostname» при использовании такого синтаксиса пользователь «username» сможет подключаться к серверу mysqld только с компьютера с именем «hostname». Возможно, также при задании имени компьютера использовать символ «%», который означает «любой». В примере выше, создается пользователь «newuser» (если такого пользователя до этого не существовала), которому разрешается подключаться с любого компьютера домена «firma.lan» и присваиваются привилегии «глобального уровня» — (*.*). Пароль для входа назначается «qwerty».

Поиск разрешения привилегии идет следующим образом:
«use» => «db» & «host» => «tables_priv» => «columns_priv»
или на языке алгебры логики:
«user» OR («db» AND «host») OR «tables_priv» OR «columns_priv»

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

Когда устанавливается, какая либо привилегия на «глобальном уровне» то пользователь может воспользоваться этой привилегией в любой БД, поэтому привилегии на «глобальном уровне» лучше не выдавать, или выдавать только доверенным пользователям.

Сменить пароль можно с помощь оператора SET PASSWORD (***):

SET PASSWORD = PASSWORD('some password') SET PASSWORD FOR user = PASSWORD('some password')

Первый строчка меняет пароль текущему пользователю, а вторая пользователю с именем «user».
Пример:
mysql#> SET PASSWORD FOR ‘username’@’%.loc.gov’ = PASSWORD(‘новый_пароль’);

Или также пароль можно сменить с помощью утилиты «mysqladmin»:
shell#> mysqladmin -p[старый_пароль] -u [пользователь] password [новый_пароль]

СОЗДАНИЕ РЕЗЕРВНОЙ КОПИИ БАЗ ДАННЫХ (БД).

Для создания копии БД можно использовать утилиту «mysqldump» или перл скрипт «mysqlhotcopy».

mysqldump

shell#> mysqldump —opt -B mysql test

  1. при каждом перезапуске сервера
  2. при выполнении команды «flush-logs»
  3. при достижение размера файла >= «max_binlog_size»

shell#> mysqldump —ignore-table=db.table -x -F —opt -A > /[путь_куда_делать_дамп]/[имя_файла_дампа].sql

Опцию «-F» я использую, чтобы во время «дампа» создавался новый файл «журнала обновлений» это позволит мне в будущем, в случае сбоя, при восстановлении данных использовать только файлы текущего «журнала обновлений», который хранит протокол последних изменений БД после создания её последний резервной копии утилитой «mysqldump».

Опцию «-x» для того чтобы создавался только один новый файл «журнала обновлений», если не поставить эту опцию то «журналы обновлений» будут создаваться для каждой БД, для которой делается «дамп», а это неудобно потому, что всё равно протоколирование изменений ведется только в один файл «журнала обновлений». (ИМХО)

Опция «-A» («дамп» всех БД) почти по той же причине, что и опцию «-x» Я не знаю как при восстановлении с использованием «журнала обновлений» выделять из этого журнала изменения только для нужной БД.

Опция «—ignore-table». Если в моей БД есть таблицы, которые не важны для меня, а исключение их из «дампа» увеличит производительность и уменьшит время создания «дампа». То я исключаю такие таблицы с помощью этой опции. Также для «неважных» БД данных лучше отключить протоколирование в «журнал обновлений». Для этого можно использовать опции «binlog-do-db» или «binlog-ignore-db».

Опцию «—opt» использую потому, что её рекомендуют использовать 🙂

Восстановление БД из «дамп» файлов

Восстанавливать информацию из «дамп» файлов созданных с помощью утилиты «mysqldump» можно следующими командами:

shell#> cat / / | mysql
Или когда «дамп» сделан для определенной БД:
shell#> mysql db_name perldoc mysqlhotcopy.sh

Для себя я решил, что буду использовать для резервного копирования БД только утилиту «mysqldump» так, как для меня важно, чтобы можно было указывать копирования для всех БД, а не только для определенных, как это надо делать в утилите «mysqlhotcopy.sh». Также на мой выбор повлияло то, что для работы утилиты «mysqlhotcopy.sh» необходимо устанавливать дополнительные perl-модули, а мне делать это лениво. (*5*)

ОБНАРУЖЕНИЕ, ИСПРАВЛЕНИЕ ОШИБОК И ВОССТАНОВЛЕНИЕ БД ПОСЛЕ СБОЯ.

  1. Проверка таблиц на наличие ошибок. Если ошибки в таблице отсутствуют, процедура завершается. В любом другом случае возникает необходимость их устранения.
  2. Перед началом исправления создается копия файлов таблиц на случай негативного развития событий.
  3. Попытка исправления таблицы
  4. Если попытка оказывается неудачной, остается лишь восстанавливать базу данных их архива («дампа») и если есть, то из «журналов обновлений».

Список номеров — описаний ошибок, по которым можно предположить, что таблица повреждена:
perror 126 127 132 134 135 136 141 144 145

Перед проверкой и восстановлением таблиц при работающем сервере «mysqld» следует обновить «кеш-память» таблиц командой «mysqladmin flush-tables»

Проверять и восстанавливать MyISAM таблицы можно с помощью утилиты «myisamchk», а также можно использовать операторы CHECK и REPAIR.

Синтаксис «myisamchk» можно посмотреть командой: «myisamchk —help | less » вкратце это выглядит так:

shell#>myisamchk [список_опций] [имя_таблицы] .

Проверка таблиц на наличие ошибок.

В качестве [имя_таблицы] может выступать, как и имя проверяемой таблицы, так и имя файла её индекса. Для определения сразу нескольких таблиц определенного каталога можно воспользоваться следующим синтаксисом:

shell#> myisamchk список_опций_проверки *.MYI

Где «список_опций_проверки»:

-c | —check обычная проверка (по умолчанию)
-e | —extend-check более тщательная проверка
-m | —medium-check детальная проверка (самая долгая)

Можно проверить все таблицы во всех базах данных, если задать шаблон вместе с путем к каталогу данных MySQL:
shell#> myisamchk /path/to/datadir/*/*.MYI

Исправление таблиц содержащих ошибки.

Для исправления ошибок можно пользоваться следующими командами:

восстановление без модификации файла данных (.MYD);

shell> myisamchk — -quick [имя_таблицы]

если проблема осталась не решённой то:

может исправить большинство проблем за исключением несовпадения ключей;

shell> myisamchk — -recover [имя_таблицы]

если проблема осталась не решённой то:

использует старый метод восстановления, медленней чем «—recover», но может исправить некоторые случаи, в которых не помогает опция «—recover».

shell> myisamchk — -safe-recover [имя_таблицы]

Восстановление INDEX файла таблицы (*.MYI).
  1. перейти в каталог БД, содержащий файлы поврежденной таблицы.
  2. скопировать файл данных таблицы (*.MYD) в безопасное место.
  3. запустить «mysql» и выполнить следующие команды:

mysql#> use [имя_БД];
mysql#> SET AUTOCOMMIT=1;
mysql#> TRUNCATE TABLE [имя_восстанавливаемой_таблицы];
mysql#> quit;

shell#> myisamchk -r -q [имя_таблицы]
mysql#> use [имя_БД];
mysql#> FLUSH TABLE [имя_таблицы];
mysql#> quit;

Оператор «FLUSH TABLE» принудительно закрывает открытую таблицу, также сбрасывается кэш запросов. Для принудительного закрытия всех таблиц можно использовать оператор «FLUSH TABLES».

разбор пункта #5
«myisamchk -r -q [имя_таблицы]» запускает быстрое восстановление таблицы («-q» ключ означает быстрое восстановление, при этом исправляются только файл индексов, а файл данных не изменяется)

Восстановление файла описания таблицы (*.frm).
  1. скопировать файл данных таблицы (*.MYD) в безопасное место
  2. восстанавливаем файл из архива или заново создать таблицу с помощью оператора «СREATE TABLE»
  3. снова запускам процедуру восстановления «myisamchk -r -q [имя_таблицы]»
Работа с блокировками таблиц во время ремонта.
  1. внутренняя блокировка
  2. внешняя блокировка (на уровне файловой системы)

От того включена ли внешняя блокировка будет зависеть, как запускать утилиту «myisamchk» (если нельзя включить (2) то нужно использовать (1)). Просмотреть состояние внешней блокировки можно с помощью команды «SHOW VARIABLES» переменная «skip_external_locking» или «skip_locking» будет содержать значение «ON» или «OFF». Значение «ON» означает, что внешняя блокировка отключена, значение «OFF» наоборот. Для того чтобы изменить значение переменной «skip_external_locking» нужно запустить сервер «mysqld» с соответствующей опцией (по умолчанию во FreeBSD 5.2 значение «ON»).

  1. запустить «mysql» и выполнить команду «LOCK TABLES» для нужной (исправляемой) таблицы
  2. не завершая работы «mysql» запустить утилиту «myisamchk» с нужными опциями проверки/исправления
  3. по окончанию работы утилиты «myisamchk» нужно вернуться к сессии «mysql» выполнить команду «FLUSH TABLES» и снять блокировку «UNLOCK TABLES»
  1. «LOCK TABLE [имя_таблицы] [READ | WRITE]». Если установлено «READ» для некоторой таблицы, то только этот поток (и все другие потоки) могут читать из данной таблицы. Если для некоторой таблицы установлена блокировка «WRITE», тогда только этот поток, содержащий блокировку, может осуществлять операции чтения «READ» и записи «WRITE» заблокированной таблицей. Остальные потоки блокируются. То есть простыми словами если нам нужно просто проверить таблицу, то устанавливаем блокировку «READ», но а если исправить, то устанавливаем «WRITE».
  2. после того, как закончили проверку/ремонт таблицы, выполняем команду «FLUSH TABLES» для того чтобы сбросить кэш таблиц.
  3. выполнить команду «UNLOCK TABLES» когда нужно будет снять блокировку.

СОЗДАНИЕ ПРОФИЛАКТИЧЕСКИХ МЕР И ПОДГОТОВКА К САМОМУ ХУДШЕМУ «СБОЮ».

  1. проверка таблиц при загрузке системы (полезно при сбоях питания)
  2. проверка таблиц по расписанию во время работы сервера «mysqld».
  3. создание резервных копий БД.

Если включена опция «—log-bin | —log-update» то есть, включен «журнал обновлений» то все изменения БД записываются в этот журнал и его можно использовать совместно с созданной резервной копией БД чтобы уменьшить количество потерянных «записей».

Было бы не плохо, если после создания каждой резервной копии БД «журнал обновлений» обнулялся — это сделает восстановление более ясным так, как в случае сбоя нам для воссоздания БД с минимальным числом потерянных записей необходимо иметь только два слагаемых:

«последний_журнал_обновлений» + «последняя_резервная_копия_БД» = «БД_с_минимальным_количеством_потерянных_записей»

ИМХО лучше с помощью опций «—binlog-do-db», «—binlog-ignore-db» исключить из протоколирования БД для, которых восстановление не важно.

Вот как я решил организовать три пункта своей стратегии:

пункт #1 «проверка таблиц при загрузке системы»
Так как для загрузки демона MySQL я использую «rc.d» систему FreeBSD, то логично было бы, встроить проверку таблиц в скрипт «/etc/rc.d/mysql» это также даcт возможность вынести нужные опции проверки в главный конфигурационный файл FreeBSD — /etc/rc.conf.

Конечно, можно не встраивать проверку таблиц в стартовый скрипт «/etc/rc.d/mysql», помня то — что «/etc/rc.d/mysql» просто запускает другой скрипт «mysqld_safe», а тот в свою очередь уже имеет нужные строчки по проверке таблиц их только нужно найти и раскомментировать. Но мне хотелось, чтоб этой проверкой я мог управлять через «rc.conf».

4 #!/bin/sh 5 # PROVIDE: mysql 6 # REQUIRE: NETWORKING SERVERS 7 # BEFORE: DAEMON 8 # KEYWORD: FreeBSD 9 # 10 # Add the following line to /etc/rc.conf to enable mysql: 11 # mysql_enable (bool): Set to "NO" by default. 12 # Set it to "YES" to enable MySQL. 13 # mysql_limits (bool): Set to "NO" by default. 14 # Set it to yes to run `limits -e -U mysql` 15 # just before mysql starts. 16 # mysql_dbdir (str): Default to "/var/db/mysql" 17 # Base database directory. 18 # mysql_args (str): Custom additional arguments to be passed 19 # to mysqld_safe (default empty). 20 # 21 . /etc/rc.subr 22 name="mysql" 23 rcvar=`set_rcvar` 24 load_rc_config $name 25 : $ 26 : $ 27 : $ 28 : $ 29 : $ 30 : $ 31 : $ 32 : $ 33 myisamchk_path="/usr/local/bin/myisamchk" 34 mysql_user="mysql" 35 mysql_limits_args="-e -U $" 36 pidfile="$/`/bin/hostname`.pid" 37 command="/usr/local/bin/mysqld_safe" 38 command_args 39 procname="/usr/local/libexec/mysqld" 40 start_precmd="$_prestart" 41 mysql_install_db="/usr/local/bin/mysql_install_db" 42 mysql_install_db_args="--ldata=$" 43 mysql_create_auth_tables() 44  45 eval $mysql_install_db $mysql_install_db_args >/dev/null 46 [ $? -eq 0 ] && chown -R $:$ $ 47 > 48 mysql_prestart() 49  50 if [ ! -d "$/mysql/." ]; then 51 mysql_create_auth_tables || return 1 52 fi 53 if checkyesno mysql_limits; then 54 eval `/usr/bin/limits $` 2>/dev/null 55 fi 56 if checkyesno mysql_myisamck; then 57 echo "Start verification MySQL databases. " 58 SAVE_IFS="$IFS" 59 IFS="" 60 errmes=`eval $ $ $/*/*.MYI` 61 IFS="$SAVE_IFS" 62 echo "End verification MySQL databases." 63 if [ "$errmes" ]; then 64 echo "$errmes" | /usr/bin/mail -s "$" "$" 65 fi 66 return 0 67 fi 68 > 69 run_rc_command "$1"

Красным шрифтом я выделил фрагменты кода, которые я добавил в скрипт «/etc/rc.d/mysql», который был создан при установке MySQL. Смысл моих строчек очень прост:

Строчки «29-32» это задание значений по умолчанию для опций, которые можно прописать в файле «/etc/rc.conf» и с их помощью управлять поведением «myisamchk».

mysql_myisamck
Может принимать значения YES или NO. Если значение YES то пред запуском «mysqld» будет проходить проверка всех таблиц в «каталоге данных».

mysql_myisamck_args
Строка аргументов, которые будут переданы утилите «myiasmchk». По умолчанию заданы аргументы «-s -C». «-s» — обозначает работу в «тихом» режиме то есть на STDOUT будет выводиться информация, только в случае если в таблицах будет найдена ошибка. «-С» обозначает, что проверка будет происходить только тех таблица в которых были изменения после последней проверки.

mysql_myisamck_mail_subj
Текстовая строка, которая будет темой в письме уведомлении, которое будет отправляться, в случае если в таблицах будет найдена ошибка.

mysql_myisamck_mail_toaddr
Адрес электронной почты, куда будет послано письмо уведомление.

Строка «33» задает путь к утилите «myisamchk».
Строки «56-67» собственно и есть код проверки таблиц и отправки письма в случае нахождения ошибок в таблицах.

  1. написать свой скрипт проверки таблиц.
  2. в «crontab» прописать расписание выполнения этого скрипта.

shell#> cp /etc/rc.d/mysql /etc/mysqld/cronchmysql.sh

Пример: вот как у меня выглядит «/etc/mysqld/cronchmysql.sh»:

#!/bin/sh : $ : $ : $ : $ command_path MAILTO="" SAVE_IFS="$IFS" IFS="" errmes=`eval $ $ $/*/*.MYI 2>&1` IFS="$SAVE_IFS" if [ "$errmes" ]; then echo "$errmes" | /usr/bin/mail -s "$" "$" fi exit 0;

Жирным шрифтом выделено то, что нужно/можно подправить под свои нужды. Что означают эти переменные описано в «пункте #1» за исключением переменной «mysql_dbdir» в ней задаётся путь к «каталогу данных».

Второе еще проще, чем первое придумываем расписание, по которому будет запускать проверку таблиц. У меня БД ночью почти не используются, поэтому я решил проверку по расписанию назначить один раз в неделю (суббота) в 4 часа утра. Для этого добавил в «crontab» следующею строчку:

0 4 * * 6 /etc/mysqld/cronchmysql.sh

Для редактирования «crontab» нужно использовать команду «crontab -e».

  1. вызывать «mysqldump» для создания копии всех баз данных с обязательным обнулением «журнала обновлений»
  2. созданная копия БД будет сжиматься с помощью «bzip2».
  3. администратору будет высылаться на электронную почту уведомление, содержащее отчет о выполненных действиях и дополнительную информацию.
#!/bin/sh path_bzip2 path_mysqldump opt_mysqldump backup_dst_dir mysql_dbdir mail_subj mail_toaddr ################################################ umask 0066 MAILTO="" date_dmy=`date "+%d%m%Y"` cd $ date_HM=`date "+%H:%M:%S"` eval "$ $ 2> $/dbbackup.out | $ > $/$-db.sql.bz2" date_HMend=`date "+%H:%M:%S"` jupdate=`tail -n 1 $/*.index 2>/dev/null` dbdirsize=`du -hc $` archsize=`du -hc $/$-db.sql.bz2 | tail -n 1` echo "--------------------[ $ ]-------------------" >> $/dbbackup.out echo -e "New name update juurnal it is:\t$" >> $/dbbackup.out echo -e "Backup starting:\t\t$" >> $/dbbackup.out echo -e "Backup end:\t\t\t$" >> $/dbbackup.out echo -e "Archiv folder:\t\t\t$" >> $/dbbackup.out echo -e "Archiv file:\t\t\t$-db.sql.bz2" >> $/dbbackup.out echo -e "Archiv file size:\t\t$" >> $/dbbackup.out echo -e "DB diretory size:\n$" >> $/dbbackup.out echo "---------------------------------------------------" >> $/dbbackup.out cat $/dbbackup.out | /usr/bin/mail -s "$" "$" exit 0;

То что выделено жирным шрифтом эти переменные нужно подправить под свои конкретные настройки и нужды. Остается только снова придумать расписание выполнения скрипта и создать соответствующую запись в «crontab».

НАСТРОЙКА ОСНОВНЫХ ПАРАМЕТРОВ СЕРВЕРА.

Настраивать параметры работы сервера можно с помощью конфигурационного файла или опций командной строки. Для меня интересны только следующие опции/параметры:

—bind-address=IP
—port=#
—character-sets-dir=[path]
—chroot=[path]
—datadir=[path]
—log[=file]
—pid-file=[path]
—skip-name-resolve
—skip-networking
—socket=path
—user=[user_name]

Основными для меня являются потому, что изменяя эти опции мы влияем на основные свойства сервера такие, как путь к «каталогу данных», IP адрес и порт на котором демон «mysqld» слушает и т.п.

Описание каждой этой опции есть в документации MySQL (http://dev.mysql.com/doc/refman/4.0/ru/command-line-options.html) поэтому я опишу только несколько опций, которые полезно использовать в частных случаях:

—skip-name-resolve
эту опцию полезно использовать, когда в сети существуют «проблемы» с DNS, при включении этой опции демон «mysqld» не будет преобразовывать IP адреса в их канонические имена. Для использования этой опции, нужно помнить, что в таблице «User» в поле «host» надо использовать IP адреса, а не DNS имена хостов.

—skip-networking
эту опцию полезно включать, если вы решили не предоставлять доступ по сети к базам данных. При включении этой опции соединиться сервером можно будет, только используя UNIX SOCKET.

Для меня удобней всего задавать параметры в конфигурационном файле (http://dev.mysql.com/doc/refman/4.0/ru/adding-users.html). Примеры стандартных конфигурационных файлов можно найти после установки MySQL на жестком диске:

/usr/local/share/mysql/my-large.cnf
/usr/local/share/mysql/my-medium.cnf
/usr/local/share/mysql/my-small.cnf

РАБОТА НЕСКОЛЬКИХ СЕРВЕРОВ MySQL НА ОДНОМ КОМПЬЮТЕРЕ.

Официальное мнение читаем здесь http://dev.mysql.com/doc/refman/4.0/ru/installing-many-servers.html.

Иногда бывает нужно запустить несколько MySQL серверов на одно компьютере, например для тестирования новой версии MySQL или для экспериментов и т.п. Это просто сделать, используя утилиту «mysqld_safe» указав ей соответствующий конфигурационный файл в котором можно/нужно задать основные опции.

Пример:
Первый сервер читает конфигурационный файл /etc/mysqld3306.cnf, в котором в секции [mysqld] указано что:

port = 3306 socket = /tmp/mysql.sock

а с помощью опций «mysqld_safe» также установлен «каталог данных» — /var/db/mysql.

Для запуска второго сервера создадим для этого сервера новый «каталог данных» используя скрипт «mysql_install_db», который устанавливается при установке сервера mysqld, новый конфигурационный файл «/etc/mysqld3307.cnf», и нового системного пользователя «mysql3307»:

shell#> /stand/sysinstall
shell#> /usr/local/bin/mysql_install_db —ldata=/var/db/mysql3307 —user=mysql3307
shell#> chown -R mysql3307:mysql3307 /var/db/mysql3307
shell#> cp /etc/mysqld3306.cnf /etc/mysqld3307.cnf

Опция «—ldata=/var/db/mysql3307» задает место, где будет создан «каталог данных», опция «—user=mysql3307» задет имя пользователя которому будет разрешено работать с «каталогом данных». Пользователя «mysql3307» я создал с помощью /stand/sysinstall.

Затем нужно отредактировать файл /etc/mysqld3307.cnf изменить в секции [mysqld] строчки на:

port = 3307 socket = /tmp/mysql3307.sock

И запустить «mysqld_safe» со следующими опциями (*7*):

shell#> mysqld_safe —defaults-file=/etc/mysqld3307/mysqld3307.cnf —datadir=/var/db/mysql3307 —user=mysql3307 -ledir=/usr/local/libexec &

После проделанных действий будет запущен еще один демон «mysqld» работающий с привилегиями системного пользователя «mysql3307». С этим сервером можно будет соединиться по TCP порту 3307 или через UNIX SOCKET /tmp/mysql3307.sock , «каталог данных» обслуживаемый этим сервером находиться в папке «/var/db/mysql3307». Конечно, можно уменьшить число задаваемых опций для «mysqld_safe» задав эти опции в конфигурационном файле, но я для примера задал опции для «mysqld_safe» и частично задал опции в конфигурационнном файле «/etc/mysqld3307/mysqld3307.cnf» (*8*).

СОВЕТЫ ПО ПОВЫШЕНИЮ БЕЗОПАСНОСТИ MySQL.

Перед тем как начать перечислять советы приведу список полезных ссылок по безопасности MySQL:

Securing MySQL step-by-step: http://www.securityfocus.com/infocus/1726
Secure MySQL Database Design: http://www.securityfocus.com/infocus/1667
Securing Your MySQL Installation: http://www.kitebird.com/articles/ins-sec.html
и естественно нужно просмотреть http://dev.mysql.com/doc/refman/5.0/en/security.html

  • Следить за последними обновлениями (заплатками) MySQL.
  • Ограничить с помощью брандмауэра, доступ по сети к серверу MySQL, разрешив доступ к серверу только с доверенных/нужных хостов.
  • Удалить из таблицы User «анонимного» пользователя.
  • Переименовать учетную запись root пользователя MySQL, во что нибудь другое и задать учетной записи root сложный пароль.
  • Для каждого web приложения требующего MySQL желательно создавать отдельную учетную запись.
  • Привилегии глобального уровня выдавать пользователям только в случае крайней необходимости.
  • Привязать доступ пользователей MySQL к БД только заранее определенных хостов (поле host в таблице User) и исключить использование пользователями пустых паролей.
  • Запускать демон «mysqld» под системной учетной записью обладающую минимальными правами (под FreeBSD демон «mysqld» по умолчанию запускается с правами пользователя «mysql»).
  • Запускать демон «mysqld» с опцией «—chroot» это позволит ограничить доступ к файлам, находящимися выше «chroot» директории для операторов «LOAD DATA INFILE» и «SELECT . INTO OUTFILE». (*9*)
  • Установить для «каталога данных» и «журналов» MySQL разрешения на доступ и просмотр только для пользователя, под которым работает демон «mysqld».
  • С большой осторожностью выдавайте пользователям привилегии «File_priv» (*9*), «Grant_priv» (*10*) и «Alter_priv»
  • Включить опцию «—skip-show-database».

ЧТО Я ЧИТАЛ ДЛЯ НАПИСАНИЯ ЭТОЙ ЗАМЕТКИ.

  • MySQL, Поль Дюбуа (Paul DuBois), Издательский дом «Вильямс»
  • Hackproofing MySQL, Chris Anley
  • http://dev.mysql.com/doc/refman/4.0/ru/
  • http://dev.mysql.com/doc/refman/5.0/en/
  • man mysqld
  • man mysqld_safe
  • mysqldump —help

(*) В действительности скрипт «/etc/rc.d/mysql» запускает другой скрипт «mysqld_safe» который в свою очередь запускает демон «mysqld» с параметрами, которые ему передаются с помощью опции «command_args» заданной в rc скрипте. Также в скрипте «/etc/rc.d/mysql» осуществляется проверка на наличие в «каталоге данных» базы данных mysql и таблиц аутентификации если они отсутствуют то создается БД mysql с нужными таблицами.

(**) Чтобы воспользоваться утилитой «mysqladmin» для взаимодействия с сервером «mysqld», нужно чтобы утилита могла соединиться с сервером с помощью одного из доступных протоколов [tcp|socket|pipe|memory] и с «нужными» правами доступа. По умолчанию в *NIX утилита соединяется через протокол «socket». Переопределить параметры можно с помощью ключей «mysqladmin» или с помощью соответствующего конфигурационного файла «my.cnf».

(***) Если забыт пароль для учетной записи «root» сервера «mysql» то его можно сменить следующим образом:
перезапустить сервер с опцией «—skip-grant-tables» эта опция заставляет сервер mysql не использовать таблицы привилегий. То есть разрешает полный доступ всех ко всем БД. сменить для пользователя «root» пароль оператором «UPDATE user SET Password=PASSWORD(» «) WHERE User=»root»;». выполнить команду «mysqladmin flush-privileges», которая перезагрузит таблицу привилегий (grant).

(****) В «журнале обновлений» протоколируются изменения всех таблиц для всех БД, чтобы управлять для каких БД делать протоколирование, для каких нет, можно воспользоваться опциями «—binlog-do-db», «—binlog-ignore-db». Эти опции можно задать в конфигурационном файле mysql. Опция «binlog-do-db = [имя_БД]» указывает mysqld ввести протоколирование только для [имя_БД], опция «binlog-ignore-db = [имя_БД]» исключает [имя_БД] из протоколируемых БД. Протоколирование всех БД ведется в один и тот же файл «журнала обновлений» текущие имя файла журнала обновлений можно посмотреть в «каталоге данных» по умолчанию этот файл имеет расширение .index.

(*5*) Для проверка установлен ли перл модуль DBI можно воспользоваться командой:
shell#>perl -MDBI -e 1
установить модуль DBI можно из порта:
/usr/ports/databases/p5-DBI

(*6*) Переменная «AUTOCOMMIT = » не описана в стандартных переменных, которые можно просмотреть с помощью команды «SHOW VARIABLES». Для просмотра значения переменной «AUTOCOMMIT» можно выполнить оператор: «SELECT @@AUTOCOMMIT;». Список нестандартных переменных, и как их изменять, можно просмотреть http://dev.mysql.com/doc/mysql/en/set-option.html. Назначение этой переменной — установка «autocommit» режима. Если значение «1» то все сделанные изменения применяются немедленно. Если установлено значение «0» то можно использовать оператор «COMMIT» для принятия транзакции или «ROLLBACK» для отмены транзакции. При изменение режима «AUTOCOMMIT» из «0» в «1», MySQL автоматически выполняет «COMMIT» для любых транзакций.

(*7*) Рекомендую обратить внимание на «mysqld_safe» опции: «—defaults-extra-file=path» и «—defaults-file=path» в «man mysqld_safe».

(*8*) Используя опцию «—ledir» можно запускать разные версии демонов «mysqld».

(*9*) Операторы «LOAD DATA INFILE» и «SELECT . INTO OUTFILE» опасны тем, что возможно выполнить следующий «ФИНТ»:

mysql#> create table foo( line blob );
mysql#> load data infile ‘/etc/passwd’ into table foo;
mysql#> select * from foo;
или
mysql#> select load_file(‘/etc/passwd’);

поэтому если эти операторы разрешены то необходимо их ограничить используя опцию «—chroot»

(*10*) Если пользователь наделен привилегией «Grant_priv» то он может предоставлять другим пользователям свои прова. Например: Если предоставить одному пользователю только привилегию SELECT, а второму SELECT и GRANT то второй пользователь может сделать первого пользователя «более продвинутым».

Writed by Krylov Stanislav aka Dragon
(November 2005)

Основные команды SQL, которые должен знать каждый программист

Рассмотрим основные команды SQL, включая агрегатные функции и вложенные подзапросы, на примере работы с MySQL.

Основные команды SQL не ограничиваются стандартными CREATE , UPDATE и DELETE . Данная статья будет полезна тем, кто хочет освежить свои знания по SQL перед собеседованием на работу.

Обратите внимание, что в примерах используется MySQL, поэтому в конце каждого оператора ставится точка с запятой.

Примечание Вы читаете улучшенную версию некогда выпущенной нами статьи.

Настройка базы данных

Перед началом создайте БД с тестовыми данными. Для работы вам понадобится скачать два файла: DLL.sql и InsertStatements.sql. После установите MySQL, откройте терминал и войдите в консоль MySQL с помощью команды:

mysql -u root -p 

Затем введите пароль и выполните следующую команду. Назовём базу данных «university»:

CREATE DATABASE university; USE university; SOURCE ; SOURCE ; 

SHOW DATABASES

SQL-команда, которая отвечает за просмотр доступных баз данных.

CREATE DATABASE

Команда для создания новой базы данных.

USE

С помощью этой SQL-команды USE выбирается база данных, необходимая для дальнейшей работы с ней.

SOURCE

А SOURCE позволит выполнить сразу несколько SQL-команд, содержащихся в файле с расширением .sql.

DROP DATABASE

Стандартная SQL-команда для удаления целой базы данных.

SHOW TABLES

С помощью этой несложной команды можно увидеть все таблицы, которые доступны в базе данных.

CREATE TABLE

SQL-команда для создания новой таблицы:

CREATE TABLE ( , , PRIMARY KEY(), FOREIGN KEY() REFERENCES () ); 
Ограничения целостности при использовании CREATE TABLE

Может понадобиться создать ограничения для определённых столбцов в таблице. При создании таблицы можно задать следующие ограничения:

  • ячейка таблицы не может иметь значение NULL ;
  • первичный ключ — PRIMARY KEY(col_name1, col_name2, …) ;
  • внешний ключ — FOREIGN KEY(col_namex1, …, col_namexn) REFERENCES table_name(col_namex1, …, col_namexn) .

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

Пример

Создайте таблицу «instructor»:

CREATE TABLE instructor ( ID CHAR(5), name VARCHAR(20) NOT NULL, dept_name VARCHAR(20), salary NUMERIC(8,2), PRIMARY KEY (ID), FOREIGN KEY (dept_name) REFERENCES department(dept_name) ); 

DESCRIBE

С помощью DESCRIBE можно просмотреть различные сведения (тип значений, является ключом или нет) о столбцах таблицы.

INSERT

Команда INSERT INTO в SQL отвечает за добавление данных в таблицу:

INSERT INTO (, , , …) VALUES (, , , …); 

При добавлении данных в каждый столбец таблицы не требуется указывать названия столбцов.

INSERT INTO VALUES (, , , …); 

UPDATE

SQL-команда для обновления данных таблицы:

UPDATE SET = , = , . WHERE ; 

DELETE

SQL-команда DELETE FROM используется для удаления данных из таблицы.

DROP TABLE

А так можно удалить всю таблицу целиком.

SELECT

Далее мы рассмотрим основные команды SQL, которые позволяют работать непосредственно с данными. К одной из таких SQL-команд относится SELECT для получения данных из выбранной таблицы:

SELECT , , … FROM ; 

Следующей командой можно вывести все данные из таблицы:

SELECT * FROM ; 

SELECT DISTINCT

В столбцах таблицы могут содержаться повторяющиеся данные. Используйте SELECT DISTINCT для получения только неповторяющихся данных.

SELECT DISTINCT , , … FROM ; 

WHERE

Можно использовать ключевое слово WHERE в SELECT для указания условий в запросе:

SELECT , , … FROM WHERE ; 

В запросе можно задавать следующие условия:

  • сравнение текста;
  • сравнение численных значений;
  • логические операции AND (и), OR (или) и NOT (отрицание).
Пример

Попробуйте выполнить следующие команды. Обратите внимание на условия, заданные в WHERE :

SELECT * FROM course WHERE dept_name=’Comp. Sci.’; SELECT * FROM course WHERE credits>3; SELECT * FROM course WHERE dept_name='Comp. Sci.' AND credits>3; 

Основные команды SQL, которые должен знать каждый программист 1

SQL-команды: пример вывода с WHERE

GROUP BY

Оператор GROUP BY часто используется с агрегатными функциями, такими как COUNT , MAX , MIN , SUM и AVG , для группировки выходных значений.

SELECT , , … FROM GROUP BY ; 
Пример

Выведем количество курсов для каждого факультета:

SELECT COUNT(course_id), dept_name FROM course GROUP BY dept_name; 

Основные команды SQL, которые должен знать каждый программист 2

SQL-команды: пример вывода с GROUP BY

HAVING

Ключевое слово HAVING было добавлено в SQL по той причине, что WHERE не может использоваться для работы с агрегатными функциями.

SELECT , , . FROM GROUP BY HAVING 
Пример

Выведем список факультетов, у которых более одного курса:

SELECT COUNT(course_id), dept_name FROM course GROUP BY dept_name HAVING COUNT(course_id)>1; 

Основные команды SQL, которые должен знать каждый программист 3

SQL-команды: пример вывода с HAVING

ORDER BY

ORDER BY используется для сортировки результатов запроса по убыванию или возрастанию. ORDER BY отсортирует по возрастанию, если не будет указан способ сортировки ASC или DESC .

SELECT , , … FROM ORDER BY , , … ASC|DESC; 
Пример

Выведем список курсов по возрастанию и убыванию количества кредитов:

SELECT * FROM course ORDER BY credits; SELECT * FROM course ORDER BY credits DESC; 

BETWEEN

BETWEEN используется для выбора значений данных из определённого промежутка. Могут быть использованы числовые и текстовые значения, а также даты.

SELECT , , … FROM WHERE BETWEEN AND ; 
Пример

Выведем список инструкторов, чья зарплата больше 50 000, но меньше 100 000:

SELECT * FROM instructor WHERE salary BETWEEN 50000 AND 100000; 

LIKE

Оператор LIKE используется в WHERE , чтобы задать шаблон поиска похожего значения.

Есть два свободных оператора, которые используются в LIKE :

  • % (ни одного, один или несколько символов);
  • _ (один символ).
SELECT , , … FROM WHERE LIKE ; 
Пример

Выведем список курсов, в имени которых содержится «to» , и список курсов, название которых начинается с «CS-» :

SELECT * FROM course WHERE title LIKE ‘%to%’; SELECT * FROM course WHERE course_id LIKE 'CS-___'; 

Основные команды SQL, которые должен знать каждый программист 4

SQL-команды: пример вывода с LIKE

IN

С помощью IN можно указать несколько значений для оператора WHERE :

SELECT , , … FROM WHERE IN (, , …); 
Пример

Выведем список студентов с направлений Comp. Sci., Physics и Elec. Eng.:

SELECT * FROM student WHERE dept_name IN (‘Comp. Sci.’, ‘Physics’, ‘Elec. Eng.’); 

JOIN

JOIN используется для связи двух или более таблиц с помощью общих атрибутов внутри них. На изображении ниже показаны различные способы объединения в SQL. Обратите внимание на разницу между левым внешним объединением и правым внешним объединением:

Основные команды SQL, которые должен знать каждый программист 5

SQL-команды: схема использования JOIN

SELECT , , … FROM JOIN ON = ; 
Пример

Выведем список всех обязательных курсов и детали о них:

SELECT prereq.course_id, title, dept_name, credits, prereq_id FROM prereq LEFT OUTER JOIN course ON prereq.course_id=course.course_id; 

Основные команды SQL, которые должен знать каждый программист 6

SQL-команды: пример вывода с JOIN

VIEW

VIEW — это виртуальная таблица SQL, созданная в результате выполнения выражения. Она содержит строки и столбцы и очень похожа на обычную SQL-таблицу. VIEW всегда показывает самую свежую информацию из базы данных.

Создание
CREATE VIEW AS SELECT , , … FROM WHERE ; 
Удаление
DROP VIEW ; 

Агрегатные функции

Это не совсем основные команды SQL, однако знать их тоже желательно. Агрегатные функции используются для получения совокупного результата, относящегося к рассматриваемым данным:

  • COUNT(col_name) — возвращает количество строк;
  • SUM(col_name) — возвращает сумму значений в данном столбце;
  • AVG(col_name) — возвращает среднее значение данного столбца;
  • MIN(col_name) — возвращает наименьшее значение данного столбца;
  • MAX(col_name) — возвращает наибольшее значение данного столбца.

Вложенные подзапросы

Вложенные подзапросы — это SQL-запросы, которые включают выражения SELECT , FROM и WHERE , вложенные в другой запрос.

Пример

Найдём курсы, которые преподавались осенью 2009 и весной 2010 годов:

SELECT DISTINCT course_id FROM section WHERE semester = ‘Fall’ AND year= 2009 AND course_id IN ( SELECT course_id FROM section WHERE semester = ‘Spring’ AND year= 2010 ); 

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *