SQL Server的Msg 945, Level 14, State 2报错

如果自己搞不定可以找诗檀软件专业SQL SERVER数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

 

Msg 945, Level 14, State 2, Server DESKTOP-L414PA5\SQLEXPRESS, Line 2
Database 'testn1' cannot be opened due to inaccessible files or insufficient memory or disk space.  See the SQL Server errorlog for details.

 

微软官方对该错误的解释是数据库文件或资源不可访问。

Product Name SQL Server
Event ID 945
Event Source MSSQLSERVER
Component SQLEngine
Symbolic Name DB_IS_SHUTDOWN
Message Text Database ‘%.*ls’ cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server error log for details.

 

该945报错发生在当SQL SERVER数据库标记某个数据库为IsShutDown状态。“database cannot be opened due to inaccessible files”错误信息也可以发生在SQL数据库因为缺失文件或资源、或备份发生损坏、或数据库处于置疑状态从而无法恢复的场景。

建议用户检查内存、磁盘空间和权限是否存在问题。确认MDF和NDF文件位置,且数据库引擎有权限访问这些文件。若都无问题,则执行ALTER DATABASE [数据库名] set ONLINE 操作,让数据库上线。

注意该问题也可能由于数据文件损坏导致,对于这种情况要么使用备份恢复,要么需要使用特殊工具恢复。

 

  • 修复SQL SERVER数据库的945错误
  • 若可能则增加更多的磁盘空间给数据库,或删除磁盘上不必要的文件
  • 检查数据库是否处于自动扩展状态
  • 检查操作系统账号是否有必要的权限
  • 检查MDF、NDF和LDF文件不是处于只读状态

 

若你的数据库处于置疑状态,并出现如下报错信息:

SQL Error 926 severity 14
Database '%.*ls' cannot be opened. It has been marked SUSPECT by recovery. See the SQL Server errorlog for more information.


SQL SERVER的926报错发生在当附加或卸载MDF文件时,且该MDF文件存在问题从而导致恢复工作无法正常完成,以便将数据库恢复到一致状态。不当的关闭数据库和计算机病毒攻击均可能引起该问题。

 

SQL SERVER中DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS选项介绍

如果自己搞不定可以找诗檀软件专业SQL SERVER数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

DBCC CHECKDB 命令用以检测数据库中所有对象的物理和逻辑完整性,其包含如下操作

 

  • 对数据库运行DBCC CHECKALLOC
  • 对数据库运行DBCC CHECKTABLE检测数据库中的每一张表和视图
  • 对数据库运行DBCC CHECKCATALOG
  • 验证每个INDEXED VIEW的内容
  • 验证使用FILESTREAM存放有varbinary(max)数据的文件系统目录和表的元数据之间的连接一致性
  • 验证数据库中的Service Broker数据

 

语法如下:

DBCC CHECKDB     
    [ ( database_name | database_id | 0    
        [ , NOINDEX     
        | , { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ]    
    ) ]    
    [ WITH     
        {    
            [ ALL_ERRORMSGS ]    
            [ , EXTENDED_LOGICAL_CHECKS ]     
            [ , NO_INFOMSGS ]    
            [ , TABLOCK ]    
            [ , ESTIMATEONLY ]    
            [ , { PHYSICAL_ONLY | DATA_PURITY } ]    
            [ , MAXDOP  = number_of_processors ]    
        }    
    ]    
]

 

 

REPAIR_ALLOW_DATA_LOSS 选项会让CHECKDB命令尝试修复所有检查出的错误。这些修复可能导致丢失数据:

REPAIR_ALLOW_DATA_LOSS选项是被SQL SERVER官方支持的特性,但使用该特性可能导致数据丢失或不一致。官方推荐在有备份的情况下,优先使用备份恢复数据。

微软官方总是建议用户从一个已知可用的备份中恢复数据,这是针对DBCC CHECKDB出现错误后的主流应对方法。REPAIR_ALLOW_DATA_LOSS选项仅在无任何有效备份的情况下考虑使用。对于特定的错误,可能只用使用REPAIR_ALLOW_DATA_LOSS选项修复;例如清除部分行、数据页来解决问题。对于这些被清除的数据而言,用户无法再访问它们,也不再可能恢复,用户可能也搞不清楚丢了哪些数据。因此,参考约束可能在这些清除后变得不准确,典型的情况是外键可能不再启用或维护。当使用REPAIR_ALLOW_DATA_LOSS后,用户需要自行人工去检查这些外键。

 

在做修复前,建议先对数据文件做备份。包括主要数据文件.mdf,二级数据文件.ndf和所有的日志文件.ldf,以及其他文件包括full text catalog,文件流目录,内存优化数据等。

 

在做具体修复前,建议将数据库置入EMERGENCY模式,并在该模式下对重要的表数据做抽取保存。

如何修复SQL SERVER置疑数据库

如果自己搞不定可以找诗檀软件专业SQL SERVER数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

