我运行一个创建许多SQLITE3数据库的服务,稍后再次删除它们,它们可能会活一天左右。它们都具有相同的模式并且从空开始。
我用它来创建一个新的空白SQLITE3数据库:
sqlite3 newDatabase.db < myschema.sql
myschema.sql文件包含三个表模式左右,没什么花哨的,没有数据。当我在相当快速的专用Linux服务器上执行上述命令时,最多需要5分钟才能完成。有些进程在后台运行,比如几个使用CPU时间的PHP脚本,但其他一切都很快,就像其他命令或稍后将数据插入数据库一样。这只是创造需要永远。
这太奇怪了,我完全不知道这里有什么问题。所以我现在唯一的办法是创建一个blank.db,然后从中创建一个新副本,而不是从SQL模式导入。
知道我搞砸了什么吗?我最初认为linux上的noatime设置正在弄乱它,但不,禁用并没有改变任何东西。
愿意提供您需要的任何配置/数据。
修改
This is what strace hangs at:
12:29:45.460852 fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741824, len=1}) = 0
12:29:45.460965 fcntl(3, F_SETLK, {type=F_WRLCK, whence=SEEK_SET, start=1073741826, len=510}) = 0
12:29:45.461079 lseek(4, 512, SEEK_SET) = 512
12:29:45.461550 read(4, "", 8) = 0
12:29:45.462639 fdatasync(4
答案 0 :(得分:1)
可能的方法是使用strace
命令查看发生了什么:
strace -f -s 1000 -tt sqlite3 newDatabase.db < myschema.sql
如果它挂在某处,你会看到。
你的架构是巨大的吗?
注意强>
I/O
磁盘,请尝试命令iotop -oPa
,您会看到“谁是”将乱七八糟的东西放入您的系统中答案 1 :(得分:0)
好吧,我想我已经找到了问题。
服务器在后台运行了几个PHP脚本,这些脚本看起来有点像CPU负载,它经常飙升100%,但除了通过APT-GET安装和安装新的SQLITE3数据库之外,所有其他命令工作正常超出架构。
可能导致问题的是重磁盘访问(IO操作)。我重新安装了APC,升级到了新版本,发现它已经被CLI禁用(这是默认设置),但启用了它,因为我有长时间运行的脚本,还添加了几个usleep(100)。
我停止了每一个PHP命令,基本上杀死了所有不需要的程序。通过MYSQL Workbench检查系统使用情况,直到我意识到这是一个平均值,它似乎仍然非常高。如果再等10分钟,它会平均出来,在我的情况下接近0%LOAD。完美。
然后我重新启动了脚本,现在似乎正在解决问题。
我尝试了上面提到的SQLITE3命令,它可以按预期立即工作。
因此,原因很简单:不仅CPU负载很高,而且还有HEAVY IO,磁盘访问。