Consideraciones imprescindibles para instalar SQL Server 2008 R2 en clúster

Un "must read" sobre todas las consideraciones a tener en cuenta, tanto a nivel de hardware, desde como formatear el disco de la forma mas conveniente, así como consideraciones a nivel permisos, software y distintos pre-requisitos para lograr conseguir una instalación exitosa de SQL Server 2008 R2 en cluster:
http://msdn.microsoft.com/es-es/sqlserver/gg601099#01

Muy pero muy buena nota, que hay que leer si o si.

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Falló el DBCC CHECKDB, y ahora que hacemos?


Que pasaría si encontraras un error en los logs indicando que tenés un error de los siguientes: torn page o checksum error. Que hacemos??
Que hacemos?

La mayoría en realidad no tiene ni idea de que es lo que hay que hacer. Que harías en esa situación en que un error de consistencia se ha detectado en una de las bases que tu (tu) administras?

La respuesta pasa por usar DBCC CHECKDB diariamente para detectar errores de consistencia.

La sintaxis básica es:

DBCC CHECKDB ('Nombre de SU base') WITH NO_INFOMSGS

NO_INFOMSGS previene que se disparen un número excesivo de mensajes, de todas maneras hay muchas opciones, pero esta realiza los chequeos mínimos necesarios.

Esta sentencia puede tomar un tiempo importante en ejecutarse si las bases de datos son grandes y en ese caso quizás pudiera querer especificar la opción PHYSICAL_ONLY, ya que esta opción chequea fisicamente en las estructuras en disco, pero omite los chequeos lógicos:

La sintaxis es:

DBCC CHECKDB ('Nombre de SU base') WITH PHYSICAL_ONLY

Ok, hay un problema y... ahora?

Siempre asumimos la existencia de los backups, no?. Todos sabemos que un indice non-clustered puede ser reconstruido sin mayores problemas, pero un indice clustered no.

La mejor opción es siempre recuperar desde un backup (en realidad siempre lo mejor es tener implementada una opción de alta disponibilidad tipo cluster o mirroring y el backup mantenerlo solamente como opción B, pero bueno, supongamos que tenemos que ir a los backups).

Primero vamos a ver que páginas están dañadas y que tipo de datos son los que están dañados (recuerdan clustered y non-clustered?)

Para empezar veamos que nos dice DBCC CHECKDB, por ejemplo una salida típica puede ser la siguiente:

Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data): Page (1:95555) could not be processed. See other errors for details.
Msg 8939, Level 16, State 98, Line 1
Table error: Object ID 2088535921, index ID 0, partition ID 72345201021503994, alloc unit ID 72345201051571606 (type In-row data), page (1:95555). Test (IS_OFF (BUF_IOERR, pBUF->bstat)) failed.
CHECKDB found 0 allocation errors and 2 consistency errors in table 'SU_tabla' (object ID 2088535921).
CHECKDB found 0 allocation errors and 2 consistency errors in database 'SU_base_de_datos'.
repair_allow_data_loss is the minimum repair level for the errors found by DBCC CHECKDB (SU_base_de_datos).

Acá ya sabemos cual es la página corrupta: (1:95555)

Ahora necesitamos saber si los datos están en un montón (heap), en un indice cluster o en un índice non-clustered.

Entre los datos podemos ver que es index ID 0. Podemos examinar especificamente la página (1:95555 en 'SU_base_de_datos') como vemos a continuación:

DBCC TRACEON (3604, -1)
GO
DBCC PAGE('SU_base_de_datos', 1, 95555, 3)
GO

En la salida vamos a ver algo como:

Metadata: IndexId = n

Si n es mayor a 1 entonces puede festejar ya que se trata de un índice non-clustered que puede ser borrado y recreado.
Ahora bien, si es 0 o 1 entonces ya se trata de corrupción de datos directamente y vamos a tener que hacer de lo que describiremos mas abajo.

RECUPERAR DESDE UN BACKUP

Si el "recovery model" es FULL entonces usted hará un backup de tail log (si no sabe que es un tail log backup recuerde google es nuestro amigo).
Entonces, tail log backup, restore full backup, differential backups, logs backups, etc, etc todos con la opción WITH NORECOVERY y finalmente recupere el backup de tail log pero esta vez con la opción WITH RECOVERY.
Asumo que usted tiene bien en claro los procesos de backup/restore, si así no fuera entonces llamen a un administrador experimentado antes de perder datos y eventualmente su trabajo.

