经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
SQL Server移除事务日志后sys.master_files依然存在记录问题
来源:cnblogs  作者:潇湘隐者  时间:2019/3/20 8:46:16  对本文有异议

在SQL Server中移除了事务日志文件后,使用sys.master_files检查时发现,对应的事务日志文件记录信息依然存在sys.master_files里面,只是状态state_desc为OFFLINE。需要经过一段时间,这条记录在这个系统视图才会消失。

 

  1. DECLARE @db_name NVARCHAR(32);
  1. SET @db_name=N'TEST';
  1. SELECT   f.database_id                AS database_id 
  1.         ,DB_NAME(f.database_id)       AS database_name
  1.         ,f.file_id                    AS primary_log_id
  1.         ,f.name                       AS log_logical_name
  1.         ,f.physical_name              AS database_file_name
  1.         ,f.type_desc                  AS type_desc
  1.         ,CAST(f.size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4))
  1.                                       AS [Size(GB)] 
  1.         ,CASE WHEN max_size = 0  THEN N'不允许增长'
  1.                   WHEN max_size = -1 THEN N'自动增长'
  1.               ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2))
  1.                       + 'G'
  1.          END                          AS max_size
  1.         ,CASE WHEN is_percent_growth = 1
  1.                  THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
  1.                  ELSE RTRIM(CAST(Growth*8.0/1024 AS CHAR(10))) + 'M'
  1.          END                          AS growth_size
  1.         ,Is_Percent_Growth            AS IsPercentGrowth
  1.         ,f.state_desc
  1. FROM    sys.master_files  f
  1. WHERE  f.database_id= DB_ID(@db_name)
  1.   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不能正确显示数据库脱机状态

SQL Server使用sys.master_files计算tempdb大小不正确。

 

不过这个系统视图sys.master_files里面数据什么时候更新,确实不清楚它的同步机制。有时候测试实验发现很快就更新了。有时候可能等好几分钟都没有更新数据。附上测试流程,其实MS SQL 事务日志管理小结这里也有介绍,只是略过简单

 

  1. --Step 1:    首先找出有2个或多个事务日志的数据库
  1. USE master;
  1. GO
  1. SELECT  f.database_id         AS database_id  ,
  1.         d.name                AS database_name,
  1.         f.type_desc           AS type_desc    ,
  1.         COUNT(*)              AS log_count
  1. FROM    sys.master_files  f
  1. INNER  JOIN sys.databases d ON f.database_id = d.database_id
  1. WHERE   type = 1
  1. GROUP BY f.database_id ,
  1.          f.type_desc,
  1.          d.name
  1. HAVING  COUNT(*) >= 2;
  1.  
  1.  
  1.  
  1. --Step 2:    查看事务日志文件的详细信息(包括文件逻辑名,物理路径,大小,增长情况等等)
  1. DECLARE @db_name NVARCHAR(32);
  1. SET @db_name=N'TEST';
  1. SELECT   f.database_id                AS database_id 
  1.         ,DB_NAME(f.database_id)       AS database_name
  1.         ,f.file_id                    AS primary_log_id
  1.         ,f.name                       AS log_logical_name
  1.         ,f.physical_name              AS database_file_name
  1.         ,f.type_desc                  AS type_desc
  1.         ,CAST(f.size * 8.0 / 1024 / 1024 AS DECIMAL(8, 4))
  1.                                       AS [Size(GB)] 
  1.         ,CASE WHEN max_size = 0  THEN N'不允许增长'
  1.                   WHEN max_size = -1 THEN N'自动增长'
  1.               ELSE LTRIM(STR(max_size * 8.0 / 1024 / 1024, 14, 2))
  1.                       + 'G'
  1.          END                          AS max_size
  1.         ,CASE WHEN is_percent_growth = 1
  1.                  THEN RTRIM(CAST(Growth AS CHAR(10))) + '%'
  1.                  ELSE RTRIM(CAST(Growth*8.0/1024 AS CHAR(10))) + 'M'
  1.          END                          AS growth_size
  1.         ,Is_Percent_Growth            AS IsPercentGrowth
  1.         ,f.state_desc
  1. FROM    sys.master_files  f
  1. WHERE  f.database_id= DB_ID(@db_name)
  1.   AND  type = 1
  1.  
  1.  
  1.  
  1.  
  1.  
  1. --Step 3: 确认那个是主事务日志文件,因为主日志文件(primary log)是不能删除的
  1.  
  1.  
  1. DECLARE @db_name NVARCHAR(32);
  1. SET @db_name=N'TEST';
  1. SELECT  f.database_id            AS database_id  ,
  1.         DB_NAME(f.database_id)   AS database_name,
  1.         MIN(f.file_id)           AS primary_log_id ,
  1.         f.type_desc              AS type_desc   
  1. FROM    sys.master_files  f
  1. WHERE  f.database_id= DB_ID(@db_name)
  1.   AND  type = 1
  1. GROUP BY f.database_id,f.type_desc;
  1.  
  1.  
  1.  
  1. --Step 4:查看对应数据库的事务日志状态
  1.  
  1. DECLARE @db_name NVARCHAR(32);
  1. SET @db_name=N'TEST';
  1. SELECT  name ,
  1.         log_reuse_wait_desc
  1. FROM    sys.databases
  1. WHERE name=@db_name
  1.  
  1.  
  1.  
  1.  
  1. --Step 5: DBCC SQLPERF(LOGSPACE)
  1. --查看数据库的事务日志空间使用情况统计信息
  1. DBCC SQLPERF(LOGSPACE)
  1.  
  1.  
  1.  
  1.  
  1. --Step 6 查看虚拟日志情况(虚拟日志文件 (VLF)事务日志的信息)
  1. USE TEST;
  1. GO
  1. DBCC LOGINFO('TEST')
  1. GO
  1.  
  1. USE TEST;
  1. GO
  1. DBCC SHRINKFILE('TEST_Log1', 1)
  1.  
  1.  
  1. USE TEST;
  1. GO
  1. DBCC SHRINKFILE('TEST_Log1', EMPTYFILE)
  1.  
  1.  
  1.  
  1. --Step 7: 备份事务日志
  1.  
  1. --类似这样的脚本。
  1.  
  1. BACKUP LOG TEST TO DISK = 'M:\DB_BACKUP\Test.Trn'
  1. GO
  1.  
  1. --有些情况下,Step 6 Step 7要循环交叉进行,直到事务日志文件empty后,然后执行step 8
  1.  
  1.  
  1. --Step 8: 移除事务日志文件
  1. ALTER DATABASE TEST REMOVE FILE TEST_Log1

原文链接:http://www.cnblogs.com/kerrycode/p/10559075.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号