kev*_*rpe 8 sqlite perl cgi dbi
我有一个(小)动态网站,它(大致)是一个使用 SQLite 数据库的 Perl CGI 脚本。包 DBI 是 Perl 中使用的抽象层。
大约一周前,我开始看到此错误消息:
dbdimp.c 第 271 行的磁盘 I/O 错误 (10)
由于这是一个运行 Apache 的托管站点,我无法查看硬盘是否(几乎)已满。访问命令“df”被禁用......但我使用(UNIX)shell命令“是> blah”来测试磁盘仍然可以创建新文件。我的数据库非常小——不到 50 KB。
我检查了文件和目录权限:目录和所有父项都是 a+r,a+x(全部 + 读取/可执行)。包含我的 SQLite 数据库文件的目录也是 a+w(全部 + 写入)。数据库文件本身有a+w,a+r(全部+读/写)。
我编写了一个简单的 Perl 程序来测试我可以运行失败的选择查询:它运行良好。
我在数据库上运行了查询“VACUUM”。我再次尝试了我的测试——没有改善。
我将 SQLite 数据库转储为原始 SQL(使用 SQLite shell 命令“.dump”)并重建。我再次尝试了我的测试——没有改善。
有什么建议?我很困惑......通常,上面的列表可以捕获大多数编程/设置错误。
造成这种情况的另一个原因:
当数据库文件不可写时,您会收到“只读数据库”错误。当它可写但日志文件不可写时,您会收到“I/O 错误”。
小智 6
不幸的是,sqlite3.h 并没有很好地描述具体问题是什么。错误代码 10 定义如下:
#define SQLITE_IOERR 10 /* Some kind of disk I/O error occurred */
Run Code Online (Sandbox Code Playgroud)
您可能会遇到 /tmp 在某些时候已满或 sqlite 无法访问内存来写入其页面缓存的问题。不过,如果您的数据库是 50kb,则这是不太可能的,因为 sqlite 应该能够将页面缓存保存在内存中。
您可以尝试制作数据库的副本,希望 sqlite 可以读取复制的数据库并更新您的代码以反映这一点:
$sqlite3 your.db
sqlite> begin immediate;
<press CTRL+Z>
$cp your.db copyofyour.db
$exit
sqlite> rollback;
Run Code Online (Sandbox Code Playgroud)
您还应该检查日志,看看这种情况是每次请求都会发生还是间歇性发生。您可能想查看是否有权访问其他命令来监控服务器运行状况(顶级,免费)。能够重现该问题似乎是您手头的首要任务。如果您无法一致地重现它,则可能是与内存相关的问题。
| 归档时间: |
|
| 查看次数: |
17493 次 |
| 最近记录: |