Azure SQLマネージドインスタンスに移行するデータベースが3つあります。 1つはユーティリティデータベースであり、一般的な関数とプロシージャのほんの一部です。 1つはOLTP Webアプリケーションのデータベースです。3つ目は、OLTPデータベースの読み取り専用アーカイブで、分析とレポートの履歴データが含まれています。監査テーブル。これらのデータベースをオンプレミスの開発サーバーとテストサーバーに復元できるようにする必要があります。これまでのところ、成功していません。
私の最初の試みは、Azure Blob Storageへのバックアップを使用することでした。しかし、ローカルで使用しているSQL Serverのバージョンに関係なく、常にコピーのみのバックアップが新しいバージョンのものであり、復元がサポートされていないというエラーが表示されます。
次に、SSMS v.18.1からデータ層アプリケーションをエクスポートしてみました。残念ながら、それは輸出を過ぎることはありません。 External references are not supported when creating a package from this platform
を読み取る数十のエラーが発生します。 Azure SQL DBを超えるマネージドインスタンスの最大の強みの1つは、クロスデータベースクエリを実行できることです。 2つのデータベースのテーブルをリンクするビューとプロシージャがいくつかあります。さらに、OLTPデータベースのいくつかのプロシージャは、ユーティリティデータベースの関数を呼び出します。MIはAzure SQLデータベースではないので、これは問題にはならないでしょう!
Googleを検索して、Stack Overflowで this の質問を見つけました。そこで、答えとして提案されたVisual Studioのアプローチを試しました。ローカルマシンにマルチギガバイトのファイルを作成することを意味するように見えますが、SSMSを使用してそのファイルをインポートしようとすると、No data is present in this file.
を読み取るエラーが発生するため、sqlpackage.exe
を使用して2番目の解決策を試しました。しかし、そのソリューションはスキーマのエクスポートを参照するだけなので、私にとっても機能しません。また、/Action:Export
を使用してデータベース全体をエクスポートしようとすると、SSMSと同じエラーメッセージが表示されます。
私も調べました this データベース管理者の質問。助けなし-それは私が最初に試みたものです。誰か他の考えがあれば、私はそれらを聞いていただければ幸いです!
MIからのBacup-restoreはサポートされていません。依存関係やサポートされていない機能がほとんどない場合、バックパックの抽出は失敗します。これは、SSMSが抽出を検証するためです。 SSDT(Visual STudio)を使用してみてください。検証抽出をスキップできます(これはデフォルトではオフになっています)。
[スキーマとデータの抽出]を選択します。
これは成功します。
データとスキーマ:
Visual Studioを使用せずに、Azureマネージドインスタンス(MI)からSQL Server 2012システムにデータを正常にエクスポートできました。
SQL Server Management Studio(SSMS)を使用して、コピーするデータベースを右クリックし、Tasks > Export Data-tier Application
を選択します。作成された.bacpacファイルを保存する場所を選択します。
7Zipを使用している場合は、bacpacファイルを抽出して内容を確認します。そうでない場合は、ファイル拡張子を.bacpacから.Zipに変更し、ファイルエクスプローラー(右クリック> [すべて抽出...])を使用して抽出できます。
任意のテキストエディターでmodel.xmlファイルを開き、CompatibilityMode
という属性を探します。これは、MIの互換性レベル(現在は150)に設定されています。インポート先の互換性レベルに変更します。 SQL 2012にインポートしていたため、110に変更しました。
Model.xmlの関連する行をコメント化して、他の互換性のない機能を削除します。
<!--<Element Type="SqlFilegroup" Name="[XTP]">
<Property Name="ContainsMemoryOptimizedData" Value="True" />
</Element>-->
Value
をfalseに設定することもできます。
Get-FileHash -Path C:\Path\To\Extracted\bacpac\model.xml | Format-Table -Property Hash
次のような出力が得られるはずです。
Hash
----
ED8754D205946850F3CED0B033342BF3D88A43E146E57D861191AACC1AC1659A
抽出したbacpacファイルからOrigin.xmlファイルを開き、最後に次のような行を探して、既存のハッシュ値を新しいものに置き換えます。
<Checksums>
<Checksum Uri="/model.xml">ED8754D205946850F3CED0B033342BF3D88A43E146E57D861191AACC1AC1659A</Checksum>
</Checksums>
スペースや無関係な文字を追加しないでください。
次に、ファイルを圧縮して、アーカイブの最上位がファイルであり、すべてを抽出したフォルダではないことを確認します。新しいファイルを開くと、単一のフォルダー名ではなく、xmlファイルが表示されます。
これで、bacpacをAzure以外のSQLデータベースにインポートできるようになります。
注意事項 bacpacバックアップについて:
それらはトランザクション上一貫していない場合があります。エクスポートをトランザクション的に整合させるには、エクスポート中に書き込みアクティビティが発生していないこと、またはトランザクション的に整合性のあるAzure SQLデータベースのコピーからエクスポートしていることを確認する必要があります。
BLOBストレージにエクスポートする場合、BACPACファイルの最大サイズは200 GBです。大きなBACPACファイルをアーカイブするには、ローカルストレージにエクスポートします。