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 为NULL2. 数据库恢复模式为sample
select recovery_model_desc from sys.databases where name='tpcc'
-- 查询结果为SAMPLE若sqlserver处于非完整日志维护状态:
执行checkpoint操作后,sqlserver会直接重用日志文件中不包含活动事务的VLF,因为VLF可以不断被重用
若sqlserver处于完整日志维护状态:
checkpoint操作不会重用VLF,执行事务日志备份后,sqlserver会自动重用reusable状态的VLF
参考:
https://docs.microsoft.com/en-us/sql/relational-databases/system-dynamic-management-views/sys-dm-db-log-info-transact-sql?view=sql-server-2017
https://docs.microsoft.com/en-us/sql/relational-databases/sql-server-transaction-log-architecture-and-management-guide?view=sql-server-2017#physical_arch
https://blog.51cto.com/jimshu/1174474










