如何查找SQL Server实例的数据目录?

Aar*_*sen 68 sql sql-server sql-server-2005 sql-server-2008 sql-server-2008-r2

我们有一些大型数据库(20GB +),其中大部分都包含静态查找数据.因为我们的应用程序对这些数据库中的表执行连接,所以它们必须是每个开发人员本地SQL Server的一部分(即它们不能托管在中央的共享数据库服务器上).

我们计划复制一组规范的实际SQL Server数据库文件(*.mdf和*.ldf)并将它们附加到每个开发人员的本地数据库.

找出本地SQL Server实例的数据目录的最佳方法是什么,以便我们可以将文件复制到正确的位置?这将通过自动化过程完成,因此我必须能够从构建脚本中查找和使用它.

Ale*_*Aza 99

这取决于是否为数据和日志文件设置了默认路径.

如果路径显式设置为Properties=> Database Settings=>,Database default locations则SQL Server将其存储在Software\Microsoft\MSSQLServer\MSSQLServerin DefaultDataDefaultLogvalues中.

但是,如果未显式设置这些参数,则SQL Server将使用master数据库的Data和Log路径.

贝娄是涵盖这两种情况的剧本.这是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
Run Code Online (Sandbox Code Playgroud)

使用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;
}
Run Code Online (Sandbox Code Playgroud)

假设您设置了默认路径(这可能总是正确的事情),它在SQL Server 2012及更高版本中要简单得多:

select 
    InstanceDefaultDataPath = serverproperty('InstanceDefaultDataPath'),
    InstanceDefaultLogPath = serverproperty('InstanceDefaultLogPath')
Run Code Online (Sandbox Code Playgroud)

  • 它可以工作,但是结果中出现错误信息。`RegQueryValueEx()返回错误2,'系统找不到指定的文件。'`消息22001,级别1,状态1``RegQueryValueEx()返回错误2,'系统找不到指定的文件。' 22001,级别1,状态1` (2认同)

TDr*_*dge 37

即使这是一个非常古老的主题,我觉得我需要提供一个简单的解决方案.只要您知道要在任何类型的自动脚本中访问Management Studio中的参数位置,最简单的方法是在独立测试系统上运行快速探查器跟踪并捕获Management Studio在后端上执行的操作.

在这种情况下,假设您有兴趣查找默认数据和日志位置,您可以执行以下操作:

SELECT
     SERVERPROPERTY('instancedefaultdatapath')AS [DefaultFile],
     SERVERPROPERTY('instancedefaultlogpath')AS [DefaultLog]


Aar*_*sen 34

我在SQL Server帮助中的Create Database语句的文档中偶然发现了这个解决方案:

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
Run Code Online (Sandbox Code Playgroud)

  • 哇,令人惊讶的是这么多赞成错误的答案.此查询将显示master数据库数据文件的路径,而不是默认数据文件路径.默认数据文件路径可能与master.mdf文件路径相同,也可能不同.如果将用户数据库与系统数据库分开存储,则此"解决方案"将不起作用,这在大型生产环境中并不常见. (38认同)

Rem*_*anu 23

对于当前数据库,您可以使用:

select physical_name fromsys.database_files;

要指定另一个数据库,例如'Model',请使用sys.master_files

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

  • +1.值得注意的是,这需要在您想要的文件的数据库环境中运行.(我花了一些时间毫无结果地寻找一种方法将它加入`sysdatabases`). (3认同)

Nat*_*han 18

从Sql Server 2012开始,您可以使用以下查询:

SELECT SERVERPROPERTY('INSTANCEDEFAULTDATAPATH') as [Default_data_path], SERVERPROPERTY('INSTANCEDEFAULTLOGPATH') as [Default_log_path];
Run Code Online (Sandbox Code Playgroud)

(这取自http://technet.microsoft.com/en-us/library/ms174396.aspx上的评论,并经过测试.)


Raj*_*ore 8

SQL Server的各种组件(数据,日志,SSAS,SSIS等)都有一个默认目录.可以在注册表中找到此设置.在这里阅读更多:

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

因此,如果您仅使用CREATE DATABASE MyDatabaseName它创建数据库,则将在上述某个设置中指定的路径中创建该数据库.

现在,如果admin/installer更改了默认路径,则实例的默认路径将存储在注册表中

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
Run Code Online (Sandbox Code Playgroud)

当您CREATE DATABASE DBName使用适当的参数发出语句时,可以创建每个数据库覆盖其自身位置中的服务器设置.您可以通过执行sp_helpdb找到它

exec sp_helpdb 'DBName'
Run Code Online (Sandbox Code Playgroud)


小智 6

保持简单:

use master
select DB.name, F.physical_name from sys.databases DB join sys.master_files F on DB.database_id=F.database_id
Run Code Online (Sandbox Code Playgroud)

这将返回包含相关文件的所有数据库