【问题标题】:Why does sqlite3 not work on Amazon Elastic File System?为什么 sqlite3 不能在 Amazon Elastic File System 上运行?
【发布时间】:2017-06-23 12:54:59
【问题描述】:

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

$ 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 数据库应该只存储元数据,并且不会经常更新。不需要并发访问。但是,如果创建数据库的进程死亡,则要求该进程可以在不同的主机上重新启动并继续前一个实例退出的位置。

Amazon 声称 EFS 是一个“文件系统,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=2 0 0

我了解it is often generally discouraged to put databases on NFS。不过,我相信,鉴于 Amazon 和 SQLite 都使用的语言,开发人员会继续尝试。

【问题讨论】:

  • 使用.log stderr获取更多错误信息。
  • @CL。 .log stderr 不会产生额外的输出
  • 在你尝试写任何东西之前。
  • @CL。我明白了,请参阅上面的编辑。这就是我得到的。
  • 更新您的sqlite3 工具。

标签: linux amazon-web-services sqlite nfs


【解决方案1】:

更新(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 如果客户端尝试升级或降级现有锁。

注意

由于不支持锁定升级和降级,因此使用案例 需要这个特性,比如那些使用 SQLite 或 IPython 的,也是 Amazon EFS 不支持。

见:

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

还有:

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

【讨论】:

  • EFS 现在支持锁升级和降级。见aws.amazon.com/about-aws/whats-new/2017/03/…
  • 感谢@user1071840,我也很高兴在我的用例中听到这个消息。我会更新我的答案,以免让发现它的人误入歧途。
  • 我在我的 AWS 设置中仍然遇到这个问题,你在 EFS/Grafana 设置中定义了什么特殊的东西来使它工作?
  • 听起来像是 AWS 支持的问题。
【解决方案2】:

默认情况下,sqlite 在“unix”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

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

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

如果使用 PHP PDO,那么你会被卡住,除非你愿意重新编译 pdo_sqlite PHP 扩展。

【讨论】:

猜你喜欢
  • 2017-04-01
  • 2019-05-27
  • 2013-09-05
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多