MyDatabaseという名前のローカルデータベースがあるとします。これをAzure SQLに移動して、現在そこにあるMyDatabaseという名前の既存のデータベースを置き換えます。ローカルでBACPACファイルを作成する方法を知っています。 BACPACをAzureストレージアカウントにインポートする方法を知っています。ただし、BACPACがAzureストレージにあると、既存のMyDatabaseデータベースをストレージ内のコピーで上書きする好ましい方法がわかりません。 BACPACファイルをインポートして2番目のデータベースを作成してから、最初のデータベースを削除し、インポートしたデータベースの名前を変更できます。しかし、これを行うための最良または推奨される方法はありますか?
あなたは正しいです。 Azureでは、既存のデータベースに復元することはできません。
.BACPACファイルから復元する方法はいくつかあります。
.\sqlpackage.exe
コマンドラインツールを使用して、オンプレミスの.BACPACの場所から直接実行できます。
。\ sqlpackage.exe/a:Import /sf:C:\filename.bacpac /tsn:ServerName.database.windows.net/tdn:destinationDBName `/ tu:adminaccountName @ serverName/tp:$ credentialPW
ストレージアカウントにアップロードしたコピーを使用することもできます。
$ 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
ポータルでは、.BACPAC
ファイルをデータベースとしてサーバーに直接インポートできます。
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。
お役に立てば幸いです。