Вы находитесь на странице: 1из 13

ESTRUCTURAS LOGICAS DE ALMACENAMIENTO

En general el almacenamiento de los objetos de la base de datos (tablas e índices fundamentales)


no se realiza sobre el archivo o archivos físicos de la base de datos, sino que se hace a través de
estructuras lógicas de almacenamiento que tienen por debajo a esos archivos físicos y que
independizan por lo tanto las sentencias de creación de objetos de las estructuras físicas de
almacenamiento. Esto es útil porque permite que a esos “espacios de objetos” les sean asociados
nuevos dispositivos físicos (es decir más espacio en disco) de forma dinámica cuando la base de
datos crece de tamaño, más de lo previsto.

Permitiendo además lo siguiente:

 Asignar cuotas específicas de espacio a usuarios de la base de datos.


 Controlar la disponibilidad de los datos de la base de datos, poniendo fuera de uso alguno de
esos espacios de tablas individualmente.
 Realizar copias de seguridad o recuperaciones parciales de la base de datos.
 Reservar espacio para almacenamiento de datos de forma cooperativa entre distintos
dispositivos.

El administrador de la base de datos puede crear o borrar nuevos espacios lógicos de objetos, añadir
o eliminar archivos físicos de soporte, utilizarlos como espacio temporal de trabajo, definir
parámetros de almacenamiento para objetos destinados a ese espacio de datos.

En sql server nuestras estructuras lógicas de almacenamiento serian nuestras bases de datos y
nuestras estructuras físicas de almacenamiento serían los archivos .mdf, .ldf; en el caso de Oracle,
las estructuras de almacenamiento lógicas serían los tablespaces y las estructuras físicas de
almacenamiento serían los datafiles.

CREACION DE BASE DE DATOS

En la creación de una nueva base de datos es muy necesaria la configuración de las estructuras de
almacenamiento, recordemos que la arquitectura de almacenamiento de SQL Server distribuye la
información de la base de datos en diversos archivos de datos y de registro de transacciones, todos
los datos y objetos de la base de datos, como tablas, procedimientos almacenados, vistas y triggers
(disparadores), se almacenan en estos archivos, estos archivos son:

Archivos de datos primarios:


Archivo con extensión .mdf, que contiene la información de inicio para la base de datos y se utiliza
para almacenar los datos. Cada base de datos tiene un archivo de datos principal.

Archivos de datos secundarios:


Archivo con extensión .ndf, que contiene los datos que no caben en el archivo principal. Las bases
de datos no necesitan archivos de datos secundarios si el archivo principal puede contener todos
los datos, por lo tanto este archivo es opcional.

Archivos de registro de transacciones (Transaction Log):


Archivos con extensión .ldf que contienen la información de registro que se utiliza para recuperar la
base de datos. Cada base de datos debe tener al menos un archivo de registro.
Es importante recordar que SQL Server dispone de forma predeterminada de la base de datos
Model, que incluye las tablas del sistema y que se utiliza como plantilla cuando se crea una nueva
base de datos. La base de datos Model actua como un esqueleto sobre el que se genera la nueva
base de datos.

En cuanto al espacio ocupado por la base de datos, hay que tener presente que los datos se
almacenan en paginas (bloques de 8Kb de espacio contiguo) lo que implica un almacenamiento de
128 páginas por Megabyte.

PUNTOS IMPORTANTES A CONSIDERAR

El administrador puede crear grupos de archivos, para mejorar el rendimiento de la base de datos
la permitir crear la base de datos en diferentes discos. En este contexto un grupo de archivos
existente, excepto el principal, puede marcarse como de solo lectura, entonces para evitar
actualizaciones accidentales es conveniente colocar las tablas que no deban modificarse en uno o
varios grupos de archivos y marcarlos como de solo lectura.

En el archivo de transacciones se registra el inicio de cada transacción y los cambios de los datos,
facilitando con esto poder deshacer los cambios en la base de datos.

Dentro de este archivo (.ldf), cada cierto volumen de información registrada en el mismo, el
manejador graba un punto de comprobación (checkpoint). En dicho punto de comprobación el
SGBD, se asegura de que todos los registros del log de transacciones y las páginas de la base de
datos modificadas se escriban en el disco, por lo tanto este punto representa el aseguramiento de
la integridad de la información y es hasta donde se deberá hacer la recuperación de la información.
Para aumentar al máximo el rendimiento, cree archivos o grupos de archivos en tantos discos físicos
como estén disponibles y distribuya en grupos de archivos en tantos discos físicos como estén
disponibles, esto para que el rendimiento aumente debido a las operaciones de E/S en paralelo que
se realizan si los archivos se encuentran en discos físicos distintos.

