2011-05-19 20 views
5

Supongamos que SQL Server 2005/2008 cuenta con una gran cantidad de bases de datos. ¿Hay alguna forma de saber rápidamente qué base de datos, si corresponde, está adjuntada a un archivo .mdf en particular?¿Hay alguna forma de saber rápidamente qué base de datos, si corresponde, está adjuntada a un archivo .mdf?

Hemos eliminado algunas bases de datos a lo largo del tiempo y nos gustaría limpiar algunas .mdf persistentes para despejar espacio en el servidor. Actualmente, la única forma que conozco es mirar las propiedades de cada base de datos, una por una, en Management Studio y hacer una lista de los archivos a los que están conectados. Buscando algo un poco más eficiente que esto, si algo existe.

Respuesta

9

Esto puede ayudar.

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 
1

Solución de baja tecnología ... mueva el archivo mdf a otra ubicación. Si está unido, el servidor SQL no dejaría que lo mueve :)

el símbolo del sistema

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

Todos los archivos no utilizados serían trasladados a UnusedDBFiles.

+0

¿Qué ocurre si se ha cerrado el servidor SQL? Supongo que todos los archivos se movieron y luego su servidor no podrá reiniciar ... – Tony

+0

¿Por qué uno ejecutaría algo como esto cuando SQL está caído ya que el propósito de esto es encontrar qué archivos ** no ** se están usando? por el servidor SQL. Además, si alguien comete el error, los archivos solo se "mueven" y no se eliminan. ¡Muévelos de regreso! –

+0

+1 para baja tecnología –

3

También se puede usar para este OrcaMDF:

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

Esto va a permitir realizar consultas de los mdf para su nombre de la base de datos sin conectar al servidor de base de datos. Tenga en cuenta que esto debe hacerse en el archivo de datos principal, en caso de que haya varios archivos. Descargo de responsabilidad: soy el autor de OrcaMDF.

Al recorrer todos los archivos en el directorio de datos, sería fácil unirse a sys.databases y ver cuáles no coinciden, y por lo tanto son archivos mdf no adjuntos.

Editar: Publicado un ejemplo más a fondo en mi blog: http://improve.dk/archive/2011/05/19/checking-which-database-is-stored-in-a-deattached-mdf-file.aspx

8

sys.master_files contiene una fila por cada base de datos para el primer archivo (id = 1) para que la base de datos. Es decir, las tablas del sistema siempre estará en fileid = 1 para cada base de datos

Esto es todo lo que necesita:

SELECT 
    DB_NAME(database_id), physical_name 
FROM 
    sys.master_files 
3
select db_name(database_id), * from sys.master_files 

una lista de todos los archivos de todas las bases de datos conocidas en el sistema.

0
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; 

     } 
Cuestiones relacionadas