背景

背景

我正在初始化一个新的 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 卷问题是由于两个不同的软件之间存在冲突。

相关内容