若用户没有任何有效的备份,则唯一可行的恢复措施是将数据库置入紧急模式EMERGENCY MODE。这样让用户可以访问数据库,但是需要注意的是所需要做的恢复并没有被完成,所以数据库中可以被读取的内容可能是行级别不一致的,也可能是结构不一致的。下面使用EMERGENCY MODE修复数据库。即先后将数据库置入EMERGENCY和SINGLE_USER模式。

 

ALTER DATABASE [数据库名] SET EMERGENCY;

GO

ALTER DATABASE [数据库名]   SET SINGLE_USER;

GO

DBCC CHECKDB(N’数据库名’,REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS,ALL_ERRORMSGS;

 

Msg 5172, Level 16, State 15, Line 1

The header for file ‘C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DemoSuspect_log.LDF’ is not a valid database file header. The PageAudit property is incorrect.

File activation failure. The physical file name “C:\Program Files\Microsoft SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DemoSuspect_log.LDF” may be incorrect.

The log cannot be rebuilt because there were open transactions/users when the database was shutdown, no checkpoint occurred to the database, or the database was read-only. This error could occur if the transaction log file was manually deleted or lost due to a hardware or environment failure.

The Service Broker in database “DemoSuspect” will be disabled because the Service Broker GUID in the database (B72D1765-80C6-4C2F-8C12-5B78DAA2DA83) does not match the one in sys.databases (001AE95A-AE22-468F-93A4-C813F4A9112D).

Warning: The log for database ‘DemoSuspect’ has been rebuilt. Transactional consistency has been lost. The RESTORE chain was broken, and the server no longer has context on the previous log files, so you will need to know what they were. You should run DBCC CHECKDB to validate physical consistency. The database has been put in dbo-only mode. When you are ready to make the database available for use, you will need to reset database options and delete any extra log files.

 

可能出现如上报错。该操作会尝试首先做常规的ATTACH_REBUILD_LOG操作。当此操作失败,DBCC CHECKDB接手并尝试从被损坏的日志中尽可能做恢复操作,然后强制重建日志。后续会运行一个全库修复,检测全库中的损坏存在。

注意在上面的例子中因为SERVICE Broker GUID是有问题的。所以需要耍个花招新建一个同名的空数据库,该操作会在MASTER.SYS.DATABASES中创建对应的记录。

 

可以使用如下语句来重设GUID:

ALTER DATABASE XXX SET NEW_BROKER WITH ROLLBACK IMMEDIATE

 

SQL Server中的sp_resetstatus

如果自己搞不定可以找诗檀软件专业SQL SERVER数据库修复团队成员帮您恢复!

诗檀软件专业数据库修复团队

服务热线 : 13764045638   QQ号:47079569    邮箱:service@parnassusdata.com

 

sp_resetstatus 这个系统存储过程用以重置数据库的置疑(suspect )状态。语法是:

sp_resetstatus [ @dbname = ] ‘database’

 

sp_resetstatus用来将数据库的置疑状态位重置,其更新sys.databases中的系统字典记录。官方推荐在错误日志中的信息被充分考虑的情况下才去做这个操作。同时建议在执行sp_resetstatus后重启SQL SERVER服务实例。

一个数据库进入置疑状态的原因可能有很多;例如数据库原本能够访问的操作系统资源突然变得不可用,或者数据库MDF文件出现讹误等。

以下是一个例子: EXEC sp_resetstatus ‘AdventureWorks2012’;

在SYBASE的文档中记录了该存储过程的代码,有理由相信SQL SERVER中其代码的主体作用应当是相似的:

 

CREATE PROC sp_resetstatus @dbname varchar(30) AS
DECLARE @msg varchar(80)
IF @@trancount > 0
    BEGIN
      PRINT "Can't run sp_resetstatus from within a transaction."
      RETURN (1)
    END
IF suser_id() != 1
    BEGIN
     SELECT @msg =  "You must be the System Administrator (SA)"
     SELECT @msg = @msg + " to execute this procedure."
     PRINT @msg
     RETURN (1)
    END
IF (SELECT COUNT(*) FROM master..sysdatabases
     WHERE name = @dbname) != 1
    BEGIN
     SELECT @msg = "Database '" + @dbname + "' does not exist!"
     PRINT @msg
     RETURN (1)
    END
IF (SELECT COUNT(*) FROM master..sysdatabases
     WHERE name = @dbname AND status & 256 = 256) != 1
   BEGIN
      PRINT "sp_resetstatus may only be run on suspect databases."
      RETURN (1)
    END
BEGIN TRAN
   UPDATE master..sysdatabases SET status = status - 320
     WHERE name = @dbname
   IF @@error != 0 OR @@rowcount != 1
     ROLLBACK TRAN
   ELSE 
       BEGIN
         COMMIT TRAN
         SELECT @msg = "Database '" + @dbname + "' status reset!"
         PRINT @msg
         PRINT " " 
         PRINT "WARNING: You must reboot Adaptive Server prior to  "
         PRINT "          accessing this database!"
         PRINT " "
       END

 

 

沪ICP备14014813号-2

沪公网安备 31010802001379号