Настройка mysql для linux

Содержание
  1. Sergey Danielyan
  2. Правильная установка и настройка MySQL в Linux
  3. Установка MySQL
  4. Настройка сервера
  5. Настройка MYSQL под Linux
  6. Где же хранятся настройки mysql?
  7. Как изменить настройки mysql?
  8. Когда требуется настройка mysql? Анализ нагрузки mysql
  9. Тонкая настройка mysql. Кэширование средствами mysql
  10. Настраиваем кэш MYSQL
  11. Выбор значения query_cache_size
  12. Как оптимально подобрать значения для query_cache_size, query_cache_limit?
  13. Какие mysql запросы не кэшируются (qcache_not_cached)?
  14. Как узнать, что query_cache_size был выбран верно?
  15. Настраиваем многопоточность в mysql
  16. Как понять, что значение thread_concurrency установлено верно?
  17. Как узнать текущее значение параметра MYSQL, если оно не указано в my.cnf?
  18. Как подобрать оптимальное значение thread_cache_size?
  19. Настраиваем «очередь» конкурентных запросов back_log на подсоединение к mysql серверу.
  20. Количество одновременно открытых таблиц в mysql.
  21. Таблицы какого размера хранить в памяти?

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) можно установить таким образом:

Читайте также:  Rhel ��� oracle linux

Близится финал нашего действия. Осталось две вещи:

  • открыть порты для 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. Обычно указывается значение, равное одной десятой, одной пятой от размера доступной физической оперативной памяти.

Читайте также:  Linux нет синхронизации времени

Совет второй: указание также большого значения может существенно снизить эффективность использования кэша при частом обращении к нему при поиске данных. Тем более, если максимальный размер данных для помещения в кэш ограничен слишком «малым» значением 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 свидетельствует о возрастающей нагрузке на файловую подсистему (винчестер).

Читайте также:  Драйвер поврежден или отсутствует код 39 windows 10

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

Источник

Оцените статью