我正在初始化一个新的 MariaDB 数据库。使用指向我主目录的卷运行 docker 可以让 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
。
答案1
背景
就我的情况而言,我使用的是合并将多个磁盘组合成一个文件系统。它的一个功能direct_io
会阻止mmap
并可能导致致命错误。mmap
正如所指出的那样,它与其他使用mergerfs 文档。
映射是 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 卷问题是由于两个不同的软件之间存在冲突。