AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题

问题[corruption](dba)

Martin Hope
Dr Xorile
Asked: 2020-09-06 09:00:07 +0800 CST

服务器上的后端不断进入不一致的状态

  • 0

我建立了一个Access数据库。它最初是为 6 人准备的,但我看到它最多 20 人,所以这可能是问题所在。无论如何,后端一天会出现几次不一致的状态。通常可以通过打开后端来解决这个问题,它提供恢复它并且通常这样做。

回答评论中的一个问题:发生的情况是前端不再能够读取后端中的任何表,因此引发错误。

当我打开后端时,状态如下:

MS 访问错误

Microsoft Access 检测到此数据库处于不一致状态,并将尝试恢复该数据库。在此过程中,将制作数据库的备份副本,并将所有恢复的对象放入新数据库中。然后 Access 将打开新数据库。未成功恢复的对象名称将记录在“恢复错误”表中。

唯一的选择是按“确定”。通常,这可以在原地完成,但是当我在 VPN 上查看文件时,有时会发现它旋转了一会儿。在这种情况下,我可以将不一致的文件复制到我的硬盘驱动器,打开它,按 OK,然后让它完成它的工作。它通常只需要几秒钟。那时它说:

恢复 MS 访问权限

Microsoft Access 已恢复此数据库。检查数据库以确认没有丢失的数据库对象。

到目前为止,除了一次我不得不去一个稍旧的备份之外,这已经成功了。

数据库不是特别复杂(我不认为),但它确实有一些 VBA。

数据库的基本思想是我们正在跟踪需要通过一组流程但被分解的批次。所以我们可能会收到 1000 个项目,然后让其中 300 个进入预筛选,然后再有 100 个,依此类推,经过大约 8 个步骤。

我这样做的方式(我很乐意改变 - 我只是不知道要改变什么)是有一个小的提交表,它跟踪进入的批次,以及一个更大的表(称为原因无关紧要的预购),它跟踪订单项。

预购表有相当多的字段(大约 75 个)。但对此重要的是数量字段和状态字段。状态字段在整个过程中跟踪项目(因此从步骤 1 = 接收到 8 = 发货或其他)。数量跟踪此批次中有多少此特定项目以及处于此状态的其他属性。

然后,这些步骤中的每一个都有表单,后面有非常相似的 VBA。其中一个字段基本上是“移动到下一步的数量”(这是预购表中最初默认为 0 的字段之一)。用户填写此数量(可能还有一些附加信息)并按下按钮来处理该步骤。

VBA:

  1. 为预购表打开一个记录集 (rs),其中状态为 1(比如说),并且要进行下一步的数量大于 0。
  2. 它还打开预排序表 (rs2) 的 appendonly 记录集。
  3. 然后它遍历 rs 中的记录,向下调整数量,并附加一个新的记录副本,其中包含新的数量和更新的状态。

以下是其中一个屏幕的示例。其他的也是类似的,尽管有一些细微的差别可能很重要,也可能不重要。

