当使用CIFS共享作为其数据目录时,我在Ubuntu Server 18.04上的MariaDB有一个非常特殊的问题。
安装程序是一个文件服务器,托管在192.168.4.10,我的MariaDB数据库服务器托管在192.168.4.8。我现在想在我的文件服务器上存储数据库服务器的“热数据”。为此,我在文件服务器上创建了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
到文件夹,并且当我使用sudo -su mysql
切换到mysql用户时,我也可以编辑/创建/删除文件和目录,并且更改正确反映在我的文件服务器上。
但是,当我尝试使用sudo systemctl start mariadb
重新启动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/mysql
时,MariaDB服务就可以正常启动了。
您可以看到,我尝试了在AutoFS配置中可以找到的所有访问掩码参数(这就是为什么有所有这些模式,uid,gid等参数的原因),但到目前为止没有任何效果。
EDIT3:我按照@danblack的建议进行了操作,并以mysql用户身份运行strace -fe trace=%desc -o /tmp/mysqld.strace /usr/sbin/mysqld
。您可以在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)