sqlserver异常处理
sqlserver附加数据库错误823的解决方案
一、SQL-Server附加数据库时失败。
1、异常情况:服务器在正常运行的情况下突然断电,导致数据库文件损坏,具体表现是:数据库名后面有“(置疑)”字样。
2、异常分析:关于823错误的 SQL-SERVER 中的帮助:
================================
错误 823
严重级别 24
消息正文
在文件 "%4!" 的偏移量 %3! 处的 %2! 过程中,检测到 I/O 错误 %1!。
解释
Microsoft SQL Server 在对某设备进行读或写请求时遇到 I/O 错误。该错误通常表明磁盘问题。但是,错误日志中在错误 823 之前记录的其它核心消息应指出涉及了哪个设备。
3、解决办法:
在SQL-Server企业管理器中,新建同名数据库(这里假设为Test)后,停止数据库,把损坏的数据库文件Data.mdf和Test_log.LDF覆盖刚才新建数据库目录下的Data.mdf和Test_log.LDF,同时删除Test_log.LDF文件;启动数据库服务,发现数据库名Test后面有“置疑”字样。不要紧,打开SQL自带查询分析器,分别执行如下SQL语句:
第一、
exec sp_configure 'allow updates',1 RECONFIGURE WITH OVERRIDE /* 打开修改系统表的开关 */
第二、
update sysdatabases set status=32768 where name='数据库名' /* 设置数据库状态 */
第三、
DBCC REBUILD_LOG ('数据库名','D:\database\Test_Log.LDF') /* 重建LDF文件 */
第四、
update sysdatabases set status=0 where name='数据库名' /* 重置数据库状态 */
第五、
restore database 数据库名 WITH RECOVERY /* 恢复数据库 */
第六、
exec sp_configure 'allow updates',0 RECONFIGURE WITH OVERRIDE /* 关闭打开修改系统表的开关 */
按照此方法操作,应该能修复数据库正常访问了。如果问题依然存在,最笨的一个方法就是新建另一个数据库,把原数据库(Test)各个表的数据导出到新建数据库表中。
============================================================
补充说明:用上面的六步把数据库置疑的问题解决了,但是数据库表里还有损坏的表(inf_gdscode),把坏表导出的时候也不成功。最后在查询分析器里运行:
USE nmgbt_hcxuexipos (数据库名)
GO
DBCC CHECKTABLE ('inf_gdscode',REPAIR_ALLOW_DATA_LOSS)
GO
2. sqlserver外部组件发生异常怎么解决
异常在SQL Server的PL/SQL程序中是常见问题,通常表示在程序执行过程中出现错误。处理异常,确保程序的稳定性和错误的可控性,是开发者需要掌握的关键技能。
异常处理的流程通常包括异常的捕获和处理。捕获异常时,程序会识别出错误,并跳转到预设的异常处理程序,如果处理成功,异常不会被传播,程序继续执行。反之,如果异常未被成功处理,程序将失败,异常被传播给上层程序或调用环境。
捕获异常的语法通常包括特定的异常类型,例如:`DECLARE HANDLE EXCEPTION WHEN OTHERS THEN`。使用`BEGIN`和`END`语句块执行程序,并在`BEGIN`块中放置可能抛出异常的代码。
捕获异常的两个关键函数是`RAISE_APPLICATION_ERROR`和`EXCEPTION`。`RAISE_APPLICATION_ERROR`允许创建自定义异常,用于返回非标准错误代码和信息。`EXCEPTION`则是用于定义和处理特定异常类型。
在程序中使用`RAISE_APPLICATION_ERROR`函数时,应遵循特定的语法格式,以一种与预定义异常相同的格式返回错误代码和信息。
在处理异常时,通常在`BEGIN`块中放置可能抛出异常的代码,在`EXCEPTION`块中定义异常处理逻辑。如果异常被捕获并成功处理,程序将继续执行。如果未捕获或未成功处理异常,异常将被传播给上层程序或调用环境。
通过合理使用异常处理机制,开发者可以确保程序在遇到问题时不会崩溃,而是能够优雅地处理错误并继续运行。正确的异常处理不仅能提高程序的稳定性和可靠性,也是实现健壮软件开发的重要组成部分。
3. 执行 Transact-SQL 语句或批处理时发生了异常。 (Microsoft.SqlServer.ConnectionInfo)
估计是异常关闭了,建议恢复一下
恢复步骤:
1 停止sqlserver服务,备份msdb数据库
2 将数据库设置为单用户模式
启动sqlserver服务,将数据库设置为单用户模式
ALTER DATABASE ErrorDB SET SINGLE_USER
3 从其他机器拷贝msdb数据库过来,直接替换msdb数据库文件和日志文件
4 对数据库进行检查修复
dbcc checkdb(EIMSDb,REPAIR_ALLOW_DATA_LOSS
dbcc checkdb(EIMSDb,REPAIR_REBUILD)
5 取消单用户模式
exec sp_dboption EIMSDb, N'single', N'false'