SQLITE3:从命令行创建数据库需要永远

时间:2012-11-16 11:09:12

标签: sql linux sqlite

我运行一个创建许多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

2 个答案:

答案 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,磁盘访问。