Imagen para determinar la altura de la cabecera
Our Blogs > Español > El rincón del DBA
Table Storage y SQL Azure: Anticipo del Pre-Summit 2010

 

Como anticipo del Pre-Summit 2010 que haremos en 23 y 24 de marzo (más información aquí: https://learning.solidq.com/ib/CourseDetail.aspx?CourseScheduleId=356), os presentamos funcionalidades claves relacionadas con el acceso a datos: Table Storage y SQL Azure de la plataforma Azure.

 

Arquitectura de la aplicación GuestBook.

mms://solidq.com/azure/Azure_0_Storage_vs_SQL.wmv

Introducción a la arquitectura de la aplicación GuestBook del kit de Azure; necesario para comprender el ciclo de la siguiente demostración.

Funcionamiento de la aplicación GuestBook.

mms://solidq.com/azure/Azure_1_usuario_guestbook.wmv

Explicación de funcionamiento de la aplicación Guestbook a nivel de usuario que consume la aplicación. Nada de código de aplicación: solamente información de despliegue, rutas, y funcionamiento. También se muestra como se integra la aplicación con la web pública de Solid Quality.

Funcionamiento de la aplicación GuestBook.

mms://solidq.com/azure/Azure_2_demo_guestbook.wmv

Código de la aplicación: cómo se gestionan Table Storage, Queues y Blobs usando la aplicación de ejemplo.

Integración de SSMS con SQL Azure.

mms://solidq.com/azure/Azure_4_SSMS.wmv

Integración de SQL Server Management Studio con SQL Azure; demostración de cómo habilitar firewalls, configurar conexiones y acceder a las bases de datos de SQL Azure.

Rendimiento de TPCC-personalizado en SQL Azure.

mms://solidq.com/azure/Azure_5_tpcc_personal.wmv

Demostración del rendimiento obtenido con la aplicación personal que hemos desarrollado para simular el comportamiento de las pruebas de TPCC. El reto de la integración fue adaptar la aplicación de consola para funcionar como aplicación web y por otro lado modificar ciertas construcciones del lenguaje TSQL para que fuera compatible con el lenguaje soportado por SQL Azure.

Utilizando Service Broker como SQL Server Agent

Seguramente ya lo conoces, pero por si acaso, ahí va…

El resumen corto del post sería algo así como “Con Service Broker se pueden agenda la frecuencia de las interacciones del procesamiento de mensajes”

Con esta consideración, podría resultar bastante sencillo crear una infraestructura de Service Broker que dispara la conversación periódicamente cada XX segundos para ejecutar un stored procedure.

Este es un escenario interesante para automatizar tareas de mantenimiento con SQL Server Express; como sabes, SQL Server Express no incluye SQL Agent, y normalmente estos procesos deben ejecutarse mediante tareas programadas de windows, otras herramientas de agendado, o incluso aplicaciones hechas para tal efecto; otro publico objetivo de este post serían clientes de MySQL que a la hora de migrar a SQL Server Express Edition se encuentran con que la funcionalidad de agendado no existe.

Por otra parte, si estás trabajando con MSDE 2000, y no quieres migrar a SQL Server 2005-8 Express Edition por la ausencia de SQL Server Agent, este sería un empujón más para la migración :)

En este post, te mostraré cómo crear esta infraestructura para realizar copias de seguridad periódicamente.

Nota: parte del código está excesivamente simplificado porque quiero enfocarlo en cómo usar Service Broker para la tarea.

1: Creación de la tabla donde se monitorizarán los resultados.

create table monitor_backups(
  bd sysname,
  fecha datetime default (getdate())
);

2: Creación de la cola y dos servicios: un servicio para la primera ejecución y el otro para las iteraciones.

create queue cola_copias
create service sb_inicio_copias 
    on queue cola_copias; 
create service sb_proceso_copias 
    on queue cola_copias ([DEFAULT]) ;

3: Creación del stored procedure que se lanzará para cada iteración: explicaré más adelante el código:

