数据库在进行CHECKDB时出现 SQL Server 检测到基于一致性的逻辑 I/O 错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库在进行CHECKDB时出现 SQL Server 检测到基于一致性的逻辑 I/O 错误相关的知识,希望对你有一定的参考价值。

目前发现查询九张表会出现这个错误,查了很多资料,都说CHECKDB一下就可以,可是我现在是在CHECKDB时还出现这个错误,请问有谁遇到过的吗?错误跟下面的一样

SQL Server 检测到基于一致性的逻辑 I/O 错误 校验和不正确(应为: 0xd4eae74b,但实际为: 0xd4eb674b)。在文件 'D:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\DATA\CCMS.mdf' 中、偏移量为 0x000000005be000 的位置对数据库 ID 7 中的页 (1:735) 执行 读取 期间,发生了该错误。SQL Server 错误日志或系统事件日志中的其他消息可能提供了更详细信息。这是一个威胁数据库完整性的严重错误条件,必须立即纠正。请执行完整的数据库一致性检查(DBCC CHECKDB)。此错误可以由许多因素导致;有关详细信息,请参阅 SQL Server 联机丛书。
在进行CHECKDB 时还有出现 检查已终止,收集事实数据时检测到错误,可能是tempdb空间用尽或某个表不一致,请检查前面的错误消息。

先备份数据库,在测试数中,将那9张表的数据先放到临时表中,再删除那9张表,重新建表,再从临时表导入数据,如果删除那9张表都失败,表明9的数据一致性有问题,那就只能重新建新的数据库,一个表一个表导数据.....追问

那几张表查询都查询不了,

追答

那表明那9张表已经不完整,已损坏,需要在新数据库中重建那几个表,如果有可用时的备份,就从备份恢复数据,如没有需要根据相关性,从关连表推断出可能的值....这个比较麻烦,
而且,有可能,那9张表删除都删除不了

追问

嗯。。确实那九张表连删除都删除不了。。一删除就提示SQL Server 检测到基于一致性的逻辑 I/O 错误

参考技术A 你有备份吗?有以前的备份应该能解决这个问题。 参考技术B 重装系统

避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设

【中文标题】避免 ORA-00904 - 在 java 中进行 sql 查询时出现无效标识符错误,因为该列可能会或可能不会在数据库中预设【英文标题】:Avoid ORA-00904 - invalid identifier error while doing sql query in java as the column may or may not be preset in the database 【发布时间】:2019-11-22 15:04:10 【问题描述】:

我正在尝试编写java 代码以将数据从oracle database 迁移到其他数据库。 我的用例是不同的客户端有不同版本的代码,因此数据库列可能会有所不同。更高版本的客户端有额外的列。 例如:新版本为COL99的客户端在表SAMPLE_TABLE中。

在编写迁移代码时,如果我尝试从SAMPLE_TABLE 中选择COL99,它将适用于新客户端。但是对于旧版本的客户端,代码失败了

ORA-00904 标识符无效错误。

有没有办法在sql查询或java代码中处理,如果数据库表中不存在该列,只需忽略并且不返回值而不是抛出异常。

【问题讨论】:

想必你想先在 oracle 中查询 all_tab_columns 以查看该列是否存在,而不是作为事后错误处理。 您是否维护任何用于识别应用程序版本的表格? @JoshEller 同意,这是一个可能的解决方案。但是我在迁移项目中有很多表和很多列。所以这种方法不太可行。 【参考方案1】:

您应该首先检查您当前的数据库连接是否存在COL99。 对于 Oracle,您可以使用如下查询:

SELECT
  COL.COLUMN_ID,
  COL.OWNER AS SCHEMA_NAME,
  COL.TABLE_NAME,
  COL.COLUMN_NAME
FROM
  SYS.ALL_TAB_COLUMNS COL
  INNER JOIN
  SYS.ALL_TABLES T 
  ON COL.OWNER = T.OWNER
     AND
     COL.TABLE_NAME = T.TABLE_NAME
WHERE
  COL.OWNER = 'SCHEMA'
  AND
  COL.TABLE_NAME = 'SAMPLE_TABLE'
  AND
  COL.COLUMN_NAME = 'COL99'

然后,您可以使用或不使用COL99 创建查询。

【讨论】:

这种方法是一种可能的解决方案。但是在我们的迁移项目中,我们有很多表和很多列。查询会变得很复杂,也不是很干净。 它认为,没有办法忽略查询中丢失的列。也许你事先添加缺失的列(使用适当的默认值)更方便,这样你就可以保持查询不变。

以上是关于数据库在进行CHECKDB时出现 SQL Server 检测到基于一致性的逻辑 I/O 错误的主要内容,如果未能解决你的问题,请参考以下文章

MS Sql Server 数据库或表修复(DBCC CHECKDB)

MS SqlServer DBCC CHECKDB 数据库/表修复

使用dubbo引用和发布服务时出现的异常:HTTP状态500 - 请求处理失败; 嵌套异常是com.alibaba.dubbo.rpc.RpcException:无法在服务cn.e3mall.serv

在运行SQL时出现错误,请问如何解决?

SQLSERVER2000数据库频繁被置疑,高手解决下

对 Fusion Table 进行 SQL 查询时出现 403 错误