web-dev-qa-db-ja.com

Azure SQLマネージドインスタンスからデータベースをバックアップし、オンプレミスSQLサーバーに復元する

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 データベース管理者の質問。助けなし-それは私が最初に試みたものです。誰か他の考えがあれば、私はそれらを聞いていただければ幸いです!

4
CB_Ron

MIからのBacup-restoreはサポートされていません。依存関係やサポートされていない機能がほとんどない場合、バックパックの抽出は失敗します。これは、SSMSが抽出を検証するためです。 SSDT(Visual STudio)を使用してみてください。検証抽出をスキップできます(これはデフォルトではオフになっています)。

  1. SQL Serverオブジェクトエクスプローラーを開く

enter image description here

  1. MIに接続します。データベースを右クリックして、[データ層アプリケーションの抽出]をクリックします。

[スキーマとデータの抽出]を選択します。

これは成功します。

enter image description here

enter image description here

  1. 上記で作成したdacpacファイルを使用して、データベースをデプロイします。データベースを右クリック->データ層アプリケーションをデプロイします。

データとスキーマ:

enter image description here

1

Visual Studioを使用せずに、Azureマネージドインスタンス(MI)からSQL Server 2012システムにデータを正常にエクスポートできました。

  1. SQL Server Management Studio(SSMS)を使用して、コピーするデータベースを右クリックし、Tasks > Export Data-tier Applicationを選択します。作成された.bacpacファイルを保存する場所を選択します。

    • .bacpacファイルは、テーブルとリレーションシップを定義するXMLと、各テーブルのデータを格納するBCPファイルを含むZipファイルです。
  2. 7Zipを使用している場合は、bacpacファイルを抽出して内容を確認します。そうでない場合は、ファイル拡張子を.bacpacから.Zipに変更し、ファイルエクスプローラー(右クリック> [すべて抽出...])を使用して抽出できます。

  3. 任意のテキストエディターでmodel.xmlファイルを開き、CompatibilityModeという属性を探します。これは、MIの互換性レベル(現在は150)に設定されています。インポート先の互換性レベルに変更します。 SQL 2012にインポートしていたため、110に変更しました。

  4. Model.xmlの関連する行をコメント化して、他の互換性のない機能を削除します。

    • たとえば、SQL 2012はインメモリテーブルを実行できないため、model.xmlファイルからこのセクションをコメント化する必要がありました。
    <!--<Element Type="SqlFilegroup" Name="[XTP]">
            <Property Name="ContainsMemoryOptimizedData" Value="True" />
    </Element>-->
  • Valueをfalseに設定することもできます。

    1. 一緒に戻す。マイクロソフトは、bacpacファイルが破損しているか、改ざんされていないかを確認する簡単な検証をいくつか追加しました。 model.xmlファイルに変更を加えた場合は、そのファイルの新しいチェックサム値を計算する必要があります。値はbacpacのOrigin.xmlファイルに保存されます。
  • PowerShellを使用して、新しいチェックサム値を生成できます。
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ファイルをアーカイブするには、ローカルストレージにエクスポートします。

2
KevH