- Sergey Danielyan
- Правильная установка и настройка MySQL в Linux
- Установка MySQL
- Настройка сервера
- Настройка MYSQL под Linux
- Где же хранятся настройки mysql?
- Как изменить настройки mysql?
- Когда требуется настройка mysql? Анализ нагрузки mysql
- Тонкая настройка mysql. Кэширование средствами mysql
- Настраиваем кэш MYSQL
- Выбор значения query_cache_size
- Как оптимально подобрать значения для query_cache_size, query_cache_limit?
- Какие mysql запросы не кэшируются (qcache_not_cached)?
- Как узнать, что query_cache_size был выбран верно?
- Настраиваем многопоточность в mysql
- Как понять, что значение thread_concurrency установлено верно?
- Как узнать текущее значение параметра MYSQL, если оно не указано в my.cnf?
- Как подобрать оптимальное значение thread_cache_size?
- Настраиваем «очередь» конкурентных запросов back_log на подсоединение к mysql серверу.
- Количество одновременно открытых таблиц в mysql.
- Таблицы какого размера хранить в памяти?
Sergey Danielyan
Правильная установка и настройка MySQL в Linux
Эта статья, по замыслу, должна служить пошаговым руководством по корректной настройки MySQL сервера в Linux в общем и в CentOS в частности, начиная от подготовки системы и заканчивая настройкой прав пользователей.
В этот раз текста будет минимум — только команды.
Установка MySQL
Проверяем, установлен ли MySQL сервер
Если установлен, шаги по установке можете пропустить, хотя ознакомиться я все же советую с ними.
Существуют следующие основные пакеты связанные с mysql:
- mysql — клиент mysql
- mysql-server — сервер mysql
- mysql-devel — для разработки и подключения библиотек и хидеров mysql
- mysql-connector-java — JDBC коннектор (используется, например, в EJBCA)
sudo yum install mysql mysql-server mysql-devel mysql-connector-java
Теперь надо установить сервер mysql на запуск в определенные runlevel‘ы (2, 3 и 5):
Если кто забыл соответствие цифрового значения runlevel‘а символьному:
Стартуем демон mysql:
Настройка сервера
Теперь пора настроить сервер. Начнем с пользователей.
Вот состояние таблицы user до начала действий с ней:
mysql -u root
> use mysql
> select host,user from user;
5 rows in set (0.00 sec)
> quit
Как видете, безопасность на уровне плинтуса. Хорошо хоть, что анонимного пользователя нет.
Для настройки базовых вещей в сервере, запустим настройку сервера через mysql_secure_installation. На время этой установки, пароль будет security. Ваш же пароль, как понимаете, должен отличаться.
Запустится скрипт, с запросами на то или иное действие. Вот ответы:
Skip root password for root
Мы еще не устанавливали пароль для root, поэтому при запуске скрипта и запросе пароля для root , просто нажмите Enter .
Install new password for root: security
А вот тут можно установить пароль для root
Do remove an anonymous user
На вопрос о том, удалить ли анонимного пользователя, отвечаем да
Do not disallow remote connections
Не запрещаем коннект к нашему северу с удаленных серверов (если, конечно, эта опция вам нужна, в другом случае, запретите ее)
Do remove a test database
Тестовая база нам не нужна — удаляйте ее
Do reload the privileges
Перегрузим привилегии для их активации
Теперь для всех root пользователей установлен пароль.
Если в ходе этой конфигурации вы не установили пароль для root , можете сделать это так:
SET PASSWORD FOR ‘root’@’localhost’ = PASSWORD(‘security’);
SET PASSWORD FOR ‘root’@’localhost.localdomain’ = PASSWORD(‘security’);
SET PASSWORD FOR ‘root’@’127.0.0.1’ = PASSWORD(‘security’);
UPDATE mysql.user SET Password = PASSWORD(‘security’) WHERE user = ‘root’;
Если же вы не запускали конфигурацию через mysql_secure_installation или не хотите этого делать по каким-то другим причинам, следующие команды удалят any пользователей:
DROP USER »@’localhost’;
DROP USER »@’localhost.localdomain’;
Также, пароль для IPv6 localhost (@::1) можно установить таким образом:
Близится финал нашего действия. Осталось две вещи:
- открыть порты для mysql:
sudo iptables -I INPUT -p tcp —dport 3306 -m state —state NEW,ESTABLISHED -j ACCEPT
sudo iptables -I OUTPUT -p tcp —sport 3306 -m state —state ESTABLISHED -j ACCEPT
выставить кодировку UTF-8 по-умолчанию — файл /etc/my.cnf :
[mysqld]
init_connect=‘SET collation_connection = utf8_unicode_ci’
character-set-server = utf8
collation-server = utf8_unicode_ci
[client]
default-character-set = utf8
Источник
Настройка MYSQL под Linux
Сегодня мы поговорим с Вами о настройке mysql под linux (unix, freebsd) на VPS/VDS сервере. Я не буду касаться аспектов установки mysql на сервер, благо, в интернете достаточно информации.
Где же хранятся настройки mysql?
На Вашем сервере настройки mysql могут находиться или в /etc/my.cnf, или в /etc/mysql/my.cnf, в крайнем случае используйте команду locate, find или им подобные с заданным именем файла
Как изменить настройки mysql?
Итак, файл найден, открыть его можно непосредственно через mc (midnight commander) + F4 или же используя VI(vim): vi my.cnf.
В случае с mc перед Вами будет старый добрый «Norton Commander», если же Вы не знаете, как пользоваться vi, Вам поможет man vi
Когда требуется настройка mysql? Анализ нагрузки mysql
Подсоединитесь с правами администратора базы данных к консоли mysql или же выполните запрос любым удобным для Вас способом, например через phpmyadmin, запрос:
Все запросы к mysql для проверки значения (мониторинга) тех или иных параметров необходимо выполнять из под пользователя с правами администратора Вашего mysql сервера.
Итак, если после выполнения этого запроса Вы видите огромную очередь, то уже есть над чем задуматься. Если в очереди находится больше нескольких сотен запросов, точно требуется тонкая настройка mysql.
А также большое значение в колонке Time во времени выполнения этих запросов указывает на возникновение «медленных» запросов. Также показателем к оптимизации mysql может быть вывод команды top, выполненный через linux консоль.
Вводим в консоли Top, после чего на английской раскладке нажимаем «О», зажимаем «shift» и нажимаем «K» до тех пор, пока %CPU не окажется вначале списка. Зажимаем «shift» и «N» и двигаем в начало списка %MEM. После чего нажимаем «Enter».
Если во главе списка у Вас оказывается «mysql» и показатели в столбце %CPU и %MEM довольно существенны (под 100% загрузка на процессор и почти полностью используется память), Вам точно необходима оптимизация mysql.
Тонкая настройка mysql. Кэширование средствами mysql
Перейдем к тюнингу mysql. Откройте файл my.cnf. Найдите раздел mysqld, все последующие переменные мы будем размещать именно в этом разделе, после строки:
Настраиваем кэш MYSQL
Внутренний кэш запросов mysql:
Query_cache_limit — «ограничиться» максимальным размером данных, которые можно поместить в кэш. Скажу Вам по опыту, в очень редких ситуациях «mysql» запросы будут возвращать данные размером больше 10 MB. Обычно и размера в 2-6 MB хватит с головой.
Например, укажите в my.cnf:
Query_cache_size – здесь Вы можете указать, сколько памяти выделить для внутреннего кэша запросов «mysql». В кэш будет добавляться результат запроса целиком («таблица», полученная в результате запроса).
Например, укажите в my.cnf:
Выбор значения query_cache_size
Совет первый: не указывайте слишком большое значение query_cache_size. Обычно указывается значение, равное одной десятой, одной пятой от размера доступной физической оперативной памяти.
Совет второй: указание также большого значения может существенно снизить эффективность использования кэша при частом обращении к нему при поиске данных. Тем более, если максимальный размер данных для помещения в кэш ограничен слишком «малым» значением query_cache_limit: поиск среди блоков небольших фрагментированных данных становится гораздо медленнее при большем объеме используемой памяти.
Как оптимально подобрать значения для query_cache_size, query_cache_limit?
После настройки my.cnf и перезапуска mysql (обычно: /etc/init.d/mysql restart, /etc/rc.d/mysql restart).
Совет: впрочем, перезапускать mysql после изменения my.cnf нет надобности. Достаточно войти в консоль управления mysql с правами администратора или корневого пользователя root и выполнить запрос на изменение тех или иных переменных.
Например, для query_cache_size:
Какие mysql запросы не кэшируются (qcache_not_cached)?
- insert, update запросы, по существу они приводят к очистки кэша таблицы, для которой выполняются;
- запросы с применением пользовательских функций и процедур;
- запросы, использующие временные таблицы;
- запросы с включением локальных переменных;
- запросы, использующие SELECT … FOR UPDATE, SELECT … INTO OUTFILE, SELECT … IN SHARE MODE, SELECT * FROM … WHERE autoincrement_col IS NULL, SELECT … INTO DUMPFILE;
- запросы без обращения к таблицам;
- запросы с включением некоторых недетерминированных функций: SLEEP(), NOW(),CURTIME(), LAST_INSERT_ID(), RAND();
- в случае, если пользователь имеет права только на часть таблицы: некоторые ее колонки и т.п.
- запросы с генерацией предупреждений (warnings).
Через сутки – другие зайдите в консоль управления mysql или выполните запрос любым, удобным для вас способом:
Здесь нас интересуют следующие переменные:
- qcache_not_cached – количество запросов, не подлежащих кэшированию;
- qcache_inserts – показывает количество результатов mysql запросов, добавляемых в кэш;
- qcache_hits – показывает количество результатов mysql запросов, извлеченных из кэша, без реального обращения к базе данных;
- qcache_free_memory – показывает свободную «доступную» память для кэширования;
- qcache_lowmem_prunes – счетчик, который показывает, сколько раз mysql пришлось принудительно освободить память для добавления новых запросов в кэш mysql.
Эффективностью работы кэша является соотношение qcache_inserts к qcache_hits, которое показывает отношение результатов запросов помещенных в кеш, к результатам запросов, извлеченным из кеша.
Также «эффективность» работы кэширования можно рассчитать по формуле:
Qcache_hits / (Qcache_inserts + Qcache_not_cached)
Как узнать, что query_cache_size был выбран верно?
На это обычно указывает qcache_free_memory, отличный от нуля. При этом желательно, чтобы параметр qcache_lowmem_prunes стремился к 0. Если же qcache_lowmem_prunes очень велик, рекомендую увеличить query_cache_size.
Настраиваем многопоточность в mysql
Thread_concurrency – количество одновременных процессов, «обрабатывающих» конкурентные запросы к mysql. По документации советуют установить это значение, равное процессорам (ядрам) системы, умноженное на два.
Но и советуют обращать внимание на количество винчестеров, которое использует система, чтобы избежать излишней нагрузки на файловую систему. Тоесть, если Ваш сервер оснащен четырьмя Intel Xeon по 2.8 ГГЦ с hyper Threading, тогда Вам следует установить значение в my.cnf:
Как понять, что значение thread_concurrency установлено верно?
Во время большой нагрузки на сервер после изменения параметра thread_concurrency (наплыва посетителей или при помощи эмуляции нагрузки (например, при помощи Apache Bench с другого сервера)) понаблюдайте за количеством свободной оперативной памяти при помощи той же команды top. Кроме этого обратите внимание на параметр в строке Cpu(s): %wa.
Если значение этого параметра после изменения thread_concurrencyвыросло, и дошло до 60-90%, советую Вам снизить количество thread_concurrency. Обычно высокое значение %wa свидетельствует о возрастающей нагрузке на файловую подсистему (винчестер).
thread_cache_size – число потоков, которые сервер будет держать в кэше открытыми для обслуживания новых подсоединений. Можно установить равным значению max_connections + 1 (максимально возможному количеству соединений с б.д. +1). Но, чтобы достигнуть максимальной производительности, потребуется мониторинг переменной max_used_connections во время длительного промежутка времени (см. далее).
Т акже советую Вам просмотреть логии Mysql: обычно /var/log/mysql.log на предмет too many connections, когда mysql сервер отвергает подсоединение к базе данных из за того, что было достигнуто максимальное количество разрешенных подсоединений.
Например, при помощи команды grep, выполненной из ssh консоли linux:
Совет: путь к логу mysql Вы сможете найти в файле my.cnf.
Если Вы нашли несколько строк с подобной ошибкой, тогда советую Вам увеличить значение max_connections, thread_cache_size, back_log, thread_concurrency:
Например для max_connections, thread_cache_size укажите в my.cnf:
Как узнать текущее значение параметра MYSQL, если оно не указано в my.cnf?
Для этого в консоли mysql с правами администратора mysql можно выполнить запрос:
Например, текущее значение max_connections можно узнать так
Если Вы хотите вывести все переменные, содержащие в своем названии max, можно сформировать такой запрос в консоли mysql:
Чтобы получить значения и имена всех без исключения параметров mysql, можно выполнить такой запрос в консоли mysql с правами администратора mysql:
Как подобрать оптимальное значение thread_cache_size?
Выполните из консоли mysql с правами рута или администратора баз данных запрос:
И постоянно отслеживайте переменную max_used_connections через определенные промежутки времени, ее значение. Если значение max_used_connections = 72, то устанавливаем значение thread_cache_size = 100 и выше (немногим больше max_used_connections).
Настраиваем «очередь» конкурентных запросов back_log на подсоединение к mysql серверу.
back_log – сколько запросов на подсоединение к mysql серверу может быть помещено в очередь и в последствии обслужено, если сервер в данный момент занят обработкой запроса на подключение к mysql. По умолчанию пять запросов на подключение будет поставлено в очередь на ожидание. Остальные будут игнорироваться. Если mysql работает под сильной нагрузкой, рекомендую увеличить значение этого параметра.
Количество одновременно открытых таблиц в mysql.
table_cache (с версии Mysql с 5.1.3 — table_open_cache) — количество открытых таблиц для всех потоков. Дело в том, что открытие таблиц – очень ресурсоемкий процесс, поэтому есть смысл «держать» определенное количество таблиц открытыми в кэше. Если у Вас на сервере используется большое количество таблиц одновременно, можно начать со значения в 1000:
Укажите в my.cnf:
Рекомендую через определенный промежуток времени выполнять в консоли mysql запрос с правами root пользователя или администратора mysql:
Opened_tables характеризует число таблиц, открытых в обход кэша, желательно, чтобы ее значение стремилось к 0.
Таблицы какого размера хранить в памяти?
max_heap_table_size — максимальный допустимый размер временной таблицы (типа MEMORY (HEAP)), хранящейся в памяти. При превышении этого раз мера таблица будет «создана» на жестком диске.
Например, укажите в my.cnf:
tmp_table_size — максимальный размер памяти для временных таблиц, создаваемых MySQL, которые «хранятся» в оперативной памяти. Если размер временной таблицы превышает указанный, тогда таблица будет «создана» на диске.
Попробуйте установить значение в my.cnf равным 32 — 128 МБ:
Понаблюдайте также за состоянием created_tmp_disk_tables, ее значение должно стремиться к 0.
Для этого нужно выполнить запрос в консоли mysql:
Если значение created_tmp_disk_tables гораздо больше нуля, попробуйте увеличить параметр tmp_table_size
Источник