martes, 22 de enero de 2013

TIP OPTIMIZAR RENDIMIENTO DE SQL



Muchos de los que administramos infraestructura, nos enfrentamos al problema y degradación del performance de nuestros servidores. En estos casos debemos realizar un análisis minucioso de nuestros servidores para poder identificar los cuellos de botella.

Existen varias herramientas que junto con el performon de Windows nos permite analizar estos datos para identificar si parte de nuestros problemas están siendo ocasionados por los dispositivos de almacenamiento.

1. ARREGLO DE DISCOS

En términos de arreglos de discos lo recomendado para ambientes de producción de alta disponibilidad y transaccionalidad, lo mejor es contar con un RAID 10.

RAID 1+0

Diagrama de una configuración RAID 10.
Un RAID 1+0, a veces llamado RAID 10, es parecido a un RAID 0+1 con la excepción de que los niveles RAID que lo forman se invierte: el RAID 10 es una división de espejos.2
En cada división RAID 1 pueden fallar todos los discos salvo uno sin que se pierdan datos. Sin embargo, si los discos que han fallado no se reemplazan, el restante pasa a ser un punto único de fallo para todo el conjunto. Si ese disco falla entonces, se perderán todos los datos del conjunto completo. Como en el caso del RAID 0+1, si un disco que ha fallado no se reemplaza, entonces un solo error de medio irrecuperable que ocurra en el disco espejado resultaría en pérdida de datos.
El RAID 10 es a menudo la mejor elección para bases de datos de altas prestaciones, debido a que la ausencia de cálculos de paridad proporciona mayor velocidad de escritura.

En términos de performance debemos tener nuestras bases de datos en arreglos de RAID independientes y diferentes para las Data Bases de SQL así:

2. ALINEAMIENTO Y OFFSET DE PARTICIÓN, PARA QUE EVITEMOS DOBLE LECTURA:


Este es un problema que todos los equipos que tiene versiones de Windows anteriores al Windows Vista / Server 2008, sufren.
El offset de partición, representa el sector del disco donde empieza la partición, y su correspondiente incidencia en el resto de los bloques de almacenamiento, y su consecuente efecto en el alineamiento de la partición.
La manera de determinar si el offset hizo que mi particion este o no correctamente alineada a los sectores del disco, es simple.
Se ingresa al “command prompt” del Windows, desde el menú Inicio -> Ejecutar -> cmd
En el se escribe lo siguiente, y luego se presiona Enter:
C:\\Windows\\System32\\wmic partition get BlockSize, StartingOffset, Name, Index
Esto, nos retornara como resultado, los datos del tamaño de bloques, offset, nombre de partición e indice de la misma en el disco.
Lo que se hace a continuación, es dividir el valor devuelto bajo la columna StartingOffset entre 1024. Si el nro. de resultado, es entero, la partición está alineada, de lo contrario, el offset hace que nuestra partición no este alineada con los sectores del disco duro.
Veamos un par de ejemplos.


Tomando como ejemplo, el valor 1048576 de esta captura realizada en un Windows Server 2008, si lo dividimos por 1024 nos da como resultado 1024. Esto quiere decir que la partición está alineada a los sectores del disco duro.
Ahora veamos esta otra captura realizada en un Windows Server 2003.




SQL2008 Consumo de Memoria

Hola a todos!

A continuación les dejo un scrip para configurar de forma correcta la memoria de nuestro servidor SQL


SET NOCOUNT ON
GO

IF EXISTS ( SELECT name
FROM tempdb..sysobjects
Where name like '#SerProp%' )
--If So Drop it
DROP TABLE #SerProp
create table #SerProp
(
ID int,
Name sysname,
Internal_Value int,
Value nvarchar(512)
)

GO

--Set Show Advanced Option
sp_configure 'Show Advanced Options', 1
Reconfigure
GO

DECLARE @PhysMem int
DECLARE @ProcType int
DECLARE @MaxMem int


INSERT INTO #SerProp
Exec xp_msver

Select @PhysMem = Internal_Value
from #SerProp
where Name = 'PhysicalMemory'

Select @ProcType = Internal_Value
from #SerProp
where Name = 'ProcessorType'

--Set Memory Configuration from server properties
--(memory level and processortype)

If @PhysMem > 4096 AND @ProcType = 8664
BEGIN
SET @MaxMem = @PhysMem - 3072
EXEC sp_configure 'max server memory', @MaxMem
Reconfigure
END 

