Skip to content

Налаштування сервера БД

У цьому уроці ти сконфігуруєш сервер бази даних. За допомогою цих налаштувань ти зможеш змінювати різні аспекти роботи сервера, які допоможуть пристосувати сервер під конкретні задачі. MySQL зберігає свою конфігурацію в файлі, розташування якого залежить від ОС та типу встановлення сервера MySQL. Щоб знайти розташування цього файлу, у Linux можна виконати ось таку команду:

mysqld --verbose --help

Ця команда виведе значення всіх конфігураційних опцій сервера. На самому початку можна знайти файли, з яких ці опції були завантажені, наприклад, /etc/my.cnf та /etc/mysql/my.cnf. Зазирнемо в ці файли:

cat /etc/my.cnf 
cat /etc/mysql/my.cnf

Другий файл містить коментар про структуру файлу, та команду includedir. За допомогою цієї команди позначаються теки, з яких MySQL завантажує додаткові файли конфігурації. Загалом це всі файли з тек з includedir, ім'я яких закінчується на .cnf. Якщо передивитись усі файли в цих теках, то можна знайти саме той, де, власне зберігаються конфігураційні опції:

ls /etc/mysql/mysql.conf.d/
nano /etc/mysql/mysql.conf.d/mysqld.cnf   

Файл mysqld.cnf є головним конфігураційним файлом:

nano /etc/mysql/mysql.conf.d/mysqld.cnf   

А ось і вміст файлу:

#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
[mysqld]
#
# * Basic Settings
#
user        = mysql
# pid-file  = /var/run/mysqld/mysqld.pid
# socket    = /var/run/mysqld/mysqld.sock
# port      = 3306
# datadir   = /var/lib/mysql
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir        = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address        = 0.0.0.0
mysqlx-bind-address = 127.0.0.1
#
# * Fine Tuning
#
key_buffer_size     = 16M
# max_allowed_packet    = 64M
# thread_stack      = 256K
# thread_cache_size       = -1
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options  = BACKUP
# max_connections        = 151
# table_open_cache       = 4000
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
#
# Log all queries
# Be aware that this log type is a performance killer.
# general_log_file        = /var/log/mysql/query.log
# general_log             = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
# slow_query_log        = 1
# slow_query_log_file   = /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
# binlog_expire_logs_seconds    = 2592000
max_binlog_size   = 100M
# binlog_do_db      = include_database_name
# binlog_ignore_db  = include_database_name

Трохи деталей:

  1. Користувач, під яким запущений демон (сервіс) бази даних (user). За замовчуванням, MySQL запускається під користувачем mysql, який створюється автоматично під час інсталяції. Насправді користувача сервісу змінюють доволі рідко, але корисно знати, де його можна подивитись, якщо потрібно буде налаштувати додаткові права в системі.

  2. Тека datadir, де MySQL зберігає файли баз даних та бінарних логів — спеціальних файлів, які зберігають історію всіх змін, що відбувались в БД. Бінарні логи зберігають інформацію як про зміни структури бази даних, так і про зміну, власне, даних. З їх допомогою можна відновити базу даних до стану, у якому вона була в минулому. datadir часто змінюють тоді, коли потрібно налаштувати роботу MySQL в контейнерах (Docker). Тоді вказують шлях до теки, яка примаунчена (mounted) з persistent storage.

  3. bind-address — це IP-адреса, на якій сервер приймає мережеві запити від клієнтів. За замовчуванням вона дорівнює 127.0.0.1. Також у bind-address може бути IP-адреса віртуальної машини, тоді сервер прийматиме підключення від будь-якого іншого комп'ютеру в мережі. bind-address можна ще змінити на 0.0.0.0. Такий варіант є найзручнішим, оскільки дозволяє підключення з інших комп'ютерів у мережі, та при цьому сервер все ще працюватиме, якщо віртуальна машина змінить адресу.

💡 127.0.0.1 — це спеціальна адреса, якою будь-який комп'ютер позначає сам себе. 0.0.0.0 — це інша спеціальна адреса, яка позначає, що MySQL буде приймати запити на будь-яку IP-адресу.

  1. port — це TCP-порт, на якому сервер приймає мережеві підключення. За замовчуванням він має значення 3306.

  2. Файл конфігурації дозволяє налаштувати логування. Опція log_error вказує шлях до файлу з помилками.

  3. Набір опцій slow_query_log дозволяє налаштувати логування повільних SQL-запитів. Завдяки цим логам можна моніторити та оптимізовувати роботу бази даних (про це ми більше поговоримо в темі про моніторинг бази даних).

Коли ти працюватимеш з конфігурацією MySQL на своїй віртуальній машині, то варто звернути увагу на кілька речей:

  1. Перед тим, як вносити зміни в файл конфігурації, зроби його резервну копію. Так ти зможеш відновити роботу сервера, якщо випадково внесеш некоректні зміни:
cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.backup

💡 Ім'я файлу резервної копії може бути будь-яким. Головне, щоб воно незакінчувалось на .cnf.

  1. Щоб застосувати зміни, потрібно перезавантажити сервіс на MySQL. На Linux це можна зробити за допомогою наступної команди:
sudo systemctl restart mysql 

Після перезапуску сервісу, обов'язково перевір його статус:

systemctl status mysql 

Якщо сервіс не запуститься, то причину помилки можна буде знайти в файлі логу помилки:

tail /var/log/mysql/error.log