- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个Perl程序,在过去的两年中,我们每天都成功运行该程序,但是今天由于错误消息而崩溃:
严重错误:无法执行PRAGMA cache_size = 1000000:尝试写入只读数据库
有问题的SQLite数据库是只读的,并且一直都是,并且在打开其只读连接后,代码始终在其上立即使用PRAGMA cache_size = 1000000
。
设置cache_size不是写操作,并且如果我直接通过DBI访问db,则不会失败,如下所示:
$ dbh-> do(“ PRAGMA cache_size = 1000000”)
但是,代码使SqliteH :: db成为DBI :: db的子类,然后从子类中调用此函数:
$ self-> SUPER :: do(“ PRAGMA cache_size = 1000000”)
现在它死于“ DBD :: SQLite :: db失败:尝试在/local/ifs_projects/prok/function/src/lib/SqliteH.pm第329行写一个只读数据库。”
该代码可用于CentOS 5,Perl 5.10.1,DBD :: SQLite 1.29和DBI 1.611。
它不适用于CentOS 6,Perl 5.16,DBD :: SQLite 1.39和DBI 1.627。
但是我很奇怪,它上周在CentOS 6和Perl 5.16上运行了。 IT可能在周末升级了DBD :: SQLite或DBI。
请不要再次将标题更改为“突然停止工作了几个月的程序出错”。那是一个无用的,不明确的标题。
最佳答案
TL; DR-如果事务打开,则任何命令都会尝试写入事务日志。如果数据库是只读的,请从dbh连接标志中删除AutoCommit => 0 [您不应该有任何-> begin_work()或INSERT / UPDATE调用,但它们对只读db均无效:-)] 。
事实证明,在更新SQLite,DBI和DBD :: SQLite之后,今天我遇到了完全相同的问题(因此我不确切知道它们中的哪个导致了问题),但就我而言,选择了一个(使它成为问题)甚至更令人困惑)。
原来,交易是在原始连接字符串中打开的:
my $dbh=DBI->connect('dbi:SQLite:file.db','','',, {PrintError=>1,RaiseError=>1,AutoCommit=>0});
DB<4> $dbh->trace(15)
DBI::db=HASH(0x18b9c38) trace level set to 0x0/15 (DBI @ 0x0/0) in DBI 1.627-ithread (pid 15740)
DB<5> $sth= $dbh->prepare("SELECT key,value FROM annotation where accession=?")
...
DB<6> $sth->execute('D3FET3')
-> execute for DBD::SQLite::st (DBI::st=HASH(0x18ba340)~0x18ba178 'D3FET3') thr#10cd010
sqlite trace: bind into 0x18ba268: 1 => D3FET3 (0) pos 0 at dbdimp.c line 1232
sqlite trace: executing SELECT key,value FROM annotation where accession=? at dbdimp.c line 660
sqlite trace: bind 0 type 3 as D3FET3 at dbdimp.c line 677
sqlite trace: BEGIN TRAN at dbdimp.c line 774
sqlite error 8 recorded: attempt to write a readonly database at dbdimp.c line 79
!! ERROR: '8' 'attempt to write a readonly database' (err#1)
<- execute= ( undef ) [1 items] at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2 via at -e line 1
DBD::SQLite::st execute failed: attempt to write a readonly database at (eval 15)[/usr/local/packages/perl-5.16.1/lib/5.16.1/perl5db.pl:646] line 2.
...
关于sql - 当对DBI进行子类化时,Perl DBI将设置SQLite DB cache_size视为写操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17793672/
我是一名优秀的程序员,十分优秀!