我最近了解了像 Cassandra 这样的键值存储环境中的预写日志和故障恢复,并有一些后续问题:
- WAL 是否被持久化到更小的快照中,以便我们只需要从最新的快照而不是整个提交历史中恢复?保留这些快照并从中恢复的高级机制是什么?
- 为了性能写入磁盘时,日志会被批处理吗?这是否有永久丢失数据的风险?
- 当机器在从 WAL 恢复期间出现故障时会发生什么?我们最终会在数据库中得到部分结果吗?下一次数据库启动时,我们如何从该状态恢复?
我最近了解了像 Cassandra 这样的键值存储环境中的预写日志和故障恢复,并有一些后续问题:
我在 Windows Server 上运行了一些处于连续恢复模式的 Postgresql 10 实例。偶尔他们只是停止恢复而没有给出任何错误,就像在这个示例日志文件中一样(在 CSV 格式中,为了清楚起见,我删除了一些字段):
2022-08-23 19:42:02.391,"restored log file ""000000010000029F0000001A"" from archive"
2022-08-23 19:42:07.638,"restored log file ""000000010000029F0000001B"" from archive"
2022-08-23 19:42:13.276,"restored log file ""000000010000029F0000001C"" from archive"
2022-08-23 19:42:18.464,"restored log file ""000000010000029F0000001D"" from archive"
2022-08-23 19:42:18.699,"redo done at 29F/1CFFF7F8"
2022-08-23 19:42:18.708,"last completed transaction was at log time 2022-07-20 12:49:38.247406-03"
2022-08-23 19:42:24.304,"restored log file ""000000010000029F0000001C"" from archive"
2022-08-23 19:42:48.625,"selected new timeline ID: 2"
2022-08-23 19:43:13.718,"archive recovery complete"
2022-08-23 19:43:27.746,"database system is ready to accept connections"
即使归档目录中存在序列中要恢复的下一个 wal 文件(000000010000029F0000001D,000000010000029F0000001E),也会发生这种情况。我正在使用的恢复命令是这样的:
restore_command = '"C:/program files/postgresql/10/bin/pg_standby.exe" -s 2 D:/archive/127 %f %p %r 2>>D:/archive/127/pg_standby.log'
我的问题是,有什么方法可以找出导致实例停止恢复的原因吗?
补偿日志的重做信息对应于日志条目的撤消信息,这使得在撤消阶段必须创建它们。
在我看来,CLR 重做信息与触发它们的日志的撤消信息相同。
但是不应该是他们有REDO信息以便在中断恢复过程的情况下取消执行的UNDO操作吗?
这是一个例子:
让 T2 成为失败交易:
<#55, T2, P3, J=J+9, J = J-9, #53>
J=J+9 是重做操作,J = J-9 是撤消操作。
现在,在重做阶段附加到日志文件的 CLR 将是:
<#56, T2, J=J-9,__, #53>
J=J-9 是原始日志条目的撤消操作,作为 CLR 中的重做信息。如果恢复中断,日志条目#56 将在重做阶段执行。
CLR 的目的是确保重新启动恢复过程并再次运行它总是会导致相同的结果。在重新运行的重做阶段运行 J=J-9 操作如何确保这一点?
有人可以向我解释一下吗?
与上一个问题相关,我正在尝试ib*
从崩溃的服务器中的现有文件中恢复一些数据。数据库版本是5.1.69,太老了。回应之一是安装 MySQL 5.5,因为它应该仍然能够导入 5.1,但即使这样在当前系统上也太旧了,而且只会遇到更深层次的兼容性问题。
同一问题中的“NBK”在评论中建议使用带有旧版本 MySQL 的 docker 文件。我决定尝试这种方法。我能够安装 docker 并拉取vsamov/mysql-5.1.73
图像,但我现在被困在如何将ib*
文件放入 docker 容器中。
我想我需要运行映像以使其具有容器 ID,但如果它正在运行,则ib*
文件被锁定,所以我不确定如何继续。如果有人有这方面的经验,或者可以提供参考,将不胜感激。
在 Microsoft SQL Server 中,ALTER DATABASE CURRENT SET RECOVERY SIMPLE WITH NO_WAIT;
会将数据库的恢复模式设置为简单,以便可以重复使用事务日志文件空间。
在 Postgres 中,wal_level
可用于此目的。
wal_level
的?minimal
RECOVERY SIMPLE
wal_level
在 Postgres 命令中设置?- 到目前为止,谷歌搜索告诉我这wal_level
是在配置文件中设置的。wal_level
为minimal
数据库?如果是,如何?谢谢你。
出于学习目的,我在测试环境中模拟了模型数据库的损坏。在阅读有关它的其他博客和文章时,我坚持这个问题,使用未记录的 -T3608 和 -f 标志启动 SQL Server 服务有什么区别?
当我尝试使用 -f 启动服务时,收到错误消息并且服务没有启动。但是,在-T3608的情况下,它开始顺利。对于 -T3608 标志,我读到,-T3608 启动所有数据库而不执行恢复,而 -f 以最少的配置启动实例。什么是最小配置,我找不到有关它的信息。
我目前遇到一个问题,SQL Server 数据库每天早上都处于“恢复挂起”状态。没有人启动数据库恢复,服务器自己决定这样做。
恢复过程卡住,SQL Server 停止工作,因为达到了内存限制。
暂时,我可以通过重新启动MSSQLSERVER
进程然后使数据库脱机并重新联机来解决它。但是,由于这种情况现在似乎每天都在发生,因此这是一种不可接受的解决方法。
我很想知道:
任何帮助或提示将不胜感激。
更新:数据库在 中recovery pending
,而不是在restore pending
. SSMS 以德语安装,并没有显示英语状态。
我们目前有一个备份已设置为简单的数据库,每天晚上都在备份(我们有过去 7 天的备份),是否可以找到在六月删除的记录?
数据库功能齐全,因此没有损坏或任何东西,我们只想看看我们是否可以在当前日志文件中找到已删除的记录。我使用了 apexsql 日志,但这表明什么都没有,假设因为在简单模式下完成备份时,它几乎会丢弃日志。
另一个问题是,假设我希望将来能够获取已删除的记录,我应该将我的备份设置为“完整”,这是否足够好,还是我还需要进行批量日志备份?
我想有没有一种简单的方法可以解释什么模式意味着什么以及我得到什么类型的恢复。ms 文章https://learn.microsoft.com/en-us/sql/relational-databases/backup-restore/recovery-models-sql-server?view=sql-server-2017谈到了这一点,但不清楚对我来说,当需要获取特定的已删除/更改记录时,在不同情况下需要发生什么。
如何在恢复 SIMPLE 模型时从表中恢复已删除的行?数据库位于 Microsoft SQL Server 2014 中。fn_dblog
在数据被新数据覆盖之前,我已设法在表中找到它们。我可以用它做任何事吗?
SELECT * FROM fn_dblog(NULL, NULL) WHERE Operation = 'LOP_DELETE_ROWS'
我还找出了删除行的具体时间。
USE Databasename
GO
SELECT
[Current LSN], Operation, [Transaction ID], [Begin Time], [Transaction Name], [Transaction SID]
FROM
fn_dblog(NULL, NULL)
WHERE
[Transaction ID] = ‘000:000001f3'
AND
[Operation] = 'LOP_BEGIN_XACT'
我读过 SIMPLE Recovery 不支持事务日志备份。但是真的没有办法恢复这些数据吗?