Vous êtes sur la page 1sur 5

Como crear un respaldo completo en SQL Server

SQL Server - Administracin


Jueves, 02 de Febrero de 2006 18:00
Hacer un respaldo en SQL Server 2000 es muy sencillo, sin embargo lo que importa es el saber de que forma nos vamos a recuperar en dado caso que
lo necesitemos. Para ello siempre es recomendable saber que tipo de recuperacin tenemos configurada.
Simple: Este es el modo de recuperacin ms sencillo que tiene sqlserver y ms fcil de administrar. En este no es posible respaldar el log de
transacciones ya que la base de datos limpia por completo el log de transacciones cada vez que hace un checkpoint.
Full: Este modo es el que requiere de una mayor administracin de SQL Server pero es la manera ms segura de recuperarnos de una falla, pues es
posible recuperar hasta la ltima transaccion antes de que se presentara el problema.
Bulk-Logged: En este modo tambin es posible recuperar la ltima transaccin pero la diferencia que tiene con la Full, es que esta casi no ocupa mucho
log de transacciones, pero a la hora de hacer el respaldo este va a ser ms grande que lo que muestra el log. Esto se debe a que solo guarda las
direcciones de las pginas donde se han llevado a cabo los cambios, pero a la hora de hacer el respaldo a disco se guardan los datos que cambiaron, de
ahi su incremento de tamao.
Generalmente en ambientes de produccin siempre debemos de usar el modo Full o Bulk-Logged y para ambientes en desarrollo la Simple, para evitar
estarles limpiando el log de transacciones a los usuarios.
Para poder ver que tipo recuperacin tiene nuestra base de datos ejecutemos el siguiente query:
select DATABASEPROPERTYEX( 'bd' , 'Recovery' )

Ahora que sabemos que tipo de recuperacin tenemos podemos hacer un plan de recuperacin o de ser necesario cambiar el modo que tiene nuestra bd
mediante un alter database.
El siguiente ejemplo cambia la base de datos a modo de recuperacin SIMPLE
ALTER database bd set recovery SIMPLE

Haciendo el respaldo completo de la Base de Datos
Existen diferentes opciones para hacer un respaldo de la base de datos, yo les voy a indicar las opciones que considero son las ms importantes y que
generalmente son las que se usan a la hora de la accin.
BACKUP DATABASE bdprueba TO DISK = 'e:/MSSQL/BACKUP/bdprueba.BAK' WITH init, stats = 10
Este comando lo que hace es respalda la base de datos bdprueba, en la ruta e:/MSSQL/BACKUP con el nombre de bdprueba.BAK, la palabra init lo que
hace es borrar cualquier archivo que exista con el nombre del respaldo que se esta indicando, por eso se debe de tener cuidado al usar esta opcin, la
palabra stats nos va a mostrar el progreso de nuestro respaldo en un incremento de 10%.

Estas es la sintaxis completa de como hacer un backup.
BACKUP DATABASE { database_name | @database_name_var }
TO [ ,...n ]
[ WITH
[ BLOCKSIZE = { blocksize | @blocksize_variable } ]
[ [ , ] DESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] DIFFERENTIAL ]
[ [ , ] EXPIREDATE = { date | @date_var }
| RETAINDAYS = { days | @days_var } ]
[ [ , ] PASSWORD = { password | @password_variable } ]
[ [ , ] FORMAT | NOFORMAT ]
[ [ , ] { INIT | NOINIT } ]
[ [ , ] MEDIADESCRIPTION = { 'text' | @text_variable } ]
[ [ , ] MEDIANAME = { media_name | @media_name_variable } ]
[ [ , ] MEDIAPASSWORD = { mediapassword | @mediapassword_variable } ]
[ [ , ] NAME = { backup_set_name | @backup_set_name_var } ]
[ [ , ] { NOSKIP | SKIP } ]
[ [ , ] { NOREWIND | REWIND } ]
[ [ , ] { NOUNLOAD | UNLOAD } ]
[ [ , ] RESTART ]
[ [ , ] STATS [ = percentage ] ]
]

