我正在使用SQLite数据库来存储数据记录器中的值.数据记录器最终将填满计算机上的所有可用硬盘空间.我正在寻找一种方法,一旦达到一定的限制,从数据库中删除最后25%的日志.
使用以下代码:
$ret = Query( 'SELECT id as last FROM data ORDER BY id desc LIMIT 1 ;' );
$last_id = $ret[0]['last'] ;
$ret = Query( 'SELECT count( * ) as total FROM data' );
$start_id = $last_id - $ret[0]['total'] * 0.75 ;
Query( 'DELETE FROM data WHERE id < '. round( $start_id, 0 ) );
Run Code Online (Sandbox Code Playgroud)
将在数据库旁边创建一个日志文件,该文件将填满驱动器上的剩余空间,直到脚本失败.
如何/我可以阻止创建该日志文件?无论如何将所有三个SQL查询合并到一个语句中?
如果日志是问题的唯一原因,您可以尝试让 SQLite 在内存中记录日志,或者直接将其关闭。
来自文档:
PRAGMA 日志模式;
PRAGMA 数据库.journal_mode;
PRAGMA 日志模式 = 删除 | 截断| 坚持 | 内存| OFF
PRAGMA 数据库.journal_mode = DELETE | 截断| 坚持 | 内存| 离开此编译指示查询或设置与当前数据库连接关联的数据库的日志模式。
该编译指示的前两种形式查询当前的日志模式。在第一种形式中,返回默认的journal_mode。默认日志记录模式是通过后续 ATTACH 语句添加到连接的数据库所使用的模式。第二种形式返回特定数据库的当前日志记录模式。
最后两种形式改变了日志模式。第四种形式更改特定数据库连接的日志记录模式。使用“main”作为主数据库(由原始 sqlite3_open()、sqlite3_open16() 或 sqlite3_open_v2() 接口调用打开的数据库),并使用“temp”作为保存 TEMP 表的数据库。第三种形式更改所有数据库上的日记模式,并更改将用于后续 ATTACH 命令添加的新数据库的默认日记模式。返回新的日志模式。如果无法更改日志模式,则返回原始日志模式。
DELETE 日志记录模式是正常行为。在 DELETE 模式下,回滚日志在每个事务结束时被删除。事实上,删除操作是导致事务提交的操作。(有关更多详细信息,请参阅标题为 SQLite 中的原子提交的文档。)
TRUNCATE 日志模式通过将回滚日志截断为零长度而不是删除它来提交事务。在许多系统上,截断文件比删除文件要快得多,因为不需要更改包含的目录。
PERSIST 日志记录模式可防止回滚日志在每个事务结束时被删除。相反,日志的标题会被零覆盖。这将防止其他数据库连接回滚日志。PERSIST 日志模式作为平台上的优化非常有用,在这些平台上,删除或截断文件比用零覆盖文件的第一个块要昂贵得多。
MEMORY 日志模式将回滚日志存储在易失性 RAM 中。这可以节省磁盘 I/O,但会牺牲数据库的安全性和完整性。如果在设置 MEMORY 日志模式时使用 SQLite 的应用程序在事务中崩溃,则数据库文件很可能会损坏。
OFF 日志模式完全禁用回滚日志。不会创建回滚日志,因此永远不会有要删除的回滚日志。OFF 日志模式禁用 SQLite 的原子提交和回滚功能。ROLLBACK 命令不再起作用;它的行为方式未定义。当日志模式关闭时,应用程序必须避免使用 ROLLBACK 命令。如果设置关闭日志模式时应用程序在事务中崩溃,则数据库文件很可能会损坏。
请注意,内存数据库的journal_mode要么是MEMORY,要么是OFF,并且不能更改为其他值。将内存数据库的journal_mode更改为除MEMORY或OFF之外的任何设置的尝试都会被忽略。另请注意,当事务处于活动状态时,journal_mode 无法更改。
| 归档时间: |
|
| 查看次数: |
763 次 |
| 最近记录: |