Вместо предисловия
Здесь и далее речь пойдет исключительно о версии Community. Но вполне очевидно, что все сказанное будет актуально и для продукта коммерческой эксплуатации. Материал ориентирован на тех, кто желает постичь основы управления базами данных, в частности, MySQL.
Необходимые компетенции для работы с материалом: базовые навыки работы с командной строкой (консолью) MS Windows и самой операционной системой ( создание и удаление каталогов и файлов, изменение расширений файлов, копирование, вставка, удаление объектов ), 1-2 драгоценных часа жизненного цикла :-).
В статье даны разнообразные уточнения и ссылки на разъясняющий материал - не пропадете :-). Вопросы, уточнения и комментарии читателей приветствуются.
Мотивация
Покопавшись в Рунете, нашел всего несколько статей на одноименную тематику. Наиболее полноценная из них на мой взгляд опубликована в 2016 г. в Блоге о базах данных. Автор достаточно полноценно раскрывает особенности установки noinstall-версии MySQL 5. Что ж, думаю, будет полезно освежить контент свежим материалом.
Почему Windows и зачем вообще нужен весь этот геморрой с noinstall-версией ( без автоустановщика ), консолью и ручной настройкой конфигурации сервера при том, что установщик с графическим интерфейсом весьма дружелюбен и многократно упрощает задачу? Практическая сторона реализации даст множество ответов на поставленные вопросы, и каждый из них будет четко соответствовать поставленной задаче и условиям ее выполнения. Самые очевидные проблемы:
Windows, как ни крути, - просто и доступно, а еще говорят: "Неважно, на чем программировать (на каком языке и в какой операционной системе), главное, чтобы было удобно и понятно.",
отсутствие графической оболочки в операционной системе,
удаленная работа с сервером через консоль,
манипуляции с исполняемыми и конфигурационными файлами СУБД без или до ее установки,
изучение файловой структуры СУБД и содержимого файлов в познавательных целях,
и прочие.
Итак, мотивация получена, можно приступать к разбору структуры СУБД.
Для начала стоит упомянуть, что MySQL, как и все СУБД, состоит из 2-х частей: сервер баз данных и, собственно, сами базы данных. Таким образом, нужно сразу различать, когда речь идет о системе управления ( субъекте ) и о том, чем она управляет ( объекте ).
Директории и распаковка/установка
Традиционно файлы сервера MySQL принято распаковывать в директорию С:\mysql. При этом согласно официальной документации для размещения файлов того же сервера автоматический установщик по default'у использует путь C:\Program Files\MySQL. Уже интересно... Если необходимо разместить файлы сервера в другой директории, официальное руководство рекомендует скорректировать путь к каталогу во время запуска установщика, или прописать его в конфигурационном файле заранее ( https://dev.mysql.com/doc/refman/8.0/en/windows-extract-archive.html ). Несколько сомнительная рекомендация, учитывая, что она дана в разделе по установке неинсталлируемой версии. А в актуальных версиях установщика с графическим интерфейсом отсутствует возможность изменить путь установки в процессе инсталляции. Очевидно, это возможно сделать, запустив консольный вариант установщика в пошаговом режиме.
Перед размещением файлов сервера предлагается загрузить архив с noinstall-версией со страницы загрузки официального сайта MySQL.
После нажатия на кнопку Download откроется страница загрузки, где будет предложено зарегистрироваться, либо авторизоваться на сайте. Также Oracle не сильно обидится, если проигнорировать предложенные любезности, нажав соответствующую надпись - над подвалом ( footer ) страницы.
Распаковать архив с сервером рекомендуется в стандартный каталог С:\mysql таким образом, чтобы корневым каталогом для всего содержимого явилась директория mysql.
Создание и размещение конфигурационного файла
Конфигурационный файл формата *.ini или *.cnf необходим для задания начальных параметров при запуске сервера СУБД. Руководство рекомендует именовать его "my" и размещать в корневом каталоге загрузочного носителя. По заверениям руководства :-) этот файл необходим только при работе в операционной системе Windows. Но при большом желании то же руководство допускает конфигурирование работы СУБД в Linux аналогичным способом.
Конфигурирование параметров запуска сервера MySQL включает прописывание путей каталогов хранения файлов сервера и баз данных, задания параметров использования памяти, кэша и движка хранилища InnoDB.
При запуске MySQL-сервера в Windows он будет искать конфигурационный файл в нескольких местах: директория с файлами операционной системы Windows, корневой каталог загрузочного диска C:\, а также директория установки/распаковки файлов сервера - MySQL.
На разных ПК имя корневой директории операционной системы Windows, а также путь до нее могут отличаться. Стандартный путь: C:\Windows. Для уточнения пути на конкретной машине необходимо воспользоваться командой echo %WINDIR% в консоли.
Первым при запуске сервер СУБД будет искать конфигурационный файл my.ini, затем - my.cnf, если не найдет первый. Во избежание конфликтных ситуаций рекомендуется использовать только один из них. Если диск "C:\" не является загрузочным на эксплуатируемой машине, единственный вариант - использовать файл my.ini.
Но в данном случае нас интересует запись, начинающаяся с BASEDIR (3-я сверху в каталоге поиска конфигурационных файлов ). Как выяснится далее, именно эта глобальная опция отвечает за возможность размещения конфигурационного файла my.ini в корневой директории mysql, что на первый взгляд кажется весьма удобным решением.
Конфигурационный файл создается в любом простейшем текстовом редакторе, например, блокноте, и содержит следующие минимальные опции, где baserdir - путь к каталогу с распакованными файлами сервера MySQL. Запись в примере ниже означает, что каталог mysql с файлами сервера расположен на диске C:\ ( строка 2 ), каталог с базами данных расположен в директории data, которая, в свою очередь, находится в директории mysql, которая расположена на диске C:\ ( строка 3 ). Использование двойного обратного слэша в пути называется "экранирование" и применяется в программировании, когда в текст необходимо включить специальный символ. Таким образом, для компилятора/интерпретатора сервера путь на самом деле будет выглядеть как C:\mysql.
[mysqld]
basedir=C:\\mysql
datadir=C:\\mysql\\data
Текстовый файл с предложенным текстом необходимо сохранить и поменять его расширение с .txt на .ini, поместить файл в директорию C:\mysql. Если возникнут проблемы со сменой расширения, подробная инструкция есть здесь.
Инициализация директории data и заполнение системных словарей
Поскольку в ZIP-архиве MySQL изначально отсутствует каталог data, его необходимо создать вручную. В противном случае при запуске в консоли файла mysqld.exe ( собственно, и есть файл запуска сервера ) СУБД выдаст ошибки, связанные с невозможностью создания тестового файла в директории data и доступа к каталогу data.
С созданной директорией data и конфигурационным файлом my.ini, расположенном в директории mysql, при очередном запуске сервера ( файл mysqld.exe в директории bin ) записи об ошибках инициализации директорий пропадут. Это значит, что сервер MySQL успешно проинициализировал все каталоги из файла my.ini. При этом в лог-файле появятся новые ошибки, свидетельствующие о том, что сервер успешно переходит к выполнению следующих инструкций. Очередной блок журналирования сессии располагается между открывающей и закрывающей фразами ( сверху вниз ): "MySQL Server - start." и "MySQL Server - end.". Актуальный блок всегда находится в самом низу журнала.
Как видно, теперь сервер жалуется на проблему отсутствия валидной директорией data и проблему с инициализацией словаря данных. Для инициализации директории data и заполнения необходимых словарей в системной базе данных необходимо запустить сервер ( файл mysqld.exe ) с параметрами --initialize или --initialize-insecure ( https://dev.mysql.com/doc/refman/8.0/en/data-directory-initialization.html ).
--initialize - также генерирует пароль для суперпользователя root, который необходимо заменить при последующем запуске сервера.
--initialize-insecure - не создает пароля; предполагается, что пароли и группы пользователей будут сформированы до перевода СУБД в промышленную эксплуатацию ( production ).
Перед инициализацией необходимо удалить директорию data со всем содержимым. Она нужна была только для первоначального тестирования конфигурации в файле my.ini. Такой способ показался мне рациональным ввиду отсутствия нагромождения рабочих файлов инициализации в директории data, позволяющего сконцентрироваться на конфигурировании. После инициализации каталог data будет создан автоматически самой СУБД и заполнен уже рабочим материалом, необходимым для работы непосредственно с базами данных.
Так выглядит команда инициализации MySQL. Полный путь до файла mysqld зависит от того, в какую директорию был распакован архив с noinstall-версией MySQL.
c:\mysql\bin>mysqld --initialize-insecure
После инициализации содержимое каталога data будет выглядеть следующим образом.
Теперь можно запустить сервер СУБД следующей командой, в консоли.
c:\mysql\bin>mysqld
И разблокировать ему доступ в сеть.
Чтобы изменить пароль, необходимо запустить сервер СУБД (файл mysqld.exe) в консоли командой
c:\mysql\bin>mysqld
После нажатия клавиши "Enter" произойдет запуск сервера MySQL и консоль прекратит выдавать сообщения.
Далее необходимо открыть дополнительное окно консоли и в нем уже выполнить команду
mysql -u root --skip-password
и далее - команды, представленные на рисунке ниже, в порядке очередности. Вместо пароля "1943" необходимо вписать желаемую комбинацию допустимых символов. На этапе № 6 необходимо ввести ранее заданный пароль. В процессе ввода пароля никакие символы отображаться не будут - это же пароль :-). По окончании ввода - нажать Enter.
Теперь можно уверенно создавать базы данных и таблицы, нормализовать и декомпозировать, изучать реляционную алгебру... Основные трудности еще только начинаются :-).