ELSE
IF @PhysMem > 4096 AND @ProcType <> 8664
BEGIN
SET @MaxMem = @PhysMem - 3072
EXEC sp_configure 'awe enabled', 1
Reconfigure
EXEC sp_configure 'max server memory', @MaxMem
Reconfigure
END

miércoles, 6 de abril de 2011

INSTALACION DE SERVIDOR STUN EN ASTERISK

Hola a todos!


Muchos de los que hemos comenzado a trabajar con VoIP hemos intentado configurar STUN Server pero no sabíamos como.


En esta ocasión vamos a ver como configurar un servidor STUN en nuestro Servidor Asterisk.


Lo primero es iniciar sesión en nuestro servidor Asterisk vía shell y luego ejecutar los siguientes pasos:


1. Descargar las librerias de STUN Server, ejecutando los siguientes comandos:


    [root@voip ~]# cd /usr/local/sbin/
    [root@voip sbin]# wget http://downloads.sourceforge.net/project/stun/stun/0.96/stund_0.96_Aug13.tgz


2. El siguiente paso es compilar nuestro paquete e instalar el mismo, ejecutando los siguientes comandos:



    [root@voip ~]# tar xvfz stund_0.96_Aug13.tgz
    [root@voip ~]# cd stund
    [root@voip ~]# make



3. Para poder iniciar nuestro servicio es necesario contar con 2 interfaces de red las cuales no necesariamente deben ser físicas; en este paso crearemos una interfaz virtual adicional a nuestro servidor.


Mi servidor actualmente cuenta con una tarjeta de red eth0 con la siguiente configuración:



# Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller
DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.50.255
DHCPCLASS=
HWADDR=00:1C:C0:7F:3A:2B
IPADDR=192.168.50.6
NETMASK=255.255.255.0
NETWORK=192.168.50.0
ONBOOT=yes



Ahora vamos a crear una nueva interfaz virtual que usaremos como segunda interfaz, para esto ejecutamos los siguientes comandos para crear nuestro archivo de NIC virtual eth0:0:


 [root@voip ~]# cd /etc/sysconfig/network-scripts/
 [root@voip ~]# vi ifcfg-eth0:0


En nuestro archivo colocamos los siguientes parámetros:



# Realtek Semiconductor Co., Ltd. RTL8111/8168B PCI Express Gigabit Ethernet controller
DEVICE=eth0:0
BOOTPROTO=static
BROADCAST=192.168.50.255
DHCPCLASS=
HWADDR=00:1C:C0:7F:3A:2B
IPADDR=192.168.50.7 
NETMASK=255.255.255.0
NETWORK=192.168.50.0
ONBOOT=yes

 
Salvamos nuestro archivo y estamos listos para configurar nuestro sistema para que inicie de forma automática el servicio de STUN.

Para esto es necesario editar el archivo /etc/rc.d/rc.local y colocar la siguiente linea:

/usr/local/sbin/stund/server -v -b -h 192.168.50.6 -p 3478 -a 192.168.50.7 -o 3479

Guardamos y reiniciamos nuestro servidor.

Una vez realizados estos procesos ha quedado funcional nuestro servidor STUN.



martes, 21 de septiembre de 2010

Info relacionado datos en formularios AX 2009

/* Muestra los registros de la CustTable en un info y al hacer 2 clic en la linea
   abre la ventana de CustTable con el registro relacionado
   
   Samuel Ardila */

static void infoCustTable(Args _args)
{
    Query       query;
    CustTable   custTable;
    sysInfoAction_FormRunQuery   sysInfoAction;
    ;
    
    while select custTable
        index hint AccountIdx
        where custTable.AccountNum like '1*'
            {
                query = new query();
                query.addDataSource(tableNum(CustTable)).addRange(fieldNum(CustTable, AccountNum)).value(custTable.AccountNum);
                info(strfmt('%1 - %2',custTable.AccountNum,DirPartyTable::find(custTable.PartyId).Name),'', sysInfoAction_FormRunQuery::newFormnameControlnameQuery(formStr(CustTable),'sac', query));
            }

}

miércoles, 25 de agosto de 2010

Enviar mail desde Dynamics AX 2009

Hola a todos, a continuación coloco una forma fácil de hacer un envío de correo desde Dynamics AX 20009.