ESTIMAR EL TAMAÑO DE LA BASE DE DATOS

 Total de datos a almacenar en las tablas, incluyendo la previsión de crecimiento


 El número de índices a utilizar sobre los tipos de datos de los campos
 El tamaño de las claves primarias
 El número de filas
 El tamaño del log de transacciones que depende sobre todo de la frecuencia de las
modificaciones, el tamaño de las transacciones, en este caso suele asignarse al log de
transacciones entre un 10 y 25% del tamaño de la base de datos.

CREACION DE LA BASE DE DATOS

CREATE DATABASE NombreBaseDatos


[ ON [PRIMARY]
NAME = nombreArchivoLógico [ ,...n ],
FILENAME = 'nombreArchivoSO',
SIZE = tamaño [ KB | MB | GB | TB ],
MAXSIZE = { tamañoMáximo [ KB | MB | GB | TB ] | UNLIMITED },
FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]

[ LOG ON
NAME = nombreArchivoLógico [ ,...n ],
FILENAME = 'nombreArchivoSO',
SIZE = tamaño [ KB | MB | GB | TB ],
MAXSIZE = { tamañoMáximo [ KB | MB | GB | TB ] | UNLIMITED },
FILEGROWTH = growth_increment [ KB | MB | GB | TB | % ] ]

NombreBaseDatos
Es el nombre de la nueva base de datos, deben ser únicos en un servidor y pueden tener hasta 128
caracteres, a menos que no se especifique ningún nombre lógico para el registro. Si no se especifica
ningún nombre lógico de archivo de registro, SQL Server genera un nombre lógico al anexar un sufijo
a NombreBaseDatos.

ON
Especifica que los archivos de disco utilizados para almacenar la parte de datos (archivos de datos)
se han definido explícitamente. La palabra clave va seguida de una lista delimitada por comas de
elementos que definen los archivos de datos del grupo de archivos principal.

PRIMARY
Especifica que la lista de archivos está asociada al grupo principal. Este grupo contiene todas las
tablas del sistema de base de datos. También contiene todos los objetos no asignados a los grupos
de archivos de usuario. El primer archivo especificado pasa a ser el archivo principal, el cual contiene
el inicio lógico de la base de datos y de las tablas del sistema. Una base de datos sólo puede tener
un archivo principal. Si no se especifica PRIMARY, el primer archivo enumerado en la instrucción
CREATE DATABASE se convierte en el archivo principal.

TAREA: investigar la definición completa de la página de Microsoft y comentar dicha definición.

CONSIDERACIONES

 En un servidor se puede especificar un máximo de 32,767 bases de datos.


 Cuando específica una instrucción CREATE DATABASE nombreBaseDatos sin parámetros
adicionales, la base de datos se crea con el mismo tamaño que model.
 Cada base de datos tiene un propietario con capacidad para realizar actividades especiales. El
propietario es el usuario que crea la base de datos, este propietario se puede cambiar mediante
sp_changedbowner.
 Para mostrar un informe de una base de datos o de todas las bases de datos de un servidor con
SQL Server, ejecute sp_helpdb.

sp_helpdb northwind
 Para obtener un informe acerca del espacio utilizado en una base de datos, emplee
sp_spaceused.

 Para obtener un informe de los grupos de archivos de una base de datos, utilice
sp_helpfilegroup, y utilice sp_helpfile para obtener el informe de los archivos de la base de
datos.

sp_helpfilegroup

sp_helpfile
¿Quiénes pueden crear bases de datos?

En forma predeterminada podrán hacerlos los usuarios que pertenecen al rol sysadmin y dbcreator.
Los miembros de las funciones fijas de servidor sysadmin y SecurityAdmin pueden conceder
permisos CREATE DATABASE a otros inicios de sesión. Los miembros de las funciones fijas de
servidor sysadmin y dbcreator pueden agregar otros inicios de sesión a la función dbcreator. El
permiso CREATE DATABASE debe concederse explícitamente; no se concede mediante la instrucción
GRANT ALL.

EJEMPLO 1:

create database prueba1

sp_helpdb prueba1

EJEMPLO 2:

Create Database Prueba2


On Primary
(NAME = 'Prueba2_Data',
FILENAME = 'C:\Prueba2_Data.Mdf',
SIZE = 10Mb,
MAXSIZE = 20Mb,
FILEGROWTH= 1Mb)

Una vez ejecutado la sentencia anterior entonces dentro de nuestra