alter procedure lanzar_backup 
as

    declare @conversationhandle uniqueidentifier 
    declare @message_type_name sysname
    declare @dialog uniqueidentifier 

    waitfor (
        receive top(1)
            @message_type_name = message_type_name,  
            @dialog = conversation_handle    
            from cola_copias
    ), timeout 500
    
    if (@message_type_name = 
            'http://schemas.microsoft.com/sql/servicebroker/dialogtimer')
    begin    
        -- segundos en que se lanzará el siguiente backup
        begin conversation timer (@dialog) timeout = 60;
        
        -- cuidado todas las copias van al mismo fichero
        -- es decir se machaca en cada ejecución
        -- codificalo adecuadamente para tu necesidad
        begin try
            backup database accountsdb to disk = 'c:\temp\accountsdb.bak'
            with init, format
            -- registro de seguimiento
            insert into monitor_backups (bd) select 'accountsdb'
        end try
        begin catch
                declare @s sysname = ERROR_MESSAGE()
                raiserror ( @s, 10, 1) with log;            
        end catch
    end
go

Qué sucede en el procedimiento almacenado; aquí lo explico:

    if (@message_type_name = 
            'http://schemas.microsoft.com/sql/servicebroker/dialogtimer')

Si el mensaje es del tipo Dialog Timer, es el momento de ejecutar la operación de mantenimiento; en este caso, el tratamiento para otro tipo de mensajes lo he descartado porque no es el propósito de SB en este caso procesar mensajes, sino activarse para ejecutar la tarea de mantenimiento.

        -- segundos en que se lanzará el siguiente backup
        begin conversation timer (@dialog) timeout = 60;

Primero se agenda la ejecución para la siguiente vez; en este caso, la próxima ejecución será dentro de 60 segundos; cámbialo a tu gusto o necesidades.

        -- cuidado todas las copias van al mismo fichero
        -- es decir se machaca en cada ejecución
        -- codificalo adecuadamente para tu necesidad
        begin try
            backup database accountsdb to disk = 'c:\temp\accountsdb.bak'
            with init, format
            -- registro de seguimiento
            insert into monitor_backups (bd) select 'accountsdb'
        end try
        begin catch
                declare @s sysname = ERROR_MESSAGE()
                raiserror ( @s, 10, 1) with log;            
        end catch

algunas consideraciones para la ejecución de la tarea: fíjate meterlo en try/catch para poder capturar y auditar el error en algún sitio; en mi caso, el error lo envío al Error Log de SQL Server; fíjate en la siguiente imagen cómo aparece en el error log

 

además, recuerda cambiar el código de la sentencia backup porque en este ejemplo, el backup se “re-escribe” continuamente; además fíjate que se ejecuta cada 60 segundos… como propósito didáctico está bien, nada más :)

4: Modificar el comportamiento de la cola para que se active el procedimiento almacenado:

alter queue cola_copias with activation (
  status = on, procedure_name = lanzar_backup,
  max_queue_readers = 1, execute as self) 

5: Disparar la primera ejecución:

-- primer lanzamiento
declare @conversationhandle uniqueidentifier 
begin dialog conversation @conversationhandle
  from service sb_inicio_copias
  to service 'sb_proceso_copias';
begin conversation timer (@conversationhandle) 
  timeout = 60;

Nota final: el siguiente código:

select conversation_handle, state_desc, far_service, dialog_timer 
    from sys.conversation_endpoints;
select * from monitor_backups;

la columna dialog_timer, indica cuando se activará la siguiente vez; la otra tablita muestra la bitacora de copias realizadas.

Conclusión: hemos usado Service Broker para agendar operaciones de mantenimiento sin tener que usar SQL Server Agent; para escenarios de agendado complejos, apóyate en tablas de configuración que mantengan frecuencias de ejecución, operaciones a realizar, etc.. etc..

Introducción al proyecto Madison

por si no lo habíais visto ya, aquí os dejo un video de Chanel9 que entrevista a Christian Kleinerman (Product Unit Manager for Madison Project) en el que explica el siguiente movimiento de Microsoft en grandes entornos DW utilizando computación paralela (MPP).

