からのデータディレクトリのための、SQL Serverのインスタンス?
-
19-09-2019 - |
質問
して数 巨大 データベース(20GB+)ではほとんどを含む静ルックアップデータです。この申請を行参加に対しテーブルでこれらのデータベースを持つと言われていたが、その開発者は地元のSQLサーバーすることができませんが主催する、共通のデータベースサーバ).
まコピーされず、正確な結果セットの実際のSQL Serverデータベースファイル(*.mdf、*.ldf)に添付してくださる各開発者の現地データベースです。
何が最良の方法は地元のSQLサーバーのインスタンスのデータディレクトリをコピーできるファイルをのせるのでしょうか?られるかということではなく経由での自動プロセスではうれしいですが、この利用からビルドを記述します。
解決
これは、デフォルトのパスは、データ用に設定してログファイルをされているかどうかによって異なります。
パスは、それはProperties
とDatabase Settings
値にDatabase default locations
でSoftware\Microsoft\MSSQLServer\MSSQLServer
=> DefaultData
=> DefaultLog
次にSQLサーバ店で明示的に設定されている場合
これらのパラメータが明示的に設定されていない場合は、SQLサーバーがマスター・データベースのデータとログのパスを使用します。
ベローは両方のケースをカバーするスクリプトです。これは、SQLの管理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を使用して同じ結果を得ることができます。ベローは、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')
他のヒント
でもこれは非常に古いスレッドができているなと思っていま必要な貢献を簡単な解決策です。随時お知らにエリアマネジメントのパラメータでありたいアドレスとパスワードを設定した任意のような自動スクリプトの最も簡単な方法がありますが、迅速プロファイラの微量スタンドアローン試験システムをどのエリアマネジメントは行っていること英語版をご覧下さい
このインスタンスを想定し、ご興味のある発見は、デフォルトのデータとログの場所次の操作が可能です:
選択
SERVERPROPERTY('instancedefaultdatapath')として[DefaultFile],
SERVERPROPERTY('instancedefaultlogpath')として[DefaultLog]
私は、SQL Serverのヘルプのデータベースの作成文のドキュメントで、このソリューションに出くわします:
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
あなただけ使用することができ、現在のデータベースの場合:
select physical_name from
sys.database_files;
する
例えば、別のデータベースを指定します'モデル'、sys.master_files
を使用します select physical_name from sys.master_files where database_id = DB_ID(N'Model');
の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、およびテストされています。)
SQL Serverの(データ、ログ、SSAS、SSIS、など)の様々なコンポーネントは、デフォルトのディレクトリを持っています。このための設定は、レジストリで見つけることができます。もっとここで読む:
http://technet.microsoft.com/ EN-US /ライブラリ/ 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',
@value=@regvalue OUTPUT,
@output = 'no_output'
SELECT @regvalue as DataAndLogFilePath
各データベースは、あなたが適切なパラメータを使用してCREATE DATABASE DBName
文を発行し、それ自身の場所にあるサーバーの設定をオーバーライドを作成することができます。あなたは、
exec sp_helpdb 'DBName'
それをシンプルに保つ:
use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id
これは、関連するファイルをすべてのデータベースを返します。
GUIから:。、サーバーのプロパティを開き、のデータベースの設定のに移動し、のデータベースのデフォルトの場所を参照してください。の
あなたが好きな場所、デフォルトのディレクトリにそれらを保つためにクリーナーようだけれども、あなたが、あなたのデータベースファイルをドロップすることもできます。
あなたは、次の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'
小nitpick:はデータのフォルダが存在しない、唯一ののデフォルトのデータフォルダー
とにかく、それを見つけるために、あなたが最初のデフォルトインスタンスに対してインストールすると仮定します:
HKEY_LOCAL_MACHINE \マイクロソフト\ Microsoft SQL Serverの\ MSSQL.1 \セットアップ\ SOFTWARE \ SQLDataRoot
という名前のインスタンスがある場合、MSSQL.1はMSSQL10.INSTANCENAMEのようなものになります。
「飛び散っビット」の答えに拡大は、ここでそれをしない完全なスクリプトです。
@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
私は、バックアップは、単にその簡単かつサポートバージョン管理becuase復元行っているでしょう。参考データは、特にそれが影響を受け始めたときに知るためにバージョン管理する必要があります。 dettachは文句を言わないあなたにその能力を与えて添付してください。また、バックアップでは、データベースをシャットダウンすることなく、更新のコピーを提供し続けることができます。
アレックスの応答 の一つが、後世にはいつものようにオプション:新しい空のデータベースです。ご利用の場合をデータベースを指定せずに対象dirま...デフォルトのデータ/logディレクトリが入っています。簡単です。
個人的には思って行くと現れる:
- 復元のデータベースの開発者用パソコンからではなくコピー/貼付(バックアップできる圧縮に露出しているUNC)、
- 利用リンク先サーバを避けるこにより異なりますどのくらいのデータを超える参加)
ps:20gbない大きなも2015年です。でもすべて相対的です。
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\%'
あなたは見つけるために、どのようにから詳細SQLスクリプトをダウンロードすることができますSQL Serverインスタンスのデータディレクトリ
あなたは、このクエリによってユーザデータベース場合は、デフォルトの場所を取得します。
declare @DataFileName nVarchar(500)
declare @LogFileName nVarchar(500)
set @DataFileName = (select top 1 RTRIM(LTRIM(name)) FROM master.sys.master_files where database_id >4 AND file_id = 1)+'.mdf'
set @LogFileName = (select top 1 RTRIM(LTRIM(name)) FROM master.sys.master_files where database_id >4 AND file_id = 2)+'.ldf'
select
( SELECT top 1 SUBSTRING(physical_name, 1, CHARINDEX(@DataFileName, LOWER(physical_name)) - 1)
FROM master.sys.master_files
WHERE database_id >4 AND file_id = 1) as 'Data File'
,
(SELECT top 1 SUBSTRING(physical_name, 1, CHARINDEX(@LogFileName, LOWER(physical_name)) - 1)
FROM master.sys.master_files
WHERE database_id >4 AND file_id = 2) as 'Log File'