在运行 PostgreSQL 数据库系统时,我如何知道我的数据库作为一个整体具有 100% 的完整性?基本上我怎么知道我的数据文件和页面是否都是 100% 好,没有损坏?
在 Microsoft SQL Server 世界中,有一个命令可以执行 DBCC CHECKDB,它会告诉您是否存在问题。如果您有兴趣了解有关命令的更多信息,请访问这里的链接。DBCC CHECKDB (Transact-SQL)
我是一个偏执的数据库完整性的人(任何以 DBA 类型角色使用数据库的人都应该是),这种类型的东西让我很难在晚上睡个好觉。这样的实用程序是必须的!在 google 上搜索发现了一些类似这样的工具的尝试,在我看来,除非它是 PostgreSQL 项目官方接受的工具,否则我不会相信它来处理如此重要的事情。
这里有一些链接,指向人们提出类似问题,但我认为没有真正明确的答案。在我看来,PostgreSQL 需要有一些工具,而 Oracle 和 Microsoft SQL Server 似乎也有这些工具。
第一个链接是我在这个主题上发现的最有趣的链接。我认为对这篇文章的评论可能总结道:“在识别数据库损坏和修复它时,Postgres 非常蹩脚。检测它的唯一方法是通过转储数据库或从数据库中的每个表中选择 * .”
我相信 9.3 可能有一些损坏检查功能。如果选择,似乎有希望对页面文件进行总和检查。因此,如果您考虑使用 ZFS 和/或带有页面校验和的未来版本的 Postgres,事情看起来会很光明。 https://commitfest.postgresql.org/action/patch_view?id=759
更新:2012 年 1 月 14 日 - 似乎使用基于 ZFS 的文件系统可以通过对每个数据块进行校验和来检测损坏。我将不得不进一步研究这一点,看看这是否是一种解决方法,可以让人们在知道他们的数据库数据不会悄悄损坏的情况下晚上睡个好觉。
更新:2012 年 1 月 17 日 - 如何查找 ZFS 损坏的文件。http://docs.oracle.com/cd/E18752_01/html/819-5461/gbbwl.html#gbcuz
更新:14-APR-2014 9.3 确实获得了数据校验和。https://wiki.postgresql.org/wiki/What's_new_in_PostgreSQL_9.3
我的 Oracle 数据库中有一个表,其中
select pkcol, count(*) from myTable group by pkcol having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)
产量
PKCOL COUNT(*)
------- ----------
1 2
2 2
Run Code Online (Sandbox Code Playgroud)
试图删除重复的行
delete myTable where pkcol = 1;
Run Code Online (Sandbox Code Playgroud)
产量:
ORA-01502: 索引“MYTABLE.PK_MT”或此类索引的分区处于可用状态。
我正在使用 Oracle.DataAccess.Client.OracleBulkCopy 来填充表格。
据我了解,必须检查Oracle PRIMARY KEY 约束的文档。
显然它们没有被检查,正如我通过连续两次执行相同的批量复制而发现的,这些批量复制以所有行中的重复结束。
现在我只在删除所有行后才使用它,并且我正在使用一个具有类似主键的表作为源。因此,我预计不会有任何问题。
但是深深嵌入到我的 MS Build 脚本中,我最终在 2210 行中只有 2 个重复。
我想首先忽略主键是一个明显的错误。不允许批量复制忽略主键约束。
编辑:
同时我发现,在调用bulkcopy之前,通常由某个脚本插入的2个冲突行。问题归结为我的已知问题,bulkcopy 不会在这里检查主键。