lunes, 29 de marzo de 2010

Introducción a SQL Server Mirroring

Mirroring es una solución software, introducida en SQL Server 2005, que nos permite tener un sistema de base de datos tolerante a fallos, aumentando la seguridad y la disponibilidad, mediante la duplicidad de la base de datos.
La "duplicación" se hace a nivel de base de datos, es decir, no se configura simplemente una instancia para que actúe como "espejo" de otra, si no que hay que crear una base de datos "espejo" por cada base de datos "principal". Hay que crear los mismos usuarios en la base de datos "espejo" (aunque la base de datos "espejo" no está accesible mientras haya otra "principal" activa, ésta será accesible en el momento en el que la instancia principal falle o lo especifiquemos manualmente), así como también los mismos trabajos condicionados para que se ejecuten según si la base de datos está funcionando como "espejo" o como "principal".

Una vez duplicada la base de datos (el registro de transacciones, los usuarios y los trabajos) hay que elegir el modo de funcionamiento en el que usaremos el "mirroring":

- Alta seguridad: Este modo ejecuta en la instancia "espejo" las mismas transacciones que se ejecutan en la instancia "principal". Se realizan de forma síncrona, es decir, por cada transacción ejecutada en la base de datos principal, se comprueba que se ha podido ejecutar en la base de datos espejo. Lo bueno es que no se pierde ninguna transacción, lo malo es que haría algo más lentas las transacciones con lo cual, la aplicación se ejecutaría sensiblemente más lenta.
En este modo el cambio de base de datos, en el caso en el que falle la bd principal, se hace de forma manual. Si se "cae" el servidor espejo la base de datos principal deja de estar activa.

- Alto rendimiento: Este modo ejecuta las transacciones, ejecutadas en la BD principal, en la BD espejo de forma asíncrona. Con esto se consigue mantener la latencia de las transacciones pero hay riesgo de pérdida de datos. El cambio de base de datos si la bd principal falla también se hace de forma manual. Si se cae el servidor espejo, el principal sigue funcionando.

Al modo de alta seguridad hay que sumarle la posibilidad de agregar un tercer servidor llamado "testigo" el cual servirá para poder automatizar la recuperación ante fallos. De esta forma, el modo "alta seguridad se divide en dos":
- Alta protección: alta seguridad sin testigo.
- Alta disponibilidad: alta seguridad con testigo.

Al añadirle un servidor "testigo", además permitimos que, si se cae el servidor espejo, la BD principal siga estando activa.

viernes, 26 de marzo de 2010

Redimensionar un popup Thickbox

Con esta función puedes cambiar el tamaño de tu Popup hecho con thickbox:

function resizeTBPopup(width, height){
            if($('TB_ajaxContent')){
                TB_WIDTH = (width*1) + 30 || 630; //defaults to 630 if no paramaters were added to URL
                TB_HEIGHT = (height*1) + 40 || 440; //defaults to 440 if no paramaters were added to URL

                $('TB_ajaxContent').style.height = TB_HEIGHT - 45 + 'px';
                tb_position();
            }
        }

Tareas de mantenimiento en SQL Server 2008

A continuación publico 3 scripts que serirán para realizar tareas de mantenimiento sobre nuestras bases de datos en un servidor SQL Server 2008. Estos 3 scripts son para realizar una copia de seguridad, reducir el log de transacciones y regenerar índices. Lo bueno de estos scripts es que no son exclusivos para una base de datos, sino que realizarán las tareas sobre todas las bases de datos que tengas en el servidor (o las que tú quieras).

Copia de base de datos (Debes asignar la variable @backupPath con tu ruta):
DECLARE @backupPath AS VARCHAR(MAX)
SET @backupPath = N'C:\SqlServer\MSSQL10.MSSQLSERVER\MSSQL\Backup\'

DECLARE @dbName AS VARCHAR(100)
DECLARE @file AS VARCHAR(MAX)

DECLARE c1 CURSOR FOR
SELECT name FROM master..sysdatabases sdb
WHERE sdb.name NOT IN ('master','model','msdb','pubs','northwind','tempdb')
ORDER BY name

OPEN c1

FETCH NEXT FROM c1
INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
    SET @file = @backupPath + @dbName + '.BAK'

    BACKUP DATABASE @dbName
    TO  DISK = @file WITH NOFORMAT, INIT,  NAME = @dbName, SKIP, NOREWIND, NOUNLOAD,  STATS = 10

    FETCH NEXT FROM c1
    INTO @dbName
