Jesús Muñoz Torres explica como crear un Cluster SQL Server en Windows Server 2008 R2

En este video, Jesús Muñoz Torres explica paso a paso y magistralmente como armar un cluster para SQL Server 2008 R2 sobre Windows Server 2008 R2. Toda esta explicación está dada sobre entornos virtualizados de modo de poder replicarlo localmente a modo de prueba.

Read More...

Encontrar los queries que consumen mas recursos

Los DMVs (Dynamic Management Views) son una magnífica forma de encontrar información de performance a partir de SQL Server 2005 en adelante (2008/2008R2/2012)
En este query de Pinal Dave se utilizan DMVs para encontrar los queries que mas consumen en un server SQL Server 2005/2008 (recordar que este script funciona solo en bases compatibilidad 2005/2008)


Query:


SELECT TOP 10 SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1,
((
CASE qs.statement_end_offset
WHEN -1 THEN DATALENGTH(qt.TEXT)
ELSE qs.statement_end_offset
END - qs.statement_start_offset)/2)+1),
qs.execution_count,
qs.total_logical_reads, qs.last_logical_reads,
qs.total_logical_writes, qs.last_logical_writes,
qs.total_worker_time,
qs.last_worker_time,
qs.total_elapsed_time/1000000 total_elapsed_time_in_S,
qs.last_elapsed_time/1000000 last_elapsed_time_in_S,
qs.last_execution_time,
qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) qt
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_logical_reads DESC -- logical reads
-- ORDER BY qs.total_logical_writes DESC -- logical writes
-- ORDER BY qs.total_worker_time DESC -- CPU time

Obviamente se puede cambiar el ordenamiento del script para destacar otro criterio de búsqueda.


Hugo Román Bernachea
SQLServer777@gmail.com
Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

Como reparar usuarios "huérfanos"?

Muchas veces encontramos que el user de una base de datos está "huérfano", lo que significa que ya no existe un login asociado al mismo.
Puede ocurrir que exista un login incluso con el mismo nombre, pero internamente su SID no coincide.







Lo primero que hacemos es verificar cuales usuarios son huérfanos en la base de datos

use [su base de datos]
go
EXEC sp_change_users_login 'Report'
con la opción Report le estamos diciendo que liste los usuarios huérfanos.
Una vez que encontramos los usuarios huérfanos los reparamos con la siguiente sentencia.
EXEC sp_change_users_login 'Auto_Fix', 'user'
Donde user es el nombre del usuario que queremos "reparar".

Ahora bien, si además se quiere crear un nuevo login y password para este usuario, usaremos la siguiente sentencia:

EXEC sp_change_users_login 'Auto_Fix', 'user', 'login', 'password'

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

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

SQL Server Best Practices for Developers















SQL Server Best Practices - Hugo Bernachea - Part One
Hugo Román Bernachea
Mail de contacto: SQLServer777@gmail.com

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Máquina virtual para probar las nuevas características de Business Intelligence de SQL Server 2012 (denali)

Microsoft ha puesto a disposición la Base ImageX Server que es una imagen de Máquina virtual para testear las últimas características de Business Intelligence de SQL Server 2012 (denali) - RC0, incluyendo PowerView Reports y PowerPivot Excel Documents.






La máquina la pueden obtener de esta url: http://www.microsoft.com/betaexperience/pd/BIVHD/enus/, para conectarse a la máquina pueden utilizar el usuario CONTOSO\Administrator, con la contraseña pass@word1 (precaución con el idioma de la máquina, está en inglés por lo que es posible que la @ la tengan que introducir con Shift+2).


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

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea


Read More...

Configurando una replicación Master a Master usando MySQL

Todos sabemos de la importancia de implementar mecanismos de alta disponibilidad en los servidores que nos toca administrar. En este caso, voy a detallar los pasos para implementar una replicación master to master o bidireccional entre servidores MySQL (una especie de espejado o mirror).

En ambos servers debemos hacer las siguientes tareas:

1. Crear una carpeta Logs, por ejemplo:
c:\program files\mysql\logs\

2. Crear un usuario para la replicación con suficientes permisos.

mysql -u root -pSuPassword (sin espacios el pass y el -p)
GRANT REPLICATION SLAVE ON *.* TO 'usuario'@'%' IDENTIFIED BY 'pepe';
FLUSH PRIVILEGES;

En el master principal

Hay que editar el archivo my.ini (en windows) o my.conf (en linux).
En la sección marcada como
[mysqld] agregar lo siguiente.
log-bin = “D:\MySQL\MySQL Server 5.1\Logs” (cuidado con las comillas)
binlog-do-db=mibase
server-id=1

y agregar al final del archivo lo siguiente:
slave-net-timeout = 30
master-connect-retry = 30

Una vez hecho esto, grabamos y reiniciamos el servicio, ya sea por services o por línea de comandos:
mysqld restart

En el Master secundario:

Lo mismo, cambiar my.ini o my.conf, segun sea Windows o Linux y agregar lo siguiente en la sección: [mysqld]

log-bin = “c:\program files\mysql\logs\” (cuidado con las comillas)
binlog-do-db=winnings
server-id=2 (fijarse que este número es distinto al del master principal)