http://channel9.msdn.com/posts/Charles/Christian-Kleinerman-Introduction-to-SQL-Server-Project-Madison/

migración de SQL Server 2005 a SQL Server 2008 con solamente 4 segundos de downtime de base de datos

hemos conseguido migrar uno de nuestros clientes de SQL Server 2005 a SQL Server 2008 con solamente 4 segundos de downtime de base de datos;

mas información aquí:

http://eon.businesswire.com/portal/site/eon/permalink/?ndmViewId=news_view&newsId=20100120005649&newsLang=en

y también aquí:

http://www.solidq.com/na/NewsDetail.aspx?Id=2171

antes de hacer la migración tuvimos que poner SP3 de SQL 2005 en el principal porque no se podía montar la sesión de Mirroring entre SQL 2005 SP2 y SQL Server 2008 SP1.

finalmente, y no menos importante, quería agradecer a todo el equipo de Payvision su ayuda durante el proyecto, sin ellos, no habría sido posible. Gracias!!

 

¿Planes de mantenimiento? No, gracias

Supongo que a más de uno le chocará el título del post. En realidad no es que esté en contra de los planes de mantenimiento de las bases de datos, obviamente, sino de las herramientas que SQL Server nos proporciona para crearlos. Ciertamente resulta muy cómodo ir añadiendo tareas y enlazándolas para que se ejecuten en un flujo de trabajo concreto, todo a golpe de clics de ratón.

Sin embargo, en muchas ocasiones se queda corto. Dejando a un lado los fallos que a veces ocurren en los propios planes de mantenimiento (haciendo una búsqueda en Google por las palabras "bug maintenance plan" salen la friolera de 660.000 páginas. De acuerdo, muchas de ellas hacen referencia a los mismos problemas, pero al menos sirve para hacerse uno una idea), personalmente no me gusta la poca información de salida que proporciona su ejecución y tampoco el hecho de no saber exactamente qué instrucciones TSQL ejecuta (sí, se pueden ver, pero no modificar).

Aunque lo anterior podría ser cuestión de gustos personales, hay otros aspectos que limitan la funcionalidad de los planes de mantenimiento. Ejemplos de ello están en las tareas de backups (no puedes modificar el nombre del archivo generado) o el chequeo de integridad (no tienes más opción que la de incluir o no los índices).

Pero donde, sin duda, la tarea que me parece más limitada es la de desfragmentación de los índices: el sistema no te da ningún parámetro para diferenciar cuándo ejecutar una reorganización o cuándo una reconstrucción, no puedes indicarle un nivel de paralelismo concreto, no tiene en cuenta si el índice tiene objetos LOB para evitar el error de intentar reconstruirlo en línea, además de que no puedes modificar la instrucción que se ejecuta… En fin, un poco precario, desde mi punto de vista.

Y vale, el problema está expuesto, pero ¿y la solución? Pues sencillo: con TSQL se puede hacer cualquier cosa en SQL Server, así que lo único que hay que hacer es trabajar en nuestro propio script que haga todas las tareas de mantenimiento que nuestro sistema requiere. Bueno, en realidad no es tan sencillo, principalmente por el tiempo que requiere implementar algo así. Sin embargo, hay gente que le ha echado ganas (y conocimientos, por supuesto) para crearse dicho script y, lo mejor de todo, compartirlo con el resto de la comunidad "esequeleservesera" J

La verdad es que el trabajo de Ola Hallengren merece un gran respeto, pues no imagino el tiempo que ha dedicado a su solución (y que sigue dedicando, pues continuamente saca nuevas versiones, mejorando lo existente). Si echáis un vistazo a su web, podréis descargaros un pequeño script que, con unas pequeñas modificaciones para adaptarlo a vuestro servidor, sirve para cualquier versión de SQL Server 2005 (con SP1 mínimo) y 2008. Además existe un apartado de documentación, puesta en marcha e incluso preguntas frecuentes

