ProgramingTip

SQL Server 인스턴스에 대한 데이터 디렉터리는 어떻게 찾습니까?

bestdevel 2020. 11. 9. 20:26
반응형

SQL Server 인스턴스에 대한 데이터 디렉터리는 어떻게 찾습니까?


정적 데이터 조회 대부분를 포함 하는 몇 개의 거대한 데이터베이스 (20기가바이트 +)가 있습니다. 우리 응용 프로그램은 데이터베이스의 테이블에 대해 조인을 실행하기 때문에 각 개발자 로컬 SQL Server의 일부 집합니다 (즉, 중앙 공유 데이터베이스 서버에서 호스팅 될 수 없음).

실제 SQL Server 데이터베이스 파일 (* .mdf 및 * .ldf)의 정식 집합을 복사하여 각 개발자의 로컬 데이터베이스에 성능 계획입니다.

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


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

경로가 Properties=> Database Settings=>에 명시 적으로 설정되어 있으면 Database default locationsSQL 서버는 경로 Software\Microsoft\MSSQLServer\MSSQLServerDefaultDataDefaultLog저장 합니다.

그러나 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')

이것은 매우 많은 것들이 제공해야한다고 생각합니다. Management Studio에서 모든 종류의 자동화 된 펼쳐보기 액세스하려는 다음 변수의 위치를 ​​알면 가장 쉬운 방법은 독립형 테스트 시스템에서 빠른 프로파일 러 추적을 실행하고 Management Studio가 백엔드에서 수행하는 작업을 수행하는 것입니다. .

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

SELECT
     SERVERPROPERTY ( 'instancedefaultdatapath') AS [DefaultFile],
     SERVERPROPERTY ( 'instancedefaultlogpath') AS [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 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 \ SOFTWARE \ 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

간단하게 백업을 수행하고 버전 관리를 지원했을 것입니다. 참조 데이터는 언제 발생하는 발생하기 시작했는지 알기 위해 버전을 관리해야합니다. 분리 첨부는 그 능력을 제공하지 않습니다. 또한 백업을 사용하면 데이터베이스를 종료하지 업그레이드 된 복사본을 계속 제공 할 수 있습니다.


Alex의 대답 은 옳지 만 후손을 위해 여기에 또 다른 옵션이 있습니다. 비어있는 새 데이터베이스를 만듭니다. 대상 디렉토리를 지정하지 않고 CREATE DATABASE를 사용하면 기본 데이터 / 로그 디렉토리가 표시됩니다. 쉬운.

개인적으로 나는 아마도 다음 중 하나 일 것입니다.

  • 데이터베이스를 복사 / 첨부하지 않고 개발자의 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 Server 인스턴스의 데이터 디렉터리를 찾는 방법 에서 세부 SQL 스크립트를 다운로드 할 수 있습니다.


이 쿼리로 사용자 데이터베이스를 사용하면 기본 위치를 얻을 수 있습니다.

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'

참고 URL : https://stackoverflow.com/questions/1883071/how-do-i-find-the-data-directory-for-a-sql-server-instance

반응형