gpt4 book ai didi

azure - 如何复制托管数据库?

转载 作者:行者123 更新时间:2023-12-02 23:58:42 25 4
gpt4 key购买 nike

据我所知,没有REST API直接提供此功能。因此,我为此使用恢复(还有其他方法,但这些方法不能保证事务一致性并且更复杂)通过 Create request .

由于无法关闭短时间备份(保留必须至少 1 天),因此它应该是可靠的。我在请求中使用当前时间作为“properties.restorePointInTime”属性。这对于大多数数据库都适用。但是一个数据库向我返回此错误(来自异步操作请求):

"error": {
"code": "BackupSetNotFound",
"message": "No backups were found to restore the database to the point in time 6/14/2021 8:20:00 PM (UTC). Please contact support to restore the database."
}

我知道我没有超出范围,因为如果恢复时间早于“earliestRestorePoint”(这可以在托管数据库上的 GET 请求中找到),或者将来我会收到“PitrPointInTimeInvalid”错误。尽管如此,我发现一些信息表明我不应该使用当前时间,而应该使用当前时间 - 最多 6 分钟。如果通过 Azure 门户完成的话也是如此(顺便说一句,它会失败并出现相同的错误),它不允许输入比当前时间更新的时间 - 6 分钟。经过几次尝试,我发现当前时间 - 大约 40 分钟开始工作正常。但 40 分钟已经很多了,在我尝试等待异步操作的结果之前,我没有找到任何方法来了解什么时间有效。

我的问题是:有没有办法找到最晚可以恢复的时间?

或者是否有更好的方法来“复制”托管数据库,从而保证事务一致性并且相当快?

编辑:
我所描述的问题已报告给 MS。它发生在:

  1. 有自定义时区格式,例如UTC + 1 小时。
  2. 由于数据库处于非事件状态(无事件事务),因此会在所需时间点跳过源数据库的备份。

这个问题应该从现在(2021 年 8 月 25 日)开始修复,但我无法用当前时间(10 分钟)重现它。我还被告知应该有新的 API,允许在不使用 PITR 的情况下进行复制(不早于 22 年 1 季度)。

最佳答案

回答您的第一个问题“有没有办法找到最晚可以恢复的时间?”

是的。通过 SQL。找到这个问题的唯一方法是使用扩展事件 (XEvent) session 来监视备份事件。

此处描述了开始记录 backup_restore_progress_trace 扩展事件并报告该事件的过程 https://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/backup-activity-monitor

在此处包含 SQL,以防链接失效。

这用于存储在环形缓冲区中(最多最后 1000 条记录):

CREATE EVENT SESSION [Verbose backup trace] ON SERVER 
ADD EVENT sqlserver.backup_restore_progress_trace(
WHERE (
[operation_type]=(0) AND (
[trace_message] like '%100 percent%' OR
[trace_message] like '%BACKUP DATABASE%' OR [trace_message] like '%BACKUP LOG%'))
)
ADD TARGET package0.ring_buffer
WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY=30 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,
TRACK_CAUSALITY=OFF,STARTUP_STATE=ON)

ALTER EVENT SESSION [Verbose backup trace] ON SERVER
STATE = start;

然后查看所有备份事件的输出:

WITH
a AS (SELECT xed = CAST(xet.target_data AS xml)
FROM sys.dm_xe_session_targets AS xet
JOIN sys.dm_xe_sessions AS xe
ON (xe.address = xet.event_session_address)
WHERE xe.name = 'Verbose backup trace'),
b AS(SELECT
d.n.value('(@timestamp)[1]', 'datetime2') AS [timestamp],
ISNULL(db.name, d.n.value('(data[@name="database_name"]/value)[1]', 'varchar(200)')) AS database_name,
d.n.value('(data[@name="trace_message"]/value)[1]', 'varchar(4000)') AS trace_message
FROM a
CROSS APPLY xed.nodes('/RingBufferTarget/event') d(n)
LEFT JOIN master.sys.databases db
ON db.physical_database_name = d.n.value('(data[@name="database_name"]/value)[1]', 'varchar(200)'))
SELECT * FROM b

注意:当我遇到同样的时间点恢复失败似乎是随机的问题时,我通过 Microsoft 支持获得了此提示。他们不为日志备份提供任何 SLA。我发现在繁忙的数据库上,日志备份似乎每 5-10 分钟进行一次,但在安静的数据库上则每小时进行一次。以这种方式恢复数据库可能会很慢,具体取决于事务日志的数量和重放的事件量等。( https://learn.microsoft.com/en-us/azure/azure-sql/database/recovery-using-backups )

回答你的第二个问题:“或者有没有更好的方法来对托管数据库进行‘复制’,从而保证事务一致性并且相当快?”

我必须同意 Thomas 的观点 - 如果您追求保证事务一致性和速度,您需要考虑创建故障转移组 https://learn.microsoft.com/en-us/azure/azure-sql/database/auto-failover-group-overview?tabs=azure-powershell#best-practices-for-sql-managed-instancehttps://learn.microsoft.com/en-us/azure/azure-sql/managed-instance/failover-group-add-instance-tutorial?tabs=azure-portal

托管实例的故障转移组将具有主服务器和故障转移服务器,每个服务器上的相同用户数据库保持同步。

但是,这是否适合您的需求取决于托马斯提出的问题:副本的目的是什么。

关于azure - 如何复制托管数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67983692/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com