static server void SendMailServer(Args _args)
{

    SysMailer                     mailer;
    SysEmailParameters      mailParms;
    ;

    mailer = new SysMailer();
    mailParms = SysEmailParameters::find();


    mailer.SMTPRelayServer(mailParms.SMTPRelayServerName,mailParms.SMTPPortNumber,mailParms.SMTPUserName,SysEmailParameters::password(),false);
    mailer.priority(1);
    mailer.fromAddress('noreply@miemail.com','Mi nombre');
    mailer.tos().clear();
    // Uno o mas destinatarios de correo
    mailer.tos().appendAddress('destinatario@correo.com');
    mailer.subject('Email enviado desde Dynamics AX');
    mailer.htmlBody('
Este es el cuerpo de nuestro mensaje de correo.');
    mailer.sendMail();


}

jueves, 19 de agosto de 2010

LDIFDE para importar y exportar a Active Directory

El formato para intercambio de datos en LDAP (o formato LDIF) es un estándar de Internet con el que se busca un formato de archivo que pueda utilizarse para realizar operaciones por lotes en directorios según los estándares del protocolo LDAP. El formato LDIF puede utilizarse para exportar e importar datos, al tiempo que permite llevar a cabo operaciones por lotes (como agregar, crear o modificar) en Active Directory. Windows 2000 | 2003 | 2008 incluye un programa de utilidad denominado LDIFDE que proporciona compatibilidad con las operaciones por lotes basadas en el estándar LDIF de formato de archivos. Este artículo pretende servir de ayuda para comprender mejor el uso de la utilidad LDIFDE para migrar directorios.

Utilización de LDIFDE para exportar e importar objetos del directorio

El siguiente proceso paso a paso indica cómo importar y exportar unidades organizativas (OU) y cuentas de usuario de un Active Directory de Windows 2000 a otro. En el ejemplo, "Export" será el nombre del dominio desde el que se exportan objetos e "Import", el del dominio al que se importan. LDIFDE también puede utilizarse para importar a Active Directory la mayoría de las carpetas de otros fabricantes.

Exportación de las unidades organizativas desde el dominio de origen

  1. Inicie sesión como Administrador en el dominio Export. Si inicia sesión con una cuenta sin privilegios administrativos, probablemente no consiga realizar operaciones de importación y exportación en Active Directory.
  2. Haga clic en Inicio, seleccione Programas y Accesorios y, a continuación, haga clic enSímbolo del sistema.
  3. En el símbolo del sistema, escriba:

    ldifde -f exportOu.ldf -s Servidor1 -d "dc=Export,dc=com" -p subtree -r "(objectCategory=organizationalUnit)" -l "cn,objectclass,ou"
    Al ejecutar este comando se exportan todas las OU menos los controladores de dominio en un archivo denominado ExportOU.ldf.

Exportación de las cuentas de usuario desde el dominio de origen

En el símbolo del sistema, escriba:
ldifde -f Exportuser.ldf -s Servidor1 -d "dc=Export,dc=com" -p subtree -r "(&(objectCategory=person)(objectClass=User)(givenname=*))" -l "cn,givenName,objectclass,samAccountName"
Al ejecutar este comando se exportan todos los usuarios del dominio Export a un archivo denominado Exportuser.ldf. Si no tiene todos los atributos necesarios, la operación de importación no se realizará. Los atributos objectclass y samAccountName son necesarios, si bien es posible agregar otros más. 

Nota



Las cuentas integradas, como la de Administrador, no tienen nombre dado. De manera predeterminada, el anterior filtro LDAP no exportará estas cuentas. LDIFDE no admite la exportación de contraseñas. 

Nota 



Cuando se omite el parámetro -s, LDIFDE elige un catálogo global para las exportaciones. Dependiendo de la ubicación del controlador de idioma, este servidor puede ser un controlador de dominio para un dominio diferente y las exportaciones pueden fallar. Esto se ve al examinar la salida de LDIFDE. En tal caso, indique un controlador de dominio local del dominio en el que se alojan los objetos.

Importación de las unidades organizativas de Export a Import

  1. Inicie sesión como Administrador en el dominio Import. Si inicia sesión con una cuenta sin privilegios administrativos, probablemente no consiga realizar operaciones de importación y exportación en Active Directory.
  2. Abra el archivo Exportou.ldf con el Bloc de notas.
  3. En el Bloc de notas, en el menú Edición, haga clic en Reemplazar.
  4. En el cuadro Buscar, escriba Export. En el cuadro Reemplazar por, escriba Import.
  5. Haga clic en Reemplazar todo.
  6. Compruebe que los nombres de dominio se han reemplazado y, a continuación, guarde y cierre el archivo.
  7. En el símbolo del sistema, escriba:

    ldifde -i -f ExportOU.ldf -s Servidor2
Debe aparecer un mensaje en el que se indique el número de entradas modificadas y que el comando ha terminado correctamente. 

Nota



En este caso, es necesario completar el primer paso antes del segundo de modo que las OU estén disponibles para incluir a los usuarios.

Importación de los usuarios de Export a Import

  1. Abra el archivo Exportuser.ldf con el Bloc de notas.
  2. En el Bloc de notas, abra el menú Edición y haga clic en Reemplazar. 

    Nota Recuerde que, en este ejemplo, "Export" es el nombre del dominio desde el que se exportan objetos e "Import", el del dominio al que se importan. Deberá reemplazar "Export" por el nombre del dominio desde donde exportó antes e "Import" por el dominio al que vaya a importar.
  3. En el cuadro Buscar, escriba Export. En el cuadro Reemplazar por, escriba Import.
  4. Haga clic en Reemplazar todo.
  5. Compruebe que los nombres de dominio se han reemplazado y, a continuación, guarde y cierre el archivo.
  6. En el símbolo del sistema, escriba:

    ldifde -i -f Exportuser.ldf -s Servidor2
  7. Vea los contactos recién creados utilizando el complemento Usuarios y equipos de Active Directory o la Libreta de direcciones de Windows.
NOTA 


Puesto que LDIFDE no exporta contraseñas, al importar los usuarios al directorio la cuenta queda deshabilitada y el valor de la contraseña se establece como nulo. Esto se hace por razones de seguridad. Asimismo, queda seleccionada la opción de cuenta "El usuario debe cambiar a la contraseña en el siguiente inicio de sesión".

Exportación de objetos de todo un bosque

Si necesita exportar las OU, los usuarios y los grupos de todo un bosque, puede ejecutar los comandos de exportación de LDIFDE anteriores en cada dominio del bosque o, como alternativa, puede ejecutar la consulta una vez para el catálogo global (GC). Para ello, compruebe que el controlador de dominio especificado por el modificador -s es un GC y, además, especifique el puerto del GC con el modificador -t. El número de puerto del GC es 3268. 

Por ejemplo, para realizar la operación de exportación anterior en un GC, el comando de LDIFDE sería:

ldifde -f Exportuser.ldf -s Servidor1 -t 3268 -d "dc=Export,dc=com" -p subtree -r "(&(objectCategory=person)(objectClass=User)(givenname=*))" -l "cn,givenName,objectclass,sAMAccountName"
Nota


Para modificar atributos en AD es muy importante respetar el siguiente formato en el archivo de importación, especialmente en cuanto a los guiones "-" que ocupan una línea seguida de otra línea completamente en blanco. Para importar este archivo, simplemente deberá ejecutar lo siguiente: ldifde -i -f Import.ldf -s Servidor.

martes, 25 de mayo de 2010

Truncar log y espacio disponible en una base de datos SQL

Hola Todos,

Les dejo el siguiente script, es para truncar el los de una base de datos de MS SQL y a su vez la indexa y recupera el espacio disponible disminuyendo de tamaño el MDF de la base de datos.




USE --> Remplace por su base de datos
GO


ALTER DATABASE contoso
SET SINGLE_USER




SELECT file_id, name
FROM sys.database_files
GO
-- truncamos el log a 1 MB.
DBCC SHRINKFILE (2, 1)
-- truncamos el espacio disponible del ldf y mdf
DBCC SHRINKFILE (1, TRUNCATEONLY)


DECLARE @TableName varchar(255) 


DECLARE TableCursor CURSOR FOR 
SELECT table_name FROM information_schema.tables 
WHERE table_type = 'base table' 


OPEN TableCursor


FETCH NEXT FROM TableCursor INTO @TableName 
WHILE @@FETCH_STATUS = 0 
BEGIN 
DBCC DBREINDEX(@TableName,' ',90) 
FETCH NEXT FROM TableCursor INTO @TableName 
END


CLOSE TableCursor 


DEALLOCATE TableCursor


DBCC SHRINKDATABASE (N'contoso');


-- Truncamos una vez mas el log de la Base de Datos
DBCC SHRINKFILE(2,1)
BACKUP LOG contoso WITH TRUNCATE_ONLY
DBCC SHRINKFILE(2,1)


ALTER DATABASE contoso
SET MULTI_USER