sql >> Base de Datos >  >> RDS >> Sqlserver

Fundamentos de la gestión de archivos de datos en SQL Server

Introducción

Los archivos de datos son objetos físicos que constituyen la parte más importante del sistema de base de datos, ya que contienen datos reales. Puede pensar en una base de datos como una colección de archivos de datos. Una instancia le brinda los medios para montar y acceder a dichos archivos.

Aquí, administrar archivos de datos es comprender cómo monitorear y cambiar el tamaño de los archivos de datos existentes y cómo agregar o eliminar los archivos de datos de una base de datos.

Los códigos T-SQL para estas operaciones están presentes en la documentación de Microsoft. Sin embargo, en este artículo, nos gustaría discutir las tácticas en torno a la administración de estos archivos para aquellos de nosotros que aún ejecutamos instalaciones locales de SQL Server.

Tipos de archivos de datos y posibles problemas

Para cada nueva base de datos creada en SQL Server, debemos tener al menos dos archivos creados:un archivo de datos principal y un archivo de registro.

  • El archivo de datos principal tiene la extensión .MDF.
  • El archivo de registro tiene la extensión .LDF.
  • Cuando agregamos archivos de datos a una base de datos de SQL Server, generalmente usamos la extensión .NDF.

Nota :Es posible crear los archivos de datos en SQL Server sin ninguna extensión, pero esa no es la mejor práctica. El uso de .mdf, .ndf y .ldf sirve para distinguir estos archivos cuando los visualizamos a nivel de sistema operativo.

Obviamente, los archivos de datos se crean cuando crea una base de datos. Puedes hacerlo con CREAR BASE DE DATOS dominio. Si bien parece tan fácil, debe tener en cuenta los posibles problemas.

Según el tamaño de la base de datos y sus archivos de datos asociados, es posible que enfrente problemas de fragmentación y otros problemas con el tiempo de copia de seguridad y el movimiento de sus datos. Sucede que los archivos de datos no tienen el tamaño correcto.

Echa un vistazo a la ilustración de abajo. Muestra el resultado de ejecutar CREAR BASE DE DATOS y proporcionar el nombre de la base de datos (MyDB).

El Listado 1 muestra los detalles de la base de datos creada:

-- Listing 1: Create Database Script
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Quizás se pregunte de dónde obtuvo SQL Server todas esas opciones, ya que todo lo que hicimos fue crear CREATE DATABASE MyDB.

SQL Server usa la configuración de la base de datos modelo como valores predeterminados para cualquier nueva base de datos creada en esa instancia. En este caso vemos el tamaño de archivo inicial de 100 MB. El crecimiento automático es de 12 MB y 64 MB respectivamente para los archivos de datos y de registro.

Los problemas resultantes

Las implicaciones de las configuraciones resaltadas en la Figura 1 son:

  1. El archivo de datos principal comienza con un tamaño de 100 MB. Es un tamaño pequeño. Por lo tanto, dependiendo del nivel de actividad en la base de datos, deberá crecer muy pronto.
  2. Siempre que sea necesario aumentar automáticamente el archivo de datos, el servidor SQL necesita adquirir 128 MB del espacio disponible en el sistema operativo. Nuevamente, es pequeño, lo que implica que la base de datos crecerá automáticamente con frecuencia . El crecimiento de la base de datos es una operación costosa que puede afectar el rendimiento si ocurre con demasiada frecuencia. Además, el crecimiento frecuente de la base de datos puede causar un fenómeno llamado fragmentación que, a su vez, tiene la habilidad de causar una degradación severa del rendimiento de las bases de datos. El otro extremo de establecer el incremento en un valor alto puede provocar que las operaciones de crecimiento tarden mucho en completarse, según el rendimiento del sistema de almacenamiento subyacente.
  3. Los archivos de la base de datos pueden crecer indefinidamente. Significa que, con suficiente tiempo permitido, estos archivos pueden consumir todo el espacio en el volumen donde se encuentran. Para moverlos, necesita un volumen de su tamaño o más. Otra opción es agregar almacenamiento al volumen cuando estos archivos están sentados.

Estos son problemas clave asociados con la dependencia de valores predeterminados para crear bases de datos.

Asignación previa

Dado el impacto del crecimiento en el rendimiento, tendría más sentido dimensionar correctamente la base de datos al comienzo del proyecto. De esta manera, nos adaptamos a los requisitos de la solución para el futuro previsible.

