SQL Server 인스턴스에 대한 데이터 디렉터리는 어떻게 찾습니까?
정적 데이터 조회 대부분를 포함 하는 몇 개의 거대한 데이터베이스 (20기가바이트 +)가 있습니다. 우리 응용 프로그램은 데이터베이스의 테이블에 대해 조인을 실행하기 때문에 각 개발자 로컬 SQL Server의 일부 집합니다 (즉, 중앙 공유 데이터베이스 서버에서 호스팅 될 수 없음).
실제 SQL Server 데이터베이스 파일 (* .mdf 및 * .ldf)의 정식 집합을 복사하여 각 개발자의 로컬 데이터베이스에 성능 계획입니다.
파일을 올바른 위치에 복사 할 수 있도록 로컬 SQL Server 인스턴스의 데이터 디렉터리를 찾는 가장 좋은 방법은 무엇입니까? 이 작업은 자동화 된 프로세스를 통해 수행 할 배포 빌드에서 찾아서 사용할 수 있습니다.
데이터 및 로그 파일에 기본 경로가 설정되어 있는지 여부에 따라.
경로가 Properties
=> Database Settings
=>에 명시 적으로 설정되어 있으면 Database default locations
SQL 서버는 경로 를 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')
이것은 매우 많은 것들이 제공해야한다고 생각합니다. 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 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 \ 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'
'ProgramingTip' 카테고리의 다른 글
Android : 사용자의 언어로 현재 요일 (월요일 등)을 가져 오는 방법은 무엇입니까? (0) | 2020.11.09 |
---|---|
Xcode 7에서 관리하는 팀 악성 프로필의 장치를 새로 고치시겠습니까? (0) | 2020.11.09 |
너비가 100 %이고 열 크기가 같은 테이블입니다. (0) | 2020.11.09 |
C #에서 전화를 설치면 어떻게됩니까? (0) | 2020.11.09 |
부트 버튼 라디오 버튼 토글 문제 (0) | 2020.11.09 |