web-dev-qa-db-ja.com

SQL Serverインスタンスのデータディレクトリを見つけるにはどうすればよいですか?

ほとんど静的なルックアップデータを含む巨大データベース(20GB +)がいくつかあります。アプリケーションはこれらのデータベースのテーブルに対して結合を実行するため、各開発者のローカルSQL Serverの一部である必要があります(つまり、中央の共有データベースサーバーでホストすることはできません)。

実際のSQL Serverデータベースファイル(* .mdfおよび* .ldf)の正規セットをコピーし、各開発者のローカルデータベースに添付する予定です。

ファイルを適切な場所にコピーできるように、ローカルのSQL Serverインスタンスのデータディレクトリを見つける最良の方法は何ですか?これは自動化されたプロセスを介して行われるため、ビルドスクリプトからそれを見つけて使用できるようにする必要があります。

67
Aaron Jensen

データファイルとログファイルにデフォルトパスが設定されているかどうかによって異なります。

パスがProperties => Database Settings => Database default locationsで明示的に設定されている場合、SQLサーバーはDefaultDataおよびDefaultLog値のSoftware\Microsoft\MSSQLServer\MSSQLServerに保存します。

ただし、これらのパラメーターが明示的に設定されていない場合、SQLサーバーはmasterデータベースのデータパスとログパスを使用します。

Bellowは両方のケースをカバーするスクリプトです。これは、SQL Management Studioが実行するクエリの簡易バージョンです。

また、xp_instance_regreadの代わりにxp_regreadを使用しているため、このスクリプトはデフォルトまたは名前付きのすべてのインスタンスで機能します。

declare @DefaultData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultData', @DefaultData output

declare @DefaultLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'DefaultLog', @DefaultLog output

declare @DefaultBackup nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer', N'BackupDirectory', @DefaultBackup output