Por ltimo, los permisos que se deben de tener para poder realizar un respaldo es ser miembro del rol de servidor sysadmin o miembro de los roles de
bases de datos db_owner y db_backupoperator.
Existen otros tipos de respaldos, como son los diferenciales que solo guardan los cambios a partir de un respaldo completo y los respaldos
transaccionales los cuales guardan el contenido del log de transacciones. Este ltimo solo aplican para el modo de recuperacin Full y Bulk-Logged pero
los explicare despus en otro articulo.
Como crear un reporte del estado de fragmentacin de las tablas
SQL Server - Administracin
Martes, 28 de Marzo de 2006 18:00
Es muy importante que a menudo revisemos el estado de fragmentacin de nuestras tablas, ya que estas pueden afectar el performance de nuestro manejador.
Una de las tareas de un administrador de bases de datos es llevar un control de cuando es necesario eliminar la fragmentacin de ciertas tablas. Esto puede ser
una actividad muy sencilla para bases de datos pequeas pues es un mantenimiento que nos puede llevar solo unos cuantos minutos, pero que pasa con las
bases de datos de varios gigas. Es una tarea bastante pesada tan solo para revisar el estado de fragmentacin de nuestras tablas.
A continuacin muestro una forma de generar un reporte de la fragmentacin de nuestra base de datos que podra ser automatizada facilmente con la ayuda de un
job y ejecutarla los fines de semana. As el lunes podemos revisar la informacin y planear el reindex de alguna de las tablas.
Antes que nada debemos de crear una tabla en donde vamos a guardar la informacin.

CREATE TABLE TBL_SHOWCONTIG (
ObjectName CHAR (255),
ObjectId INT,
IndexName CHAR (255),
IndexId INT,
Lvl INT,
CountPages INT,
CountRows INT,
MinRecSize INT,
MaxRecSize INT,
AvgRecSize INT,
ForRecCount INT,
Extents INT,
ExtentSwitches INT,
AvgFreeBytes INT,
AvgPageDensity INT,
ScanDensity DECIMAL,
BestCount INT,
ActualCount INT,
LogicalFrag DECIMAL,
ExtentFrag DECIMAL)
Despus ejecutamos el comando que va a alimentar esta tabla, el cul podra ser programado dentro de algn job, donde el primero paso sera eliminar los
registros existente para posteriormente poder alimentar la tabla.
INSERT tbl_ShowContig
EXEC ('DBCC SHOWCONTIG WITH ALL_INDEXES, TABLERESULTS')

Ahora ya estamos listos para revisar la fragmentacin de nuestras tablas
SELECT ObjectName, IndexName,IndexID,CountRows,ScanDensity
FROM tbl_ShowContig
WHERE ObjectName NOT LIKE 'dt%' AND
ObjectName NOT LIKE 'sys%'
ORDER BY ScanDensity DESC
Si la columna indexid es igual a 0, significa que la tabla no contiene un ndice clustered si es 1, siginfica que ese es un ndice clustered y los que son mayores a 1
son ndices nonclustered
La columna que nos importa para ver que tan fragmentada se encuentra nuestra tabla es ScanDensity , cuando todo esta completamente desfragmentado el valor
es 100, si es menor a 100 significa que existe fragmentacin en la tabla.
Desde mi punto de vista personal, considero que una tabla necesita ser desfragmentada cuando el valor en ScanDensity es menor a 75. Para hacer esto puede
borrar el ndice y volverlo o utilizar el comando DBCC DBREINDEX o DBCC INDEXDEFRAG.
La diferencia entre los dos, es que el INDEXDEFRAG es una operacin que se puede hacer en linea, mientras se tienen usuarios haciendo uso de la tabla, pues
no genera bloqueos que duren mucho tiempo. Una desventaja de este metodo es que puede llevarse mucho ms tiempo que un DBREINDEX cuando los ndices
estan demasiado fragmentados. El DBREINDEX si genera bloqueos muy largos mientras esta regenerando los ndices.
Recuerda desfragmentar tus tablas, he presenciado casos en donde la fragmentacin de una tabla cambia el plan de ejecucin de un query haciendo que tarde
hasta 20 minutos en correr y al eliminar la fragmentacin reducir su tiempo a 6 segundos con el nuevo plan de ejecucin generado por SQL Server.
Si quisieramos crear algun job que haga esto diariamente y guardar estadsticas delcomportamiento de la fragmentacin de nuestras tablas podemos crear una
tabla con un constraint de esta manera.

