CentOS 8升级至Rocky Linux 9后SQLite提交报错:DBD::SQLite::db commit failed: disk I/O error
解决Rocky Linux 9下SQLite commit时的磁盘I/O错误
以下是针对该问题的排查和修复建议:
检查SELinux上下文限制
Rocky Linux 9的SELinux默认配置比CentOS 8更严格,即使文件权限正常,SELinux上下文不匹配也会触发I/O错误。- 临时关闭SELinux测试:
setenforce 0,重新运行系统验证是否还报错。 - 若临时关闭后问题解决,为SQLite文件设置正确的SELinux上下文:
chcon -t sqlite_db_t /path/to/your/database.db - 如需永久生效,执行
semanage fcontext -a -t sqlite_db_t "/path/to/your/database.db",再运行restorecon -v /path/to/your/database.db
- 临时关闭SELinux测试:
验证文件系统挂载选项
检查数据库文件所在分区的挂载参数,是否存在限制写入的配置:- 执行
mount查看分区挂载信息,确认没有ro(只读)、noexec等影响写入的参数。 - 若使用XFS文件系统,可尝试临时重新挂载分区:
mount -o remount,rw /mount/point,测试是否恢复正常。
- 执行
核对SQLite及DBD::SQLite版本兼容性
Rocky Linux 9自带的SQLite版本与CentOS 8差异较大,可能导致DBD::SQLite模块与系统SQLite库不兼容:- 查看系统SQLite版本:
sqlite3 --version - 查看Perl的DBD::SQLite版本:
perl -MDBD::SQLite -e 'print $DBD::SQLite::VERSION' - 若版本不匹配,重新编译安装DBD::SQLite:
cpanm DBD::SQLite(需提前安装编译依赖:gcc、make、sqlite-devel)
- 查看系统SQLite版本:
检查数据库文件完整性
系统升级过程中可能导致数据库文件损坏:- 执行完整性检查:
sqlite3 /path/to/database.db "PRAGMA integrity_check;" - 若检查出错误,重建数据库:
sqlite3 /path/to/database.db ".recover" > new_database.db,替换原文件后测试。
- 执行完整性检查:
验证目录读写权限及临时文件创建权限
SQLite在commit时会在数据库文件同目录创建临时日志文件(如.db-journal或-wal文件),需确保目录有读写权限:- 检查目录权限:
ls -ld /path/to/directory,确认运行系统的用户对该目录有w权限。 - 手动在目录创建文件测试:
touch /path/to/directory/test_file,确认可正常写入。
- 检查目录权限:
尝试禁用WAL日志模式
Rocky Linux 9的SQLite默认可能启用WAL模式,部分环境下存在兼容性问题:- 进入SQLite交互模式修改日志模式:
sqlite3 /path/to/database.db "PRAGMA journal_mode=DELETE;" - 确认返回结果为
delete后,重新运行系统测试commit功能。
- 进入SQLite交互模式修改日志模式:
内容的提问来源于stack exchange,提问作者fvlasie
相关产品推荐
相关产品推荐

