How do I find the data directory for a SQL Server instance?

后端 未结 15 2464
挽巷
挽巷 2020-11-30 23:16

We have a few huge databases (20GB+) which mostly contain static lookup data. Because our application executes joins against tables in these databases, they have t

相关标签:
15条回答
  • 2020-11-30 23:58

    Various components of SQL Server (Data, Logs, SSAS, SSIS, etc) have a default directory. The setting for this can be found in the registry. Read more here:

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

    So if you created a database using just CREATE DATABASE MyDatabaseName it would be created at the path specified in one of the settings above.

    Now, if the admin / installer changed the default path, then the default path for the instance is stored in the registry at

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

    If you know the name of the instance then you can query the registry. This example is SQL 2008 specific - let me know if you need the SQL2005 path as well.

    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
    

    Each database can be created overriding the server setting in a it's own location when you issue the CREATE DATABASE DBName statement with the appropriate parameters. You can find that out by executing sp_helpdb

    exec sp_helpdb 'DBName'
    
    0 讨论(0)
  • 2020-11-30 23:59
    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\%'
    

    You can download detail SQL script from how to find the data directory for a SQL Server instance

    0 讨论(0)
  • 2020-12-01 00:05

    Small nitpick: there is no data folder, only a default data folder.

    Anyway, to find it, assuming you want to install for the first default instance:

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

    If there's a named instance, MSSQL.1 becomes something like MSSQL10.INSTANCENAME.

    0 讨论(0)
  • 2020-12-01 00:07

    Alex's answer is the right one, but for posterity here's another option: create a new empty database. If you use CREATE DATABASE without specifying a target dir you get... the default data / log directories. Easy.

    Personally however I'd probably either:

    • RESTORE the database to the developer's PC, rather than copy/attach (backups can be compressed, exposed on a UNC), or
    • Use a linked server to avoid doing this in the first place (depends how much data goes over the join)

    ps: 20gb is not huge, even in 2015. But it's all relative.

    0 讨论(0)
  • 2020-12-01 00:08

    Keeping it simple:

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

    this will return all databases with associated files

    0 讨论(0)
  • 2020-12-01 00:09

    You will get default location if user database by this query:

    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'
    
    0 讨论(0)
提交回复
热议问题