获取 MSSQL Server 命名实例上的数据库大小

Hop*_*00b 6 sql-server t-sql sql-server-2008-r2

我需要获取 SQL 服务器迁移项目的数据库大小列表。我们要迁移的 SQL Server 服务器安装了三个实例,一个是默认实例,两个是命名实例。如果重要的话,它在 Server 2008 R2 上运行 SQL Server 2008 R2。

为了得到这个列表,我删除了我在上一个职位上作为事实上/意外 DBA 使用的旧 T-SQL“脚本”,它在默认实例上按预期工作,但没有返回任何一个命名实例的数据。

SELECT [Database Name] = DB_NAME(database_id),

   [Type] = CASE WHEN Type_Desc = 'ROWS' THEN 'Data File(s)'

                 WHEN Type_Desc = 'LOG'  THEN 'Log File(s)'

                 ELSE Type_Desc END,

   [Size in MB] = CAST( ((SUM(Size)* 8) / 1024.0) AS DECIMAL(18,2) )

FROM   sys.master_files

GROUP BY      GROUPING SETS

          (

                 (DB_NAME(database_id), Type_Desc),

                 (DB_NAME(database_id))

          )

ORDER BY      DB_NAME(database_id), Type_Desc DESC

GO
Run Code Online (Sandbox Code Playgroud)

有人可以告诉我原因(以及如何解决),或提出更好的解决方案吗?

(它一定是FROM sys.master_files一点,因为它还能是什么,但我不确定我应该在命名实例上使用什么。)

编辑:下面是我在我的命名实例上看到的内容,无论如何......所以如果这段代码确实/应该适用于命名实例,那么关于它为什么不适用于这些实例的想法将不胜感激。

截图

Kin*_*hah 10

如果您只需要整个数据库的大小,那么下面的脚本将为您提供帮助:

SELECT  @@servername as server_name,
        d.name,
        CONVERT(DECIMAL(10,2),(SUM(size * 8.00) / 1024.00)) Size_MBs
FROM    sys.master_files mf
        INNER JOIN sys.databases d ON d.database_id = mf.database_id
WHERE   d.database_id > 4 -- Skip system databases
AND     d.state_desc = 'ONLINE'-- ONLY get size for ONLINE database.
GROUP BY d.name
ORDER BY d.name
Run Code Online (Sandbox Code Playgroud)

如果您想自动将数据库从一台服务器迁移到另一台服务器,我强烈建议您使用sqlmigration - 一种将您的数据库、作业、登录名等从一台服务器迁移到另一台服务器的 powershell 脚本。此外,如果您要从 sql server 的一个版本迁移到更高版本(2012 或 2014),请注意迁移前和迁移后的步骤

根据您的数据库大小和停机时间,您可以实施多种方法来最大限度地减少整个迁移的停机时间 - 例如使用日志传送或镜像,然后在切换期间,仅故障转移到新服务器等。

始终准备并测试您的迁移和回滚过程。

编辑:从您的屏幕截图来看,您似乎没有权限。你能不能做一个select * from sys.master_files

  • 从您的屏幕截图来看,您似乎没有权限。你能做一个`select * from sys.master_files`吗 (3认同)