установка MySQL5 + phpMyAdmin

для хостинга сайта до 10К посетителей в сутки

Постановка задачи: сконфигурировать сервер баз данных для интенсивного использования или для хостинга мало- или средне-нагруженных сайтов (до 10К уникальных посетителей в сутки)

Нам понадобятся:

  • MySQL 5.x – СУБД (обязательно);
  • phpMyAdmin + Дизайнер – веб-интерфейс для удобной работы с базами данных (опционально);
  • mysqltuner – MySQL оптимизатор (опционально);
  • руки – прямые (обязательно)...
  • Итак, приступаем к настройке:

    1. 1. Установка MySQL Database Server
    2. 2. Конфигурирование, настройка MySQL 5
    3. 3. Установка phpMyAdmin (PMA) в Debian 7 Wheezy
    4. 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]

    • 1

    Комментарии отключены, сожалеем