SE の雑記

SQL Server の情報をメインに Microsoft 製品の勉強内容を日々投稿

SQL Server のシステムデータベースディレクトリを変更

leave a comment

SQL Server をインストールするときにシステム データベース ディレクトリが指定されます。
このディレクトリは、[データルート ディレクトリ] を元に設定され、インスタンス ID 等が用いられたディレクトリ構成が自動的に使用され、任意のディレクトリに変更をすることができません。
image

インストール後にこのディレクトリを変更するための方法をまとめてみたいと思います。

システム データベース ディレクトリには以下の内容が格納されます。

  • システムデータベース (master / model /msdb)
  • SQL Server のログ
  • SQL Server Agent のログ

インストール時にこれらの格納先を変更できればよいのですが、投稿時点の SQL Server のバージョンでは変更することができませんので、インストール後に変更をする必要があります。

システムデータベースの移動については、システム データベースの移動 に記載されています。

master / SQL Server のログについてはスタートアップオプションとして設定されているためレジストリを変更する必要があります。
# SQL Server 構成マネージャーからも変更できます。
image

model / msdb については ALTER DATABASE で変更をすることができます。
SQL Server Agent のログについてはレジストリに格納されていますので、レジストリから設定を変更することで格納場所を変えることができます。

これらの設定ですが、以下のような PowerShell で変更できます。

# 初期設定
$OldDir = "C:MSSQLDATADatabaseMSSQL11.MSSQLSERVERMSSQLDATA*"
$NewDir = "C:MSSQLDATADatabase"
$NewlogDir = "C:MSSQLDATALog"
$SQLArgPath = "registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11.MSSQLSERVERMSSQLServerParameters"
$SQLAgentArgPath = "registry::HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL11.MSSQLSERVERSQLServerAgent"
# 実行ポリシーと PowerShell モジュールのインポート
Set-ExecutionPolicy RemoteSigned -Force
Import-Module SQLPS -DisableNameChecking
# model / msdb のファイルパス変更 (SQL Server)
Invoke-SQLCMD "ALTER DATABASE model MODIFY FILE ( NAME = modeldev , FILENAME = '$NewDirmodel.mdf' )"
Invoke-SQLCMD "ALTER DATABASE model MODIFY FILE ( NAME = modellog , FILENAME = '$NewDirmodellog.ldf' )"
Invoke-SQLCMD "ALTER DATABASE msdb MODIFY FILE ( NAME = MSDBData , FILENAME = '$NewDirMSDBData.mdf' )"
Invoke-SQLCMD "ALTER DATABASE msdb MODIFY FILE ( NAME = MSDBLog , FILENAME = '$NewDirMSDBLog.ldf' )"
# 物理ファイルの移動
Stop-Service "SQLSERVERAGENT" -Force
Stop-Service "MSSQLSERVER" -Force
# ファイルのコピー
Copy-Item  $OldDir $NewDir -Force
# master のパス変更
Set-ItemProperty -Path $SQLArgPath -Name "SQLArg0" -Value "-d$NewDirmaster.mdf"
Set-ItemProperty -Path $SQLArgPath -Name "SQLArg2" -Value "-l$NewDirmastlog.ldf"
# ログ用ディレクトリの作成
New-Item $NewLogDir -Type directory -Force
# SQL Server ログの変更
Set-ItemProperty -Path $SQLArgPath -Name "SQLArg1" -Value "-e$NewlogDirERRORLOG"
# SQL Server Agent ログの変更
Set-ItemProperty -Path $SQLAgentArgPath -Name "ErrorLogFile" -Value "$NewlogDirSQLAGENT.OUT"
Start-Service "MSSQLSERVER"
Start-Service "SQLSERVERAGENT"

 

元のファイルはコピーで複製しているので起動しなかった場合は、元のシステムデータベースのファイルを利用することが可能です。

Amazon の RDS for SQL Server は動作を眺めていると、インスタンスのデプロイ時に SQL Server をインストールしているように見受けられます。

# ログを眺めながらの想像ですので実際には違うかもしれませんが。

RDS では master データベース等は [D:RDSDBDATADATA] に保存されていますので、インストール後にこのような配置変更処理を実行しているのかもしれないですね。

Share

Written by Masayuki.Ozawa

9月 21st, 2013 at 9:36 pm

Posted in SQL Server

Tagged with ,

Leave a Reply