Copio/pego una tabla comparativa entre los planes de mantenimiento y el script de Ola:

Area

Maintenance Plans

Stored procedure based solution

Logging

The log file is created in the end of the Maintenance Plan execution. If the Maintenance Plan, SQL Server or server would crash then you have no log file.

The logging includes superficial information about the execution.

The log file is created in the beginning of the stored procedure execution. Log information is written as the stored procedure execution proceeds.

The logging includes start time, command text, command output and end time for each command.

Database Selection

You can select databases as below.

All databases
All system databases
All user databases
A list of databases

You can select databases as below.

All databases
All system databases
All user databases
A list of databases
Exclusion of databases
Database name pattern matching

Error Handling

If an error occur the Maintenance Plan continues to the next database and reports failure in the end.

If the backup fails for one database, the other databases will still be backed up.

If an error occur the stored procedure logs the error, continues to the next database and reports failure in the end.

If the backup fails for one database, the other databases will still be backed up.

Backup Compression

The Maintenance Plan supports native SQL Server 2008 backup compression.

The backup stored procedure supports both native SQL Server 2008 backup compression and LiteSpeed backup compression.

Online Index Rebuild

In the Maintenance Plan you can select to do rebuild of indexes online or offline.

The problem with that is that if the index (or table for a clustered index) contains a LOB (large object), online rebuild is not supported and will fail.

The index optimization stored procedure supports dynamic online / offline rebuild of indexes based on LOB (large object) existence.

It supports that indexes with no LOBs are rebuilt online and indexes with LOBs are rebuilt offline.

Index Fragmentation

The Maintenance Plan does not take index fragmentation into consideration when rebuilding and reorganizing indexes.

The index optimization stored procedure supports dynamic rebuild / reorganization of indexes based on the fragmentation levels.

It supports that indexes with a high level of fragmentation are rebuilt, that indexes with a medium level of fragmentation are reorganized and that indexes with a low level of fragmentation are skipped.

Partitioning

The Maintenance Plan rebuilds and reorganizes partitioned indexes on the table level (not partition level).

The index optimization stored procedure supports both table level and partition level rebuild and reorganizition of partitioned indexes.

Documentation

SQL Server Books Online

Documentation

Actualización (15/09/09): La nueva versión disponible ya no impone la limitación de tener SP1 de SQL Server 2005 instalado

Localización del log errores

Siempre es curioso encontrarse con funcionalidades no documentadas en SQL Server. Aunque uno no pueda fiarse mucho de ellas (al no estar documentadas, el equipo de desarrollo podría cambiarlas o directamente eliminarlas sin tener que rendir cuentas a nadie), en alguna ocasión te puede sacar de un apuro.

El caso es que hoy me he encontrado con una forma fácil de conocer la ruta del log de errores de nuestra instancia. Sí, igual alguno puede conocer la forma por la cual podemos obtener algo similar leyendo del registro, mediante el procedimiento almacenado extendido xp_instance_regread (el cual tampoco está documentado) y filtrando por la clave correcta. Algo como:

DECLARE @DirLog nvarchar(512)

EXEC master.dbo.xp_instance_regread N'HKEY_LOCAL_MACHINE' , N'SOFTWARE\Microsoft\MSSQLServer\CPE' , N'ErrorDumpDir' , @DirLog OUTPUT

PRINT @DirLog

Teniendo en cuenta que lo anterior nos muestra la ruta de la carpeta LOG de nuestra instancia, no habría mayor problema en usar este método si conocemos la clave del registro donde buscar. Lo cual en algunas ocasiones puede ser bastante complicado.

Sin embargo, con este nuevo método que he encontrado, simplemente ejecutando

SELECT SERVERPROPERTY('ErrorLogFileName')

Tenemos no sólo la ruta completa, sino también el nombre del archivo de log de nuestra instancia.

Fácil, ¿verdad?

Windows Complete PC Backup… & ¿Restore?