Private Sub btnProcess_Click()
    DoCmd.Hourglass True
    Dim db As Database
    Dim rs As DAO.Recordset
    Dim rs2 As DAO.Recordset
    Set db = CurrentDb
    Set rs = db.OpenRecordset("SELECT * FROM tblPreorder " & _
                            "WHERE (((tblPreorder.StatusID)=1) AND ((tblPreorder.PSQuantity)>0));", dbOpenDynaset, dbFailOnError)
    If rs.EOF Then
        MsgBox "No records found for processing"
        rs.Close
        DoCmd.Hourglass False
        Exit Sub
    End If
    Set rs2 = db.OpenRecordset("tblPreorder", dbOpenDynaset, dbAppendOnly)
    rs.MoveFirst
    Do Until rs.EOF
        myQuantity = rs("Quantity").Value
        PSQuantity = rs("PSQuantity").Value
        rs2.AddNew
        For Each fld In rs.Fields
            SFld = fld.Name 'to catch special fields
            Select Case SFld
                'special cases
                Case "ID":  'do nothing
                Case "Quantity":
                    rs.Edit
                    rs(SFld).Value = myQuantity - PSQuantity
                    rs.Update
                    rs2(SFld).Value = PSQuantity
                Case "Comment":
                    If Len(Trim(rs("PSComment")) > 0) Then
                        rs2(SFld).Value = Trim(rs("Comment")) & vbCrLf & Trim(rs("PSComment"))
                    Else
                        rs2(SFld).Value = rs(SFld)
                    End If
                Case "StatusID":
                    rs2(SFld).Value = 2 'Changes the status from 1 to 2
                Case "DateChanged":
                    rs2(SFld).Value = Now()
                Case "EmployeeID":
                    rs2(SFld).Value = UserID()
                Case "Location":
                    If rs("PSLocation") <> "" Then
                        rs2(SFld).Value = rs("PSLocation")
                    End If
                Case "PSDate":
                    rs2(SFld).Value = Now()
                Case "PSEmployeeID":
                    rs2(SFld).Value = UserID()
                Case "PSQuantity":
                    rs.Edit
                    rs(SFld) = 0
                    rs.Update
                    rs2(SFld) = 0
                Case "ReleasedFiles": 'do nothing
                Case Else:
                    rs2(SFld).Value = fld.Value
            End Select
        Next fld
        rs2.Update
        rs.MoveNext
    Loop
    rs.Close
    rs2.Close
    c = Me.CurrentRecord
    Me.Requery
On Error Resume Next:
    DoCmd.GoToRecord acDataForm, Me.Name, acGoTo, c
    MsgBox "Items moved to BNC Request"
    DoCmd.Hourglass False
End Sub