unidad C:, deberemos tener algo similar a la imagen de la derecha.

sp_helpdb Prueba2
EJEMPLO 3

Crear la base de datos Prueba3 especificando un archivo de datos con un tamaño inicial de 15Mb,
un tamaño máximo de 30Mb y un crecimiento de 5Mb., el archivo de registro debe tener un tamaño
inicial de 5MB y uno máximo de 10MB, el crecimiento debe ser de 1MB.

Create Database Prueba3


On Primary
(NAME = 'Prueba3_Data',
FILENAME = 'C:\Prueba3_Data.Mdf',
SIZE = 15Mb,
MAXSIZE = 30Mb,
FILEGROWTH= 5Mb)
LOG ON
(NAME = 'Prueba3_Log',
FILENAME = 'C:\Prueba3_Log.ldf',
SIZE = 5Mb,
MAXSIZE = 10Mb,
FILEGROWTH= 1Mb)

sp_helpdb Prueba3

BITACORAS

Cada base de datos en SQL Server tiene un Transaction Log asociado con ella. El transaction log (en
español bitácora de transacciones) es un componente esencial de SQL Server, el cual la utiliza para
registrar un historial de cada modificación que sufre la base de datos como resultado de las
transacciones. Dicho registro es de vital importancia para mantener la integridad de los datos y
poder deshacer los cambios resultantes de transacciones incompletas ya sea por error del sistema
o por la cancelación por parte de los usuarios.
Durante la operación de la base de datos la escritura a la bitácora tiene prioridad, es decir, todos los
cambios primero se escriben a la bitácora y luego se aplican a la base de datos.

Debido a su importancia, es imperativo respaldar la bitácora regularmente ya que de no hacerlo,


será imposible recuperar la base de datos en caso de falla.
Qué tan frecuentemente hay que hacer los respaldos? La respuesta está en función de dos factores
principales:

Qué tan frecuentemente cambian los datos almacenados en la base de datos y qué tan sensible
es la organización a la pérdida de información.
Por ejemplo, si la base de datos almacena datos clínicos y la tasa de cambios es bastante alta, es
decir, se agrega y se cambia información constantemente, entonces los respaldos tendrán que
ocurrir con mayor frecuencia que cuando se trata de una base de datos que casi no cambia o cuya
información no es crítica para el negocio. Entre más frecuentes sean los respaldos, mayor protegidos
estaremos contra la pérdida de datos.

Tips Para Evitar Problemas Con La Bitácora


- No limites el tamaño de la bitácora. En lugar de limitar el tamaño del archivo en sí, mejor pon la
bitácora sola en una unidad dedicada y monitorea el espacio libre constantemente.

- Respalda la bitácora frecuentemente.


- Si vas a hacer cambios masivos de datos, utiliza comandos que no hagan uso de la bitácora.

BITACORAS PARA AUDITORIAS

Con el crecimiento de Internet, y el desarrollo de sistemas de información bajo la arquitectura


Cliente/Servidor, los sistemas de cómputo, en general, están expuestos a múltiples amenazas,
vulnerabilidades y ataques cada vez más complejos. Por lo tanto, es importante que las
organizaciones implementen bitácoras (o archivos logs) para almacenar los sucesos que ocurren en
el sistema. La información contenida en una bitácora es muy importante y útil cuando ocurre un
incidente de seguridad o cuando se realiza una auditoría de sistemas.

Una bitácora puede registrar mucha información acerca de eventos relacionados con el sistema que
la genera los cuales pueden ser:

 Fecha y hora.
 Host origen.
 Usuario.
 Actividad realizada.

La importancia de las bitácoras es la de recuperar información ante incidentes de seguridad,


detección de comportamiento inusual, información para resolver problemas, evidencia legal, es de
gran ayuda en las tareas de cómputo forense.

La estructura de la tabla bitácora sería la siguiente:

CREATE TABLE BITACORA


(
id int IDENTITY NOT NULL,
operacion varchar(10) DEFAULT NULL,
usuario varchar(40) DEFAULT NULL,
host varchar(30) NOT NULL,
modificado datetime DEFAULT NULL,
tabla varchar(40) NOT NULL,
PRIMARY KEY (id)
)
La bitácora debe registrar todos los movimientos (insertar, eliminar y modificar) que se realicen en
las tablas de la base de datos. Para lograr lo anterior es necesario crear un trigger para que se
ejecute después de la operación de insertar, otro para después de eliminar y el último para
después de modificar para cada una de las 3 tablas de la
Base de datos.
CREATE TRIGGER bit_carr_upd AFTER UPDATE ON carrera
AS
INSERT INTO bitacora(host, usuario, operacion, modificado, tabla) VALUES
@@SERVERNAME,SUSER_SNAME(), ‘ACTUALIZAR’, GETDATE(), ‘CARRERA’)