Si solo fueron afectadas unas pocas páginas entonces tenemos la opción de recuperar solamente las páginas dañadas, como vemos a continuación:

RESTORE DATABASE SU_base_de_datos PAGE = '1:95555'
FROM DISK = 'C:\SU_backup.bak'
WITH NORECOVERY

Si el "recovery model" está en modo simple, entonces no tiene absolutamente ninguna opción y va a tener que aplicar un procedimiento de restore completo.

Ahora si usted no tiene absolutamente ningún backup, entonces podría llegar a aplicar la opción de automatic repair. (haga backup de todo por favor)

OPCIONES AUTOMATICAS DE REPARACION

Primero: backup, backup, backup. Queda avisado: BACKUP antes de hacer cualquier cosa que se le ocurra hacer.

Ok, miremos nuevamente la salida de CHECKDB. Ahí se especifica el mínimo nivel de reparación.

REPAIR_REBUILD
Si el nivel mínimo de reparación es REPAIR_REBUILD usted debería estar mas o menos feliz.
La sintaxis es:

DBCC CHECKDB('SU_base_de_datos', REPAIR_REBUILD)

REPAIR_ALLOW_DATA_LOSS
Con esta opción ya no debería estar tan contento.
Esta opción intentará reparar todos los errores encontrados pero retirará eventualmente la página afectada y modificará los links entre páginas,
de modo que todo quedará como si esa página nunca hubiera existido. Algo se habrá borrado y habrá que ver que consecuencias a nivel de integridad referencial y perdida de datos esto pueda haber generado.

La sintaxis es:

DBCC CHECKDB('SU_base_de_datos', REPAIR_ALLOW_DATA_LOSS)

Despues asegúrese de ejecutar DBCC CHECKCONSTRAINTS una vez finalizado el checkdb para verificar problemas de integridad referencial que puedan ocurrir y tomar las medidas apropiadas.

FINALMENTE

La opción correcta es (en el 99% de los casos) recuperar un backup. Solo usamos las opciones automáticas de recuperación cuando no nos queda absolutamente otra opción.

DBCC CHECKDB es una herramienta poderosa, pero muy peligrosa en las manos equivocadas, es como un bisturí, que tiene una utilidad en las manos de un cirujano y otra muy distinta en las manos de un chipancé.


Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Libro Gratuito de Microsoft sobre PowerShell














La gente de Microsoft publicó hace algún tiempo un libro electrónico en inglés sobre Windows PowerShell.
El libro ha resultado ser un éxito. Sus casi 50 páginas ayudan a aquellos que quieren conocer Windows PowerShell.
A continuación ustedes tienen los enlaces correspondientes:

Alguna documentación interesante mas ejemplos, scripts y artículos en los siguientes links:
http://technet.microsoft.com/es-ar/library/ee221100%28en-us%29.aspx
http://technet.microsoft.com/es-es/scriptcenter/dd742419

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Eliminar todas las conexiones activas de una base de datos

CREATE PROCEDURE dbo.KillConexiones
@dbName SYSNAME
AS
BEGIN
SET NOCOUNT ON

DECLARE @spid INT,
@cnt INT,
@sql VARCHAR(255)

SELECT @spid = MIN(spid), @cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname)
AND spid != @@SPID

PRINT 'Eliminando '+RTRIM(@cnt)+' procesos.'

WHILE @spid IS NOT NULL
BEGIN
PRINT 'Eliminando Proceso '+RTRIM(@spid)
SET @sql = 'KILL '+RTRIM(@spid)
EXEC(@sql)
SELECT @spid = MIN(spid), @cnt = COUNT(*)
FROM master..sysprocesses
WHERE dbid = DB_ID(@dbname)
AND spid != @@SPID
PRINT RTRIM(@cnt)+' Procesos por eliminar.'
END
END
GO

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Traducción del Checklist de Mejores Prácticas para ser un DBA excepcional por Brad McGehee

Mejores Prácticas para ser un DBA excepcional SQL Server (redactado por el genial Brad McGehee )

