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%.
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.
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