sqlserver 2016 系统数据库msdb状态恢复挂起,导致数据库无法使用,服务重启过还是不行,这个要怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sqlserver 2016 系统数据库msdb状态恢复挂起,导致数据库无法使用,服务重启过还是不行,这个要怎么办?相关的知识,希望对你有一定的参考价值。

参考技术A

如果您的SQL Server 2016的msdb数据库恢复状态挂起,您可以尝试以下解决方案:

    用命令行或SQL Server Management Studio终止挂起的恢复:

ALTER DATABASE msdb SET SINGLE_USER WITH ROLLBACK IMMEDIATE

ALTER DATABASE msdb SET MULTI_USER

2. 尝试从备份恢复msdb数据库:

RESTORE DATABASE msdb

FROM DISK = '<backup_file_path>'

WITH REPLACE

3. 如果以上方法都不起作用,您可以考虑重建msdb数据库:

4. 停止SQL Server服务

5. 删除msdb数据库和其相关文件(包括LDF和MDF文件)

6. 启动SQL Server服务,msdb数据库将自动重建。

请注意,在进行任何操作之前,请确保您已经备份了所有重要数据!!!!

从“MSDB”系统表中读取数据

【中文标题】从“MSDB”系统表中读取数据【英文标题】:Read Data from 'MSDB' System Table 【发布时间】:2014-07-14 17:56:29 【问题描述】:

在我的应用程序中,我想从 SQL Server 2012 中的数据库“MSDB”中的系统表“sysmail_mailitems”中检索 blind_copy_recipients。我在 C# Web 应用程序中使用实体框架来查询数据库。我为sysmail_mailitems 创建了一个类以及从中读取数据的方法。但它实际上使用此名称在系统表之外创建了一个新表。我的目标不是创建一个表,而只是从现有表中读取。谁能指导我如何做到这一点?

代码:

public class sysmail_mailitem

    [Key]
    public Int32 mailitem_id  get; set; 

    public Int32 profile_id  get; set; 
    public String recipients  get; set; 
    public String copy_recipients  get; set; 
    public String blind_copy_recipients  get; set; 
    public String subject  get; set; 
    public String from_address  get; set; 
    public String reply_to  get; set; 
    public String body  get; set; 
    public String body_format  get; set; 
    public String importance  get; set; 
    public String sensitivity  get; set; 
    public String file_attachments  get; set; 
    public String attachment_encoding  get; set; 
    public String query  get; set; 
    public String execute_query_database  get; set; 
    public Boolean? attach_query_result_as_file  get; set; 
    public Boolean? query_result_header  get; set; 
    public Int32? query_result_width  get; set; 
    public String query_result_separator  get; set; 
    public Boolean? exclude_query_output  get; set; 
    public Boolean? append_query_error  get; set; 
    public DateTime send_request_date  get; set; 
    public String send_request_user  get; set; 
    public Int32? sent_account_id  get; set; 
    public Byte? sent_status  get; set; 
    public DateTime? sent_date  get; set; 
    public DateTime last_mod_date  get; set; 
    public String last_mod_user  get; set; 


public String GetMailRecipients(Int32 mailItemId)

     using(MSDBContext _db = new MSDBContext())
     
         var query = (from mailItems in _db.MailItems
                         where mailItems.mailitem_id == mailItemId
                         select mailItems).FirstOrDefault();
         try
         
                return query.blind_copy_recipients;
         
         catch (NullReferenceException)  
         return "N/A";
     
 


public class MSDBContext : DbContext

    public MSDBContext() : base("msdb")  

    public DbSet<sysmail_mailitem> MailItems  get; set; 

【问题讨论】:

【参考方案1】:

最后我想出了使用 ExecuteStoreQuery 执行原始 sql 命令以从 MSDB 检索数据。

代码:

public String GetMailRecipients(Int32 mailItemId)

   using(context _db = new context())
                                           
        var obj = ((IObjectContextAdapter)_db).ObjectContext;
        return obj.ExecuteStoreQuery<String>("SELECT blind_copy_recipients FROM msdb.dbo.sysmail_mailitems WHERE mailitem_id = 0", mailItemId).FirstOrDefault();                            
    
 

【讨论】:

【参考方案2】:

如果您想以您尝试的初始方式执行此操作,使用 DBSet 等您可以执行此操作。您的问题是,当表名是 sysmail_mailitems(带有 s)时,您调用了类 sysmail_mailitem。因此,您必须像这样在类上方注释实际的表名:

[Table("sysmail_mailitems")]
public class sysmail_mailitem

【讨论】:

以上是关于sqlserver 2016 系统数据库msdb状态恢复挂起,导致数据库无法使用,服务重启过还是不行,这个要怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

sqlserver2000 msdb 置疑

无法打开数据库MSDB

SqlServer中的系统数据库

以编程方式创建 SQL Server 代理作业

SQL Server 2005 异常

SQLServer Always On FCI 集群节点同时占用资源及可疑状态修复