- Первоначальная настройка MySQL
- Настройка MySQL
- Указание кодировок и collation
- Ограничение количества, таймауты и источники соединений
- Увеличение числа открытых файлов
- Оптимизация MySQL для MyISAM
- Буферы
- Перенос временных файлов MySQL в память
- Оптимизация MySQL для InnoDB
- Динамическое изменение размера innodb_buffer_pool_size
- Что нужно настроить в mySQL сразу после установки?
Первоначальная настройка MySQL
В этой небольшой статье я хотел лишь описать самые первые шаги, которые нужно делать после того, как вы скачали и установили пакет для работы с базами данных MySQL. Я совсем не собирался здесь описывать сам MySQL и не рассчитывал вдаваться во всякие технические подробности относительно безопасности. Если вы хотите подробной информации, Read The Fine Manual. Если вы хотите как можно быстрее начать делать базы данных, читайте это маленькое руководство.
После того, как вы поставили серверную и клиентскую части пакета MySQL, следующим шагом будет заставить все это работать. Демон базы данных запускается командой mysqld. При помощи ключа [—help] можно посмотреть все доступные опции. Так же этот ключ позволит посмотреть список директорий, с которыми работает MySQL.
Для функционирования пакета, надо создать главную системную базу данных по имени mysql. Все базы создаются в отдельно выделенной папке, которую как раз можно вычислить при помощи mysqld —help. Найдите после длинного списка возможных ключей строчки, явно указывающие на разные директории.
basedir: говорит само за себя — это базовая директория, относительно которой могут быть заданы другие.
datadir: вот в ней-то и будут храниться все базы данных.
Если вы устанавливали MySQl при помощи RPM-пакетов или еще каким-нибудь автоматизированным способом, возможно в этой директории уже существует системная база данных. Если же вы компилировали пакет или переписывали исполняемые файлы вручную, то возможно ее не существует или она пуста. В этом случае базу mysql надо создать с помощью скрипта mysql_install_db. Если не будет никаких ошибок, то после окончания работы скрипта, он попросит вас задать пароль для пользователя root. Что это значит?
Базы данных в MySQL, как и во многих других системах доступны одновременно большому количеству пользователей, которые могут подключаться к серверу MySQL как с локального компьютера, посредством серверных языков и CGI, так и по TCP/IP через клиентов MySQL, находящихся на удаленных компьютерах. После создания, в системной базе будут описаны в том числе привелегии для разных пользователей. Самый главный из них конечно же пользователь root, который имеет полный доступ ко всем базам. Для него надо задать пароль, так как по умолчанию его нет.
Означает запуск главного MySQL-клиента по имени mysql от имени пользователя root (-u root) и выбор базы данных mysql Далее откроется консолька программы mysql. Делаем самый обычный SQL-запрос:
Это обновит поля Password для таблицы user, в которой поля user=’root’. Другими словами для пользователя root будет установлен пароль new_password закриптованный по методу PASSWORD().
Заставляем MySQL принять изменения:
Есть еще один способ, работающий на версиях MySQL >= 3.22:
или вообще из shell’а с помощью программы mysqladmin:
Все, теперь root не сможет просто так войти в программу mysql. Пишем
и убеждаемся в этом:
Заходить с паролем надо так:
Вот и все. Пароль для root’а совсем не обязательно должен быть таким же как его пароль в системе.
Если пароль был случайно забыт, чтобы его задать по новой, придется стереть файлы mysql.frm mysql.MYI и mysql.MYD из папки с базами данных, затем запустить скрипт mysql_install_db и повторить все по новой.
Если вам интересна структура системной базы данных вы можете строить исследовать ее с помощью SQL-запросов из программы mysql, а так же с помощью внутренних команд и утилиты mysqlshow. Например
покажет список всех таблиц в базе данных some_database, а запрос
выдаст содержимое some_table в табличном виде.
ok. Теперь хорошо бы добавить пользователей базы данных, вместе с их правами и паролями.
Используем выражение GRANT. Можно опять вносить прямые поправки в таблицы mysql, но это будет слишком длинно. Итак:
Это создаст пользователя admin, который сможет делать все что захочет со всеми базами данных и вообще mysql-ем, подключаясь только с localhost и указывая пароль some_password. Чтобы admin мог подключаться с других хостов, надо добавить строчку
Кстати *.* означает к каким базам данных и таблицам имеет доступ admin. Обозначения делаются следующим образом «база.таблица»
Для создания более-менее продвинутого пользователя можно использовать такое выражение:
Такой пользователь сможет использовать все основные SQL-команды для данных в таблицах, а так же создавать и удалять базы данных. Однако он не сможет выключать, перезапускать демон MySQL, смотреть на список процессов, не будет иметь доступ к файлам сервера, а так же сможет подключаться к базе данных только с localhost’а и указывая свой пароль.
Вот все возможные опции для привилегий:
SELECT,INSERT,UPDATE,DELETE — одноименные sql-команды операций с данными
INDEX — операции с индексами в таблицах
REFERENCES — работа со ссылками в базах данных и таблицах
CREATE, DROP — создание и удаление баз данных и таблиц
GRANT, ALTER — совершение операций с привилегиями
RELOAD, SHUTDOWN, PROCESS — управление сервером mysql. Перезапустить, убить и посмотреть все подключения соответственно. Точнее это дает право на выполнение команд программы mysqladmin, направленных на исполнение указанных целей
FILE — позволяет загонять в базу данных любой читабельный файл с сервера
Выбирайте сами каких пользователей создавать. Для многопользовательского сервера можно посоветовать делать пользователей, способных только изменять данные одной базы данных. Если всем сервером заведует один вебмастер, вполне можно предоставить ему более широкую свободу действий.
Отлично! Теперь минимум того, что может понадобится от сервера MySQL настроено и можно начинать создавать таблицы и вносить данные.
И не забудьте добавить mysqld в автозапуск.
Источник
Настройка MySQL
Основное конфигурирование MySQL осуществляется с помощью файла /etc/my.cnf или /etc/mysql/my.cnf
Указание кодировок и collation
В секцию [mysqld] добавим строки:
character-set-server=utf8
# collation-server=utf8_general_ci
init-connect=»SET NAMES utf8″
- character-set-server — кодировка для всего сервера;
- collation-server — порядок символов и строк на основе алфавитного порядка и классов эквивалентности;
- init-connect — строка, выполняемая для каждого клиента при соединении.
Ограничение количества, таймауты и источники соединений
bind-address=localhost
# Отключаем определение доменного имени для IP-адресов
skip-name-resolve
# Максимальное количество соединений
max_connections = 250
# Отключаем использованием symbolic-links
symbolic-links=0
# Таймауты
interactive_timeout=60
wait_timeout=60
Увеличение числа открытых файлов
В большинстве Linux-систем по умолчанию лимит открытия файловых дескрипторов установлен в 1024, для работы этого недостаточно.
Проверим текущие опции:
Внесем требуемые лимиты в /etc/security/limits.conf
Динамически изменим текущие лимиты:
Проверим soft limit:
Текущие лимиты в MySQL проверим SQL-запросом:
SHOW VARIABLES LIKE ‘%open_files%’
Оптимизация MySQL для MyISAM
Оптимизация параметров MySQL позволяет значительно увеличить производительность MyISAM.
Буферы
Основными параметрами являются key_buffer_size (буфер для работы с ключами и индексами) и sort_buffer (буфер для сортировки).
key_buffer_size = 64M
sort_buffer_size = 32M
При наличии 16Гб памяти и более, рекомендуется увеличить key_buffer_size до 128M-256M. Если Вы не используете MyISAM таблицы, рекомендуется установить размер key_buffer_size в 32Мб для хранения индексов временных таблиц.
Кэш запросов указывается в опции query_cache_size, ограничение на кэшируемый элемент в query_cache_limit, кэш открытых таблиц в table_open_cache.
table_open_cache = 2048
query_cache_limit = 2M
query_cache_size = 128M
query_cache_type = 1
thread_cache_size = 16
max_heap_table_size = 128M
tmp_table_size = 128M
Будьте внимательны при установке завышенного значения query_cache_size, т.к. это может привести к ожиданию блокировок (Be careful not to set the size of the cache too large. Due to the need for threads to lock the cache during updates, you may see lock contention issues with a very large cache). Мы не рекомендуем устанавливать значение больше 256M.
Параметр thread_cache_size указывает количество тредов (threads), уходящих в кеш при отключении клиента. При новом подключении тред не создается, а берется из кеша, что позволяет экономить ресурсы при больших нагрузках. При наличии 32Гб памяти и более рекомендуем увеличить thread_cache_size до 32, table_open_cache в диапазон 4096-8192, query_cache_size до 256M.
Перенос временных файлов MySQL в память
Проверяем наличие /dev/shm:
Настройки размещаются в /etc/fstab , рекомендуем указать размер, например, 1G:
none /dev/shm tmpfs defaults,size=1G 0 0
Если внесли изменения, то перемонтируем:
mount -o remount /dev/shm
В конфигурационном файле указываем:
В случае, если используется Apparmor, то внесите используемый путь (/dev/shm или /run/mysql) в конфигурационный файл /etc/apparmor.d/usr.sbin.mysqld, например:
service apparmor restart
Оптимизация MySQL для InnoDB
Стандартно все таблицы и индексы хранятся в одном файле, мы рекомендуем использовать опцию innodb_file_per_table для установки хранения каждой таблицы в отдельном файле. Дополнительно необходимо корректно рассчитать параметр innodb_open_files, до версии MySQL 5.6.6 он устанавливался в значение 300, с версии MySQL 5.6.6 рассчитывается автоматически и имеет значение по умолчанию -1.
Значение innodb_open_files и table_open_cache рассчитывается как количество таблиц во всех базах, умноженное на 2, ориентировочно рекомендуем устанавливать обе опции в 4096 или 8192.
innodb_file_per_table = 1
table_open_cache = 4096
innodb_open_files = 4096
При использовании только InnoDB часть опций требует корректировки:
key_buffer_size = 32M
max_allowed_packet = 1M
sort_buffer_size = 32M
# query_cache_limit = 1M
# query_cache_size = 0
# query_cache_type = 1
thread_cache_size = 32
max_heap_table_size = 128M
tmp_table_size = 128M
Обратите внимание, при работе с InnoDB мы отключаем query_cache_size установкой его значения в 0, исключающее лишние действия по работе с кэшем, что особенно важно при активной работе с большими объемами данных. С версии MySQL 5.6 query_cache_size отключен, а с версии 8.0 удален.
Важнейшей настройкой MySQL при работе с InnoDB является innodb_buffer_pool_size, устанавливается по принципу «чем больше, тем лучше». Рекомендуется выделять до 70-80% оперативной памяти сервера под innodb_buffer_pool_size. Не забудьте провести расчет использования памяти Apache и дополнительным программным обеспечением для исключения сваливания системы в swap. Для сервера с 16Гб устанавливается в диапазоне 10-12G и разделяем его на 4 секции, для сервера с 32Гб устанавливаем значение в диапазоне 20-24G и разделяем его на 8 секций, :
innodb_buffer_pool_size = 10G
innodb_buffer_pool_instances = 4
Установка большого размера innodb_log_file_size может привести к увеличению быстродействия, при этом увеличится время восстановления данных, выберите от 258M до 1G.
innodb_log_file_size = 256M
innodb_log_buffer_size = 32M
При установке значения в 2 буфер не сбрасывается на диск, а только в кэш операционной системы. Установка значения в 0 увеличит быстродействие, однако возможна потеря последних данных при аварийном выключении mysql-сервера.
Количество потоков ввода/вывода файлов в InnoDB задается опциями innodb_read_io_threads, innodb_write_io_threads, обычно этому параметру присваивается значение 4 или 8, на быстрых SSD-дисках установите в 16. Значение innodb_thread_concurrency установите в количество ядер * 2.
innodb_read_io_threads = 4
innodb_write_io_threads = 4
innodb_thread_concurrency = 32
Для ускорения работы с INFORMATION_SCHEMA, SHOW TABLE STATUS или SHOW INDEX отключим обновление статистики при выполнении таких операций, с версии MySQL 5.6.6 innodb_stats_on_metadata отключено по умолчанию:
Для версии MySQL 5.7+ укажите дополнительные опции:
performance_schema = OFF
skip-log-bin
sync_binlog = 0
После применения изменений перезагрузите MySQL:
service mysqld restart
Динамическое изменение размера innodb_buffer_pool_size
С версии MySQL 5.7.5 допускается динамическое изменение размера innodb_buffer_pool_size, однако необходимо помнить, что размер innodb_buffer_pool_size должен быть пропорционален innodb_buffer_pool_chunk_size.
Запросим размер innodb_buffer_pool_chunk_size:
Получим значение, например, 128 мегабайт. Нам требуется динамически установить размер innodb_buffer_pool_size в 16G, соответсвенно 16G / 128M = 125, установим значение:
SET GLOBAL innodb_buffer_pool_size = (SELECT @@innodb_buffer_pool_chunk_size) * 125
Источник
Что нужно настроить в mySQL сразу после установки?
Вольный перевод довольно старой статьи с MySQL Performance Blog о том, что лучше сразу же настроить после установки базовой версии mySQL.
Удивительно, сколько народу устанавливает mySQL на свои сервера и оставляют его с настройками по умолчанию.
Несмотря на то, что в mySQL существует довольно много настроек, которые Вы можете изменить, есть набор действительно очень важных характеристик, которые обязательно нужно оптимизировать под собственный сервер. Обычно после такой небольшой настройки производительность сервера заметно увеличивается.
- key_buffer_size — крайне важная настройка при использовании MyISAM-таблиц. Установите её равной около 30-40% от доступной оперативной памяти, если используете только MyISAM. Правильный размер зависит от размеров индексов, данных и нагрузки на сервер — помните, что MyISAM использует кэш операционной системы (ОС), чтобы хранить данные, поэтому нужно оставить достаточно места в ОЗУ под данные, и данные могут занимать значительно больше места, чем индексы. Однако обязательно проверьте, чтобы всё место, отводимое директивой key_buffer_size под кэш, постоянно использовалось — нередко можно видеть ситуации, когда под кэш индексов отведено 4 ГБ, хотя общий размер всех .MYI-файлов не превышает 1 ГБ. Делать так совершенно бесполезно, Вы только потратите ресурсы. Если у Вас практически нет MyISAM-таблиц, то key_buffer_size следует выставить около 16-32 МБ — они будут использоваться для хранения в памяти индексов временных таблиц, создаваемых на диске.
- innodb_buffer_pool_size — не менее важная настройка, но уже для InnoDB, обязательно обратите на неё внимание, если собираетесь использовать в основном InnoDB-таблицы, т.к. они значительно более чувствительны к размеру буфера, чем MyISAM-таблицы. MyISAM-таблицы в принципе могут неплохо работать даже с большим количеством данных и при стандартном значении key_buffer_size, однако mySQL может сильно «тормозить» при неверном значении innodb_buffer_pool_size. InnoDB использует свой буфер для хранения и индексов, и данных, поэтому нет необходимости оставлять память под кэш ОС — устанавливайте innodb_buffer_pool_size в 70-80% доступной оперативной памяти (если, конечно, используются только InnoDB-таблицы). Относительно максимального размера данной опции — аналогично key_buffer_size — не стоит увлекаться, нужно найти оптимальный размер, найдите лучшее применение доступной памяти.
- innodb_additional_mem_pool_size — данная опция практически никак не влияет на производительность mySQL, однако рекомендую оставлять для InnoDB около 20 МБ (или чуть больше) под различные внутренние нужды.
- innodb_log_file_size — крайне важная настройка в условиях баз данных с частыми операциями записи в таблицы, в особенности при больших объёмах. Большие размеры увеличивают быстродействие, однако будьте осторожны — увеличится и время восстановления данных. Я обычно выставляю значение около 64-512 МБ в зависимости от размера сервера.
- innodb_log_buffer_size — стандартное значение данной опции вполне подойдёт для большинства систем со средним количеством операций записи и небольшими транзакциями. Если же в Вашей системе бывают всплески активности, или Вы активно работаете с BLOB-данными, то рекомендую немного увеличить значение innodb_log_buffer_size. Однако не переусердствуйте — слишком большое значение будет пустой тратой памяти: буфер сбрасывается каждую секунду, поэтому Вам не понадобится больше места, чем требуется в течение этой секунды. Рекомендуемое значение — около 8-16 МБ, а для небольших баз — и того меньше.
- innodb_flush_log_at_trx_commit — жалуетесь, что InnoDB работает в 100 раз медленнее MyISAM? Вероятно, Вы забыли про настройку innodb_flush_log_at_trx_commit. Значение по умолчанию «1» означает, что каждая UPDATE-транзакция (или аналогичная команда вне транзакции) должна сбрасывать буфер на диск, что достаточно ресурсоёмко. Большинство приложений, в особенности ранее использовавшие таблицы MyISAM, будут хорошо работать со значением «2» (т.е. «не сбрасывать буфер на диск, только в кэш ОС»). Лог, однако, всё равно будет сбрасываться на диск каждые 1-2 секунды, поэтому в случае аварии Вы потеряете максимум 1-2 секунды обновлений. Значение «0» повысит производительность, но Вы рискуете потерять данные даже при аварийной остановке mySQL-сервера, в то время как при установке значение innodb_flush_log_at_trx_commit в «2» Вы потеряете данные только при аварии всей операционной системы.
- table_cache — открытие таблиц может быть весьма ресурсоёмко. К примеру, MyISAM-таблицы помечают заголовки .MYI файлов как «используемые в текущий момент». Обычно не рекомендуется открывать таблицы слишком часто, поэтому лучше, чтобы кэш был достаточных размеров, чтобы держать все Ваши таблицы открытыми. Для этого используется некоторое количество ресурсов ОС и оперативной памяти, однако это обычно не является существенной проблемой для современных серверов. Если у Вас несколько сотен таблиц, то стартовым значением для опции table_cache может быть«1024» (помните, что каждое соединение требует свой собственный дескриптор). Если у Вас ещё больше таблиц или очень много соединений — увеличьте значение параметра. Я видел mySQL сервера со значением table_cache равной 100 000.
- thread_cache — создание/уничтожение потоков также является ресурсоёмкой операцией, которая происходит при каждой установке соединения и каждом разрыве соединения. Я обычно выставляю эту опцию равную 16. Если у Вашего приложения могут быть скачки количество конкурентных соединений и по переменной Threads_Created виден быстрый рост количества потоков, то стоит увеличить значение thread_cache. Цель — не допускать создания новых потоков в условиях нормального функционирования сервера.
- query_cache_size — если Ваше приложение много и часто читает данные, и при этом у Вас нет кэша на уровне приложения, эта опция может очень помочь. Не ставьте здесь слишком большое значение, так как обслуживание большого кэша запросов будет само по себе затратным. Рекомендуемое значение — от 32 до 512 МБ. Не забудьте проверить, насколько хорошо используется кэш запросов — в некоторых условиях (при небольшом количестве хитов в кэше, т.е. когда практически не выбираются одинаковые данные) использование большого кэша может ухудшить производительность.
Как Вы можете видеть, это — глобальные настройки. Эти переменные зависят от «железа» сервера и используемых движков mySQL, в то время как сессионные переменные обычно настраиваются специально под конкретные задачи. Если Вы в основном используете простые запросы, то нет никакой необходимости увеличивать значение sort_buffer_size, даже если у Вас есть лишние 64 ГБ оперативной памяти. Более того, большие значения кэшей могут только ухудшить производительность сервера. Сессионные переменные лучше оставить на потом, для тонкой настройки сервера.
Источник