SQL Server移除事務日誌後sys.master_files依然存在記錄問題

在SQL Server中移除了事務日誌文件後,使用sys.master_files檢查時發現,對應的事務日誌文件記錄信息依然存在sys.master_files裏面,只是狀態state_desc爲OFFLINE。須要通過一段時間,這條記錄在這個系統視圖纔會消失。html

 

DECLARE @db_name NVARCHAR(32);
SET @db_name=N'TEST';
SELECT   f.database_id                AS database_id  
        ,DB_NAME(f.database_id)       AS database_name
        ,f.file_id                    AS primary_log_id 
        ,f.name                       AS log_logical_name
        ,f.physical_name              AS database_file_name
        ,f.type_desc                  AS type_desc
        ,CAST(f.size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) 
                                      AS [Size(GB)]  
        ,CASE WHEN max_size = 0  THEN N'不容許增加'
                  WHEN max_size = -1 THEN N'自動增加'
              ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2))
                      + 'G'
         END                          AS max_size 
        ,CASE WHEN is_percent_growth = 1
                 THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
                 ELSE RTRIM(CAST(Growth*8.0/1024 AS CHAR(10))) + 'M'
         END                          AS growth_size 
        ,Is_Percent_Growth            AS IsPercentGrowth 
        ,f.state_desc
FROM    sys.master_files  f
WHERE  f.database_id= DB_ID(@db_name) 
  AND  type = 1

 

 

clip_image001

 

其實這個是由於這個系統視圖的數據庫不會實時更新,它的數據是異步更新。具體英文描述爲: The view sys.master_files is something new and is updated asynchronously. It doesn't updates immediately. 之前也因爲這個系統視圖的數據異步更新,遇到過幾個問題, 以下連接所示:數據庫

 

SQL Server系統視圖sys.master_files不能正確顯示數據庫脫機狀態app

SQL Server使用sys.master_files計算tempdb大小不正確。異步

 

不過這個系統視圖sys.master_files裏面數據何時更新,確實不清楚它的同步機制。有時候測試實驗發現很快就更新了。有時候可能等好幾分鐘都沒有更新數據。附上測試流程,其實MS SQL 事務日誌管理小結這裏也有介紹,只是略過簡單async

 

--Step 1:    首先找出有2個或多個事務日誌的數據庫
USE master;
GO
SELECT  f.database_id         AS database_id  ,
        d.name                AS database_name,
        f.type_desc           AS type_desc    ,
        COUNT(*)              AS log_count
FROM    sys.master_files  f
INNER  JOIN sys.databases d ON f.database_id = d.database_id
WHERE   type = 1
GROUP BY f.database_id ,
         f.type_desc,
         d.name
HAVING  COUNT(*) >= 2;
 
 
 
--Step 2:    查看事務日誌文件的詳細信息(包括文件邏輯名,物理路徑,大小,增加狀況等等)
DECLARE @db_name NVARCHAR(32);
SET @db_name=N'TEST';
SELECT   f.database_id                AS database_id  
        ,DB_NAME(f.database_id)       AS database_name
        ,f.file_id                    AS primary_log_id 
        ,f.name                       AS log_logical_name
        ,f.physical_name              AS database_file_name
        ,f.type_desc                  AS type_desc
        ,CAST(f.size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4)) 
                                      AS [Size(GB)]  
        ,CASE WHEN max_size = 0  THEN N'不容許增加'
                  WHEN max_size = -1 THEN N'自動增加'
              ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2))
                      + 'G'
         END                          AS max_size 
        ,CASE WHEN is_percent_growth = 1
                 THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
                 ELSE RTRIM(CAST(Growth*8.0/1024 AS CHAR(10))) + 'M'
         END                          AS growth_size 
        ,Is_Percent_Growth            AS IsPercentGrowth 
        ,f.state_desc
FROM    sys.master_files  f
WHERE  f.database_id= DB_ID(@db_name) 
  AND  type = 1
 
 
 
 
 
--Step 3: 確認那個是主事務日誌文件,由於主日誌文件(primary log)是不能刪除的
 
 
DECLARE @db_name NVARCHAR(32);
SET @db_name=N'TEST';
SELECT  f.database_id            AS database_id  ,
        DB_NAME(f.database_id)   AS database_name,
        MIN(f.file_id)           AS primary_log_id ,
        f.type_desc              AS type_desc    
FROM    sys.master_files  f
WHERE  f.database_id= DB_ID(@db_name) 
  AND  type = 1
GROUP BY f.database_id,f.type_desc;
 
 
 
--Step 4:查看對應數據庫的事務日誌狀態
 
DECLARE @db_name NVARCHAR(32);
SET @db_name=N'TEST';
SELECT  name ,
        log_reuse_wait_desc
FROM    sys.databases
WHERE name=@db_name
 
 
 
 
--Step 5: DBCC SQLPERF(LOGSPACE)
--查看數據庫的事務日誌空間使用狀況統計信息
DBCC SQLPERF(LOGSPACE)
 
 
 
 
 --Step 6: 查看虛擬日誌狀況(虛擬日誌文件 (VLF)事務日誌的信息)
USE TEST;
GO
DBCC LOGINFO('TEST')
GO
 
USE TEST;
GO
DBCC SHRINKFILE('TEST_Log1', 1)
 
 
USE TEST;
GO
DBCC SHRINKFILE('TEST_Log1', EMPTYFILE)
 
 
 
--Step 7: 備份事務日誌
 
--相似這樣的腳本。
 
BACKUP LOG TEST TO DISK = 'M:\DB_BACKUP\Test.Trn'
GO
 
--有些狀況下,Step 6 跟 Step 7要循環交叉進行,直到事務日誌文件empty後,而後執行step 8
 
 
--Step 8: 移除事務日誌文件
ALTER DATABASE TEST REMOVE FILE TEST_Log1
相關文章
相關標籤/搜索