Любой способ быстро определить, какая база данных, если таковая имеется, прикреплена к файлу .mdf? - PullRequest
6 голосов
/ 19 мая 2011

Предположим, SQL Server 2005/2008 с большим количеством баз данных.Есть ли способ быстро определить, какая база данных, если таковая имеется, прикреплена к конкретному файлу .mdf?

Мы со временем удалили некоторые базы данных и хотели бы очистить некоторые устаревшие файлы .mdf, чтобы освободить место на сервере.В настоящее время я знаю только один способ - просмотреть свойства каждой базы данных, одну за другой, в Management Studio и составить список файлов, к которым они прикреплены.Ищете что-то более эффективное, чем это, если что-то существует.

Ответы [ 6 ]

9 голосов
/ 19 мая 2011

sys.master_files содержит одну строку на базу данных для первого файла (id = 1) для этой базы данных. То есть системные таблицы всегда будут в fileid = 1 для каждой базы данных

Это все, что вам нужно:

SELECT
   DB_NAME(database_id), physical_name
FROM
   sys.master_files
9 голосов
/ 19 мая 2011

Это может помочь.

declare @files table (
    db_name sysname,
    physical_name nvarchar(260)
)

insert into @files
    exec sp_MSforeachdb 'select "?", physical_name from ?.sys.database_files'

select db_name, physical_name 
    from @files
3 голосов
/ 19 мая 2011
select db_name(database_id), * from sys.master_files

Перечислит все файлы всех баз данных, известных в системе.

3 голосов
/ 19 мая 2011

Вы также можете использовать OrcaMDF для этого:

using (var file = new MdfFile(@"C:\Database.mdf"))
{
    var bootPage = file.GetBootPage();
    Console.WriteLine(bootPage.DatabaseName);
}

Это позволит вам запрашивать у mdf имена их баз данных, не подключая их к серверу баз данных.Обратите внимание, что это должно быть сделано в основном файле данных, если имеется несколько файлов.Отказ от ответственности - я автор OrcaMDF.

Циклически просматривая все файлы в каталоге данных, было бы легко объединить их с sys.databases и посмотреть, какие из них не совпадают, и, следовательно,неприкрепленные файлы mdf.

Редактировать: Разместил более подробный пример в моем блоге: http://improve.dk/archive/2011/05/19/checking-which-database-is-stored-in-a-deattached-mdf-file.aspx

1 голос
/ 19 мая 2011

Низкотехнологичное решение ... переместите файл mdf в другое место. Если он подключен, SQL-сервер не позволит вам переместить его:)

Из командной строки

cd X:\TheDir\Where\MDF\File\Are
mkdir UnusedMdf
move *.mdf UnusedDBFiles
move *.ldf UnusedDBFiles

Все неиспользуемые файлы будут перемещены в UnusedDBFiles.

0 голосов
/ 05 августа 2015
private bool IsDbAttached()
        {
            const string isAttachedSqL = @"SELECT count(*)
                                        FROM sys.master_files
                                        WHERE  DB_NAME(database_id) = @DbName";

            bool isAttached = false;
            try
            {
                using (var connection = new SqlConnection(this.connectionString))
                using (var command = new SqlCommand(isAttachedSqL, connection))
                {
                    command.Parameters.Add("@DbName", SqlDbType.VarChar).Value = "dbName";
                    connection.Open();
                    var count = command.ExecuteScalar();
                    isAttached = (int)count > 0;
                }
            }
            catch
            {
                throw;
            }

            return isAttached;

        }
...