Removing Offline Databases and Orphaned Data Files from SQL Server

Removing Offline Databases and Orphaned Data Files from SQL Server

Removing Offline Databases and Orphaned Data Files from Your SQL Server What Is an Orphaned Data File? Orphaned database files are files that aren’t associated with any attached (live) database. Sometimes when you drop a database from a SQL Server instance, the underlying files aren’t removed. If you’re managing a lot of development and test […]

November 24, 2021

Removing Offline Databases and Orphaned Data Files from Your SQL Server

What Is an Orphaned Data File?

Orphaned database files are files that aren’t associated with any attached (live) database.

Sometimes when you drop a database from a SQL Server instance, the underlying files aren’t removed.

If you’re managing a lot of development and test environments, this can definitely happen.

It usually happens when you take a database offline and forget to bring it back online before dropping it.

Why Should You Care About This?

Offline databases and leftover files may be needlessly taking up space on your SQL Server storage.

How Do You Check for Them?

Offline Databases

Run the script below to list every offline database on your setup.

SELECT

'DB_NAME' = db.name,

'FILE_NAME' = mf.name,

'FILE_TYPE' = mf.type_desc,

'FILE_PATH' = mf.physical_name

FROM sys.databases db

INNER JOIN sys.master_files mf ON db.database_id = mf.database_id

WHERE db.state = 6

Orphaned Database Files

You can run the script below to find leftover database files on an instance.

DECLARE @DefaultDataPath VARCHAR(512), @DefaultLogPath VARCHAR(512);

 

SET @DefaultDataPath = CAST(SERVERPROPERTY('InstanceDefaultDataPath') AS VARCHAR(512));

SET @DefaultLogPath = CAST(SERVERPROPERTY('InstanceDefaultLogPath') AS VARCHAR(512));

 

IF OBJECT_ID('tempdb..#OrphanedDataFiles') IS NOT NULL

DROP TABLE #OrphanedDataFiles;

 

CREATE TABLE #OrphanedDataFiles (

Id INT IDENTITY(1,1),

[FileName] NVARCHAR(512),

Depth smallint,

FileFlag bit,

Directory VARCHAR(512) NULL,

FullFilePath VARCHAR(512) NULL);

 

INSERT INTO #OrphanedDataFiles ([FileName], Depth, FileFlag)

EXEC MASTER..xp_dirtree @DefaultDataPath, 1, 1;

 

UPDATE #OrphanedDataFiles

SET Directory = @DefaultDataPath, FullFilePath = @DefaultDataPath + [FileName]

WHERE Directory IS NULL;

 

INSERT INTO #OrphanedDataFiles ([FileName], Depth, FileFlag)

EXEC MASTER..xp_dirtree @DefaultLogPath, 1, 1;

 

UPDATE #OrphanedDataFiles

 

SET Directory = @DefaultLogPath, FullFilePath = @DefaultLogPath + [FileName]

WHERE Directory IS NULL;

 

SELECT

f.[FileName],

f.Directory,

f.FullFilePath

FROM #OrphanedDataFiles f

LEFT JOIN sys.master_files mf ON f.FullFilePath = REPLACE(mf.physical_name,'', '')

WHERE mf.physical_name IS NULL AND f.FileFlag = 1

ORDER BY f.[FileName], f.Directory

 

DROP TABLE #OrphanedDataFiles;

You can also do this using dbatools (PowerShell).

SQL Server Consulting

Need expert support for SQL Server?

Our senior database team supports SQL Server performance tuning, health checks, migrations, Remote DBA services and urgent operational issues.

Explore Services

How Do You Fix It?

Since they’re still offline, they’re probably not needed.

  1. Consider removing the files.
  2. If there’s a chance you might need something from them, back them up first.

SQL Server Backup Consulting

Does Your Backup Policy Meet Your Data Loss Risk?

Aryasoft builds a backup strategy aligned with your RPO/RTO targets, audits your existing backup policy, and plans recovery testing.

Get SQL Server Support

4.7/5