sqlite格式错误的数据库仅在本地

sqlite格式错误的数据库仅在本地,sqlite,malformed,Sqlite,Malformed,我有一个SQLite数据库托管在我的网站上,在那里它工作得很好。我需要添加一些新的查询,我喜欢在上线之前在本地测试它们 问题是,在我下载db文件以在本地使用它之后,当我尝试运行一个查询(与在线查询相同)时,我会得到一个“数据库磁盘映像格式不正确” 知道问题出在哪里吗 我的网站详细信息 服务器:linux SQLite 3.x的PDO驱动程序:已启用 SQLite库:3.3.7 我的本地详细信息 服务器:带XAMPP的Windows 7(1.7.2) SQLite 3.x的PDO驱动程序:已启用

我有一个SQLite数据库托管在我的网站上,在那里它工作得很好。我需要添加一些新的查询,我喜欢在上线之前在本地测试它们

问题是,在我下载db文件以在本地使用它之后,当我尝试运行一个查询(与在线查询相同)时,我会得到一个“数据库磁盘映像格式不正确”

知道问题出在哪里吗

我的网站详细信息

服务器:linux

SQLite 3.x的PDO驱动程序:已启用

SQLite库:3.3.7

我的本地详细信息

服务器:带XAMPP的Windows 7(1.7.2)

SQLite 3.x的PDO驱动程序:已启用

SQLite库:3.6.16


如何将SQLITE3DB文件下载到本地系统

如果在服务器联机时使用FTP或SCP之类的工具直接获取该文件,则很可能检索到损坏的文件。想想看:在互联网上传输这样一个文件至少需要几秒钟——在这几秒钟内,您的站点仍然在线,并且在服务器DB文件上执行事务。因此,文件的第一个字节将反映事务1003,而最后一个字节将反映事务1015。实际上,DB文件在您下载时会发生更改

我们还没有进入数据库日志文件和部分事务

您需要的是DB文件的原子副本。甚至服务器上的
cp
也可能不够快。您需要一种在复制文件时锁定数据库的方法

有三种方法可以做到这一点:

  • 使用服务器上的
    sqlite3
    shell实用程序和数据库的
    .dump
    。然后可以压缩SQL转储,下载它并重建本地数据库。有点麻烦,但几乎可以保证工作

  • 使用。有一个
    .backup
    命令,其作用与此基本相同。然后就可以下载新的DB文件了。不幸的是,较旧的SQLite版本可能不支持这一点

  • 使用sqlite3外壳实用程序锁定DB文件,使用
    cp
    复制它,解锁。这是一种古老的,有点危险的方式,这就是为什么我不想深入讨论更多细节的原因

  • 停止服务器以便不执行任何事务,复制文件,然后重新启动。我不认为这是一个实际的解决方案,因此它不包括在最后的计数中。


顺便说一句,包含一些破坏SQLite3数据库的常见方法-您可能想通过FTP查看一下…

是的,但该文件非常小,如64KB,而且使用量不多,我怀疑该文件可能仍然挂起且未关闭。@BrainCrash:很可能存在您未下载的活动日志文件。一般来说,在任何DBMS中,而不仅仅是SQLite中,可靠复制DB文件的唯一方法是通过DBMS本身。我的问题是我有一个便宜的主机,所以不能在服务器上运行shell命令。谢谢。下载.db shm和.db wal文件修复了我的问题。