END

CLOSE c1
DEALLOCATE c1
Reducir el log de transacciones
DECLARE @dbName AS VARCHAR(100)
DECLARE @cmd AS VARCHAR(MAX)
DECLARE c1 CURSOR FOR
SELECT name FROM master..sysdatabases sdb
WHERE sdb.name NOT IN ('master','model','msdb','pubs','northwind','tempdb')
ORDER BY name

OPEN c1

FETCH NEXT FROM c1
INTO @dbName

WHILE @@FETCH_STATUS = 0
BEGIN
    --Establecer la base de datos en uso
    SET @cmd = 'USE ' + @dbName

    --Si se establece el modo de restauración a simple, las partes inactivas del log de transacción deben ser borradas
    --Este comando reducirá el archivo de log un poco
    SET @cmd = @cmd + ' ALTER DATABASE ' + @dbName + ' SET RECOVERY SIMPLE'

    --Obtener el nombre de log de la base de datos
    SET @cmd = @cmd + ' DECLARE @logFile AS NVARCHAR(1000)'
    SET @cmd = @cmd + ' SELECT @logFile = name FROM ' + @dbName + '.sys.database_files WHERE type_desc = ''LOG'''
    --Cambiar el modo de restauración a Simple no es suficiente, esto reduce el log a 1 MB
    SET @cmd = @cmd + ' DBCC SHRINKFILE (@logFile , 1)'

    EXEC(@cmd)

    FETCH NEXT FROM c1
    INTO @dbName
END

CLOSE c1
DEALLOCATE c1
Regenerar índices
SET QUOTED_IDENTIFIER ON

DECLARE @Table VARCHAR(255) 
DECLARE @DataBase VARCHAR(255)
DECLARE @cmd NVARCHAR(500) 
DECLARE @fillfactor INT

SET @fillfactor = 90

DECLARE DatabaseCursor CURSOR FOR 
SELECT name FROM master.dbo.sysdatabases  
WHERE name NOT IN ('master','model','msdb','tempdb','distrbution')  
ORDER BY 1 

OPEN DatabaseCursor 

FETCH NEXT FROM DatabaseCursor INTO @Database 
WHILE @@FETCH_STATUS = 0 
BEGIN 

   SET @cmd = 'DECLARE TableCursor CURSOR FOR SELECT table_catalog + ''.'' + table_schema + ''.'' + table_name as tableName  
                    FROM ' + @Database + '.INFORMATION_SCHEMA.TABLES WHERE table_type = ''BASE TABLE'''  

   -- create table cursor 
   EXEC (@cmd) 
   OPEN TableCursor  

   FETCH NEXT FROM TableCursor INTO @Table  
   WHILE @@FETCH_STATUS = 0  
   BEGIN  

       -- SQL 2000 command 
       --DBCC DBREINDEX(@Table,' ',@fillfactor)  
        
       -- SQL 2005 command 
       SET @cmd = 'ALTER INDEX ALL ON ' + @Table + ' REBUILD WITH (FILLFACTOR = ' + CONVERT(VARCHAR(3),@fillfactor) + ')' 
       EXEC (@cmd) 

       FETCH NEXT FROM TableCursor INTO @Table  
   END  

   PRINT @Database + ' indexes were rebuilt'

   CLOSE TableCursor  
   DEALLOCATE TableCursor 

   FETCH NEXT FROM DatabaseCursor INTO @Database 
END 
CLOSE DatabaseCursor  
DEALLOCATE DatabaseCursor
Estos scripts los puedes ejecutar cuando quieras o programarlos para que sean ejecutados periódicamente con el Agente SQL.

Puedes modificar la "SELECT" donde obtiene las bases de datos donde se realizarán las tareas para que se ejecuten sobre las bases de datos que quieras. Si lo ejecutas como está publicado aquí, se ejecutará sobre todas las bases de datos.

jueves, 25 de marzo de 2010

CSS: Contenedor de divs con "float left" o "float right"

Cuando un contenedor contiene objetos con la propiedad "float", dicho contenedor no crecerá en función del tamaño de los objetos contenidos, por ejemplo:
float:left
float:right

Hacer que el contenedor crezca en función del contenido es tan sencillo como asignarle al contenedor la propiedad "overflow:hidden" y ¡ya está!. Eso sí, para que funcione también en Internet Explorer hay que asignar obligatoriamente la propiedad width del estilo.

float:left
float:right