문제

우리는 몇 가지를 가지고 있습니다 거대한 주로 정적 조회 데이터를 포함하는 데이터베이스(20GB 이상).우리 애플리케이션은 이러한 데이터베이스의 테이블에 대해 조인을 실행하기 때문에 각 개발자의 로컬 SQL Server(예:중앙 공유 데이터베이스 서버에서는 호스팅할 수 없습니다.

실제 SQL Server 데이터베이스 파일(*.mdf 및 *.ldf)의 정식 세트를 복사하여 각 개발자의 로컬 데이터베이스에 연결할 계획입니다.

파일을 올바른 위치에 복사할 수 있도록 로컬 SQL Server 인스턴스의 데이터 디렉터리를 찾는 가장 좋은 방법은 무엇입니까?이 작업은 자동화된 프로세스를 통해 수행되므로 빌드 스크립트에서 이를 찾아서 사용할 수 있어야 합니다.

도움이 되었습니까?

해결책

기본 경로가 데이터 및 로그 파일에 대해 설정되어 있는지 여부에 따라 다릅니다.

경로가 명시 적으로 설정된 경우 Properties => Database Settings => Database default locations 그런 다음 SQL Server가 저장합니다 Software\Microsoft\MSSQLServer\MSSQLServer 안에 DefaultData 그리고 DefaultLog 가치.

그러나 이러한 매개 변수가 명시 적으로 설정되지 않으면 SQL Server는 마스터 데이터베이스의 데이터 및 로그 경로를 사용합니다.

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')

다른 팁

이것은 매우 오래된 스레드이지만 간단한 솔루션을 제공해야한다고 생각합니다. 관리 스튜디오에서 모든 종류의 자동 스크립트에 액세스하려는 매개 변수가 어디에 있는지 알 수있는 경우, 가장 쉬운 방법은 독립형 테스트 시스템에서 빠른 프로파일 러 트레이스를 실행하고 Backend에서 수행하는 관리 스튜디오에서 수행하는 작업을 캡처하는 것입니다. .

이 경우 기본 데이터 및 로그 위치를 찾는 데 관심이 있다고 가정하면 다음을 수행 할 수 있습니다.

고르다
defaultFile]로서 ServerProperty ( 'InstanceFaultDatapath'),
defaultLog]로 ServerProperty ( 'InstanceFaultLogPath')

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 fromsys.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/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',
        @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 Microsoft SQL Server MSSQL.1 SETUP SQLDATAROOT

이름이 지정된 인스턴스가 있으면 mssql.1은 mssql10.instanceName과 같은 것이됩니다.

"Splattered Bits"답변을 확장하면 다음은 다음과 같은 완전한 스크립트가 있습니다.

@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

더 쉽고 지원 버전을 지원하기 때문에 백업 복원을했을 것입니다. 참조 데이터는 특히 시행 된시기를 알기 위해서는 버전을 만들어야합니다. Dettach 부착은 그 능력을 제공하지 않을 것입니다. 또한 백업을 사용하면 데이터베이스를 종료하지 않고도 업데이트 된 사본을 계속 제공 할 수 있습니다.

알렉스의 대답 올바른 것이지만 후손의 경우 여기에 또 다른 옵션이 있습니다. 새 빈 데이터베이스를 만듭니다. 대상을 지정하지 않고 생성 데이터베이스를 사용하는 경우 기본 데이터 / 로그 디렉토리를 얻습니다. 쉬운.

그러나 개인적으로 나는 아마도 아마도 다음과 같습니다.

  • 복사/첨부 대신 데이터베이스를 개발자의 PC로 복원하십시오 (백업은 압축, UNC에 노출 될 수 있음) 또는
  • 링크 된 서버를 사용하여 처음 부터이 작업을 피하십시오 (결합 된 데이터의 양에 따라 다릅니다)

추신 : 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\%'

enter image description here

세부 사항 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