【问题标题】:sqlite3 WAL/SHM files not deletedsqlite3 WAL/SHM 文件未删除
【发布时间】:2015-10-16 18:58:47
【问题描述】:

我有以下代码

int main(){
sqlite3 *db;
int     rc;
char filename[512];
char query[512];
char trace_string[512];
sqlite3_stmt *Stmt;
const char *zLeftover;

strcpy(filename,"/data/xcd/textdatabase/2015274/2015274_mos.sqlite");
strcpy(query,"ATTACH '/data/xcd/textdatabase/2015273/2015273_mos.sqlite' as db1");

rc = sqlite3_open_v2(filename, &db,SQLITE_OPEN_READONLY,NULL);
if (rc != SQLITE_OK) {
    sprintf(trace_string,"open_database: failed to open %s, rc=%d\n", filename, rc);
    fprintf(stdout,trace_string);
    return 0;
}
else {
    sprintf(trace_string,"open_database: %s opened rc=%d\n", filename, rc);
    fprintf(stdout,trace_string);
}

rc = sqlite3_prepare(db, query, -1, &Stmt, &zLeftover);
if (rc != SQLITE_OK) {
    sprintf(trace_string,"test: sqlite3_prepare, command=%s, rc=%d\n", query, rc);
    fprintf(stdout,trace_string);
    return rc;
}

rc = sqlite3_step(Stmt);
if ((rc != SQLITE_OK) && (rc != SQLITE_DONE) && (rc != SQLITE_ROW)) {
    sprintf(trace_string,"test: sqlite3_step, command=%s, rc=%d\n", query, rc);
    fprintf(stdout,trace_string);
    return rc;
}

rc = sqlite3_finalize(Stmt);

sprintf(trace_string,"test: sqlite3_finalize, command=%s, rc=%d\n", query, rc);
fprintf(stdout,trace_string);

rc=sqlite3_close(db);
sprintf(trace_string,"close_database: rc=%d\n", rc);
fprintf(stdout,trace_string);
return (rc);

}

我正在使用的数据库是预写日志 (WAL) 数据库。根据 SQLite 文档,应该在程序完成后删除 shm 和 wal 文件。但是,执行此程序后,这些文件仍然存在。文档说如果程序没有完全完成,文件可能仍然存在,但我只是没有看到。有什么见解吗? 谢谢!

【问题讨论】:

    标签: sqlite wal


    【解决方案1】:

    -shm-wal 文件在 checkpoint 之后被删除。 这不能在只读数据库上完成。

    【讨论】:

    • 对于只读数据库,我希望它根本不会创建这种东西...:/
    • 你为什么还要使用read-only WAL
    • 因为数据是证据,在我们阅读时不应修改。
    • 复制一份,然后打开。
    • 这就是我们正在做的事情,所以现在我也在尝试阻止它在 tmp 中创建其他文件。
    猜你喜欢
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2014-01-25
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-10
    相关资源
    最近更新 更多