我想将所有数据库迁移到一个Azure SQL数据库中。
我的所有数据库都具有相同的架构,我想生成一些通用方法或代码来自动执行。
对于每个数据库,它将在Azure SQL中创建一个新架构,并将所有数据库创建到该架构中并将所有数据复制到其中。
数据库很小,所以起初我在考虑DMA(https://www.microsoft.com/en-us/download/details.aspx?id=53595),但是它不能帮助我将多个数据库整合到一个数据库中。
我当时想尝试编写一个动态查询以在实例中的每个数据库上运行并生成相关代码,然后通过链接服务器或OpenQuery / OpenRowSet将其提取到Azure SQL。
也许我可以使用Powershell dbaTools?
我对此不太熟悉,但听说它可以起到魔术作用(:-)
你怎么看?
谢谢 内森
答案 0 :(得分:2)
根据我的经验,我进行了很多搜索:
由于所有数据库都具有相同的架构,因此您应该首先考虑将这些数据合并到一个数据库中,然后再考虑deploy the database to Azure SQL Server。 Azure SQL Server将帮助您创建数据库。
DMA,DMS或其他工具暂时不支持合并数据库。
您可以参考这些博客,这对您非常有帮助:
希望这会有所帮助。
答案 1 :(得分:1)
我终于在Powershell脚本(和DBATools模块)的帮助下以及在使用SQLCMD脚本的情况下做到了这一点。
我一开始尝试进行数据库合并,但是它不适用于我正在处理的模式。诀窍是每个数据库本身都必须是唯一的,因此我必须将每个表/视图/过程/函数转移到新模式,并将所有对象引用都与此新模式相关。 没有用于表合并或数据合并的空间。每个对象必须使用其自己的数据保持唯一性,才能将其传输到一个Azure SQL数据库。
所以我必须制定一些规则。
一种模式。数据库架构不应更改。所有数据库都具有相同的架构,因此我可以使用相同的DDL脚本在新数据库中创建每个对象。
我使用SQLCMD并在脚本中使用了一个参数($(NewSchema)
,我可以为每个对象集创建一个新的架构,并可以控制每个对象与同一架构中的其他对象相关。
对于数据传输,我想使用INSERT INTO [LinkedServer]...[Tablename]
,但是由于表中的Identity列,它不能很好地工作。
我无法使用“将身份设置为开”来操作它,因为您必须在服务器上处于同一会话上才能执行此操作。使用链接服务器无法执行此操作。
我面临的另一个问题是对数据库和外键的一堆约束。
所以我不得不以不同的方式解决这个问题。
PowerShell模块DBATools可以解救。
在数据库的每个表上运行,在Export-DbaScript的帮助下仅将数据导出为脚本,将其存储到变量中,替换模式名称,然后在远程服务器上运行它。
已为每个表使用SET IDENTITY_INSERT On
创建的脚本。
对于约束,我再次使用SQLCMD脚本来ALTER TABLE NOCHECK CONSTRAINT
当前模式的所有约束,然后使用它将其重新打开(在复制所有数据之后)。
我在PowerShell脚本中敲击了所有内容,该脚本获取所有连接和数据库的参数,然后执行此工作。
我很确定有更好的方法可以实现这一目标,但这对我有用。
我会喜欢你的到这里, 您如何看待我提出的解决方案?
如果有人也问我,我将很乐意分享脚本。
内森