2

当使用 CIFS 共享作为其数据目录时,Ubuntu Server 18.04 上的 MariaDB 有一个相当特殊的问题。

设置是托管在 192.168.4.10 的文件服务器和托管在 192.168.4.8 的 MariaDB 数据库服务器。我现在想将数据库服务器的“热数据”存储在我的文件服务器上。为此,我在我的文件服务器上创建了一个 SMB/CIFS 共享,数据库服务器应该使用它来在文件服务器上存储其数据(默认/var/lib/mysql位于此设置对生产数据库有意义)。

我使用 AutoFS 挂载 CIFS 共享。配置看起来像这样

/etc/auto.master

[...]
/var/autofs/net        /etc/auto.db-slave --timeout 300 --mode 0777

/etc/auto.db-slave

db-slave        -fstype=cifs,username=smbmysql,password=***,rw,vers=3.0,uid=mysql,gid=mysql,forceuid,forcegid,dir_mode=0777,file_mode=0777,hard,intr,noperm        ://192.168.4.10/db_slave

我还创建了一个(软)符号链接/var/lib/mysql -> /var/autofs/net/db-slave

共享工作得很好,我可以cd到文件夹,当我切换到 mysql 用户时,sudo -su mysql我还可以编辑/创建/删除文件和目录,并且更改正确反映在我的文件服务器上。

但是,当我尝试再次启动 MariaDB 服务时,sudo systemctl start mariadb它无法启动并且日志文件如下所示:

Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] /usr/sbin/mysqld (mysqld 10.4.10-MariaDB-1:10.4.10+maria~bionic-log) starting as process 1291 ...
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Using Linux native AIO
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Mutexes and rw_locks use GCC atomic builtins
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Uses event mutexes
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Compressed tables use zlib 1.2.11
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Number of pools: 1
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Using SSE2 crc32 instructions
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] mysqld: O_TMPFILE is not supported on /tmp (disabling future attempts)
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Initializing buffer pool, total size = 256M, instances = 1, chunk size = 128M
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Completed initialization of buffer pool
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: If the mysqld execution user is authorized, page cleaner thread priority can be changed. See the man page of setpriority().
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] InnoDB: Cannot read first page of './ibdata1' I/O error
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] InnoDB: Plugin initialization aborted with error I/O error
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] InnoDB: Starting shutdown...
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] Plugin 'InnoDB' init function returned error.
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [Note] Plugin 'FEEDBACK' is disabled.
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] Unknown/unsupported storage engine: InnoDB
Dec 11 11:01:12 vmpsateam04-08 mysqld[1291]: 2019-12-11 11:01:12 0 [ERROR] Aborting

如您所见,问题似乎是 InnoDB 引擎无法读取./ibdata1。但是该文件很好,因为当我禁用共享并将所有文件从我的文件服务器复制回/var/lib/mysqlMariaDB 服务时,它启动得很好。

如您所见,我尝试了在 AutoFS 配置中可以找到的所有访问掩码参数(这就是为什么存在所有这些模式、uid、gid 等参数的原因),但到目前为止无济于事。

EDIT3:我按照@danblack 的建议做了,并strace -fe trace=%desc -o /tmp/mysqld.strace /usr/sbin/mysqld以 mysql 用户身份运行。你可以在WeTransfer上找到完整的文件,希望有人能够理解这一切。

跟踪的关键部分是:

1625  openat(AT_FDCWD, "./ibdata1", O_RDWR|O_CLOEXEC) = 7
1625  fcntl(7, F_SETFL, O_RDONLY|O_DIRECT) = 0
1625  fcntl(7, F_SETLK, {l_type=F_WRLCK, l_whence=SEEK_SET, l_start=0, l_len=0}) = 0
1625  fstat(7, {st_mode=S_IFREG|0777, st_size=79691776, ...}) = 0
1625  pread64(7, 0x56003fa78000, 65536, 0) = -1 EINVAL (Invalid argument)
4

0 回答 0