y al final del archivo agregar:
slave-net-timeout = 30
master-connect-retry = 30

grabar el archivo y reiniciar el servicio mysql

mysqld restart

En el Master principal:

Para evitar problemas vamos a bloquear las tablas hasta que finalicemos la operatoria.

FLUSH TABLES WITH READ LOCK;

En el Master secundario:

Creamos la base a ser replicada:
mysql -u root -pSuPassword

CREATE DATABASE suBase;

mysql -u root -pSuPassword suBase < suBase_backup.sql

En el Master principal:

mysql -u root -pSuPassword

use SuBase
go
SHOW MASTER STATUS;

Esto nos mostrará algo asi
PLAIN TEXT
CODE:
+---------------------+----------+-------------------------------+------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------------+----------+-------------------------------+------------------+
| mysql-bin.000001 | 21197930 | my_database,my_database | |
+---------------------+----------+----------------------------

Lo que nos interesa a nosotros es el dato del file (mysql-bin.000001) y el número de la posición (21197930) . Con esos datos nos vamos al master secundario.

En el master secundario:
mysql -u root -pSuPassword

stop slave;
CHANGE MASTER TO MASTER_HOST='10.33.0.14', MASTER_USER='usuario', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=21197930;
start slave;

Fijense que en los parametros master_log_file y master_log_pos pusimos los datos que guardamos en el paso anterior en el master principal. En master user pusimos el usuario que creamos originalmente para la replicación y en Master_password su correspondiente password.

A continuación ejecutamos lo siguiente para ver como está funcionando la replicación:

Show Slave Status;

A este punto ya tendríamos seteada la replicación desde el master principal al master secundario, pero nos faltaría hacer la inversa, replicación desde el secundario al principal, por lo tanto...
Vamos al Master secundario.
use SuBase
go
SHOW MASTER STATUS;
Lo mismo que antes, tomamos los valores de file y position y los llevamos ahora al master principal.

En el master principal
mysql -u root -pSuPassword

stop slave;
CHANGE MASTER TO MASTER_HOST='10.33.0.13', MASTER_USER='usuarios', MASTER_PASSWORD='pepe’, MASTER_LOG_FILE='Logs.000001', MASTER_LOG_POS=107;
start slave;

Y como habiamos bloqueado las tablas para replicar sin problemas ahora es el momento de desbloquearlas:

unlock tables;

Si se siguieron todos los pasos, en este momento la replicación debería estar funcionando.

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

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea















Read More...

Where In usando Variables varchar.


Esta es una cuestión que muchas veces queremos resolver, como hacer un where in contra una variable de tipo varchar.
Obviamente que en reporting services está cuestión se resuelve por si misma, pero el punto es cuando queremos ejecutar sentencias con where in dados por una variable.
Está claro que se puede ejecutar por medio de xml o sql dinámico, pero estas soluciones no están exentas de su complejidad.

La solución propuesta en este caso es la creación de una función que transforma el contenido de una variable de tipo varchar en un resultset de integers.

La función

Create function dbo.SplitToInt(@values varchar(8000), @delimiter varchar(10))
returns @result table (value int)
as
begin
declare @v as varchar(8000);
while charindex(@delimiter,@values) <> 0
begin
set @v = substring(@values,1,charindex(@delimiter,@values)-1);
if isnumeric(@v)=1
insert into @result
values(@v);
set @values = substring(@values,charindex(@delimiter,@values)+1,len(@values))
end
if isnumeric(@values)=1
insert into @result
values(@values);
return;
end

Un ejemplo:

declare @sIds varchar(10)
set @sIds = '1,3,4'
select * from tabla where id in (select * from SplitToInt(@sIds, ','))

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

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...

Consejo de Experto, Qing Song Yao recomienda NO usar char o varchar !

Qing Song Yao: Hoy quisiera recomendarles que NO usen los tipos de datos char o varchar para representar strings en su base de datos. Nunca se arrepentirán de haber usado nchar o nvarchar en cualquier implementación.
Por ejemplo, nuestra implementación de Sharepoint usa exclusivamente el tipo de datos nvarchar y nunca hemos tenido problemas relacionados con almacenar caracteres en diferentes lenguajes. Y adicionalmente los tipos unicode (nvarchar y nchar) tienen mejor soporte en .NET, ODBC, JDBC y Windows.

En cambio Varchar y Char solo admiten un rango mas limitado de caracteres y el soporte de herramientas no es tan amplio comparado con los tipos unicode (nvarchar o nchar).

Ah, me dirán que nvarchar ocupa el doble de espacio de almacenamiento si la mayor parte de los datos está dada en alfabetos latinos. Pero en SQL Server 2008 R2 existen la opción de Compresión de Datos a nivel de página, que les permite obtener una compresión a hasta la mitad del tamaño sin por eso tener un impacto significativo a nivel de performance.
De modo que recomiendo usar nvarchar junto a la compresión a nivel de página para lograr ambas cosas: menor espacio en disco y mejor soporte a nivel plataforma.
artículo original: Qing Song Yao
traducido por : Hugo Bernachea

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

Microsoft Certified DBA
Microsoft Certified Trainer
Twitter: @bernachea

Read More...