#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;
}