質問

して数 巨大 データベース(20GB+)ではほとんどを含む静ルックアップデータです。この申請を行参加に対しテーブルでこれらのデータベースを持つと言われていたが、その開発者は地元のSQLサーバーすることができませんが主催する、共通のデータベースサーバ).

まコピーされず、正確な結果セットの実際のSQL Serverデータベースファイル(*.mdf、*.ldf)に添付してくださる各開発者の現地データベースです。

何が最良の方法は地元のSQLサーバーのインスタンスのデータディレクトリをコピーできるファイルをのせるのでしょうか?られるかということではなく経由での自動プロセスではうれしいですが、この利用からビルドを記述します。

役に立ちましたか?

解決

これは、デフォルトのパスは、データ用に設定してログファイルをされているかどうかによって異なります。

パスは、それはPropertiesDatabase Settings値にDatabase default locationsSoftware\Microsoft\MSSQLServer\MSSQLServer => DefaultData => DefaultLog次にSQLサーバ店で明示的に設定されている場合

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

ベローは両方のケースをカバーするスクリプトです。これは、SQLの管理Studioが実行されるクエリのバージョンを簡素化されます。

また、私が代わりにxp_instance_regreadxp_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文を発行し、それ自身の場所にあるサーバーの設定をオーバーライドを作成することができます。あなたは、

は、sp_helpdbを実行しているを見つけることができます
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'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top