Я инициализирую новую базу данных 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.
mmap
работатьВ моем сценарии для этого требуется отключение теперь устаревшая функция под названием direct_io
который обходит кеш страницы. Согласно mergerfs
документация, это рекомендуется.
Это можно проверить с помощью либо файл конфигурации, либо как команда для процесса контейнера. Я проверил это, добавив --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
Хотя это и не идеально, но это вариант. Либо используйте том на хосте, либо на другом диске. Моя особая проблема с томом MariaDB была из-за конфликта между двумя разными частями программного обеспечения.