Desde el lanzamiento de Windows Vista disponemos de una herramienta de backup completo incluida en el propio sistema operativo. El uso de dicha herramienta tiene como ventaja que el propio medio de instalación de Windows Vista/ Windows Server 2008 incluye las herramientas necesarias para hacer un restore llamado "bare metal restore". Y esto que suena un poco a terminología Terminator quiere decir simplemente una recuperación del sistema a partir de un hardware diáfano, un disco duro totalmente vacío, etc.

Desgraciadamente esta herramienta en nuestra experiencia proporciona un grado de confiabilidad un poco bajo. En concreto mi experiencia personal ha sido la de tener más de un "encontronazo" a la hora de restaurar el sistema tanto en Windows Vista como en Windows Server 2008. Lo primero que debemos tener en cuenta es que para restaurar un backup hecho con Windows Server 2008 R2 por ejemplo necesitamos un DVD de la versión R2, no siendo posible hacerlo desde uno de Windows Server 2008. Mi último "cabezazo" con dicha herramienta ha sido con la versión R2 de este último sistema operativo. La situación al intentar restaurar era que, detectándose correctamente el disco destino y teniendo suficiente capacidad, el programa se negaba a restaurar la copia indicando algunos "hints" para solucionarlo.

Entre ellos está el problemático ordenamiento de los discos por parte de la BIOS. Para realizar cualquier tipo de recuperación recomiendo que arranquéis la máquina con el mínimo número de discos/dispositivos de almacenamiento conectados para evitar confusiones. Para entendernos, arrancar solo con el "disco C:" conectado. Si aún así sigue insistiendo en mostrar errores podéis recurrir a los logs ubicados en: X:\Windows\Logs\WindowsServerBackup. En mi caso concreto y aun siguiendo las recomendaciones indicadas, repasando con DISKPART que todo está correcto, etc. no ha sido posible convencerle de hacer la restauración.

Creo que el escenario en el que me ha ocurrido el error es bastante típico (upgrade del disco duro de sistema) y la solución ha pasado por volver a arrancar con el disco anterior y, utilizando la propia opción "Recover" de la herramienta Windows Server Backup, realizar la restauración sobre el nuevo disco conectándolo con una carcasa externa USB. Una vez restaurada la imagen reinstalamos el bootloader manualmente sobre el nuevo disco y "damos el cambiazo" de disco. Indicar que esto no habría sido posible si estuviéramos realizando una restauración completa del sistema debido a un fallo fatal en el nuestro disco duro de sistema.

Sin duda Microsoft necesita seguir trabajando y puliendo este sistema de backup pues por ahora la sensación que deja es muy agridulce. Mientras tanto cuando utilicemos dicha solución conviene que comprobemos que es posible realizar la restauración "bare-metal" sobre al menos un disco duro secundario de "emergencia" para evitar encontrarnos sorpresas tan desagradables.

P.D. Para los morbosos comentar que la restauración completa sobre un disco duro secundario de "emergencia" había sido comprobada en este caso y, en su día, funcionó sin problemas. Por tanto parece que el problema está relacionado directamente con alguna peculiaridad/incompatibilidad con el disco utilizado para la restauración. Be paranoid my friend! J

 

 

Novedades SQL Server 2008 R2

Con el lanzamiento de la CTP de SQL Server 2008 R2 podemos ir comenzado a degustar algunas de las novedades que nos deparará. Muchas de las novedades de esta nueva versión se verán reflejadas en el entorno de BI pero muchas otras afectarán a nuestro querido motor relacional o a la administración de la plataforma. A medida que vayamos realizando pruebas más exhaustivas sobre estas novedades las iremos comentando pero por ahora un aperitivo de novedades J

DAC (Data-tier application)