PARTICIONES:
Investigar:
Ventajas y desventajas de Particionar Tablas e Indices
Como se realizan las particiones en SQL Server
Instrucciones SQL

PARTICIONES (http://msdn.microsoft.com/es-es/library/ms188730.aspx)

Los datos en tablas e índices con particiones se dividen horizontalmente en unidades que pueden
propagarse por más de un grupo de archivos de la base de datos. Las particiones pueden hacer
que las tablas y los índices grandes sean más escalables y fáciles de administrar.

La creación de una tabla o índice con particiones tiene lugar normalmente en cuatro partes:

1. Crear un grupo o grupos de archivos y los archivos correspondientes que contendrán las
particiones especificadas por el esquema de partición.
2. Crear una función de partición que asigna las filas de una tabla o un índice a particiones
según los valores de una columna especificada.
3. Crear un esquema de partición que asigna las particiones de una tabla o índice con
particiones a los nuevos grupos de archivos.
4. Crear o modificar una tabla o un índice y especificar el esquema de partición como
ubicación de almacenamiento.

PERMISOS

La creación de una tabla con particiones requiere el permiso CREATE TABLE en la base de datos y el
permiso ALTER en el esquema en el que se crea la tabla. Crear un índice con particiones requiere el
permiso ALTER en la tabla o vista donde se crea el índice. Crear una tabla o índice con particiones
requiere alguno de los permisos adicionales siguientes:

Permiso ALTER ANY DATASPACE. Este permiso se concede de manera predeterminada a los
miembros del rol fijo de servidor sysadmin y a los roles fijos de base de
datos db_owner y db_ddladmin.
Permiso CONTROL o ALTER en la base de datos en la que se está creando la función de partición y
el esquema de partición.

Permiso CONTROL SERVER o ALTER ANY DATABASE en el servidor de la base de datos en la que se
está creando la función de partición y el esquema de partición.
FUNCION DE PARTICION
Crea una función en la base de datos actual que asigna las filas de una tabla o un índice a particiones
según los valores de una columna especificada. El uso de CREATE PARTITION FUNCTION constituye
el primer paso para la creación de una tabla o un índice con particiones.

CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type )


AS RANGE [ LEFT | RIGHT ]
FOR VALUES ( [ boundary_value [ ,...n ] ] )

partition_function_name
Es el nombre de la función de partición. Los nombres de las funciones de partición deben ser únicos
en la base de datos y ajustarse a las reglas para los identificadores.

input_parameter_type
Es el tipo de datos de la columna utilizada para la partición. Todos los tipos de datos,
excepto text, ntext, image, xml, timestamp, varchar(max),nvarchar(max), varbinary(max), los
tipos de datos de alias o los tipos definidos por el usuario CLR, se pueden utilizar como columnas de
partición.
La columna en sí, conocida como columna de partición, se especifica en la instrucción CREATE TABLE
o CREATE INDEX.

LEFT | RIGHT
Especifica el lado de cada intervalo de valores de límite, derecho o izquierdo, al que
pertenece boundary_value [ ,...n ], cuando Motor de base de datos ordena los valores del intervalo
en orden ascendente de izquierda a derecha. Si no se especifica, el valor predeterminado es LEFT.

EJEMPLOS

Crear una función de partición RANGE LEFT en una columna int

La siguiente función de partición realizará cuatro particiones en una tabla o un índice.

CREATE PARTITION FUNCTION myRangePF1 (int)


AS RANGE LEFT FOR VALUES (1, 100, 1000);

En la tabla siguiente se muestra cómo se crearían particiones en una tabla que usa esta función de
partición en la columna de partición col1.

Partición 1 2 3 4

Valores col1 <= 1 col1 > 1 AND col1 <= 100 col1 > 100 AND col1 <=1000 col1 > 1000

Crear una función de partición RANGE RIGHT en una columna int


CREATE PARTITION FUNCTION myRangePF2 (int)
AS RANGE RIGHT FOR VALUES (1, 100, 1000);

En la tabla siguiente se muestra cómo se crearían particiones en una tabla que usa esta función de
partición en la columna de partición col1.

Partición 1 2 3 4

Valores col1 < 1 col1 >= 1 AND col1 < 100 col1 >= 100 AND col1 < 1000 col1 >= 1000

