Перейти к содержимому

База данных в веб-окружении - запуск, настройки, доступ снаружи

Разбираемся с базой данных внутри веб-окружения: почему она не поднимается, где менять её настройки и как дать к ней доступ снаружи, не открыв её всему миру.

Решение

Смотрим, почему база не поднялась:

Окно терминала
systemctl status mysqld --no-pager
tail -40 /var/log/mysqld.log | grep -iE 'error|crash|disk'
df -h /var/lib/mysql # кончившееся место - причина номер один
ls -ld /var/lib/mysql # владелец каталога данных после ручного переноса

Причину отказа старта всегда называет журнал. Три четверти случаев - это кончившееся место на диске, битая таблица после жёсткой перезагрузки или чужие права на каталог данных после ручного восстановления.

Меняем настройки базы правильно:

Окно терминала
# основной файл перезаписывается обновлением окружения
cat /etc/mysql/conf.d/bx_custom.cnf
[mysqld]
innodb_buffer_pool_size = 4G
max_allowed_packet = 64M
# после правки сервер базы перезапускают, иначе значения остаются прежними

Правки кладут в отдельный файл, а не в основной. Обновление окружения перезаписывает свои файлы целиком, и настройки, внесённые прямо в них, исчезают в самый неудобный момент.

Открываем доступ снаружи, если он действительно нужен:

CREATE USER 'reporter'@'203.0.113.10' IDENTIFIED BY 'пароль';
GRANT SELECT ON bitrix.* TO 'reporter'@'203.0.113.10';
-- права выдаются на конкретный адрес, а не на все сразу
SHOW GRANTS FOR 'reporter'@'203.0.113.10'; -- проверка выданного набора прав

Нужны две вещи сразу: права пользователя с нужного адреса и открытый порт в межсетевом экране. Доступ с любого адреса и с полными правами - самая частая причина потери базы вместе с сайтом.

Проверяем кодировку рабочего соединения:

echo \Bitrix\Main\Application::getConnection()->queryScalar("SELECT @@character_set_client"), "\n";
// значение должно совпадать с кодировкой самого сайта
// кодировка подключения задаётся в файле настроек соединения, а не в таблицах
// расхождение кодировок соединения и таблиц даёт знаки вопросов вместо букв

Кодировка соединения задаётся настройками подключения сайта, а не таблицами базы. Сайт в одной кодировке и соединение в другой дают вопросительные знаки вместо русских букв, хотя данные в таблицах целы.

Расширения PHP для работы с базой ставятся вместе с самой версией PHP. Сообщение о неизвестной функции подключения означает не поломку сайта, а версию PHP без нужного расширения, и лечится оно установкой пакета для этой версии.

Кодировку самого сайта менять задним числом почти никогда не стоит. Перевод живого проекта в другую кодировку означает пересборку базы, правку файлов и повторную проверку всех обменов, а выигрыш при этом нулевой.

Резервная копия базы средствами сервера и копия средствами сайта решают разные задачи. Первая снимается быстро и целиком, вторая переносима между площадками, и на большой базе разница во времени доходит до часов.

Типичные проблемы

После перезагрузки сервера сайт не открывается.

База не поднялась из-за нехватки места на диске либо из-за битой таблицы. Причина отказа всегда записана в журнале самого сервера базы данных.

Настройки базы вернулись к прежним значениям.

Правки внесены прямо в основной файл настроек. Обновление окружения перезаписывает этот файл целиком вместе со всеми правками.

Подключиться снаружи не удаётся.

Права пользователю выданы, но порт закрыт межсетевым экраном. Для доступа снаружи нужны оба условия одновременно.

Вместо русских букв вопросительные знаки.

Кодировка соединения не совпадает с кодировкой самого сайта. Данные в таблицах при этом остаются полностью целыми.

Сайт пишет о неизвестной функции подключения.

Для текущей версии PHP не установлено расширение работы с базой. Смена версии PHP нужные для базы расширения за собой не тянет.

Частые вопросы

Сколько памяти отдавать базе?

Около половины оперативной памяти сервера при отдельной машине под базу. На общем сервере - меньше, иначе процессам PHP не останется места.

Можно ли обновлять версию базы отдельно от окружения?

Лучше не стоит: окружение рассчитано на свои версии. Обновление вручную ломает его собственные сценарии обслуживания.

Как быстро снять копию большой базы?

Средствами сервера базы, а не через административную часть. Снятие копии сайтом на десятках гигабайт упирается в ограничение времени выполнения.

Нужен ли доступ снаружи для отчётов?

Чаще нет: отчёты снимают с копии базы или на самом сервере. Открытый наружу порт - постоянная цель для перебора паролей.

Смежное

Первоисточник