Frage

Wir haben ein paar riesig Datenbanken (20 GB+), die größtenteils statische Suchdaten enthalten.Da unsere Anwendung Verknüpfungen mit Tabellen in diesen Datenbanken ausführt, müssen diese Teil des lokalen SQL Servers jedes Entwicklers sein (d. h.sie können nicht auf einem zentralen, gemeinsam genutzten Datenbankserver gehostet werden).

Wir planen, einen kanonischen Satz der tatsächlichen SQL Server-Datenbankdateien (*.mdf und *.ldf) zu kopieren und sie an die lokale Datenbank jedes Entwicklers anzuhängen.

Wie können wir das Datenverzeichnis der lokalen SQL Server-Instanz am besten herausfinden, damit wir die Dateien an den richtigen Ort kopieren können?Dies erfolgt über einen automatisierten Prozess, daher muss ich es über ein Build-Skript finden und verwenden können.

War es hilfreich?

Lösung

Es hängt davon ab, ob Standardpfad für Daten festgelegt ist und die Protokolldateien oder nicht.

Wenn der Pfad festgelegt wird ausdrücklich auf Properties => Database Settings => Database default locations dann SQL Server speichert sie auf Software\Microsoft\MSSQLServer\MSSQLServer in DefaultData und DefaultLog Werte.

Allerdings, wenn diese Parameter nicht explizit festgelegt werden, SQL-Server verwendet Daten- und Protokollpfade Master-Datenbank.

Bellow ist das Skript, das beide Fälle abdeckt. Dies wird vereinfachte Version der Abfrage, die SQL Management Studio ausgeführt wird.

Beachten Sie auch, dass ich xp_instance_regread anstelle von xp_regread, so dass dieses Skript für jede Instanz, Standard oder benannt wird funktionieren.

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

Sie können das gleiche Ergebnis erzielen, indem SMO verwenden. Bellow ist C # Probe, aber Sie können andere .NET-Sprache oder Powershell verwenden.

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;
}

Es ist so viel einfacher, in SQL Server 2012 und höher, vorausgesetzt, Sie haben Standardpfade gesetzt (was wahrscheinlich immer eine richtige Sache zu tun):

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')

Andere Tipps

Auch wenn dies ein sehr alter Faden ist, fühle ich mich wie eine einfache Lösung beitragen müssen. Jedes Mal, dass Sie wissen, wo in Management Studio ein Parameter liegt, dass Sie für jede Art von automatisierter Skript zugreifen mögen, ist der einfachste Weg, um eine schnelle Profiler-Ablaufverfolgung auf einem eigenständigen Testsystem laufen und erfassen, was Management Studio tut auf dem Back-End .

In diesem Fall vorausgesetzt, Sie daran interessiert sind, die Standarddaten zu finden und melden Stellen Sie können wie folgt vorgehen:

SELECT
SERVER ( 'instancedefaultdatapath') AS [Defaultfile],
SERVER ( 'instancedefaultlogpath') AS [DefaultLog]

ich auf diese Lösung in der Dokumentation gestolpert für die Datenbank-Anweisung in der Hilfe für SQL Server erstellen:

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

Für die aktuelle Datenbank können Sie nur verwenden:

select physical_name from href="http://msdn.microsoft.com/en-us/library/ms174397.aspx" rel="noreferrer"> sys.database_files;

eine andere Datenbank angeben, z 'Model', Verwendung sys.master_files

select physical_name from sys.master_files where database_id = DB_ID(N'Model');

Wie von SQL Server 2012 können Sie die folgende Abfrage verwenden:

SELECT SERVERPROPERTY('INSTANCEDEFAULTDATAPATH') as [Default_data_path], SERVERPROPERTY('INSTANCEDEFAULTLOGPATH') as [Default_log_path];

