База данных в веб-окружении - запуск, настройки, доступ снаружи
Разбираемся с базой данных внутри веб-окружения: почему она не поднимается, где менять её настройки и как дать к ней доступ снаружи, не открыв её всему миру.
Решение
Смотрим, почему база не поднялась:
systemctl status mysqld --no-pagertail -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 = 4Gmax_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 не останется места.
Можно ли обновлять версию базы отдельно от окружения?
Лучше не стоит: окружение рассчитано на свои версии. Обновление вручную ломает его собственные сценарии обслуживания.
Как быстро снять копию большой базы?
Средствами сервера базы, а не через административную часть. Снятие копии сайтом на десятках гигабайт упирается в ограничение времени выполнения.
Нужен ли доступ снаружи для отчётов?
Чаще нет: отчёты снимают с копии базы или на самом сервере. Открытый наружу порт - постоянная цель для перебора паролей.
Смежное
- BitrixVM и веб-окружение - оглавление подтемы
- Сайт не поднялся после перезагрузки - разбор недоступного сайта целиком
- Мониторинг сервера: что смотреть до того, как сайт упадёт - как заметить кончающееся место
- База данных: продвинутое - настройка базы под нагрузку
- Инфраструктура и хостинг - устройство площадки целиком
- Восстановление из резервной копии: порядок, отказы, проверка - разворот копии на новой площадке
- Вынос базы и кэша на отдельные машины: когда и как - когда базе нужна своя машина
- Сайт не подключается к базе: причины по убыванию частоты - что проверять при отказе базы
- Настройка базы под нагрузку: буферы, движок, соединения - параметры под нагрузку поверх запуска