Есть ли способ быстро определить, какая база данных, если таковая имеется, присоединена к файлу .mdf?

#sql #sql-server #sql-server-2005 #sql-server-2008 #mdf

#sql #sql-server #sql-server-2005 #sql-server-2008 #mdf

Вопрос:

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

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

Ответ №1:

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

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

 SELECT
   DB_NAME(database_id), physical_name
FROM
   sys.master_files
  

Ответ №2:

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

 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:

 select db_name(database_id), * from sys.master_files
  

Отобразит список всех файлов всех баз данных, известных в системе.

Ответ №4:

Для этого также можно использовать OrcaMDF:

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

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

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

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

Ответ №5:

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

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

 cd X:TheDirWhereMDFFileAre
mkdir UnusedMdf
move *.mdf UnusedDBFiles
move *.ldf UnusedDBFiles
  

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

Комментарии:

1. Что произойдет, если ваш SQL Server был выключен? Я предполагаю, что все файлы перемещены, а затем ваш сервер не сможет перезапуститься…

2. Зачем запускать что-то подобное, когда SQL не работает, поскольку вся цель этого — найти, какие файлы не используются SQL Server. Кроме того, если кто-то допустит ошибку, файлы будут только «перемещены», а не удалены. Переместите их обратно!

Ответ №6:

 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;

        }