SQL Server 인스턴스의 데이터 디렉터리를 어떻게 찾나요?
-
19-09-2019 - |
문제
우리는 몇 가지를 가지고 있습니다 거대한 주로 정적 조회 데이터를 포함하는 데이터베이스(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 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/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\%'
세부 사항 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'