Dies hängt davon ab, ob der Standardpfad für Daten- und Protokolldateien festgelegt ist oder nicht.
Wenn der Pfad explizit auf Properties
=> Database Settings
=> festgelegt Database default locations
ist, speichert SQL Server ihn unter Software\Microsoft\MSSQLServer\MSSQLServer
in DefaultData
und DefaultLog
Werten.
Wenn diese Parameter jedoch nicht explizit festgelegt werden, verwendet SQL Server die Daten- und Protokollpfade der Masterdatenbank.
Unten ist das Skript, das beide Fälle abdeckt. Dies ist eine vereinfachte Version der Abfrage, die SQL Management Studio ausführt.
Beachten Sie auch, dass ich xp_instance_regread
anstelle von verwende xp_regread
, damit dieses Skript für jede Instanz, Standard oder benannt, funktioniert.
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
Mit SMO können Sie das gleiche Ergebnis erzielen. Unten ist ein C # -Beispiel, Sie können jedoch jede 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;
}
In SQL Server 2012 und höher ist dies viel einfacher, vorausgesetzt, Sie haben Standardpfade festgelegt (was wahrscheinlich immer richtig ist):
select
InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
C:\Program Files\Microsoft SQL Server\110\SDK\Assemblies
, z. B.Microsoft.SqlServer.Smo.dll
undMicrosoft.SqlServer.ConnectionInfo.dll
. Wenn Sie jedoch eine Verbindung von einem Computer herstellen, auf dem kein SQL Server installiert ist, müssen Sie SMO installieren. Suchen Sie nach "Microsoft SQL Server 2012 Feature Pack", um ein eigenständiges SMO-Installationsprogramm zu finden.RegQueryValueEx() returned error 2, 'The system cannot find the file specified.'
Msg 22001, Level 1, State 1
RegQueryValueEx() returned error 2, 'The system cannot find the file specified.'
Msg 22001, Level 1, State 1
Database default locations
ich die GESAMTE Registrierung nach einem von Ihnen erwähnten Schlüsselwort durchsucht habe , kann ich es jedoch nirgendwo finden - nicht für SQL2005, SQL2008 oder SQL2012. Ich habe das gesamteHKEY_LOCAL_MACHINE
nach diesem Schlüsselwort sowie nach den tatsächlichen Pfaden selbst durchsucht . Keine Spur für jede Version. Beim Versuch über TSQL erhalte ich den gleichen Fehler wie bei @DKroot. Ich denke, ich muss die Verzeichnisse der Master-Datenbankdateien betrügen und verwenden.Obwohl dies ein sehr alter Thread ist, habe ich das Gefühl, dass ich eine einfache Lösung beitragen muss. Jedes Mal, wenn Sie wissen, wo sich in Management Studio ein Parameter befindet, auf den Sie für ein automatisiertes Skript zugreifen möchten, können Sie am einfachsten einen schnellen Profiler-Trace auf einem eigenständigen Testsystem ausführen und erfassen, was Management Studio im Backend tut .
Angenommen, Sie möchten die Standarddaten und Protokollspeicherorte finden, können Sie in diesem Fall Folgendes tun:
SELECT
SERVERPROPERTY ('instancedefaultdatapath') AS [DefaultFile],
SERVERPROPERTY ('instancedefaultlogpath') AS [DefaultLog]
quelle
Ich bin in der Dokumentation zur Anweisung "Datenbank erstellen" in der Hilfe für SQL Server auf diese Lösung gestoßen:
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
quelle
SELECT physical_name FROM sys.master_files mf inner JOIN sys.databases d ON d.database_id = mf.database_id AND d.name = 'our-template-database' AND TYPE = 0
Für die aktuelle Datenbank können Sie einfach verwenden:
select physical_name from
sys.database_files;
Verwenden Sie sys.master_files, um eine andere Datenbank anzugeben, z. B. 'Model'
select physical_name from sys.master_files where database_id = DB_ID(N'Model');
quelle
sysdatabases
).sys.master_files
und beitretensys.databases
.select * from sys.master_files f join sys.databases d on d.database_id = f.database_id
Ab 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 einem Kommentar unter http://technet.microsoft.com/en-us/library/ms174396.aspx entnommen und getestet.)
quelle
Verschiedene Komponenten von SQL Server (Daten, Protokolle, SSAS, SSIS usw.) haben ein Standardverzeichnis. Die Einstellung hierfür finden Sie in der Registrierung. Lesen Sie hier mehr:
http://technet.microsoft.com/en-us/library/ms143547%28SQL.90%29.aspx
Wenn Sie also eine Datenbank nur
CREATE DATABASE MyDatabaseName
mit erstellen, wird diese unter dem in einer der obigen Einstellungen angegebenen Pfad erstellt.Wenn der Administrator / Installer den Standardpfad geändert hat, wird der Standardpfad für die Instanz in der Registrierung unter gespeichert
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup
Wenn Sie den Namen der Instanz kennen, können Sie die Registrierung abfragen. Dieses Beispiel ist SQL 2008-spezifisch. Lassen Sie mich wissen, ob Sie auch den SQL2005-Pfad 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
Jede Datenbank kann erstellt werden, indem die Servereinstellung an einem eigenen Speicherort überschrieben wird, wenn Sie die
CREATE DATABASE DBName
Anweisung mit den entsprechenden Parametern ausgeben . Sie können dies herausfinden, indem Sie sp_helpdb ausführenquelle
null
in erster Linie für mich zurückgegeben. Ich wechseltexp_regread
zuxp_instance_regread
und den Registrierungspfad festgelegtSoftware\Microsoft\MSSQLServer\Setup
Abfrage Arbeit auf jeder SQL - Server - Instanz trotz der Version zu machen. Der Speicherort, den die Abfrage zurückgibt, befindet sich jedoch nicht einmal in der Nähe meines Standardspeicherorts für Daten- oder Protokolldateien. Wie kommt es, dass nur ein Wert für Daten- und Protokolldateien zurückgegeben wird? Sie sind in meiner Umgebung auf unterschiedliche Werte eingestellt. Es ist nicht ungewöhnlich, dass sich Daten und Protokolldateien auf verschiedenen Datenträgern befinden.HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server\[INSTANCENAME]\Setup
Zugriff auf das Instanzverzeichnis, jedoch nicht auf die Standardverzeichnisse der Daten- / Protokolldatei. Es enthältSQLDataRoot
jedoch nicht das Unterverzeichnis,\Data
das der tatsächliche Speicherort ist.Einfach halten:
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 zugehörigen Dateien zurückgegeben
quelle
Über die GUI: Öffnen Sie Ihre Servereigenschaften, gehen Sie zu Datenbankeinstellungen und sehen Sie sich die Standardspeicherorte der Datenbank an .
Beachten Sie, dass Sie Ihre Datenbankdateien beliebig ablegen können, obwohl es sauberer erscheint, sie im Standardverzeichnis zu belassen.
quelle
Kleiner Nitpick: Es gibt keinen Datenordner, nur einen Standarddatenordner .
Wie auch immer, um es zu finden, vorausgesetzt, Sie möchten für die erste Standardinstanz installieren:
HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Microsoft SQL Server \ MSSQL.1 \ Setup \ SQLDataRoot
Wenn es eine benannte Instanz gibt, wird MSSQL.1 zu MSSQL10.INSTANCENAME.
quelle
Mithilfe des folgenden T-SQL können Sie Standarddaten- und Protokollspeicherorte für die aktuelle SQL Server-Instanz ermitteln:
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'
quelle
Hier ist ein vollständiges Skript, das die Antwort "Splattered Bits" erweitert:
@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
quelle
Ich hätte eine Backup-Wiederherstellung durchgeführt, nur weil es einfacher ist und die Versionierung unterstützt. Insbesondere Referenzdaten müssen versioniert werden, um zu wissen, wann sie wirksam werden. Ein Dettach-Anhang gibt Ihnen diese Fähigkeit nicht. Auch bei Sicherungen können Sie weiterhin aktualisierte Kopien bereitstellen, ohne die Datenbank herunterfahren zu müssen.
quelle
Alex 'Antwort ist die richtige, aber für die Nachwelt gibt es 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 aber wahrscheinlich auch:
ps: 20GB sind auch 2015 nicht riesig. Aber es ist alles relativ.
quelle
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 ein detailliertes SQL-Skript herunterladen , um das Datenverzeichnis für eine SQL Server-Instanz zu finden
quelle
Sie erhalten den Standardspeicherort, wenn Benutzerdatenbank durch diese Abfrage:
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'
quelle