Powershell ieを使用してシステムデータベースを移動しようとしています。 なし任意のT-SQLを使用します。
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"
Copy-DbaDatabase
が最も近くなります。正確ではありません。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
データベースの移動に関する非常に詳細な投稿を見つけました。
Restore-DbaDatabase
dbatoolsで、システムデータベースを復元する機能がブロックされるようになりました。プロセスを解決することは、ある時点でロードマップ上にあります。そのコマンドのブロックは、Copy-DbaDatabaseも失敗する理由であり、単純なデタッチ/アタッチ方法ではシステムデータベースを移動できません。
全体として、SMOに関する「手動で準備された」コードだけを組み合わせたdbatoolsコマンドを使用して、PowerShellでタスク全体を実行することができます。
_$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
_
これにより、すべてのシステムデータベースが移動します。