Supongamos que sabemos que nuestra base de datos finalmente tendrá un tamaño de 1 GB. Podríamos asignar 1 GB de almacenamiento cuando comience el proyecto. Entonces, la base de datos nunca necesita crecer. Elimina los problemas de fragmentación causados ​​por el crecimiento de la base de datos.

El Listado 2 muestra el script aplicable para esta preasignación:

-- Listing 2: Create Database Script with Pre-allocation
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 1024MB , MAXSIZE = 2048MB, FILEGROWTH = 512MB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Mencionamos 1 GB de espacio para fines de demostración. Por lo general, una base de datos de producción puede requerir 1 TB. El punto es:asignar el espacio necesario al principio. Entonces elimina o reduce significativamente la necesidad de crecimiento.

Ahora, debemos preguntarnos si realmente queremos un solo archivo de 1 TB en nuestro volumen. Sería prudente dividirlo en partes más pequeñas. Cuando se realizan operaciones paralelas, como las copias de seguridad, cada archivo será direccionado por un solo subproceso de CPU para un sistema multiprocesador. Con un solo archivo, no iría bien.

Nuevamente, modificamos nuestro script para acomodar este requisito en el Listado 3:

-- Listing 3: Create Database Script with Pre-allocation and 
USE [master]
GO

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.mdf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) 
( NAME = N'MyDB03', FILENAME = N'C:\MSSQL\Data\MyDB03.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB04', FILENAME = N'C:\MSSQL\Data\MyDB04.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB ) ,
( NAME = N'MyDB05', FILENAME = N'C:\MSSQL\Data\MyDB05.ndf' , SIZE = 256MB , MAXSIZE = 512MB, FILEGROWTH = 512MB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 512MB , MAXSIZE = 2048GB , FILEGROWTH = 512MB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Información adicional

También debemos mencionar que no tiene ningún valor usar este enfoque para los archivos de registro. La cuestión es que SQL Server siempre escribe en los archivos de registro de forma secuencial. Además, hemos utilizado la extensión .ndf para los nuevos archivos que estamos agregando.

La cláusula MAXSIZE garantiza que nuestros archivos de datos no crezcan indefinidamente. Le hemos dado a cada archivo un nombre lógico y físico diferente:la cláusula NAME especifica el nombre lógico del archivo y la cláusula FILENAME especifica el nombre físico.

Crear una base de datos con archivos de datos más grandes llevará más tiempo que de otra manera. Puede que sea más razonable crear primero una base de datos pequeña y luego manipularla con los comandos apropiados para cambiar el tamaño y agregar archivos, hasta que establezcamos una estructura de base de datos ideal.

Al crear la base de datos con opciones explícitas, hemos abordado las tres inquietudes planteadas anteriormente en este artículo. La Figura 2 muestra el resultado de este enfoque:

Ahora tenemos una base de datos correctamente configurada para acomodar el crecimiento de datos durante un período prolongado sin necesidad de crecimiento de archivos de datos. Elimina los riesgos de fragmentación y ayuda a garantizar una mejor gestión de los archivos de datos.

Administración de archivos de datos

En lugar de crear cuatro o cinco archivos de datos en la declaración CREATE DATABASE, podemos usar las cláusulas MODIFY y ADD de la declaración ALTER DATABASE T-SQL.

Una vez más, comenzamos con la declaración que se muestra en el Listado 4 a continuación. Crea una única base de datos con el archivo de datos de 100 MB y un archivo de registro adjunto. Nuestro objetivo es garantizar la preasignación ampliando este archivo y luego agregando más archivos.

-- Listing 4: Create Database Script
USE [master]
GO

IF EXISTS (SELECT * FROM sys.databases WHERE name='MyDB')
DROP DATABASE MyDB;

/****** Object:  Database [MyDB]    Script Date: 29/11/2020 10:38:18 pm ******/
CREATE DATABASE [MyDB]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'MyDB', FILENAME = N'C:\MSSQL\Data\MyDB.mdf' , SIZE = 102400KB , MAXSIZE = UNLIMITED, FILEGROWTH = 131072KB )
 LOG ON 
( NAME = N'MyDB_log', FILENAME = N'E:\MSSQL\Log\MyDB_log.ldf' , SIZE = 102400KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
GO

IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [MyDB].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO

Extender archivos de datos

La instrucción T-SQL que amplía un archivo de datos se muestra en el Listado 5. Especifica el nombre de la base de datos, el nombre del archivo y el tamaño inicial y el incremento deseados. En este caso, configuramos SQL Server para asignar 1 GB al inicio y luego asignamos 512 MB para todos los crecimientos automáticos posteriores.

-- Listing 5: Extend the Primary Datafile
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , FILEGROWTH = 524288KB )
GO

El Listado 6 muestra cómo se vería el código si especificamos el TAMAÑO MÁXIMO de 2 GB:

-- Listing 6: Extend the Primary Datafile with Maximum Size
USE [master]
GO
ALTER DATABASE [MyDB] MODIFY FILE ( NAME = N'MyDB', SIZE = 1048576KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB )
GO

Si configuramos la cláusula FILEGROWTH en 0, configuraremos nuestro servidor SQL para que NO aumente automáticamente el archivo de datos . En este caso, necesitamos emitir comandos explícitamente para hacer crecer el archivo de datos o agregar otros archivos.

Adición de archivos de datos

El Listado 7 muestra el código que usamos para agregar un nuevo archivo de datos a la base de datos. Tenga en cuenta que debemos especificar nuevamente el nombre del archivo lógico y el nombre del archivo físico que incluye una ruta completa.

Además, podemos colocar el archivo físico en un volumen diferente. Para eso, solo necesitamos cambiar la ruta.

-- Listing 7: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB01', FILENAME = N'C:\MSSQL\Data\MyDB01.ndf' , SIZE = 1048576KB , FILEGROWTH = 524288KB ) TO FILEGROUP [PRIMARY]
GO

Ampliar y agregar archivos de datos también se aplica al escenario en el que elegimos deshabilitar el crecimiento automático para nuestras bases de datos (consulte la Figura 4).

Luego necesitamos ampliar la base de datos manualmente usando los códigos anteriores de los Listados 5 o 6, o agregar archivos como en el Listado 7.

Uso de grupos de archivos

Los grupos de archivos nos permiten administrar las colecciones de archivos de datos juntos. Podemos agrupar lógicamente algunos archivos de datos almacenados en diferentes discos o diferentes volúmenes en un grupo de archivos. Ese grupo de archivos crea una capa de abstracción entre las tablas y los índices, y los archivos físicos reales que almacenan los datos.

Por lo tanto, si creamos una tabla en un grupo de archivos, los datos de esta tabla se distribuirán entre todos los archivos de datos asignados al grupo de archivos.

Hasta este punto, hemos estado tratando solo con el grupo de archivos PRIMARIO. El Listado 8 muestra cómo podemos agregar un nuevo archivo MyDB02 a un grupo de archivos, que no sea el grupo de archivos principal.

La primera declaración después de configurar el contexto de la base de datos como maestro crea el nuevo grupo de archivos FG01. La siguiente instrucción luego agrega el archivo a este nuevo grupo de archivos con opciones similares a las utilizadas en el Listado 7.

-- Listing 8: Add Data Files to the Primary Filegroup
USE [master]
GO
ALTER DATABASE [MyDB] ADD FILEGROUP [FG01]
GO
ALTER DATABASE [MyDB] ADD FILE ( NAME = N'MyDB02', FILENAME = N'C:\MSSQL\Data\MyDB02.ndf' , SIZE = 102400KB , MAXSIZE = 2097152KB , FILEGROWTH = 524288KB ) TO FILEGROUP [FG01]
GO

Soltar archivos de datos

La figura 5 muestra el resultado de las operaciones que hemos realizado hasta ahora. Tenemos tres archivos de datos. Dos de ellos están en el grupo de archivos PRIMARIO y el tercero está en el grupo de archivos FG01.

Supongamos que hemos hecho algo mal, por ejemplo, establecer el tamaño de archivo incorrecto. Luego, podemos soltar el grupo de archivos usando el siguiente código en el Listado 9:

-- Listing 9: Drop Data Files
USE [MyDB]
GO
ALTER DATABASE [MyDB]  REMOVE FILE [MyDB02]
GO

Conclusión

Este artículo exploró los tipos de archivos de la base de datos, las posibles complicaciones causadas por el crecimiento de los archivos de datos y las formas de resolver el problema. Además, examinamos los códigos T-SQL para extender archivos de datos y agregar nuevos archivos de datos a una base de datos. También mencionamos el uso de grupos de archivos.

Nuestro objetivo es garantizar que cuando implementamos bases de datos, las preparamos para almacenar todos los datos que necesitará para una aplicación en particular.

Referencias

  1. Archivos de base de datos y grupos de archivos