web-dev-qa-db-ja.com

SQL Server 2016のシステムデータベースは、Powershellを使用してどのように移動できますか?

Powershell ieを使用してシステムデータベースを移動しようとしています。 なし任意のT-SQLを使用します。

  1. SMOの使用:Install-Module SQL-SMO $smo = New-SMO -ServerName localhost $smo.databases["TempDB"].PrimaryFilePath= "F:\Tempdb\" $smo.databases["TempDB"].Alter()はエラーを返します:

    'PrimaryFilePath'はReadOnlyプロパティです。

ログファイルは正常に移動します。 $smo.databases["TempDB"].LogFiles[0].Filename = "F:\Tempdb\tempdb.ldf"

  1. SQLServerまたはDBAToolsモジュールで特定のコマンドレットを見つけることができませんでした。 Copy-DbaDatabaseが最も近くなります。正確ではありません。
2
Ayan Mullick

Powershellを使用した[〜#〜] all [〜#〜]システムデータベースの移動に関する質問に完全には答えていませんが、実用的な例を提供したいと思いましたTEMPDBの個々のファイルを移動する方法。

TEMPDBファイルの現在の場所が

C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA

それらを移動したい

C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\TempDB

基本的に、filegroupsを反復処理し、次にfiles内のfilegroupsを反復処理する必要があります。

次に、ログファイルに対して同じタイプのアクションを実行します。

Install-Module SQL-SMO
$smo = New-SMO -ServerName localhost
$TempDb = $smo.databases["TempDB"]

foreach ($fg in $TempDb.FileGroups) {
    foreach ($fl in $fg.Files) {
    $fl.FileName = $fl.FileName.Replace("C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA","C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\TempDB")
    }
}

foreach ($fg in $TempDb.FileGroups) {
    foreach ($fl in $fg.Files) {
    $fl.FileName
    }
}

foreach ($fl in $TempDb.LogFiles) {
    $fl.FileName = $fl.FileName.Replace("C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA","C:\Program Files\Microsoft SQL Server\MSSQL13.MSSQLSERVER\MSSQL\DATA\TempDB")
    }

$smo.databases["TempDB"].Alter()

SQL Serverインスタンスを再起動すると、新しいディレクトリの下にTEMPDBファイルが割り当てられていることがわかります。


元の回答を投稿した後、POWERSHELLを使用したSQL Serverシステムデータベースの移動についてもう少し調査しましたが、masterデータベースの移動に関する非常に詳細な投稿を見つけました。

#Powershellを使用したマスターデータベースの移動

1
Scott Hodgin

Restore-DbaDatabase dbatoolsで、システムデータベースを復元する機能がブロックされるようになりました。プロセスを解決することは、ある時点でロードマップ上にあります。そのコマンドのブロックは、Copy-DbaDatabaseも失敗する理由であり、単純なデタッチ/アタッチ方法ではシステムデータベースを移動できません。

全体として、SMOに関する「手動で準備された」コードだけを組み合わせたdbatoolsコマンドを使用して、PowerShellでタスク全体を実行することができます。

1
user507

_$smo = New-SMO -ServerName localhost -Verbose_

$('model','MSDB','TempDB')| ForEach-Object {$Db = $smo.databases[$PSItem] foreach ($fg in $Db.FileGroups) {foreach ($fl in $fg.Files) {$fl.FileName = $fl.FileName.Replace("C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA","F:\SystemDB")}} foreach ($fl in $Db.LogFiles) {$fl.FileName = $fl.FileName.Replace("C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA","F:\SystemDB")} $smo.databases[$PSItem].Alter() }

_Stop-Service -Name MSSQLSERVER -Force -Verbose_

$('model','MSDB','mast')|ForEach-Object {Move-Item -Path $('C:\Program Files\Microsoft SQL Server\MSSQL14.MSSQLSERVER\MSSQL\DATA\'+$PSItem+'*') -Destination F:\SystemDB\ -Verbose}

$wmisvc = $(New-Object Microsoft.SqlServer.Management.Smo.Wmi.ManagedComputer 'localhost').Services | where {$_.name -eq "MSSQLSERVER"} $wmisvc.StartupParameters= '-dF:\SystemDB\master.mdf;-eF:\SystemDB\ERRORLOG;-lF:\SystemDB\mastlog.ldf' $wmisvc.Alter()

_Start-Service -Name MSSQLSERVER,SQLSERVERAGENT -Verbose_

これにより、すべてのシステムデータベースが移動します。

0
Ayan Mullick