Crear una función de partición RANGE RIGHT en una columna datetime

La siguiente función de partición divide una tabla o un índice en 12 particiones, una para cada mes
de un año natural de valores en una columna datetime.

CREATE PARTITION FUNCTION [myDateRangePF1] (datetime)


AS RANGE RIGHT FOR VALUES ('20030201', '20030301', '20030401',
'20030501', '20030601', '20030701', '20030801',
'20030901', '20031001', '20031101', '20031201');

En la tabla siguiente se muestra cómo se crearían particiones en una tabla o un índice que usa esta
función de partición en la columna de partición datecol.

Partición 1 2 ... 11 12

Valores datecol < February datecol >= February 1, datecol >= November 1, col1 >= December
1, 2003 2003 AND datecol< March 2003 AND col1 <December 1, 2003
1, 2003 1, 2003

Crear una función de partición en una columna char

La siguiente función de partición realiza cuatro particiones en una tabla o un índice.

CREATE PARTITION FUNCTION myRangePF3 (char(20))


AS RANGE RIGHT FOR VALUES ('EX', 'RXE', 'XR');

Partición 1 2 3 4

Valores col1 < EX... col1 >= EX AND col1 < RXE... col1 >= RXE AND col1 < XR... col1 >= XR
EJERCICIO

Creamos los grupos de archivos y los archivos correspondientes que contendrán las particiones
especificadas por el esquema de partición, donde cada archivo queda asociado con un grupo de
archivos.

CREATE DATABASE ADMINBD

ALTER DATABASE ADMINBD


ADD FILEGROUP fg1

ALTER DATABASE ADMINBD


ADD FILEGROUP fg2

ALTER DATABASE ADMINBD


ADD FILEGROUP fg3

ALTER DATABASE ADMINBD


ADD FILEGROUP fg4

ALTER DATABASE ADMINBD


ADD FILE
(
NAME = data1,
FILENAME = 'C:\DATA\t1data1.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP fg1;

ALTER DATABASE ADMINBD


ADD FILE
(
NAME = data2,
FILENAME = 'C:\DATA\t3data2.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP fg2;

ALTER DATABASE ADMINBD


ADD FILE
(
NAME = data3,
FILENAME = 'C:\DATA\t3data3.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP fg3;

ALTER DATABASE ADMINBD


ADD FILE
(
NAME = data4,
FILENAME = 'C:\DATA\t3data4.ndf',
SIZE = 5MB,
MAXSIZE = 100MB,
FILEGROWTH = 5MB
)
TO FILEGROUP fg4;

Creamos la función de partición que asigna las filas de una tabla o un índice a una partición
especifica según los valores de una columna especificada.

CREATE PARTITION FUNCTION FunRango (int)


AS RANGE LEFT FOR VALUES (1, 100, 1000) ;

Creamos el esquema de partición que asigna las particiones de una tabla o índice con particiones a
los nuevos grupos de archivos.

CREATE PARTITION SCHEME SchRango


AS PARTITION FunRango
TO (fg1, fg2, fg3, fg4);

Creamos la tabla a la cual asociamos el esquema de particiones.

CREATE TABLE TablaParticionada


(
col1 int PRIMARY KEY,
col2 char(10)
)
ON SchRango(col1);

Consulta para obtener las particiones de la tabla indicada

SELECT * FROM sys.partitions AS p


JOIN sys.tables AS t
ON p.object_id = t.object_id
WHERE p.partition_id IS NOT NULL
AND t.name = 'TablaParticionada';

Revisemos los datos y la partición donde se encuentra cada uno de los registros con la siguiente
instrucción

select *, $Partition.FunRango (col1) as "Particion"


from TablaParticionada
EJERCICIO EN CLASE:

Crear una tabla particionada que almacene la informacion correspondiente a un detalle de kardex,
para lo cual analice los posibles campos que conformaran dicha tabla, se debera generar una
particion para cada mes del anio, una vez hecho lo anterior genere diferentes inserciones sobre
dicha tabla y verifique que los registros esten almacenados dentro de las particiones definidas por
la funcion de particion la cual debera elaborar para implementar dichas particiones.

Elabore un reporte del ejercicio el cual debera ser entregado al profesor, dicho reporte debera
contener las instrucciones que utilizo para lograr el objetivo del ejercicio, asi tambien debera anexar
las pantallas cuando sea necesario de los resultados de la ejecucion de dichos comandos.

Reporte el espacio utilizado por la base de datos (Con comandos)


Asi como los archivos que se crearon de la misma (Con comandos)

Вам также может понравиться