当机器突然关闭时,MySQL v5.1.61 中继被损坏。我试图修复它,但没有奏效。
- 我如何解决它?我做错什么了吗?
据我所知,损坏的 MySQL 中继日志很容易修复:
change master to master_log_file='<Relay_Master_Log_File>',
master_log_pos=<Exec_Master_Log_Pos>;
Run Code Online (Sandbox Code Playgroud)
其中Relay_Master_Log_File和Exec_Master_Log_Pos由以下列出:
mysql> show slave status;
但是,当我这样做时change master status ...,我收到了主键违规错误。这怎么可能?上述程序是否不正确,或者例如缺少一些+1?
(现在我只是将 --master-data mysqldump 从主服务器重新导入到从服务器,这解决了问题。但是,在将来,这样做可能不合适。)
以下是有关我的特定问题的详细信息:
mysql> show slave status \G
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: the-master-host
Master_User: replication
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: mysql-bin.000021
Read_Master_Log_Pos: 33639968
Relay_Log_File: mysql-relay-bin.000271
Relay_Log_Pos: 2031587
Relay_Master_Log_File: mysql-bin.000020
Slave_IO_Running: Yes
Slave_SQL_Running: No
Replicate_Do_DB: the_database
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 1594 …Run Code Online (Sandbox Code Playgroud) 尝试删除包含无效时间戳的元组
DELETE FROM comments WHERE date > '1 Jan 9999' OR date < '1 Jan 2000' OR date_found > '1 Jan 9999' OR date_found < '1 Jan 2000';
Run Code Online (Sandbox Code Playgroud)
结束于
ERROR: attempted to delete invisible tuple
Run Code Online (Sandbox Code Playgroud)
有一个 2009 年的邮件列表讨论了完全相同的错误消息,OP 修复了它,但我没有找到关于他是如何做到的或可能导致此错误的原因的解释。
由于谷歌搜索量不足以及我对 PostgreSQL 的了解有限,我很无助。
我在 Debian 8 上运行了 PostgreSQL 9.5.5 服务器(~4TB 数据,所有默认设置,内存限制除外),当时操作系统内核崩溃了——可能是在重建 /dev/md1 时交换所在的位置。在此之前,PostgreSQL 用一个 400GB 的日志文件吃光了几乎所有的磁盘空间。操作系统再也没有启动过,磁盘检查没问题,所以我从 LiveCD 启动并将每个块设备备份到映像,以防万一。我已经成功地从 /dev/md2 重建了 / 目录,fsck 显示了一个干净的文件系统,并且我已经将 PGDATA 文件夹备份到了一个外部硬盘上。
在我格式化 md 设备并重新安装操作系统和新的 postgresql-9.5 之后,我停止了 PostgreSQL 服务器,将 PGDATA 文件夹移动并更改为 …
postgresql recovery corruption disaster-recovery postgresql-9.5
TL;DR:我在索引视图中有一个无法修复的损坏。以下是详细信息:
跑步
DBCC CHECKDB([DbName]) WITH EXTENDED_LOGICAL_CHECKS, DATA_PURITY, NO_INFOMSGS, ALL_ERRORMSGS
在我的数据库之一上产生以下错误:
消息 8907,级别 16,状态 1,第 1 行 空间索引、XML 索引或索引视图“ViewName”(对象 ID 784109934)包含不是由视图定义生成的行。这不一定表示此数据库中的数据存在完整性问题。(……)
CHECKDB 在表“ViewName”中发现 0 个分配错误和 1 个一致性错误。
repair_rebuild 是最低修复级别 (...)。
我确实理解此消息表明索引视图“ViewName”的物化数据与基础查询生成的数据不同。但是,手动验证数据不会出现任何差异:
SELECT * FROM ViewName WITH (NOEXPAND)
EXCEPT
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
SELECT ...
from T1 WITH (FORCESCAN)
join T2 on ...
EXCEPT
SELECT * FROM ViewName WITH (NOEXPAND)
Run Code Online (Sandbox Code Playgroud)
NOEXPAND用于强制在 上使用(唯一)索引ViewName。FORCESCAN用于防止索引视图匹配发生。执行计划确认这两种措施都有效。
这里没有返回任何行,这意味着两个表是相同的。(只有整数和 guid 列,排序规则不起作用)。
无法通过在视图上重新创建索引或运行DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS …
这个问题是由这篇较早的帖子提示的,我有一个数据库归档以备将来调查,该数据库在以下情况下恢复:
BACKUP 'BrokenDatabase' detected an error on page (1:123456) in file ’BrokenDatabase.mdf'.
Error: 3043, Severity: 16, State: 1.
Run Code Online (Sandbox Code Playgroud)
在链接的问题和备份中,我已准备好进行 DBCC PAGE 调查,DBCC CHECKDB 无错误通过,但显然存在损坏。
哪些类型的损坏会导致 CHECKDB 通过但 BACKUP WITH CHECKSUM 会失败?
在运行 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
帮助!我的主数据库损坏了,我什至无法使 SQL 实例联机!我有哪些选项可以让我的服务器备份?
我确实有 master 的备份,但是MSDN 页面“恢复 master 数据库”要求我以单用户模式启动实例,我做不到!
(注意:我不指定 SQL 版本的这个问题,以便作为更广泛适用的参考。在 DBA.SE 上有一些类似的问题,但没有涉及服务器无法启动的问题。)
在 SQL Server 2017 (CU3) 上,每当我在我的一个 TDE 数据库上启用备份压缩时,备份过程总是会损坏数据库中的特定页面。如果我在不压缩的情况下运行备份,它不会被损坏。以下是我为验证和重现此问题而采取的步骤:
总结一下:数据库和常规备份看起来不错,在数据库上运行 CHECKDB 并在备份上运行 VERIFYONLY 不会报告任何错误。使用压缩备份数据库似乎会导致损坏。
下面是有错误的代码示例。(注意:在 TDE 数据库中使用压缩需要 MAXTRANSFERSIZE)
-- Good, completes with no corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1a.bak' WITH CHECKSUM;
RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1a.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- Bad, I …Run Code Online (Sandbox Code Playgroud) sql-server corruption transparent-data-encryption sql-server-2017
我SqlException在调用存储过程时得到以下信息:
尝试在数据库 2 中获取逻辑页 (5:65424) 失败。它属于分配单元 7349876362857938944 不属于 4899918190390149120。
System.Data.SqlClient.SqlException发生
Message="Attempt to fetch logical page (5:65424) in database 2 failed. 它属于分配单元 7349876362857938944 不属于 4899918190390149120。Source=".Net SqlClient Data Provider"
ErrorCode=-2146232060
Class=21
LineNumber=257
Number=605
Procedure="ispDisplayCount"
Server="10.10.1.1"
State=3
这个异常是什么意思?以上问题有解决办法吗?
尽管上述错误中引用的数据库表示 tempdb,但引用消息 605 的类似错误可以使用以下答案进行修复。
消息 605,级别 21,状态 3,第 1 行
尝试获取数据库 7 中的逻辑页 (1:8687634) 失败。它属于分配单元 72057594364821504 不属于 72057594052476928。
我有一个数据库,当我运行备份命令时
BACKUP DATABASE [MyDatabase] TO
DISK = 'G:\Backup\MyDatabase_01_01_2018.bak'
WITH NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100
Run Code Online (Sandbox Code Playgroud)
我收到错误消息
消息 3043,级别 16,状态 1,第 8 行
BACKUP 'MyDatabase' 在文件 'F:\Data\MyDatabase_1.ndf' 中的页面 (1:745345) 上检测到错误。
消息 3013,级别 16,状态 1,第 8 行
BACKUP DATABASE 异常终止。
我运行了一个完整的 CHECKDB,但它回来了。我确实注意到页面验证选项已设置为 NONE(不是我做的),因此我将其更改为 CHECKSUM 并重建数据库中的所有索引以使其写入所有页面并生成校验和。在此之后备份仍然失败并且 checkdb 仍然显示干净(所以没有变化)。
DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;
Run Code Online (Sandbox Code Playgroud)
从 SQL 日志:
xxx 执行的 DBCC CHECKDB (MyDatabase) WITH all_errormsgs, no_infomsgs, data_purity 发现 0 个错误并修复了 0 个错误。已用时间:0 小时 21 分 46 秒。内部数据库快照具有分割点 LSN = 000ab776:0000112f:0001 和第一个 LSN …
我知道我可以执行 aDBCC CHECKDB并获取我的数据库的状态。
问题
谁能告诉我在哪里可以找到这些页面 ID?
corruption ×10
sql-server ×5
dbcc-checkdb ×2
postgresql ×2
dbcc ×1
maintenance ×1
mysql ×1
recovery ×1
replication ×1