为什么sqlite3无法在Amazon Elastic File System上运行?

Jan*_*Jan 3 linux sqlite nfs amazon-web-services

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

$ sqlite3 foo.db SQLite version 3.7.17 2013-05-20 00:56:22 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .log stderr sqlite> CREATE TABLE foo (int bar); Error: disk I/O error

有问题的Sqlite3数据库应仅用于故事元数据,并且不经常更新.不需要并发访问.但是,如果创建数据库的进程终止,则需要在不同的主机上重新启动该进程,并继续执行先前实例退出的位置.

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

挂载选项/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 = 2 0 0

据我所知,通常不鼓励将数据库放在NFS上.但是,我相信,鉴于亚马逊和SQLite使用的语言,开发人员将继续尝试.

2ti*_*tim 5

更新(2017年3月6日):

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

https://aws.amazon.com/about-aws/whats-new/2017/03/amazon-elastic-file-system-amazon-efs-now-supports-nfsv4-lock-upgrading-and-downgrading/

来自文档:

锁定升级和降级:如果客户端尝试升级或降级现有锁定,则Amazon EFS将返回NFS4ERR_LOCK_NOTSUPP.

注意

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

看到:

http://docs.aws.amazon.com/efs/latest/ug/efs-ug.pdf

并且:

http://docs.aws.amazon.com/efs/latest/ug/nfs4-unsupported-features.html


Ser*_*ayu 5

默认情况下,sqlite 在“unix” VFS上运行,该 VFS 使用 Amazon EFS 不支持的锁定升级。但是,如果您将 VFS 更改为“unix-excl”,您可以在 Amazon EFS 上使用 sqlite 数据库,这使用独占文件锁并且不需要升级。

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

ubuntu@ip-1-1-1-1 /efs> sqlcipher foo.db -vfs unix-excl
SQLCipher version 3.8.10.2 2015-05-20 18:17:19
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> CREATE TABLE foo (int bar);
sqlite> .exit
Run Code Online (Sandbox Code Playgroud)

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

sqlite3_vfs_register(sqlite3_vfs_find("unix-excl"), 1);
sqlite3_open("foo.db", &db);
Run Code Online (Sandbox Code Playgroud)

如果使用 PHP PDO,那么你就会陷入困境,除非你愿意重新编译 pdo_sqlite PHP 扩展。