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状态恢复挂起,导致数据库无法使用,服务重启过还是不行,这个要怎么办?的主要内容,如果未能解决你的问题,请参考以下文章