web-dev-qa-db-ja.com

BACPACファイルをAzure SQLにインポートして既存のデータベースを上書きする方法

MyDatabaseという名前のローカルデータベースがあるとします。これをAzure SQLに移動して、現在そこにあるMyDatabaseという名前の既存のデータベースを置き換えます。ローカルでBACPACファイルを作成する方法を知っています。 BACPACをAzureストレージアカウントにインポートする方法を知っています。ただし、BACPACがAzureストレージにあると、既存のMyDatabaseデータベースをストレージ内のコピーで上書きする好ましい方法がわかりません。 BACPACファイルをインポートして2番目のデータベースを作成してから、最初のデータベースを削除し、インポートしたデータベースの名前を変更できます。しかし、これを行うための最良または推奨される方法はありますか?

4
Randy Minder

あなたは正しいです。 Azureでは、既存のデータベースに復元することはできません。

  • 別の名前で復元する必要があります。
  • 古いデータベースを削除
  • 新しい名前を古いデータベース名に変更します。

.BACPACファイルから復元する方法はいくつかあります。

  1. .\sqlpackage.exeコマンドラインツールを使用して、オンプレミスの.BACPACの場所から直接実行できます。

    。\ sqlpackage.exe/a:Import /sf:C:\filename.bacpac /tsn:ServerName.database.windows.net/tdn:destinationDBName `/ tu:adminaccountName @ serverName/tp:$ credentialPW

  2. ストレージアカウントにアップロードしたコピーを使用することもできます。

    $ ResourceGroupName = "RGName" $ ServerName = 'ServerName' $ DatabaseName = "DestinationDBName"

    $ StorageName = "StorageAccountName" $ StorageKeyType = "StorageAccessKey" $ StorageUri = "http://$StorageName.blob.core.windows.net/swwstoragecontainer/BackpacFileName.bacpac" $ StorageKey = "********* **************************」

    $ credential = Get-Credential

    $ importRequest = New-AzureRmSqlDatabaseImport -ResourceGroupName $ ResourceGroupName -ServerName $ ServerName -DatabaseName $DatabaseName -StorageKeytype $StorageKeyType -StorageKey $StorageKey -StorageUri $ StorageUri -AdministratorLogin $ credential.UserName -AdministratorLoginPassword $ credential.Password `-Edition Standard -ServiceObjectiveName S0 -DatabaseMaxSizeBytes 50000

    Get-AzureRmSqlDatabaseImportExportStatus -OperationStatusLink $ importRequest.OperationStatusLink

  3. ポータルでは、.BACPACファイルをデータベースとしてサーバーに直接インポートできます。

8
SqlWorldWide

Azureでは、既存のデータベースに復元することはできません。 (c)

どうやら、そうではない。たとえば、Azure環境に組み込まれているため、Azure SQLデータベースのインスタンス同じを維持する必要がある場合などに、.bacpacファイルを既存のAzure SQLデータベースに復元できます。そのために必要な条件は次のとおりです。ターゲットDBは空である必要があります。しかし、空ではない(もちろん!)ターゲットDBがすでにある場合は、データベースを「クリーン」にして、そのコンテキストで次のスクリプトを実行し、スーパーユーザーとしてログインできます。

DECLARE @sql NVARCHAR(2000)

WHILE EXISTS(SELECT TOP(1) * FROM SYS.TRIGGERS WHERE is_ms_shipped = 0)
BEGIN
    SELECT TOP(1) @sql = 'DROP TRIGGER IF EXISTS [' + [name] + '] ON ' + parent_class_desc COLLATE database_default --SQL_Latin1_General_CP1_CI_AS
    FROM SYS.TRIGGERS
    WHERE is_ms_shipped = 0
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE')
BEGIN
    SELECT TOP(1) @sql = 'DROP PROCEDURE IF EXISTS [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']'
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'PROCEDURE'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'FUNCTION')
BEGIN
    SELECT TOP(1) @sql = 'DROP FUNCTION IF EXISTS [' + ROUTINE_SCHEMA + '].[' + ROUTINE_NAME + ']'
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_TYPE = 'FUNCTION'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY')
BEGIN
    SELECT TOP(1) @sql = 'ALTER TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE='FOREIGN KEY'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA != 'sys')
BEGIN
    SELECT TOP(1) @sql = 'DROP VIEW [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'VIEW' AND TABLE_SCHEMA != 'sys'
    PRINT @sql
    EXEC (@sql)
END

WHILE EXISTS(SELECT TOP(1) * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory')
BEGIN
    SELECT TOP(1) @sql = 'DROP TABLE [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory'
    PRINT @sql
    EXEC (@sql)
END

--SELECT * FROM SYS.TYPES WHERE is_user_defined = 1
--SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME != '__MigrationHistory'
--SELECT * FROM SYS.TRIGGERS WHERE is_ms_shipped = 0
--DROP TRIGGER IF EXISTS [backup_objects] ON DATABASE

最後の4つのステートメントはオプションです。それらの最初の3つは、いくつかのパラメーターのチェック/表示用であり、最後の1つは、特定のデータベースレベルのトリガーが存在する場合、それを削除するために使用されます。

その後、次のように、標準のsqlpackage.exeユーティリティを使用して、持っている.bacpacファイルをターゲットDBに復元し、管理者特権のコマンドラインウィンドウで実行できます。

“C:\Program Files (x86)\Microsoft SQL Server\140\DAC\bin\sqlpackage.exe” /a:Import /sf:"C:\Users\[username1]\Documents\SQL Server Management Studio\DAC Packages\[SourceDBName.bacpac]" /tsn:[azureSQLServerName].database.windows.net /tdn:[TargetAzureSQLDBName] /tu:[DBAdminLogin] /tp:[DBAdminPassword]

[braced_values]を実際の値に置き換えるだけで動作します。ユーティリティを実行すると、次のような警告メッセージが黄色で表示される場合があります。

デプロイメントの初期化オブジェクト[data_0]はターゲットに存在しますが、[ターゲットデータベースにはあるがソースにはないオブジェクトのdropステートメントを生成する]チェックボックスをオンにしてもドロップされません。オブジェクト[ログ]はターゲットに存在しますが、[ターゲットデータベースには存在するが、ソースには存在しないオブジェクトのdropステートメントを生成する]チェックボックスをオンにしてもドロップされません。

無視してかまいません。データベースのサイズと複雑さによっては、復元プロセスに時間がかかる場合があるため、完了するまで待って、次のメッセージを表示してください:Successfully import database。

お役に立てば幸いです。

0
Tumnin