Постановка задачи: сконфигурировать сервер баз данных для интенсивного использования или для хостинга мало- или средне-нагруженных сайтов (до 10К уникальных посетителей в сутки)
Нам понадобятся:
Итак, приступаем к настройке:
- 1. Установка MySQL Database Server
- 2. Конфигурирование, настройка MySQL 5
- 3. Установка phpMyAdmin (PMA) в Debian 7 Wheezy
- 4. Тюнинг сервера MySQL с помощью mysqltuner
1. Установка MySQL Database Server
Немало сказано про безудержную прожорливость сервера БД MySQL! Действительно сервер MySQL использует много ресурсов сервера и используется в высоконагруженных системах. Как и все прожорливые системы – без дополнительной настройки будет работать медленно и криво. А ещё он имеет массу уязвимостей и периодически может "падать" от кривой настройки или неоптимизированных запросов и таблиц. Но в общем, сервер MySQL имеет огромные возможности и в своём классе имеет мало конкурентов. Дважды подумайте какая БД Вам нужна... Может не такая мощная как MySQL!? Нет... тогда ставим:
server:/# apt-get install mysql-server mysql-client php5-mysql
Создание пользователей MySQL и изменение пароля суперюзера (root)
Если Вы работаете в Debian выше Lenny, Squeeze или Wheezy, то пароль для root-а у вас попросят при установке и обязательно его задайте!
Примечание: Граждане! Не оставляйте пароль главного пользователя mysql ROOT нашей БД пустым!!! Выберите его посерьёзнее и нигде больше не используйте. Для работы с отдельными базами создавайте отдельного пользователя, грамотно выбирайте нужные для него права (ничего лишнего!) и используйте всю мощь привилегий, предоставляемых сервером БД MySQL. По умолчанию в Debian Etch mysql создает пользователя root без пароля. вот на такой вот случай и установим пароль для пользователя mysql – root.
server:/# mysql mysql> USE mysql; mysql> UPDATE user SET Password=PASSWORD('new-password') WHERE user='root'; mysql> FLUSH PRIVILEGES;
2. Конфигурирование, настройка MySQL 5
В очередной раз файл настроек сменил место. Теперь глобальный файл коняигурации раположен в папке /etc/mysql/my.cnf. Обратите внимание, что можно использовать специфичные настройки (локальные) для каждого пользователя в отдельности (user-specific) – расположив файл с дополнительными или корректирующими опциями в папке пользователя ~/.my.cnf
Для настройки сервера для средненагруженного портала скорректируем настройки в /etc/mysql/my.cnf.:
[mysqld] # # * Basic Settings # user = mysql pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock port = 3306 basedir = /usr datadir = /var/lib/mysql tmpdir = /tmp lc-messages-dir = /usr/share/mysql skip-external-locking # skip-name-resolve - блокируем поиск DNS хоста, будем использовать только IP - для ускорения производительности; # skip-networking - разрешаем только локальные запросы; skip-name-resolve skip-networking # # Не забудем "русифицировать" нащу БД. # # Устанавливаем набор символов для сервера (по умолчанию --character-set-server=latin1) character-set-server=cp1251 # Задаём схему сранения и сортировки cимволов в столбцах (по умолчанию --collation-server=latin1_swedish_ci) collation-server=cp1251_general_ci # Форсируем кодировку для связи между клиентскими программами и сервером init-connect="SET NAMES cp1251" # Кодировка (набор символов) по умолчанию, которая будет использована, когда создаётся новая база данных или # таблица и не используется принудительно иной символьный набор или кодировка default-character-set=cp1251 # Запрещаем использовать обмен наборами символов при обработке запросов клиента skip-character-set-client-handshake # # Instead of skip-networking the default is now to listen only on # localhost which is more compatible and is not less secure. bind-address = 127.0.0.1 # # * Fine Tuning # key_buffer_size = 1500M max_allowed_packet = 32M thread_stack = 192K thread_cache_size = 8 # Try number of CPU's*2 for thread_concurrency thread_concurrency = 8 table_open_cache = 512 sort_buffer_size = 8M read_buffer_size = 2M read_rnd_buffer_size = 8M tmp_table_size = 128M max_heap_table_size = 32M wait_timeout = 120 local-infile = 0 join_buffer_size = 150M lower-case-table-names = 0 myisam_sort_buffer_size = 64M # This replaces the startup script and checks MyISAM tables if needed # the first time they are touched myisam-recover = BACKUP max_connections = 300 table_cache = 1024 #thread_concurrency = 10 # # * Query Cache Configuration # query_cache_limit = 32M query_cache_size = 128M # # * Logging and Replication # # Both location gets rotated by the cronjob. # Be aware that this log type is a performance killer. # As of 5.1 you can enable the log at runtime! #general_log_file = /var/log/mysql/mysql.log #general_log = 1 # # Error logging goes to syslog due to /etc/mysql/conf.d/mysqld_safe_syslog.cnf. # # Here you can see queries with especially long duration # Обязательно включаем логирование медленных запросов. Это помогает найти узкие места в работе скриптов сайтов. slow_query_log log_slow_queries = /var/log/mysql/mysql-slow.log long_query_time = 2 log-queries-not-using-indexes # # The following can be used as easy to replay backup logs or for replication. # note: if you are setting up a replication slave, see README.Debian about # other settings you may need to change. # Бинарные логи нужны для репликации. Пока их не стоит задействовать, но ограничение надо включить #server-id = 1 #log_bin = /var/log/mysql/mysql-bin.log expire_logs_days = 10 max_binlog_size = 100M #binlog_do_db = include_database_name #binlog_ignore_db = include_database_name # # * InnoDB # # InnoDB is enabled by default with a 10MB datafile in /var/lib/mysql/. # Read the manual for more InnoDB related options. There are many! # # * Security Features # # Read the manual, too, if you want chroot! # chroot = /var/lib/mysql/ # # For generating SSL certificates I recommend the OpenSSL GUI "tinyca". # # ssl-ca=/etc/mysql/cacert.pem # ssl-cert=/etc/mysql/server-cert.pem # ssl-key=/etc/mysql/server-key.pem [mysqldump] quick quote-names max_allowed_packet = 32M [mysql] #no-auto-rehash # faster start of mysql but no tab completition [isamchk] key_buffer = 16M # # * IMPORTANT: Additional settings that can override those from this file! # The files must end with '.cnf', otherwise they'll be ignored. # !includedir /etc/mysql/conf.d/
Указанная конфигурация используется на сервере с ограничением в 300 одновременных подключений к службе и выделением исключительно для неё от 2GB оперативной памяти. Всего на сервере установлено 32GB RAM.
После конфигурирования, перезапускаем службу и изучаем пристально лог-файл, расположенный в /var/log/mysql.err.
server:/# service mysql restart
3. Установка phpMyAdmin (PMA) в Debian 7 Wheezy
Однако сразу скажу - из консоли рядовому пользователю работать с MySQL сервером ой как не просто! Но для решения всех задач есть хорошее решение, написанное на языке PHP – phpMyAdmin. Установим сий чудный веб-интерфейс для работы с MySQL.
В случае с Debian Etch и Lenny пакет необходимо скачать самостоятельно с Инетернета и установить либо вручную, либо пакетным инсталятором. В последних версиях все проще, нам поможет утилита для настройки `dbconfig`:
server:/# apt-get install phpmyadmin dbconfig-common
При установке, нас спросят во что интегрировать пакет, выбираем apache2. А вот установка БД вместе с пакетом - это уже кое что новенькое. В любом случае Вы можете создать эту базу и пользователя самостоятельно, настроить Дизайнера и прочие фишки и проч., или тупо согласиться... Соглашаемся.
Вводим пароль root от MySQL для того, чтобы инсталятор пакета сумел создать пользователя phpmyadmin и базу данных для него. Тут же укажем пароль для phpmyadmin
Примечание: Все телодвижения с созданием БД и пользователя необходимы чтобы задействовать такие вкусности PMA как: "Дизайнер" связей, "Репликация", "Отслеживать таблицу", "Синхронизировать" и прочее.
Проверим, корректно ли добавил инсталятор необходимую информацию в наш веб сервер apache2, смотрим папку /etc/apache2/conf.d на предмет наличия ссылки @phpmyadmin.conf.
Перезапускаем apache (если за Вас это не сделал dbconfig ;):
server:/# service apache2 restart
Теперь можно пользоваться пакетом - http://ip.address/phpmyadmin/ или http://domain/phpmyadmin/. Хорошей практикой является защита этого ресурса дополнительно паролем, хотя бы той-же самой Basic Auth от Apache...
4. Тюнинг сервера MySQL с помощью mysqltuner
server:/# apt-cache search mysqltuner mysqltuner - high-performance MySQL tuning script server:/# apt-get install mysqltuner
Особенность этой утилиты в том, что надо выждать время... Пускай Ваш сервер поработает под нагрузкой без перезапуска недельку, насобирает статистику. Чем больше статистики, тем точнее прогноз.
server:/# mysqltuner >> MySQLTuner 1.0.1 - Major Hayden>> Bug reports, feature requests, and downloads at http://mysqltuner.com/ >> Run with '--help' for additional options and output filtering Please enter your MySQL administrative login: root Please enter your MySQL administrative password: -------- General Statistics -------------------------------------------------- [--] Skipped version check for MySQLTuner script [OK] Currently running supported MySQL version 5.1.49-3 [OK] Operating on 32-bit architecture with less than 2GB RAM -------- Storage Engine Statistics ------------------------------------------- [--] Status: -Archive -BDB -Federated +InnoDB -ISAM -NDBCluster [--] Data in MyISAM tables: 1K (Tables: 15) [!!] InnoDB is enabled but isn't being used [OK] Total fragmented tables: 0 -------- Performance Metrics ------------------------------------------------- [--] Up for: 1h 11m 50s (620 q [0.144 qps], 99 conn, TX: 190K, RX: 52K) [--] Reads / Writes: 100% / 0% [--] Total buffers: 58.0M global + 2.7M per thread (151 max threads) [!!] Maximum possible memory usage: 463.8M (92% of installed RAM) [OK] Slow queries: 0% (0/620) [OK] Highest usage of available connections: 1% (2/151) [OK] Key buffer size / total MyISAM indexes: 16.0M/124.0K [OK] Query cache efficiency: 24.7% (76 cached / 308 selects) [OK] Query cache prunes per day: 0 [OK] Sorts requiring temporary tables: 0% (0 temp sorts / 1 sorts) [OK] Temporary tables created on disk: 22% (75 on disk / 328 total) [OK] Thread cache hit rate: 97% (2 created / 99 connections) [OK] Table cache hit rate: 23% (38 open / 159 opened) [OK] Open file limit used: 7% (76/1K) [OK] Table locks acquired immediately: 100% (177 immediate / 177 locks) -------- Recommendations ----------------------------------------------------- General recommendations: Add skip-innodb to MySQL configuration to disable InnoDB MySQL started within last 24 hours - recommendations may be inaccurate Reduce your overall MySQL memory footprint for system stability Enable the slow query log to troubleshoot bad queries
Периодически запускаем его, анализируем отчет, выполняем его рекомендации с учётом собственных соображений. Цветами покажет критические моменты и выдаст рекомендации... Как видно по последнему результату - рано мы его запускаем - 24 часа просит выждать)
Комментарии 1
- 1
Дмитрий — Dec 22, 2015 at 04:17 PM
Поле: default-character-set=cp1251
Необходимо писать в блок [cleint], а не [mysqld]