Oracle:
select * from v$log;
SQL Server :
dbcc loginfo(dbname)
status含义:
0:reusable或unused
2:active或recoverable
或者用
SELECT [name], COUNT(l.database_id) AS 'vlf_count' FROM sys.databases s CROSS APPLY sys.dm_db_log_info(s.database_id) l GROUP BY [name] HAVING COUNT(l.database_id) > 100
status含义:
0 - VLF is inactive
1 - VLF is initialized but unused
2 - VLF is active.
状态含义对比
Oracle | 含义 | SQL Server | 含义 | 备注 |
CURRENT | 当前正在使用的日志文件组。该联机重做日志组是活动的 | ACTIVE | VLF中存在属于活动事务(未结束的事务)的日志记录 | |
ACTIVE | 该组是活动的但不是当前组,实例恢复时需要这组日志。
文件中的数据没有全部写入数据文件,一旦需要实例恢复,必须借助该文件中保存的内容。
已归档没归档均可。 | RECOVERABLE | VLF中不包含活动事务的日志记录,此时DB处于维护一个完整日志序列的状态,但是某些操作(例如数据库镜像、复制、日志备份等)还需要用到这些数据,因此不可以被覆盖。 | sqlserver的有点类似Oracle归档还没被DG应用不可删除 |
INACTIVE | 该组联机重做日志当前处于空闲状态。
文件中的数据全部写入数据文件,实例恢复已不再需要这组联机重做日志组了。
已归档没归档均可。 | REUSABLE | VLF中的数据已经不需要了,可以被覆盖(该状态也称为“可截断”) | |
UNUSED | 该联机重做日志文件组对应的文件还从未被写入过数据。
通常是刚创建或重建 | UNUSED | VLF从未被使用 | |
CLEARING | 在执行了 ALTER DATABASE CLEAR LOGFILE 后,表示该组重做日志正被重建(重建后该状态会变成UNUSED) | 无对应 | ||
CLEARING_CURRENT | 表示该组重做日志重建时出现错误,如io错误。 | 无对应 |
|
SQL Server 日志维护状态
以下两种情况视为sqlserver数据库处于非完整日志维护状态:
1. 从未进行过全库备份
select last_log_backup_lsn from sys.database_recovery_status where db_name(database_id)='tpcc'
-- last_log_backup_lsn 为NULL
2. 数据库恢复模式为sample
select recovery_model_desc from sys.databases where name='tpcc'
-- 查询结果为SAMPLE
若sqlserver处于非完整日志维护状态:
执行checkpoint操作后,sqlserver会直接重用日志文件中不包含活动事务的VLF,因为VLF可以不断被重用
若sqlserver处于完整日志维护状态:
checkpoint操作不会重用VLF,执行事务日志备份后,sqlserver会自动重用reusable状态的VLF
参考: