2012-04-03 55 views
4

我有一個(很小)的動態網站,它大致上是一個使用SQLite數據庫的Perl CGI腳本。 Package DBI是Perl中使用的抽象層。SQLite的磁盤I/O錯誤

大約一週前,我開始看到此錯誤消息:

disk I/O error(10) at dbdimp.c line 271

由於這是運行Apache託管的網站,我不能看到,如果硬盤是(幾乎)滿。訪問命令「df」被禁用....但我使用(UNIX)shell命令「yes> blah」來測試磁盤是否仍然可以創建新文件。我的數據庫非常小 - 不到50千字節。

我檢查了文件和目錄權限:目錄和所有父母都是+ r,a + x(all + read/executable)。包含我的SQLite數據庫文件的目錄也是+ w(all + write)。數據庫文件本身具有+ w,a + r(all +讀/寫)。

我寫了一個簡單的Perl程序來測試我可以運行失敗的選擇查詢:它運行良好。

我在數據庫上運行查詢「VACUUM」。我再次嘗試了我的測試 - 沒有任何改進。

我將SQLite數據庫轉儲到原始SQL(使用SQLite shell命令「.dump」)並重建。我再次嘗試了我的測試 - 沒有任何改進。

有什麼建議嗎?我很困惑...通常,上面的列表可以捕捉大多數編程/設置錯誤。

+0

你可以發佈錯誤發生時執行的代碼嗎? – 2012-04-03 13:07:40

+0

你正在運行哪個版本的SQLite?你的數據庫有多大?這是否有用 - http://www.sqlite.org/cvstrac/tktview?tn=3094,3 – 2012-04-03 13:42:58

回答

2

不幸的是,sqlite3.h對特定問題的描述不是很明確。錯誤代碼10在這裏被定義:

​​

你可以有/ tmp中充滿的特定點或源碼不必訪問存儲器以寫入其頁面緩存的問題。這是不太可能的,但如果您的數據庫是50kb,因爲sqlite應該能夠將您的頁面緩存保存在內存中。

你可以嘗試使數據庫的拷貝在sqlite的希望可以讀取複製的數據庫和更新代碼,以反映:

$sqlite3 your.db 
sqlite> begin immediate; 
<press CTRL+Z> 
$cp your.db copyofyour.db 
$exit 
sqlite> rollback; 

您也應該檢查日誌,看看這是否是發生與每一個請求或間歇性。您可能想要查看是否有權訪問其他命令來監視服務器運行狀況(頂部,免費)。能夠重現此問題似乎是您的首要任務。如果你不能一致地重現它,那很可能是一個與內存相關的問題。

+0

不錯的建議!很酷的想法。我將爲未來的問題記錄一下。不幸的是,在這種情況下 - 這是由於FreeBSD內核錯誤(如支持論壇爲NearlyFreeSpeech.net所解釋的)。 – kevinarpe 2012-04-04 14:23:10

+0

你能否多說一點這個錯誤?想想我可能會碰到類似的東西... – 2013-02-21 07:11:21

+0

@ChrisVandevelde:對不起,NFS。網絡管理員沒有提供有關FreeBSD <-> SQLite錯誤的更多細節。但是,我的問題已得到解決。 – kevinarpe 2013-07-22 08:06:30

0

如果文件鎖定失敗,那麼可能的錯誤源可能很難檢測到。您可以測試,如果你的文件系統,目前支持例如

flock testfile touch testfile 

NFS文件系統的文件鎖定可能會出現此行爲取決於NFS服務器配置。