【问题标题】:What causes a journal file to be created in SQLite?是什么导致在 SQLite 中创建日志文件?
【发布时间】:2009-03-11 03:56:19
【问题描述】:

我开始注意到我的 iPhone 应用程序的 SQLite 查询有一个奇怪的行为。每当我执行“INSERT”语句时,都会在我的 db 文件旁边创建一个日志文件(确切的文件名是“userdata.db-journal”)。

如果我正确理解文档,SQLite 会使用此日志文件来回滚以防操作失败。但是操作完成后文件会一直保留在那里。

我执行准备、绑定和执行查询的经典步骤(为简单起见,不检查返回值):

sqlite3 *db = NULL;
sqlite3_open( "userdata.db", &db );

sqlite3_stmt *insertStmt = NULL;
const char *query = "INSERT INTO table VALUES(?,?)";
sqlite3_prepare_v2( db, query, -1, &insertStmt, NULL );

sqlite3_bind_int( insertStmt, 1, 0 );
sqlite3_bind_int( insertStmt, 2, 0 );

sqlite3_step( insertStmt );

sqlite3_reset( insertStmt );
sqlite3_clear_bindings( insertStmt );

sqlite3_close( db );

日志文件是在调用 'sqlite3_step' 函数后创建的,并一直保留在那里,直到我关闭数据库。我需要做什么才能让它消失?

【问题讨论】:

    标签: iphone sqlite


    【解决方案1】:

    SQLite 默认在事务开始时创建日志文件,这是一件好事。通常它会在提交时删除文件。

    您可以通过 PRAGMA sql 命令更改此行为以简单地截断文件(无需创建/删除)或将其归零。您的 SQLite 版本可能不支持所有选项。

    PRAGMA journal_mode = DELETE | TRUNCATE | PERSIST | MEMORY | OFF  
    

    写入操作通常在您提交之前不会完成,这是通过截断、删除或使日志无效来实现的。

    如果这种行为是新的,我无法解释为什么它可能会改变,除了可能是 SQLite 的升级改变了默认行为,或者通过不为每个事务重新打开日志而变得更加复杂。

    【讨论】:

    • 现在还有一个预写日志模式(WAL)被添加到这个列表中。它将日志保存在另一个带有“-wal”后缀的文件中。
    【解决方案2】:

    你为什么想要?

    日志文件跟踪数据库中的每笔交易;您希望它在关闭数据库之前一直存在,以便在崩溃后可以重建数据库状态,即使写入缓冲区尚未刷新等。

    【讨论】:

      【解决方案3】:

      正如 Joe 所说,日志是在事务启动时创建的,而 SQLlite 在您启动语句时会为您创建一个。

      要清除该日志并确保该语句已提交给数据库使用:

      sqlite3_finalize(insertStmt);   
      

      收盘前。

      .journal 文件将消失,您的所有数据将在您的数据库中完好且安全。

      希望这会有所帮助。

      克里斯。

      【讨论】:

        猜你喜欢
        • 2021-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 1970-01-01
        • 1970-01-01
        • 2011-02-06
        相关资源
        最近更新 更多