1. Ingresa a un SQL grupo de usuarios (chapters.sqlpass.org)
2. Únete a SQL PASS (www.sqlpass.org)
3. Asistir a por lo menos una conferencia de profesionales cada año.
4. Asistir a por lo menos una sesión de entrenamiento cada año.
5. Lea por lo menos cuatro libros sobre SQL Server cada año.
6. Lea el libro electrónico Cómo convertirse en un DBA excepcional (descarga free en red-gate.com)
7. Aprenda todo lo que pueda acerca de su trabajo, especialmente aquellas áreas que nadie más le gusta o quiere dominar.
8. Sea voluntario en su trabajo para tareas nuevas y difíciles que le harán conocer en toda su organización.
9. Instale SQL Server en una computadora portátil o de escritorio y practique nuevos aspectos de SQL Server, especialmente de SQL Server 2008 y 2008R2 y del nuevo denali (2010).
10. Participar en los foros de SQL Server (preguntar y responder preguntas)
1. www.SQLServerCentral.com
2. http://ask.sqlservercentral.com/com
3. www.microsoft.com / comunidades / grupos de noticias / en-us / default.aspx
11. Obtenga la certificación como DBA de SQL Server:
1. a. Microsoft Certified Technology Specialist (http://www.microsoft.com/learning/en/us/certification/cert-sql-server.aspx # Tab2)
2. b. TI de Microsoft Certified Professional (http://www.microsoft.com/learning/en/us/certification/cert-sql-server.aspx # tab3)















Día a día

1. Compruebe los registros de eventos del S.O. y los registros de SQL Server para detectar eventos inusuales.
2. Verifique que todos los trabajos programados se han ejecutado correctamente.
3. Confirme que las copias de seguridad se han hecho y guardado con éxito a un lugar seguro.
4. Monitoree el espacio en disco para asegurarse de que sus servidores de SQL no se quedarán sin espacio en disco. Para un mejor rendimiento, todos los discos deben tener 15% o más de espacio libre.
5. A lo largo del día, haga un seguimiento periódico de rendimiento utilizando Monitor de sistema y de perfiles / Traza de SQL.
6. Monitorear regularmente e identificar problemas de bloqueo.
7. Mantenga un registro de los cambios que realice a los servidores, incluyendo la documentación de los problemas de rendimiento a identificar y corregir.
8. Crear alertas de SQL Server para que le avise de posibles problemas, y las envíe por mail. Tomar las medidas necesarias.
9. Regularmente restaure copias de seguridad en un servidor de prueba para verificar que realmente los puede restaurar. No es necesario para restaurar todas las copias de seguridad todos los días, pero debiera hacerlo a menudo para asegurarse de que usted tiene buenas copias de seguridad.
10. Tómese su tiempo para aprender algo nuevo como un DBA para promover su desarrollo profesional.

Instalación

1. Siempre documente las instalaciones de modo completo, aun cuando parezca redundante, esto hará que las instancias de SQL Server se pueden reproducir fácilmente en caso de emergencia.
2. Si es posible, instalar y configurar todas las instancias de SQL Server de una manera consistente, de la misma forma , basándose en las normas pre-acordadas de su organización.
3. No instale los servicios de SQL Server que no se utilizan, como Microsoft indexación de texto completo, Reporting Services o Analysis Services.
4. Para obtener el mejor rendimiento de SQL Server, detenga todos los servicios del sistema operativo que no son necesarios.
5. Para un óptimo rendimiento de SQL Server, no ejecutar al SQL Server junto con ninguna otra aplicación.
6. Para obtener el mejor rendimiento I / O, busque los archivos de base de datos (. mdf) y archivos de registro (. ldf) en discos separados para aislar a los patrones de acceso a disco.
7. Si tempdb se utiliza en gran medida, pongalo en un disco aparte.
8. No instale SQL Server en un controlador de dominio.
9. Asegúrese de que SQL Server se instala en una partición NTFS.
10. No utilice NTFS con cifrado de archivos de datos (EFS) y ni compresión de datos sobre el disco de la base de datos de SQL Server y los archivos de registro.

Actualizar1. Ejecute el Upgrade Advisor de SQL Server antes de actualizar. Haga los cambios necesarios antes de realizar la actualización.2. Realizar una actualización de prueba antes de actualizar los servidores de producción. Y no se olvide de probar las aplicaciones con la nueva versión también.3. Antes de actualizar, asegúrese de tener un plan para revertir los cambios en caso que la actualización sea problemática.4. No actualizar clústeres de SQL Server en su lugar. En cambio, a reconstruirlos en un nuevo hardware.5. Si actualiza desde una versión anterior de SQL Server, debe actualizar todas las estadísticas en todas las bases de datos. Esto se debe a que las estadísticas no se actualizan automáticamente durante el proceso de actualización.

Seguridad

  1. Asegure la seguridad física de cada Servidor SQL , previniendo que cualquier usuario no autorizado pueda acceder físicamente a sus servidores.
  2. Instalar solamente las mínimas y necesarias nettwork libraries y network protocols en sus instancias SQL
  3. Minimize el número de usuarios sysadmins con acceso a SQL Server.
  4. Como DBA, logueesé como sysadmin solo cuando realmente lo necesite. Cree cuentas específicas para DBAs para que puedan acceder a SQL Server cuando no necesiten privilegios sysadmin.
  5. Asigne a la cuenta "sa" una password realmente compleja y no la use nunca para loguearse a SQL Server. En vez de eso use una cuenta Windows Authentication para acceder SQL Server como sysadmin.
  6. Dele a los usuarios los mínimos permisos necesarios que le permitan a ellos realizar su trabajo.
  7. De ser posible, use stored procedures o views para el acceso a los datos en vez de dejarlos acceder directamente a las tablas.
  8. De ser posible, use Windows Authentication logins en vez de SQL Server logins.
  9. Use strong passwords (combinación de mayúsculas, minúsculas, numeros y caracteres especiales) para todos los SQL Server login.
  10. No le asigne permisos al rol de base de datos "public"
  11. Remueve Logins IDs que ya no necesitan acceder a SQL Server apenas los detecte.
  12. Deshabilite el usuario "guest" en cada base de datos usando REVOKE CONNECT FROM GUEST.
  13. No use "cross database ownership chaining" si no es realmente necesario.
  14. Nunca habilite permisos a xp_cmdshell a los usuarios que no son sysadmin.
  15. Eliminar las bases de ejemplo (adventureworks, pubs, northwind) de todas las instancias de producción.
  16. Usar Windows Global Groups, o SQL Server Roles para manejar grupos de usuarios con similares permisos.
  17. No debería crear ni permitir crear network shares en servidores SQL Server.
  18. Configurar login auditing , de esta manera se puede ver quienes intentaron loguearse y los intentos fallidos de login.
  19. No use jamás la cuenta sa ni login ids que sean sysadmin como cuentas de acceso desde aplicaciones.
  20. Asegurese que sus servidores están detrás de un firewall y no están expuestos directamente a internet.
  21. En SQL Server 2005 y previos, remover el grupo de BUILTIN/Administrators para evitar que los administradores locales del servidor puedan acceder a SQL Server. En SQL Server 2008, el grupo BUILTIN/Administrators group no existe en forma predeterminada.
  22. Ejecute cada servicio SQL Server bajo una cuenta de dominio diferente.
  23. Dele a las cuentas asignadas a los servicios SQL Server los minimos permisos que le permitan al mismo ejecutarse de la manera correcta. En la mayoría de los casos los permisos de un administrador local no son necesarios y menos aún los permisos de un administrador de dominio.
  24. Cuando use queries distribuidas use linked servers en vez de remote servers. Remote servers están solo por backward compatibility.
  25. No navegue internet desde una instancia de producción de SQL Server.
  26. En vez de instalar antivirus/antispyware en un SQL Server, realice scaneos desde un servidor remoto y solo cuando la actividad del servidor SQL no sea tan alta.
  27. Agregue los service packs, tanto de SQL Server com de sistema operativo apenás estén disponibles.
  28. Considere la posibilidad de encriptar los backups con herramientas como Red Gate SQL Backup Pro u otras.
  29. Solo habilite las trazas de "C2 auditing" o "Common Criteria compliance" cuando sea realmente necesario, porque sobrecargan el servidor si están habilitadas.
  30. Considere seriamente ejecutar un SQL Server security scanner para detectar si hay huecos de seguridad en sus servidores, tanto a nivel sistema operativo como servidor de base de datos. http://searchsqlserver.techtarget.com/feature/SQL-Server-security-test-checklist
  31. Considere habilitar SSL or IPSEC para las conexiones entre sql server y los clientes.
  32. Si está utilizando SQL Server 2005/2008, habilite password policy checking.
  33. Si está usando SQL Server 2008 en un entorno de alta seguridad, considere implementar TDE, Transparent Data Encryption para proteger los datos de su servidor.
  34. Si utiliza SQL Server 2005, no use SQL Server Surface Area Configuration para desbloquear características que nunca se utilizan y que pueden traer solamente problemas de seguridad.
  35. Si está usando SQL Server 2005/2008 y crea endpoints, solo habilite permisos grant CONNECT a los logins que realmente necesitan acceder esos endpoints. Explicitamente deniegue (deny) CONNECT permissions a los endpoints que no son necesarios para los usuarios.

Mantenimiento de Jobs

  1. Evite ejecutar jobs en el mismo horario. Preferentemente cada job debe ejecutarse en su propio horario.
  2. Cuando cree jobs asegurese de incluir intercepción de errores, de loguear la actividad del job y de establecer alertas (mails por ejemplo) para asegurarse de saber al momento de cualquier fallo que pudiera ocurrir.
  3. Cree un login específico con el solo propósito de ejecutar jobs y asignele a dicho login todos los jobs.
  4. Si su job incluye código Transact-SQL, asegurese que está optimizado para que se ejecute correctamente.
  5. Periodicamente (diario, semanal, mensual) reconstruya o reorganice los índices de sus bases de datos para remover la fragmentación logica y aprovechar mejor el especio en disco.
  6. Periódicamente y como parte de sus tareas de mantenimiento, ejecute DBCC CHECKDB en todas sus bases de datos para comprobar su integridad y detectar eventuales problemas.
  7. Evite ejecutar comandos DBCC en los horarios donde se da la mayor carga de trabajo en sus servidores. Estos comandos son altamente requirientes en términos de recursos y afectan la performance.
  8. Si usted reinicia muy raramente el servicio SQL Server service, se va a encontrar con que el log de SQL Server se pone muy grande y toma mucho tiempo para cargar y ser mostrado. Usted puede cerrar el log error actual y crear uno nuevo ejecutando sp_cycle_errorlog o DBCC ERRORLOG. Establezca esto como un job semanal.
  9. Haga un script de todos los jobs y guarde esos scripts en un lugar seguro por si necesita en algun momento reconstruir los servers.

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Como obtener el último registro de una categoría dada usando la función RANK

Supongamos que queremos obtener el último producto vendido de cada categoría, la forma mas sencilla de realizar esto es utilizando la función RANK particionando por la categoría y ordenando por orden inverso por la fecha de venta, luego filtramos por el rango obtenido ( rank = 1) y ahi obtenemos el último de cada categoría.

SELECT *
FROM
(
SELECT top 100 categoria_id
, producto_id
, fechadeventa, Rank() over (Partition BY categoria_id ORDER BY fechadeventa DESC ) AS rango
FROM
productosvendidos
) rs WHERE rango = 1

Hugo Bernachea
Twitter: @bernachea
el.kyrios@yahoo.com
Read More...

Cannot open user default database. Login failed. SQL 2005

En linea de comandos ejecutar la utilidad sqlcmd: sqlcmd -E -d master

Una vez dentro de la línea de comandos de SQL Server ejecutar (reemplazar miLogin con el login que no está pudiendo acceder al servidor)

alter login miLogin with default_database = master

go

Y ya estaría habilitado el acceso a la base.

Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Error 945 Database cannot be opened due to inaccessible files

SQL SERVER – FIX : Error 945 Database cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server error log for details
Este es un error mas o menos común y los pasos de verificación son los siguientes:
Paso 1: Identificar el status de la base de datos
use master
select databaseproperty(‘db_name’,'isShutdown’)

La mayor parte de las veces debería devolver 1 en esta situación.
Paso 2: Limpiar el estado interno de la Base de datos.
use master
alter database db_name set offline

Finaliza sin error en la mayoría de los casos...
Paso 3: Poner la base de nuevo Online

use master

alter database db_name set online
SQL Server verificará el log y la base de datos y si todo está ok ya tendriamos la base nuevamente online y funcional.


Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...