AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 84611
Accepted
Im88
Im88
Asked: 2014-12-09 08:05:28 +0800 CST2014-12-09 08:05:28 +0800 CST 2014-12-09 08:05:28 +0800 CST

查找数据库默认位置

  • 772

我正在创建一个脚本以将数据库从备份文件恢复到实例的默认位置,该位置远离系统数据库安装文件夹。

目前,我正在使用查找默认DATA位置

 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

和默认LOG位置

 SELECT SUBSTRING(physical_name, 1, CHARINDEX(N'mastlog.ldf', LOWER(physical_name)) - 1)
    FROM master.sys.master_files
    WHERE database_id = 1
        AND file_id = 2
    )

有没有其他方法可以在查询的帮助下找到数据库默认位置?

谢谢你的时间。

sql-server sql-server-2008-r2
  • 3 3 个回答
  • 2205 Views

3 个回答

  • Voted
  1. RLF
    2014-12-09T08:17:09+08:002014-12-09T08:17:09+08:00

    大多数 SQL Server 配置为使非系统数据库与系统数据库分开存在。这就是默认路径的通常含义。

    您可以在以下位置查找一些代码以找到它:

    http://www.codeproject.com/Articles/684020/Checking-MS-SQL-Server-database-files-default-path

    此外,Alex Aza 在 StackOverflow 上提供了一篇受欢迎的帖子。关键是从存储它们的注册表项中获取数据。这是 Alex 较长脚本的一个片段:

    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
    
    • 5
  2. LowlyDBA - John M
    2014-12-09T08:19:50+08:002014-12-09T08:19:50+08:00

    您不会希望使用此方法,因为主数据库文件的位置不一定表示默认位置。例如,我将我的主数据库文件指定在单独的驱动器上,而所有用户数据库都默认为另一个。

    您可以使用 SQLandMe中的以下查询来查找默认数据库位置:

    CREATE TABLE #tempInstanceNames
     (
      InstanceName      NVARCHAR(100),
      RegPath           NVARCHAR(100),
      DefaultPath   NVARCHAR(MAX)
     )
    
    INSERT INTO #tempInstanceNames (InstanceName, RegPath)
    EXEC   master..xp_instance_regenumvalues
       @rootkey = N'HKEY_LOCAL_MACHINE',
       @key     = N'SOFTWARE\\Microsoft\\Microsoft SQL Server\\Instance Names\\SQL'
    
    DECLARE     @SQL VARCHAR(MAX)
    SET         @SQL = 'DECLARE @returnValue NVARCHAR(100)'
    SELECT @SQL = @SQL + CHAR(13) +
    'EXEC   master.dbo.xp_regread
    @rootkey      = N''HKEY_LOCAL_MACHINE'',
    @key          = N''SOFTWARE\Microsoft\Microsoft SQL Server\' + RegPath + '\MSSQLServer'',
    @value_name   = N''DefaultData'',
    @value        = @returnValue OUTPUT;
    
    UPDATE #tempInstanceNames SET DefaultPath = @returnValue
    WHERE RegPath = ''' + RegPath + '''' + CHAR(13) FROM #tempInstanceNames
    
    EXEC (@SQL)
    
    SELECT      InstanceName, RegPath, DefaultPath
    FROM        #tempInstanceNames
    

    以及以下日志位置:

    DECLARE     @SQL VARCHAR(MAX)
    SET         @SQL = 'DECLARE @returnValue NVARCHAR(100)'
    SELECT @SQL = @SQL + CHAR(13) +
    'EXEC   master.dbo.xp_regread
    @rootkey      = N''HKEY_LOCAL_MACHINE'',
    @key          = N''SOFTWARE\Microsoft\Microsoft SQL Server\' + RegPath + '\MSSQLServer'',
    @value_name   = N''DefaultLog'',
    @value        = @returnValue OUTPUT;
    
    UPDATE #tempInstanceNames SET DefaultPath = @returnValue
    WHERE RegPath = ''' + RegPath + '''' + CHAR(13) FROM #tempInstanceNames
    
    EXEC (@SQL)
    
    SELECT      InstanceName, RegPath, DefaultPath
    FROM        #tempInstanceNames
    
    • 4
  3. Best Answer
    Aaron Bertrand
    2014-12-09T08:30:22+08:002014-12-09T08:30:22+08:00

    您当前的方法将不起作用,因为它假定它master被放置在默认数据/日志路径中,它在任何时候都没有被移动,并且从那时起默认值没有改变。

    注册表方法有效,但它们有点乏味(特别是如果您不使用特定于实例的 XP 并且必须自己提供注册表路径),谁知道这是否是始终存储位置的位置。

    另一种方法 - 假设模型没有荒谬的文件大小设置 - 只是临时创建一个数据库并查看 SQL Server 默认放置它的位置。

    USE master;
    GO
    CREATE DATABASE [!#floobernuggets];
    GO
    SELECT 
      [type] = CASE [type] WHEN 1 THEN 'data' ELSE 'log' END,
      [path] = SUBSTRING(physical_name, 1, 
        CHARINDEX(N'!#floobernuggets', physical_name)-1)
      FROM sys.master_files
      WHERE database_id = DB_ID(N'!#floobernuggets')
      ORDER BY [type];
    GO
    DROP DATABASE [!#floobernuggets];
    GO
    

    (这也假设您的默认路径实际上并不包含该字符串!#floobernuggets,并且您没有任何奇怪的警报或任何因实际创建数据库而触发的东西。)

    当然,正如 Kin在 SQL Server 2012 中指出的那样,您将能够使用SERVERPROPERTY它。

    SELECT [data] = SERVERPROPERTY('InstanceDefaultDataPath'), 
           [log]  = SERVERPROPERTY('InstanceDefaultLogPath');
    
    • 3

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve