Wednesday, February 4, 2009

Tips para actualizar el SP3 de SQL 2005.

Que tal,
Hace poco terminé de actualizar mi servidores SQL 2005 al SP3 CU1, así que les compartiré algunos tips, para aquellos que aún no lo han hecho.

En general, este Service Pack no da problemas, bueno eso, si el folder C:\windows\installer se mantiene intacto, de lo contrario puede dar algunos problemas y ser mas problematico. Los errores que me han tocado y que he visto son de que al momento de la instalación falle en la instalación del SP en algun componente, pero nunca he visto, que deje el servidor "tocado", o que ya nunca levante. En posts anteriores en este blog hablo de algunos de ellos.

Yo recomendaría que actualizaran al SP3 y de una vez al Cumulative Update 1, ya que los fixes que tiene, valen la pena, son solo 15 minutos mas en el procedimiento.

Aqui comparto algunos tips:
1. Si ya tienes instalado el SP2 en el servidor, descomprime el ejecutable del SP2 (con el 7-zip) y verifica el tamaño que tiene el archivo que viene en el folder hotfixtools, despues verifica que exista un archivo con el mismo tamaño en el folder C:\windows\installer, si existe es que no habrá problema, si no, ya sabes que en ese punto te puede fallar, si tienes un cluster, el archivo solamente estará en el servidor en donde se realizó la instalación.
2. Existe un bug en el cual, la cuenta con la que corre el servicio de SQL no debe ser domain admin, así que ya sabes, si así es, primero sacala del grupo domain admins.
3. Al momento de la instalación, si es un cluster, verifica que no haya alguien logueado por Remote Desktop en el otro nodo.
4. La instalación del SP en un cluster, es un poco tardada, dependiendo del número de nodos y de otras cosas, pero en mi caso, en servidores de 2 nodos, se tarda en total aprox. 40 minutos, así que hay que abrir una ventana de mantenimiento lo suficientemente holgada, a esto hay que añadir lo que se tardan los restarts de los nodos y los failovers. El CU1 se tarda aprox. entre 15 y 20 minutos.
5. Haz un backup completo de todas las bases de datos, nunca sabes que puede pasar y es mejor estar preparado, esto le aumenta tiempo en la instalación, pero es mejor prevenir, que lamentar.
6. De preferencia, antes de que lo vayas a instalar, instala el Windows Installer 4.5.
7. Se tiene que correr el instalador en el nodo en donde está el servicio de SQL funcionando.
8. Al momento de la instalación en cluster, de repente se queda en el mensaje: "Awaiting first complete passive cluster node SQLSERVER", a mi se me tardó en este punto, aprox. 10 minutos, pero despues avanzó, para que no se preocupen y no cancelen la instalación.
9. Revisa bien la estrategia de Disaster Recovery de tus servidores y preparate para el peor escenario, es mejor, estar siempre bien preparados y contar una buena estrategia de recuperacion de datos, si no existe, este es el momento de empezar.

Estos son los pasos que yo realize en cluster active-passive de 2 nodos:
1. Hacer failover de SQL hacia la instancia en donde hize la instalacion.
2. Correr script para deshabilitar jobs. Este script se puede generar utilizando mi script que tengo en otro de mis posts.
3. Correr script para matar conexiones y poner bds en read-only.
4. Correr script para backup de bases de datos.
5. Correr instalador del SP3.
6. Reiniciar el segundo nodo.
7. Hacer failover de SQL al segundo nodo.
8. Reinciar el primer nodo.
9. Instalar el CU1.
10. Reiniciar el segundo nodo.
11. Hacer failover de SQL hacia el segundo nodo.
12. Reiniciar el primer nodo.
13. Correr script para poner bases de datos en read-write.
14. Correr script para habilitar jobs.
15. Verificar aplicaciones que se conectan al servidor, conectividad, delegación, etc.

En teoría no es necesario reiniciar los nodos y hacer failovers despues de aplicar el CU1, pero yo lo hize para estar bien seguro de que no habrá problemas.

Si alguien quiere hacer algun comentario o hacerme preguntas acerca de algo, con todo gusto le ayudaré.

Verifying logins integrity between SQL 2005 servers with PowerShell.

Hi,
Recently I had to verify that every login in my production servers were in my backup servers, so I did a script using PowerShell to do that. This script is useful if you want to make sure that all your backup servers have the production logins.

The script takes 2 parameters, the production server and the backup server, all the logins in the production server must be in the backup server, in case it finds someone is missing, it writes it in a log and displays the login in the console.

This is the script:
param (
[string]$ServerOp ,
[string]$ServerBackup)

$LogFile = "C:\Intlogins\logs\Int_LOGINS_$nombre.log"

out-file -filepath $LogFile -inputobject ("#############################################################################################################################################")
out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject " START PROCESS TO VERIFY LOGINS INTEGRITY " -append
out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append
out-file -filepath $LogFile -inputobject (" ") -append

$SqlConnection = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection.ConnectionString = "Server=$serverOp;Database=master;Integrated Security=True"
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd.CommandText = "select name from master.sys.server_principals where is_disabled=0 and principal_id>258 and name <>'##MS_AgentSigningCertificate##'"
$SqlCmd.Connection = $SqlConnection
$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter.SelectCommand = $SqlCmd
$DataSet = New-Object "System.Data.DataSet" "Table1"
$result = $SqlAdapter.fill($DataSet)

$SqlConnection2 = New-Object System.Data.SqlClient.SqlConnection
$SqlConnection2.ConnectionString = "Server=$serverBackup;Database=master;Integrated Security=True"
$SqlCmd2 = New-Object System.Data.SqlClient.SqlCommand
$SqlCmd2.CommandText = "select name from master.sys.server_principals where is_disabled=0 and principal_id>258 and name <>'##MS_AgentSigningCertificate##'"
$SqlCmd2.Connection = $SqlConnection2
$SqlAdapter2 = New-Object System.Data.SqlClient.SqlDataAdapter
$SqlAdapter2.SelectCommand = $SqlCmd2
$DataSet2 = New-Object "System.Data.DataSet" "Table1"
$result2 = $SqlAdapter2.fill($DataSet2)

foreach ($row in $dataset.Tables[0].rows){
$exist=0
foreach ($row2 in $Dataset2.Tables[0].rows){
if([string]::Compare($row2.name,$row.name,$True) -eq 0){
# Write-Host "The login" $row.name "exists in backup server"
$exist=1
break
}
}
if ($exist -eq 0){
Write-Host "The login" $row.name "does NOT exist in backup server"
$var = "$hora ERROR: The login ["+ $row.name+ "] does NOT exist in backup server: $ServerBackup"
out-file -filepath $LogFile -inputobject $var -append

}
}

out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append
out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject (" END PROCESS TO VERIFY LOGINS INTEGRITY") -append
out-file -filepath $LogFile -inputobject (" ") -append
out-file -filepath $LogFile -inputobject ("#############################################################################################################################################") -append