CREATE TABLE [dbo].[TBL_SHOWCONTIG] (
[ObjectName] [char] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[ObjectId] [int] NULL ,
[IndexName] [char] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NULL ,
[IndexId] [int] NULL ,
[Lvl] [int] NULL ,
[CountPages] [int] NULL ,
[CountRows] [int] NULL ,
[MinRecSize] [int] NULL ,
[MaxRecSize] [int] NULL ,
[AvgRecSize] [int] NULL ,
[ForRecCount] [int] NULL ,
[Extents] [int] NULL ,
[ExtentSwitches] [int] NULL ,
[AvgFreeBytes] [int] NULL ,
[AvgPageDensity] [int] NULL ,
[ScanDensity] [decimal](18, 0) NULL ,
[BestCount] [int] NULL ,
[ActualCount] [int] NULL ,
[LogicalFrag] [decimal](18, 0) NULL ,
[ExtentFrag] [decimal](18, 0) NULL ,
[FracDate] [datetime] NOT NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TBL_SHOWCONTIG] ADD
CONSTRAINT [todaydate] DEFAULT (getdate()) FOR [FracDate]
GO
Y un job que ejecute diario esto:
INSERT into msdb..tbl_ShowContig
(ObjectName,ObjectId,IndexName,IndexId,Lvl,CountPages,CountRows,MinRecSize,MaxRecSize,AvgRecSize,ForRecCount
,Extents,ExtentSwitches,AvgFreeBytes,AvgPageDensity,ScanDensity,BestCount,ActualCount,LogicalFrag,ExtentFrag)
EXEC ('DBCC SHOWCONTIG WITH ALL_INDEXES, TABLERESULTS')

Como crear tablas particionadas en SQL Server 2005

SQL Server - Administracin
Martes, 27 de Junio de 2006 18:00
El crear tablas particionadas, es una gran ayuda para mejorar el performance cuando contamos con tablas de millones de registros, pues permite dividir
la informacin en diferentes filegroups. Este es un ejemplo que cubre todo lo necesario para su creacin.

Primero debemos de crear una base de datos con diferentes filegroups definidos, que es donde vamos a colocar las particiones
de la tabla.

Ahora debemos de crear una funcion del tipo particin, que nos va a dar el rango para cada una de las particiones. En este caso
creemos una para particionar los datos por nombre G y N. De esta manera los datos van a quedar divididos en 3 particiones; De
la A a la F, de la G a la M y de la N a la Z.
CREATE PARTITION FUNCTION nombrePF(nvarchar(30))
AS RANGE RIGHT
FOR VALUES ('G', 'N')
GO

Ahora creemos un esquema para esta particin, para mapear las particiones a los filegroups
CREATE PARTITION SCHEME nombrePS
AS PARTITION nombrePF TO (fg1,fg2,fg3)

Finalmente podemos crear una tabla particionada en el esquema que creamos para la particin, especificando una columna particionada apropiada, en
este caso el nombre.
CREATE TABLE DBASupport.Clientes
(ClienteID int, Nombre nvarchar(30))
ON nombrePS (Nombre)
GO

Ahora podemos insertar la informacin como normalmente lo hacemos.
INSERT DBASupport.Clientes VALUES (1,Antonio)
INSERT DBASupport.Clientes VALUES (1,Marco)
INSERT DBASupport.Clientes VALUES (1,Oscar)
GO

Podemos usar la funcin $partition, para verificar que la informacin a sido automticamente insertada en su correspondiente
filegroup
SELECT Nombre, $partition,nombrePF(Nombre) Particin
FROM DBASupport.Nombre

Vous aimerez peut-être aussi