declare @MasterData nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg0', @MasterData output
select @MasterData=substring(@MasterData, 3, 255)
select @MasterData=substring(@MasterData, 1, len(@MasterData) - charindex('\', reverse(@MasterData)))

declare @MasterLog nvarchar(512)
exec master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE', N'Software\Microsoft\MSSQLServer\MSSQLServer\Parameters', N'SqlArg2', @MasterLog output
select @MasterLog=substring(@MasterLog, 3, 255)
select @MasterLog=substring(@MasterLog, 1, len(@MasterLog) - charindex('\', reverse(@MasterLog)))

select 
    isnull(@DefaultData, @MasterData) DefaultData, 
    isnull(@DefaultLog, @MasterLog) DefaultLog,
    isnull(@DefaultBackup, @MasterLog) DefaultBackup

SMOを使用して同じ結果を得ることができます。 BellowはC#のサンプルですが、他の.NET言語またはPowerShellを使用できます。

using (var connection = new SqlConnection("Data Source=.;Integrated Security=SSPI"))
{
    var serverConnection = new ServerConnection(connection);
    var server = new Server(serverConnection);
    var defaultDataPath = string.IsNullOrEmpty(server.Settings.DefaultFile) ? server.MasterDBPath : server.Settings.DefaultFile;
    var defaultLogPath = string.IsNullOrEmpty(server.Settings.DefaultLog) ? server.MasterDBLogPath : server.Settings.DefaultLog;
}

SQL Server 2012以降では、デフォルトのパスが設定されていると仮定すると、非常に簡単です(おそらく常に正しいことです)。

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
98
Alex Aza

これは非常に古いスレッドですが、簡単な解決策を提供する必要があると感じています。 Management Studioで、自動化されたスクリプトにアクセスしたいパラメーターがどこにあるかを知っている場合、最も簡単な方法は、スタンドアロンテストシステムでクイックプロファイラートレースを実行し、Management Studioがバックエンドで実行していることをキャプチャすることです。

この例では、デフォルトのデータとログの場所を見つけることに関心があると仮定すると、次のことができます。

- 選択する
SERVERPROPERTY( 'instancedefaultdatapath')AS [DefaultFile]、
SERVERPROPERTY( 'instancedefaultlogpath')AS [DefaultLog]

36
TDrudge

SQL ServerのヘルプにあるCreate Databaseステートメントのドキュメントで、このソリューションに出くわしました。

SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1)
                  FROM master.sys.master_files
                  WHERE database_id = 1 AND file_id = 1
33
Aaron Jensen

現在のデータベースでは、次のものを使用できます。

_select physical_name from_ _sys.database_files;_

別のデータベースを指定するには「モデル」、sys.master_filesを使用

select physical_name from sys.master_files where database_id = DB_ID(N'Model');

23
Remus Rusanu

Sql Server 2012以降、次のクエリを使用できます。

SELECT SERVERPROPERTY('INSTANCEDEFAULTDATAPATH') as [Default_data_path], SERVERPROPERTY('INSTANCEDEFAULTLOGPATH') as [Default_log_path];

(これは http://technet.Microsoft.com/en-us/library/ms174396.aspx のコメントから取られ、テストされました。)

17
Nathan

SQL Serverのさまざまなコンポーネント(データ、ログ、SSAS、SSISなど)にはデフォルトのディレクトリがあります。この設定はレジストリにあります。詳細はこちら:

http://technet.Microsoft.com/en-us/library/ms143547%28SQL.90%29.aspx

したがって、CREATE DATABASE MyDatabaseNameのみを使用してデータベースを作成した場合、上記の設定のいずれかで指定されたパスに作成されます。

ここで、管理者/インストーラーがデフォルトパスを変更した場合、インスタンスのデフォルトパスは次のレジストリに保存されます。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup

インスタンスの名前がわかっている場合は、レジストリを照会できます。この例はSQL 2008固有のものです。SQL2005パスも必要かどうかを教えてください。

DECLARE @regvalue varchar(100)

EXEC master.dbo.xp_regread @rootkey='HKEY_LOCAL_MACHINE',
        @key='SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL10.MSSQLServer\Setup',
        @value_name='SQLDataRoot',
        @[email protected] OUTPUT,
        @output = 'no_output'

SELECT @regvalue as DataAndLogFilePath

適切なパラメーターを指定してCREATE DATABASE DBNameステートメントを発行すると、各データベースを独自の場所でサーバー設定を上書きして作成できます。あなたはsp_helpdbを実行することでそれを見つけることができます

exec sp_helpdb 'DBName'
8
Raj More

シンプルに保つ:

use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id

これにより、関連するファイルを持つすべてのデータベースが返されます

6
Deptor

GUIから:サーバーのプロパティを開き、データベース設定に移動し、データベースのデフォルトの場所を参照してください。

データベースファイルは任意の場所にドロップできますが、デフォルトのディレクトリに保存する方がきれいに見えることに注意してください。

2

次のT-SQLを使用して、現在のSQL Serverインスタンスのデフォルトのデータとログの場所を見つけることができます。

DECLARE @defaultDataLocation nvarchar(4000)
DECLARE @defaultLogLocation nvarchar(4000)

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultData', 
    @defaultDataLocation OUTPUT

EXEC master.dbo.xp_instance_regread
    N'HKEY_LOCAL_MACHINE',
    N'Software\Microsoft\MSSQLServer\MSSQLServer',
    N'DefaultLog', 
    @defaultLogLocation OUTPUT

SELECT @defaultDataLocation AS 'Default Data Location',
       @defaultLogLocation AS 'Default Log Location'
1
Regent

「飛び散ったビット」の答えを拡張して、これを行う完全なスクリプトを次に示します。

@ECHO off
SETLOCAL ENABLEDELAYEDEXPANSION

SET _baseDirQuery=SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'master.mdf', LOWER(physical_name)) - 1) ^
 FROM master.sys.master_files WHERE database_id = 1 AND file_id = 1;
ECHO.
SQLCMD.EXE -b -E -S localhost -d master -Q "%_baseDirQuery%" -W >data_dir.tmp
IF ERRORLEVEL 1 ECHO Error with automatically determining SQL data directory by querying your server&ECHO using Windows authentication.
CALL :getBaseDir data_dir.tmp _baseDir

IF "%_baseDir:~-1%"=="\" SET "_baseDir=%_baseDir:~0,-1%"
DEL /Q data_dir.tmp
echo DataDir: %_baseDir%

GOTO :END
::---------------------------------------------
:: Functions 
::---------------------------------------------

:simplePrompt 1-question 2-Return-var 3-default-Val
SET input=%~3
IF "%~3" NEQ "" (
  :askAgain
  SET /p "input=%~1 [%~3]:"
  IF "!input!" EQU "" (
    GOTO :askAgain
  ) 
) else (
  SET /p "input=%~1 [null]: "
)   
SET "%~2=%input%"
EXIT /B 0

:getBaseDir fileName var
FOR /F "tokens=*" %%i IN (%~1) DO (
  SET "_line=%%i"
  IF "!_line:~0,2!" == "c:" (
    SET "_baseDir=!_line!"
    EXIT /B 0
  )
)
EXIT /B 1

:END
PAUSE
0
djangofan

バックアップの復元は、簡単になりバージョン管理がサポートされるためです。参照データは、いつ有効になったかを知るために、特にバージョン管理する必要があります。デタッチアタッチはあなたにその能力を与えません。また、バックアップを使用すると、データベースをシャットダウンせずに、更新されたコピーを引き続き提供できます。

0
Jayanth Kurup

Alexの答え は正しいものですが、後世には別のオプションがあります。新しい空のデータベースを作成します。ターゲットディレクトリを指定せずにCREATE DATABASEを使用すると、デフォルトのデータ/ログディレクトリが取得されます。簡単です。

個人的には、しかし、私はおそらくどちらかだろう:

  • コピー/アタッチではなく、開発者のPCにデータベースを復元します(バックアップは圧縮でき、UNCで公開できます)。
  • リンクサーバーを使用して、そもそもこれを行わないようにします(結合を通過するデータの量によって異なります)

ps:2015年であっても20GBは巨大ではありません。しかし、それはすべて相対的なものです。

0
piers7
SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceDataPaths
FROM sys.sysaltfiles WHERE filename like '%.mdf' and filename not like '%\MSSQL\Binn\%'

SELECT DISTINCT dbo.GetDirectoryPath(filename) AS InstanceLogPaths
FROM sys.sysaltfiles WHERE filename like '%.ldf' and filename not like '%\MSSQL\Binn\%'

enter image description here

詳細なSQLスクリプトは SQL Serverインスタンスのデータディレクトリの検索方法 からダウンロードできます。

0
frank tan

小さい選択:データフォルダーはなく、デフォルトデータフォルダーのみです。

とにかく、それを見つけるために、最初のデフォルトのインスタンス用にインストールしたい場合:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\MSSQL.1\Setup\SQLDataRoot

名前付きインスタンスがある場合、MSSQL.1はMSSQL10.INSTANCENAMEのようなものになります。

0
Stu