我的问题:

  1. 当然,如果您发现任何明显错误的地方,请告诉我。当它只是我测试它时,它就像一个魅力。我从来没有设法复制这个问题,但我可以看到它正在生产版本中发生。
  2. 我已经遵循了几个网站上关于避免这种情况的建议(例如https://www.techrepublic.com/article/get-it-done-top-10-ways-to-prevent-access-database-corruption/)。我基本上是在修补和尝试,因为我根本不知道问题是什么。例如,我在上面的代码中从记录集切换到 DAO.recordset。好像没什么区别,所以我可能会回去。每个人都在使用 Access 365,而后端是 Access 365,因此使用 Access 特定的记录集似乎很有意义。我关闭所有记录集(rs.close);我编译VBA;我已将前端保存为acde;所有用户在自己的电脑上使用acde;所有用户都使用有线连接;我有版本控制,所以每个人都在使用最新的前端。
  3. 我想主要问题是:我该如何诊断?我可以很容易地想象放入一个新表来跟踪谁在按下进程按钮以及何时以及哪一个。我可能会这样做,看看在导致腐败的过程中会发生什么。但是,您对跟踪什么有什么建议,是否有任何其他技巧和提示可以解决这个问题?

代码特定问题:

  1. Recordset 或 DAO.Recordset 或其他什么东西?
  2. dbFailOnError 或 dbSeeChanges 或其他什么东西?
  3. rs.Edit ... rs.Update 在我循环时更新的几个字段(当前代码)?还是在循环的任一侧都有一个 rs.Edit ... rs.Update?
  4. 我应该手动保留或阻止人们同时运行类似的代码吗?这样做有点冒犯了我,因为我有点想象制作 MS Access 的人在这种事情上会比我做得更好。但我可能会在某个地方设置一个标志,让人们等待轮到他们。我仍然会担心比赛条件。

更广泛的数据库问题:

  1. 是否需要调整其他秘密设置以尽量减少此问题?每个人都在使用 MS Access 365。命名自动更正选项、过滤器查找选项、缓存、数据类型支持选项。我真的不知道这些做什么,我怀疑到处都有陷阱!我有一个类似的数据库,多年来一直没有问题,所以我在这里陷入了一种错误的安全感。
  2. 我的结构完全错误吗?我可以做一大堆工作——如果能很好地了解它会解决问题,那就太好了!
ms-access corruption
  • 1 个回答
  • 880 Views
Martin Hope
Danielle Paquette-Harvey
Asked: 2019-11-16 10:05:10 +0800 CST

可疑页面中的条目但 checkdb 未显示错误

  • 1

我正在使用 Microsoft SQL Server 2016 (SP2-GDR) (KB4505220) - 13.0.5101.9 (X64) Jun 15 2019 23:15:58 版权所有 (c) Microsoft Corporation Standard Edition (64-bit) o​​n Windows Server 2012 R2 Standard 6.3 (构建 9600:)

昨天,我在同一数据库的“suspect_pages”中有两个条目。事件类型 1 和类型 2 之一

1 = 823 错误导致可疑页面(例如磁盘错误)或 824 错误而不是错误校验和或损坏页面(例如错误页面 ID)。

2 = 校验和错误。

database_id file_id page_id eventtype   error_count last_update_date
8           1       1482057 1           1           2019-11-14 14:40
8           1       1482057 2           1           2019-11-14 14:40

我找到了相关的对象,它们都指向数据库上的同一个表。

DBCC TRACEON (3604); DBCC PAGE (8, 1, 14823057, 0); DBCC TRACEOFF (3604);

我在损坏之前有一个有效的备份并且无法承受停机时间,所以我对损坏的数据库进行了备份,并以新名称恢复了我的备份。我删除了损坏的表,然后从有效备份中重新创建了它。

今天,我恢复了昨天在测试服务器上进行的损坏的数据库备份,当我运行完整的 checkdb 时,它没有检测到损坏。

DBCC CheckDB() WITH No_INFOMSGS, ALL_ERRORMSGS

我从损坏的数据库中获取的备份(根据怀疑页面)怎么可能没有任何问题?可疑页面中的那些条目会是误报吗?

数据库兼容级别为 130 (SQL 2016) 我们的 SQL Server 在 Windows Server 2012 上运行。

corruption sql-server-2016
  • 1 个回答
  • 344 Views
Martin Hope
Gherman
Asked: 2019-10-17 07:46:27 +0800 CST

如果进程因某种原因终止,重新启动 PostgreSQL 是否安全?

  • 1

我正在编写一个docker-compose带有 PostgreSQL 的容器的配置。docker-compose有一个名为restart. 如果我启用它,那么只要 Postgres 进程停止,它就会立即重新启动 Postgres。然而,它(可能)如何重新启动并不相关。

我知道在 MySQL 中,在数据库停止后立即启动数据库是不安全的,因为 MyISAM 表可能会损坏。必须先使用不相关的命令行工具手动修复 MyISAM 表,然后启动 db。

所以我想知道如果出现问题,重启 PostgreSQL 通常是否安全。或者,也许我们应该先备份、修复、读取日志,然后再尝试重新启动它。

例如,一个相关的情况是停电。之后我该怎么办?

postgresql corruption
  • 1 个回答
  • 815 Views
Martin Hope
renzu
Asked: 2019-08-16 01:15:49 +0800 CST

将大型 blob 数据从一个表插入到同一数据库中的另一个表时,是否存在数据损坏/丢失的可能性?

  • -1

我正在尝试确定在同一模式中将大数据从一个表移动到另一个表时是否可能发生数据损坏/丢失。

我是编程新手,数据库不是我的强项。无论如何,我已经尝试了一些 sql 查询来传输数据并检查差异,但我想听听数据库开发专家的确认。

我用了

INSERT INTO table_name2
SELECT *
FROM table_name1;

查询将数据从一个表传输到另一个表。

oracle corruption
  • 1 个回答
  • 143 Views
Martin Hope
Element Zero
Asked: 2018-07-03 16:06:53 +0800 CST

备份检测到损坏,但 CHECKDB 没有

  • 12

我有一个数据库,当我运行备份命令时

BACKUP DATABASE [MyDatabase] TO     
DISK =  'G:\Backup\MyDatabase_01_01_2018.bak'   
WITH    NOFORMAT, NOSKIP, COMPRESSION, INIT, BUFFERCOUNT = 100

我收到错误消息

消息 3043,级别 16,状态 1,第 8 行
备份“MyDatabase”在文件“F:\Data\MyDatabase_1.ndf”的页面 (1:745345) 上检测到错误。
消息 3013,级别 16,状态 1,第 8 行
备份数据库异常终止。

我运行了一个完整的 CHECKDB,但它返回干净。我确实注意到页面验证选项已设置为 NONE(不是我做的),所以我将其更改为 CHECKSUM 并重建数据库中的所有索引以使其写入所有页面并生成校验和。在此之后,备份仍然失败并且 checkdb 仍然显示干净(所以没有变化)。

DBCC CHECKDB('MyDatabase') WITH NO_INFOMSGS, ALL_ERRORMSGS,
DATA_PURITY, EXTENDED_LOGICAL_CHECKS;

从 SQL 日志:

xxx 执行的 DBCC CHECKDB (MyDatabase) WITH all_errormsgs, no_infomsgs, data_purity 发现 0 个错误并修复 0 个错误。经过时间:0 小时 21 分 46 秒。内部数据库快照具有拆分点 LSN = 000ab776:0000112f:0001 和第一个 LSN = 000ab776:0000112d:0001。

我运行了 DBCC PAGE,但它出错(甚至似乎一开始都没有返回正确的页面)。我可以使用打印选项 2 运行它并返回,但老实说我不知道​​我在那里寻找什么。

DBCC PAGE ('MyDatabase',1,745345,3)
页:(3:513793)

缓冲:


BUF @0x00000003811F8280

bpage = 0x00000000F2D70000 bhash = 0x0000000000000000 bpageno = (1:745345)
bdbid = 5 breferences = 0 bcputicks = 0
bsampleCount = 0 bUse1 = 44283 bstat = 0x809
博客 = 0x5adb215a bnext = 0x0000000000000000          

页眉:


页面@0x00000000F2D70000

m_pageId = (3:513793) m_headerVersion = 1 m_type = 2
m_typeFlagBits = 0x4 m_level = 0 m_flagBits = 0x0
m_objId (AllocUnitId.idObj) = 1075937538 m_indexId (AllocUnitId.idInd) = 2
元数据:AllocUnitId = 633462595911680 元数据:PartitionId = 0
元数据:IndexId = -1 元数据:ObjectId = 0 m_prevPage = (3:513795)
m_nextPage = (3:513820) pminlen = 17 m_slotCnt = 426
m_freeCnt = 2 m_freeData = 7338 m_reservedCnt = 0
m_lsn = (608841:643611:411) m_xactReserved = 0 m_xdesId = (0:0)
m_ghostRecCnt = 0 m_tornBits = 0 DB 片段 ID = 1

分配状态

GAM (1:511232) = 已分配 SGAM (1:511233) = 未分配     
PFS (1:744096) = 0x40 已分配 0_PCT_FULL DIFF (1:511238) = 未更改
ML (1:511239) = NOT MIN_LOGGED      

消息 2514,级别 16,状态 8,第 20 行
发生 DBCC PAGE 错误:页面元数据无效 - 无法转储样式 3。

有什么想法我可以尝试下一步吗?服务器版本是

select @@version
Microsoft SQL Server 2014 (SP2-CU11) (KB4077063) - 12.0.5579.0 (X64)
    2018 年 2 月 21 日 12:19:47
    版权所有 (c) 微软公司
    Windows NT 6.3 (Build 9600: ) (Hypervisor) 上的开发人员版(64 位)

DB 的兼容级别为 100 (SQL 2008)。

sql-server corruption
  • 1 个回答
  • 1884 Views
Martin Hope
Milla Well
Asked: 2018-04-17 06:29:36 +0800 CST

磁盘空间不足后无法重新启动 Postgres

  • 3

当 postgres 运行时,我的 HD 空间不足。我不得不杀死 postgres 并释放一些空间。现在我无法使用以下错误消息重新启动 postgres:

LOG:  listening on IPv4 address "0.0.0.0", port 5434
LOG:  listening on IPv6 address "::", port 5434
LOG:  listening on Unix socket "/tmp/.s.PGSQL.5434"
LOG:  database system was interrupted; last known up at 2018-04-16 05:20:46 EDT
PANIC:  could not read file "pg_logical/replorigin_checkpoint": Success
LOG:  startup process (PID 97490) was terminated by signal 6: Aborted
LOG:  aborting startup due to startup process failure
LOG:  database system is shut down

里面有data/pg_logical一个同名的文件,replorigin_checkpoint但它是空的。

我已经按照此处的建议出于备份原因复制了数据目录,但我实际上并不确定下一步该做什么。amcheck看起来,它只适用于正在运行的 postgres。

./postgres -V postgres (PostgreSQL) 11devel

Ubuntu 16.04.4 LTS

也许值得注意的是,文件系统本身就安装在该机器上(nfs)

问题
1. 里面应该有replorigin_checkpoint什么?
2. 是否有可能从较早的检查点重新启动?
3. 有哪些类型的损坏修复(不仅是损坏检测)

postgresql corruption
  • 3 个回答
  • 2201 Views
Martin Hope
Eric Cobb
Asked: 2018-01-11 07:32:07 +0800 CST

备份压缩导致 SQL 2017 TDE 数据库损坏

  • 13

在 SQL Server 2017 (CU3) 上,每当我在我的一个 TDE 数据库上启用备份压缩时,备份过程总是会损坏数据库中的特定页面。如果我在没有压缩的情况下运行备份,它不会损坏。以下是我为验证和重现此问题而采取的步骤:

  1. 在数据库“TDE_DB1”上运行 DBCC CheckDB;一切都很好,没有错误;
  2. 不压缩成功备份数据库;RESTORE VERIFYONLY 表示一切正常;
  3. 成功将数据库恢复为“TDE_DB2”;一切都很好,DBCC CheckDB 显示没有错误;
  4. 使用压缩成功备份“TDE_DB1”数据库;RESTORE VERIFYONLY 错误,提示“检测到备份集损坏”;
  5. 尝试将数据库恢复为“TDE_DB2”;错误,说“RESTORE 在数据库中的页面 (1:92454) 上检测到错误”
  6. 重复步骤1-3;一切都很好;
  7. 删除“TDE_DB1”和“TDE_DB2”;从备份中恢复“TDE_DB1”;一切都很好;
  8. 重复步骤1-5;得到相同的结果;

总结一下:数据库和常规备份看起来很好,在数据库上运行 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 haz corruption;
BACKUP DATABASE [TDE_DB1] TO DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM, COMPRESSION, MAXTRANSFERSIZE = 131072;
RESTORE VERIFYONLY FROM DISK = N'E:\MSSQL\Backup\TDE_DB1b.bak' WITH CHECKSUM;
-- ERROR
--Msg 3189, Level 16, State 1, Line 1
--Damage to the backup set was detected.
--Msg 3013, Level 16, State 1, Line 1
--VERIFY DATABASE is terminating abnormally.

RESTORE DATABASE [TDE_DB2]
FROM DISK = 'E:\MSSQL\Backup\TDE_DB1b.bak'
WITH MOVE 'DataFileName' to 'E:\MSSQL\Data\TDE_DB2.mdf'
,MOVE 'LogFileName' to 'F:\MSSQL\Log\TDE_DB2_log.ldf';
-- ERROR
--Msg 3183, Level 16, State 1, Line 7
--RESTORE detected an error on page (1:92454) in database "TDE_DB2" as read from the backup set.
--Msg 3013, Level 16, State 1, Line 7
--RESTORE DATABASE is terminating abnormally.

然后我尝试检查报告为有错误的页面(它始终是同一页面。),但 DBCC PAGE 报告 ObjectId 为 0。 根据 Paul Randal 的这篇文章,这意味着没有找到元数据,并且原因之一可能是页面本身已损坏,并且使用了不正确的值来尝试查找元数据。他的建议是运行 CHECKDB,但我不能这样做,因为损坏的备份无法恢复。

我尝试了这个 SO Post(将 INIT 和 FORMAT 添加到 BACKUP 命令)中的建议来重置元数据,但这似乎没有改变任何东西,我仍然在压缩备份上损坏。

这只发生在我的一个 TDE 数据库中。我在同一台服务器上还有 4 个其他 TDE 数据库,它们没有这个问题。这告诉我这个特定数据库可能存在潜在问题。我意识到简单的解决方案就是不使用压缩,但我觉得这实际上可能是对即将出现的更大问题的早期警告。

有没有人以前见过这个,或者知道为什么压缩会损坏该页面?在这一点上,我有点不知道下一步该怎么做。我考虑过从较早的备份中恢复页面,但我认为这无关紧要,因为常规数据库中的页面看起来很好。

更新 1: 以下是 DBCC PAGE 的结果,选项为 0:

DBCC 执行完成。如果 DBCC 打印出错误消息,请联系您的系统管理员。

页:(1:92454)

缓冲:

BUF @0x000002187AE55640

bpage = 0x000002184865e000 bhash = 0x000000000000000000
bpageno =(1:92454)bdbid = 8 breferences = 0 bcputicks = 0 bcputicks = 563 bsamplecount = 1 buse1 = 1
buse1 = 51429 bstat = 51429 bstat = 0x809blet000000000000
00000000000000000000000000000000000000000000个

页眉:

页面@0x000002184865E000

m_pageId = (1:92454) m_headerVersion = 111
m_type = 189 m_typeFlagBits = 0x2d m_level = 197
m_flagBits = 0x525e m_objId (AllocUnitId.idObj) = 788815194
m_indexId (AllocUnitId.idInd) = 515 Metadata: AllocUnitId = 145011308798541824 Metadata: PartitionId = 0 Metadata: IndexId = -1 Metadata: ObjectId = 0 m_prevPage = (32842:1881351155) m_nextPage = (13086:-560562340)
pminlen = 36067 m_slotCnt = 8149 m_freeCnt = 51871 m_freeData = 7295 m_reservedCnt = 4810 m_lsn = (742012401:720884976:30191) m_xactReserved = 14755
m_xdesId = (12811:1559482793) m_ghostRecCnt = 12339
m_tornBits = -1381699202 数据库片段 ID = 1

分配状态

GAM (1:2) = 已分配 SGAM (1:3) =
未分配 PFS (1:88968) = 0x0 0_PCT_FULL DIFF (1:6) = 未更改
ML (1:7) = NOT MIN_LOGGED

如果我尝试使用其他选项运行 DBCC PAGE,我会收到以下错误:

带有选项 1 的 DBCC PAGE:消息 0,级别 11,状态 0,第 0 行当前命令发生严重错误。结果,如果有的话,应该被丢弃。

带选项 3 的 DBCC PAGE:消息 2514,级别 16,状态 5,第 3 行 发生 DBCC PAGE 错误:页面类型无效 - 转储样式 3 不可能。

更新 2: 以下是 sys.dm_db_database_page_allocations DMO 的一些结果:

object_id = 75 index_id = 1 rowset_id = 281474981625856 allocation_unit_id = 281474981625856
allocation_unit_type = 1 allocation_unit_type_desc = IN_ROW_DATA extent_file_id = 1 extent_page_id = 92448
allocated_pa​​ge_iam_file_id = 1 allocated_pa​​ge_iam_page_id = 104
allocated_pa​​ge_file_id = 1 allocated_pa​​ge_page_id = 92454
is_allocated = 0 is_iam_page = 0 is_mixed_pa​​ge_allocation = 0

sql-server corruption
  • 1 个回答
  • 896 Views
Martin Hope
Vilx-
Asked: 2017-09-13 05:09:07 +0800 CST

在共享文件夹上使用数据目录在 virtualbox 中运行 MySQL 有时会导致数据损坏

  • 3

我正在尝试将我们的开发环境转移到一个 vagrant box(使用 Oracle virtualbox 的虚拟机)上。目前我被困在一个问题上:

环境需要一个MySQL服务器和一些数据库。我已经设置了所有用于安装 MySQL、创建和填充数据库等的脚本。这很有效。

由于开发人员可能会设置更多自己的数据,所以我的想法是将 MySQL 数据文件夹放在共享的 virtualbox 文件夹中。这样,当 vagrant 机器被销毁/重新创建时,数据文件夹仍然存在并且可以重复使用而不会丢失数据。

但是有时(但不总是,我不知道是什么触发了它)当我简单地暂停然后恢复虚拟机时,MySQL 开始抱怨它的很多表(但不是全部)已损坏。修复表格会导致其中的所有数据丢失。显然这是不可接受的。

有谁知道为什么会发生这种情况以及如何预防?

一些可能的线索或转移注意力 - 因为我读到 virtualbox 的共享文件夹很慢,所以我将 InnoDB 缓冲池大小增加到 1GB,以便它有很多缓存空间。我们确实以大约 50/50 的比例使用 InnoDB 和 MyISAM。我还没有检查失败的表是否都属于同一个引擎——下次崩溃时我会注意它。

更新

哈,我设法当场抓住了它!这实际上是...悬念...InnoDB 和 MyISAM。

从 MyISAM 表中选择会给出错误

表 'xxx' 被标记为崩溃,应该修复

尝试运行mysqlcheck -A -a(分析所有表)实际上会使 MySQL 崩溃。日志文件讲述了这个故事(为清楚起见进行了编辑):

[Warning] InnoDB: Retry attempts for writing partial data failed.
[ERROR] InnoDB: Write to file ./ib_logfile0failed at offset 29885952, 1024 bytes should have been written, only 0 were written. Operating system error number 71. Check that your OS and file system support files of this size. Check also that the disk is not full or a disk quota exceeded.
[ERROR] InnoDB: Error number 71 means 'Protocol error'
[ERROR] mysqld got signal 6 
Query (0x7fbc12501b50): ANALYZE TABLE `yyy`

然后,片刻之后,systemctl 重新启动服务,一切再次完美运行。

我有根据的猜测是,暂停虚拟机会释放 virtualbox 对打开文件的锁定,并且当 virtualbox 再次启动时,它不会重新获取它们。所以从 MySQL 的角度来看,它保持文件打开,但 virtualbox 失去了控制,所以当 MySQL 再次尝试访问该文件时,它会出错。

mysql corruption
  • 2 个回答
  • 1265 Views
Martin Hope
BradC
Asked: 2017-02-15 08:25:58 +0800 CST

主数据库已损坏,实例无法启动 - 我的选择是什么?

  • 14

帮助!我的主数据库已损坏,我什至无法使 SQL 实例联机!我有哪些选择可以让我的服务器备份?

我确实有master的备份,但是MSDN页面“Restoring master Database”要求我以单用户模式启动实例,我做不到!

(注意:我将这个问题未指定 SQL 版本,以便成为更广泛适用的参考。DBA.SE 上有一些类似的问题,但没有涉及服务器无法启动的问题。)

sql-server corruption
  • 3 个回答
  • 42527 Views
Martin Hope
user4535727
Asked: 2016-09-21 04:33:42 +0800 CST

修复损坏的块后,视图“v$database_block_corruption”是否可以刷新?

  • 0

我有一个包含多个损坏数据块的表,我使用驻留在“ DBMS_REPAIR”中的存储过程将数据块标记为损坏数据块,以便我可以继续查询该表。执行存储过程后,一切正常,我使用rman命令检查损坏:

validate datafile number

并且输出仍然报告损坏,没有任何变化v$database_block_corruption,所以怎么v$database_block_corruption刷新,我是否必须通过这样的语句重建表:

create table TABLE_BAK as select * from TABLE_CORRUPTED; 
drop table TABLE_CORRUPTED;
RENAME table TABLE_BAK to TABLE_CORRUPTED;

顺便说一句:我没有任何备份来恢复数据块。

oracle corruption
  • 1 个回答
  • 1320 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve