微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何复制托管数据库?

如何解决如何复制托管数据库?

AFAIK 没有 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 门户(在那里它失败并出现相同的错误 btw)完成,这也是正确的,它不允许输入比当前新的时间 - 6 分钟。经过几次尝试,我发现当前时间 - 大约 40 分钟开始正常工作。但是 40 分钟很多,在尝试等待异步操作的结果之前,我没有找到任何方法来找出什么时间有效。

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

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

解决方法

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

是的。通过 SQL。找出这一点的唯一方法是使用扩展事件 (XEvent) 会话来监控备份活动。

此处描述了开始记录 backup_restore_progress_trace 扩展事件并报告它的过程https://docs.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://docs.microsoft.com/en-us/azure/azure-sql/database/recovery-using-backups)

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

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

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

但是,是的,这是否适合您的需求取决于 Thomas 询问副本的目的是什么。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。