Muchas de nuestras aplicaciones son aplicaciones conducidas o muy ligadas a los datos de una base de datos. Una de las tareas más "aburridas" para muchos desarrolladores es generar dicha capa de acceso a datos que les permita realizar las modificaciones de los datos. Además de frameworks como el Entity Framework en esta R2 CTP aparece el concepto de DAC (Data-tier application). SQL Server Management Studio proveerá de una forma sencilla de extraer directamente a partir de una base de datos que, Visual Studio de por medio, podrá ser enlazarda con nuestra aplicación como si un componente más de ésta se tratara. De esta forma podemos gestionar cambios en la base de datos junto a su actualización correspondiente en las aplicaciones con un simple instalable que corresponderá con la nueva versión de la "capa de acceso a la base de datos" J

SQL Server Utility

En SQL Server 2008 se ha hecho un importante esfuerzo en centralizar y en permitir manejar un conjunto alto de instancias y servidores de forma centralizada y sencilla. Con la SQL Server Utility conseguimos tener una utilidad específica para la gestión del rendimiento y la configuración de éstas de forma unificada. Por supuesto nuevos informes se añadirán (tipo Dashboard) para poder mostrar toda esta información de forma gráfica. Creemos que esta utilidad tendrá un amplio uso entre administradores de granjas de servidores SQL Server, entornos virtualizados, etc.

Soporte de hasta 512 CPUs

Con la cada vez mayor cantidad de cores por socket se llegaba a la situación de tener algunos servidores grandes con 96 procesadores de los cuales únicamente 64 podían ser utilizados por SQL Server 2008. Con la nueva revisión R2 ganamos "margen" hasta 512 CPUs por lo que, por ahora, no tendremos problemas para explotar al máximo todo el potencial de nuestros servidores J

Compresión Unicode

En la revisión R2 se mejora el almacenamiento de los nchar(n) y nvarchar(n) utilizando la compresión SCSU (Standard Compression Scheme for Unicode). El grado de compresión obtenido rondará el 50% para la mayoría de lenguajes que utilicen los caracteres más habituales como castellano o inglés J Una razón más para SIEMPRE utilizar UNICODE en nuestras cadenas de texto con contenido potencialmente multiidioma.

Finalmente recomendaros que quien se lance a instalar SQL Server 2008 R2 Side-by-side se lea bien las implicaciones de esto en los libros en pantalla pues bastantes componentes que serán compartidos entre ambas revisiones al no tratarse de una nueva versión al 100% sino de una revisión de producto. Es por ello que prevemos muchas más actualizaciones inplace en estos escenarios antes que side-by-side.

SQL Server 2008 R2 CTP

Recién salida del horno tenemos disponible la CTP de SQL Server 2008 R2. De hecho, tan reciente es que el enlace al que hace referencia la página principal del producto (http://www.microsoft.com/sqlserver/2008/en/us/r2.aspx) es inválido… No creo que tarden en solucionarlo J

En http://blogs.technet.com/dataplatforminsider/archive/2009/08/10/download-sql-server-2008-r2-august-ctp-today.aspx puedes encontrar más información sobre qué nos trae de nuevo esta versión.

Actualización (11/08/09): parece ser que hasta mañana día 12 no está disponible la descarga para el público en general (si tienes una subscripción MSDN o TechNet sí lo tienes disponible)

BIDS Helper

Buscando por la web, uno nunca sabe cómo llega a los sitios que visita y algunas veces se encuentra con cosas bastante interesantes. Una de ellas es la que hoy os quiero comentar, un Add-In para Visual Studio llamado BIDS Helper (http://bidshelper.codeplex.com/). Aunque está más orientado para la parte de Business Intelligence, quien más quien menos usa Integration Services y Reporting Services en mayor o menor medida, así que no está de más incorporarlo a nuestras herramientas típicas de trabajo.

El proyecto está muy documentado, teniendo apartados específicos que comentan funcionalidades concretas, así que os recomiendo echar un vistazo a la página principal del componente e ir navegando para conocerlo más profundamente. Espero que os sirva de ayuda.

1 - 10 Next

 ‭(Hidden)‬ Admin Links


¿Problemas técnicos? Contáctenos en webmaster@solidq.com o al 800 300 800 (desde España) o al +34 91 414 8950 (desde fuera de España)