Назад | Перейти на главную страницу

Докер MariaDB «Не удается запустить журнал tc» при использовании подключенного хранилища

Я инициализирую новую базу данных MariaDB. Запуск докера с томом в моем домашнем каталоге позволяет MariaDB запускаться нормально:

docker run -it --rm --name mymaria \
  -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
  -e MYSQL_PASSWORD=p@$$w0rd \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=myapp \
  -v /home/myuser/mysql:/var/lib/mysql \
  mariadb:10.2

Однако запуск контейнера mariadb с томом через смонтированный каталог, например:

docker run -it --rm --name mymaria \
  -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
  -e MYSQL_PASSWORD=p@$$w0rd \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=myapp \
  -v /mnt/storage/mysql:/var/lib/mysql \
  mariadb:10.2

Эта конфигурация возвращает это из docker logs вывод:

Initializing database
2019-09-23  5:12:13 139724696503616 [ERROR] Can't init tc log
2019-09-23  5:12:13 139724696503616 [ERROR] Aborting


Installation of system tables failed!
...

Просто удалите tc.log как предлагают некоторые люди не работай. Перезапуск mariadb перезапишет tc.log обратно в объем /var/lib/mysql.

Возможно, это проблема с разрешениями? Я чувствую, что пробовал каждую комбинацию chown с каждым каталогом.

Я сталкиваюсь с этой проблемой только с 10.2 тег, а не latest. Однако для оркестровки, над которой я работаю, предлагается mariadb:10.2.

Задний план

В моей ситуации я использовал слияние для объединения множества дисков в единую файловую систему. Одна из его особенностей direct_io подавляет mmap и, вероятно, является причиной фатальной ошибки. Аналогичные конфликты возникают с другим программным обеспечением, использующим mmap как указано документация mergerfs.

Mmap используется в MariaDB и поддерживается не всеми файловыми системами. Я считаю, что в более поздних версиях mmap больше не используется, поэтому в моих собственных тестах я столкнулся с этой проблемой только с mariadb:10.2.

Этот фон может помочь другим, использующим mergerfs или с похожие проблемы, вызывающие конфликты с mmap в MariaDB.

Возможные решения

1. Разрешить mmap работать

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

2. Активировать двоичный журнал

Это можно проверить с помощью либо файл конфигурации, либо как команда для процесса контейнера. Я проверил это, добавив --log-bin команда:

docker run -it --rm --name mymaria \
  -e MYSQL_RANDOM_ROOT_PASSWORD=yes \
  -e MYSQL_PASSWORD=p@$$w0rd \
  -e MYSQL_DATABASE=myapp \
  -e MYSQL_USER=myapp \
  -v /mnt/storage/mysql:/var/lib/mysql \
  mariadb:10.2 --log-bin --log-basename=some_hostname

3. Переместите том в другое место.

Хотя это и не идеально, но это вариант. Либо используйте том на хосте, либо на другом диске. Моя особая проблема с томом MariaDB была из-за конфликта между двумя разными частями программного обеспечения.