(Dies wurde von einem Kommentar genommen unter http://technet.microsoft.com/en-us /library/ms174396.aspx und getestet.)

Verschiedene Komponenten von SQL Server (Data, Logs, SSAS, SSIS, usw.) haben ein Standardverzeichnis. Die Einstellung hierfür kann in der Registrierung gefunden werden. Lesen Sie mehr hier:

http://technet.microsoft.com/ en-us / library / ms143547% 28SQL.90% 29.aspx

Wenn Sie also eine Datenbank erstellt nur CREATE DATABASE MyDatabaseName mit ihm an dem oben in einen der Einstellungen angegebenen Pfad erstellt werden würde.

Wenn nun der admin / Installateur des Standardpfad geändert wird, dann für die Instanz des Standardpfad in der Registrierung bei

gespeichert

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup

Wenn Sie den Namen der Instanz kennen, dann können Sie die Registrierung abfragen. Dieses Beispiel ist SQL 2008 spezifisch -. Lassen Sie mich wissen, wenn Sie den SQL2005-Weg, sowie benötigen

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

kann jeder Datenbank, um die Server-Einstellung in einem seiner eigenen Standort erstellt werden überschrieben, wenn Sie die CREATE DATABASE DBName Anweisung mit den entsprechenden Parametern ausgeben. Sie können, dass durch die Ausführung Sp_helpdb herausfinden

exec sp_helpdb 'DBName'

Halten Sie es einfach:

use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id

Dadurch werden alle Datenbanken mit den dazugehörigen Dateien zurückgeben

Von der GUI. Servereigenschaften öffnen, gehen Sie auf Datenbank-Einstellungen , und sehen Sie Datenbank Standardpositionen

Beachten Sie, dass Sie Ihre Datenbank-Dateien ablegen können, wo immer Sie mögen, obwohl es sauberer scheint sie im Standardverzeichnis zu halten.

Sie können mit der folgenden T-SQL-Standard-Daten- und Protokoll Standorte für die aktuelle SQL Server-Instanz finden:

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'

Kleiner nitpick. Gibt es keine Datenordner, nur ein default Datenordner

Wie auch immer, um es zu finden, vorausgesetzt, Sie zur ersten Standardinstanz installiert werden sollen:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ Setup \ SQLDataRoot

Wenn es eine benannte Instanz ist, wird MSSQL.1 so etwas wie MSSQL10.INSTANCENAME.

auf „bespritzt Bits“ Antwort Aufweiten, hier ist ein komplettes Skript, das es funktioniert:

@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

ich würde eine Sicherung wiederherstellen getan habe einfach becuase seine einfachere und Unterstützung Versionierung. Referenzdaten benötigt vor allem um versioniert werden zu wissen, wann es begann Wirksamwerdens. Ein dettach befestigen Sie nicht diese Fähigkeit geben. Auch mit Sicherungen können Sie aktualisieren Kopien zur Verfügung zu stellen fortsetzen, ohne die Datenbank herunterfahren zu müssen.

Alex‘ Antwort ist die richtige, aber für die Nachwelt gibt es hier noch eine andere Option:Erstellen Sie eine neue leere Datenbank.Wenn Sie CREATE DATABASE verwenden, ohne ein Zielverzeichnis anzugeben, erhalten Sie ...die Standarddaten-/Protokollverzeichnisse.Einfach.

Persönlich würde ich jedoch wahrscheinlich entweder:

  • Stellen Sie die Datenbank auf dem PC des Entwicklers wieder her, anstatt sie zu kopieren/anzuhängen (Sicherungen können komprimiert oder auf einer UNC verfügbar gemacht werden) oder
  • Verwenden Sie einen Verbindungsserver, um dies von vornherein zu vermeiden (hängt davon ab, wie viele Daten über den Join übertragen werden).

PS:20 GB sind nicht riesig, selbst im Jahr 2015.Aber es ist alles relativ.

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\%'

Sie können Detail SQL-Skript herunterladen von , wie das finden Datenverzeichnis für eine SQL Server-Instanz

Sie werden Standardverzeichnis, wenn Benutzerdatenbank von dieser Abfrage erhalten:

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'
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top