Установку СУБД MySQL в данной статье мы будет производить из коллекции портов FreeBSD. Предполагается, что на сервере установлена свежая версия коллекции портов. Если это не так, следует установить или обновить порты приложений с помощью утилиты portsnap.
# portsnap fetch extract - установить порты, если они отсутствуют в системе # portsnap fetch update - обновить порты, если они присутствуют в системе
Далее нужно будет в /etc/make.conf указать некоторые опции сборки mysql55-server.
# vi /etc/make.conf ########## MySQL 5.5 ########## .if ${.CURDIR} == "/usr/ports/databases/mysql55-server" WITH_CHARSET=utf8 # Кодировка по-умолчанию WITH_COLLATION=utf8_general_ci # Сравнение по-умолчанию WITH_XCHARSET=all # Дополнительные кодировки WITH_OPENSSL=yes # Включить безопасные соединения через OpenSSL WITH_LINUXTHREADS=no # Работа в несколько нитей одновременно с помощью # линуксовой библиотеки pthread WITH_PROC_SCOPE_PTH=yes # Работа в несколько нитей одновременно, для # повышения производительности BUILD_OPTIMIZED=yes # Добавление флагов оптимизации, даёт # небольшой прирост производительности BUILD_STATIC=yes # Сборка статической версии mysqld, даёт # небольшой прирост производительности и # независимость от внешних библиотек WITH_NDB=no # Поддержка NDB storage engine (для кластеров) .endif
Заходим в порт mysql55-server, приступаем к установке. После установки перечитываем директории PATH с помощью rehash.
# cd /usr/ports/databases/mysql55-server/ # make install clean # rehash
Сервер СУБД MySQL 5.5 установлен. Далее необходимо произвести инициализацию директории данных и первоначальную настройку. Инициализируем директорию данных MySQL, владельцем назначим непривилегированного пользователя «mysql».
# cd /usr/local # mysql_install_db --user=mysql --datadir=/var/db/mysql
Installing MySQL system tables... OK Filling help tables... OK
Отлично, системные и вспомогательные таблицы созданы. Далее нужно создать конфигурационный файл mysql. Шаблоны конфигов mysql можно найти в /usr/local/share/mysql/:
# ls /usr/local/share/mysql/my-* /usr/local/share/mysql/my-huge.cnf # 2GB памяти /usr/local/share/mysql/my-innodb-heavy-4G.cnf # 4GB памяти /usr/local/share/mysql/my-large.cnf # 512MB памяти /usr/local/share/mysql/my-medium.cnf # 64MB памяти /usr/local/share/mysql/my-small.cnf # <64MB памяти
Общий объём используемой оперативной памяти для MySQL подсчитывается по формуле (основные параметры):
innodb_buffer_pool_size + key_buffer_size + max_connections*(sort_buffer_size+read_buffer_size+binlog_cache_size) + max_connections*2MB
В этой формуле не хватает ряда других параметров, использующих память, в контексте данной статьи будем использовать эту формулу. Если требуется подсчитать более точное максимальное количество памяти, которое может использовать mysql, можно воспользоваться следующей формулой (ниже). Как показывает практика, полученное значение памяти из следующей более сложной формулы не стоит воспринимать «как будет», значение обычно получается меньше.
Память на одно соединение = read_buffer_size + read_rnd_buffer_size + sort_buffer_size + + thread_stack + join_buffer_size; 1. Память на все соединения = per_thread_buffers * max_connections; 2. Память используемая СУБД = key_buffer_size + max_tmp_table_size + innodb_buffer_pool_size + + innodb_additional_mem_pool_size + innodb_log_buffer_size + + query_cache_size; Суммарная используемая память = (Память используемая СУБД) + (Память на все соединения);
На стенд-сервере, куда мы устанавливаем MySQL имеется 16GB оперативной памяти. Будут использоваться таблицы MyISAM и InnoDB. Скопируем пример конфигурационного файла my-innodb-heavy-4G.cnf как /var/db/mysql/my.cnf.
# cp /usr/local/share/mysql/my-innodb-heavy-4G.cnf /var/db/mysql/my.cnf
После чего приводим его к следующему виду.
# vi /var/db/mysql/my.cnf
[mysqld] port = 3306 # Порт, на котором слушает mysqld socket = /tmp/mysql.sock # Unix-сокет для mysqld back_log = 128 # Размер очереди для tcp/ip запросов на соединение #skip-networking # Раскомментируйте данную директиву, если не планируется # разрешать соединения снаружи (только на localhost) max_connections = 1000 # Максимальное количество соединений (сессий) max_connect_errors = 1000 # Максимальное количество ошибок от каждого хоста. При # достижении лимита происходит блокировка хоста. table_open_cache = 2048 # Максимальное количество открытых таблиц max_allowed_packet = 16M # Максимальный размер пакета в запросе binlog_cache_size = 1M # Максимальный размер кэша бинарного лога, для отдельной # транзакции read_buffer_size = 2M # Размер буфера чтения для полного просмотра таблицы read_rnd_buffer_size = 16M # Размер буфера сортировки для запросов ORDER BY sort_buffer_size = 8M # Размер буфера сортировки для запросов GROUP BY, ORDER BY join_buffer_size = 8M # Размер буфера для запросов JOIN (без индексов) thread_cache_size = 24 # Количество трэдов, которые не убиваются, а остаются в # кэше для повторного использования thread_concurrency = 8 # Максимальное количество потоков mysqld. Рекомендуется # устанавливать как [number of CPUs]*(2..4) query_cache_type=1 # Включение кэширования запросов query_cache_size = 64M # Размер кэша результатов запросов SELECT query_cache_limit = 2M # Размер максимальной выборки SELECT для кэширования default-storage-engine = MYISAM # Указываем тип таблиц по-умолчанию, если тип не указан # в запросах CREATE TABLE tmp_table_size = 64M # Максимальный размер в памяти для создаваемых временных # таблиц. Если больше - таблица записывается на диск #log-bin=mysql-bin # Раскомментируйте, если планируется использовать #binlog_format=mixed # репликации для MySQL. key_buffer_size = 1G # Размер памяти, выделяемой для кэширования индексов # таблиц MyISAM. Важный параметр оптимизации #skip-innodb # Раскомментируйте параметр, чтобы отключить InnoDB innodb_additional_mem_pool_size = 16M # Выделенная память для внутренних нужд InnoDB innodb_buffer_pool_size = 2G # Объём памяти, выделенной для InnoDB. Чем больше - тем # лучше. Снижает количество дисковых операций innodb_data_file_path = ibdata1:100M:autoextend # Размер стораджа данных таблиц # InnoDB, авторасширяемый. innodb_file_per_table = 1 # Каждая таблица будет храниться в отдельном файле innodb_thread_concurrency = 16 # Максимальное количество потоков mysqld для innodb
После первоначальной настройки СУБД MySQL мы должны запустить сервер и настроить запуск mysqld при старте системы. Управлять состоянием mysqld можно через rc-скрипт, который автоматически после сборки порта записался как /usr/local/etc/rc.d/mysqld-server. Запускаем СУБД.
# echo 'mysql_enable="YES"' >> /etc/rc.conf # echo 'mysql_dbdir="/var/db/mysql"' >> /etc/rc.conf # /usr/local/etc/rc.d/mysql-server start Starting mysql.
Проверим, что mysql действительно запустился и работает от пользователя mysql.
# ps wwaux | grep mysql mysql 28671 0.3 2.6 3486888 440948 ?? I 11:08PM 0:00.65 /usr/local/libexec/mysqld --defaults-extra-file=/var/db/mysql/my.cnf --basedir=/usr/local --datadir=/var/db/mysql --plugin-dir=/usr/local/lib/mysql/plugin --log-error=/var/db/mysql/inter.onsever.ru.err --open-files-limit=8192 --pid-file=/var/db/mysql/inter.onsever.ru.pid --socket=/tmp/mysql.sock --port=3306 mysql 28026 0.0 0.0 8296 1884 ?? Is 11:08PM 0:00.02 /bin/sh /usr/local/bin/mysqld_safe --defaults-extra-file=/var/db/mysql/my.cnf --user=mysql --datadir=/var/db/mysql --pid-file=/var/db/mysql/inter.onsever.ru.pid root 28683 0.0 0.0 9124 1420 0 S+ 11:09PM 0:00.00 grep --color=auto mysq
Всё верно. Далее - установим пароль пользователя root (по-дефолту пароль пустой), после чего обновим таблицу привилегий mysql.
# mysqladmin -uroot password 'новый_пароль' # mysql -uroot -p -e 'flush privileges' Enter password: вводим новый пароль
Заключительным шагом - запустим утилиту безопасности mysql_secure_installation, с помощью которой удалим анонимного пользователя, тестовую базу данных, которые создаются по-умолчанию при инициализации директории данных и запретим удалённый вход для пользователя root (не системный пользователь).
# mysql_secure_installation Enter current password for root (enter for none): вводит пароль суперпользователя mysql Change the root password? [Y/n] n Remove anonymous users? [Y/n] Y Disallow root login remotely? [Y/n] Y Remove test database and access to it? [Y/n] Y Reload privilege tables now? [Y/n] Y All done! If you've completed all of the above steps, your MySQL installation should now be secure. Thanks for using MySQL!
На этом установка и первоначальная настройка СУБД MySQL закончена. Успехов в использовании и оптимизации!