Linux 为什么sqlite3不能在Amazon弹性文件系统上工作?

Linux 为什么sqlite3不能在Amazon弹性文件系统上工作?,linux,amazon-web-services,sqlite,nfs,Linux,Amazon Web Services,Sqlite,Nfs,当我尝试在EFS目录上使用sqlite3创建基时,这会导致错误: $sqlite3 foo.db SQLite版本3.7.17 2013-05-20 00:56:22 输入“.help”以获取说明 输入以“;”结尾的SQL语句 sqlite>.log标准 sqlite>创建表foo(int-bar); 错误:磁盘I/O错误 所讨论的Sqlite3数据库应该只描述元数据,并且不经常更新。不需要并发访问。但是,如果创建数据库的进程终止,则需要在另一台主机上重新启动该进程,并在前一个实例退出的地方继

当我尝试在EFS目录上使用
sqlite3
创建基时,这会导致错误:

$sqlite3 foo.db
SQLite版本3.7.17 2013-05-20 00:56:22
输入“.help”以获取说明
输入以“;”结尾的SQL语句
sqlite>.log标准
sqlite>创建表foo(int-bar);
错误:磁盘I/O错误

所讨论的Sqlite3数据库应该只描述元数据,并且不经常更新。不需要并发访问。但是,如果创建数据库的进程终止,则需要在另一台主机上重新启动该进程,并在前一个实例退出的地方继续

Amazon声称这是一个“Amazon EC2实例可以通过文件系统接口(使用标准操作系统文件I/O API)访问的文件系统,并且支持完整的文件系统访问语义(如强一致性和文件锁定)。”因此,我假设它适合于手头的任务

/etc/fstab
中的装载选项包括:

eu-west-1a.fs-ID.efs.eu-west-1.amazonaws.com://efs-nfs4-nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=20

我明白。然而,我相信,考虑到Amazon和SQLite都使用的语言,开发人员将继续尝试。

更新(2017年3月6日):

EFS现在支持NFS v4.1锁升级和降级:

从文档中:

锁升级和降级:Amazon EFS返回NFS4ERR\u Lock\u NOTSUPP 如果客户端尝试升级或降级现有锁

注意

由于不支持锁升级和降级,因此 还需要此功能,例如使用SQLite或IPython的功能 在Amazon EFS中不受支持

见:

而且:

默认情况下,sqlite在“unix”上运行,而“unix”使用的是亚马逊EFS锁升级不支持的版本。但是,如果将VFS更改为“unix excl”,则可以在AmazonEFS上使用sqlite数据库,后者使用独占文件锁,不需要升级

有几种方法可以指定VFS。如果您使用的是命令行,只需添加“-vfs unix excl”选项:

如果从API使用,则需要在调用open函数之前注册VFS:

sqlite3_vfs_register(sqlite3_vfs_find("unix-excl"), 1);
sqlite3_open("foo.db", &db);

如果使用PHP PDO,那么您将陷入困境,除非您愿意重新编译PDO_sqlite PHP扩展。

使用
.log stderr
获取更多错误信息。@CL.
.log stderr
在您尝试编写任何内容之前不会产生任何附加输出。@CL.我理解,请参阅上面的编辑。这就是我得到的。更新你的
sqlite3
工具。很高兴知道,毕竟在EFS上运行sqlite是可能的。可能的,但总体来说还是个坏主意:EFS现在支持锁升级和降级。请参阅Thank@user1071840,我也很高兴听到这个关于我的用例的消息。我将更新我的答案,以免让人们误入歧途。我在AWS设置中仍然遇到这个问题,您在EFS/Grafana设置中定义了什么特别的东西来让它工作?听起来像是AWS支持的问题。
sqlite3_vfs_register(sqlite3_vfs_find("unix-excl"), 1);
sqlite3_open("foo.db", &db);