Blackslot blog

Etiquetados como ‘sql server’

Al tratar de hacer un backup de una base de datos pesada en SQL Server desde el panel de control Plesk se produce el siguiente error:

“The timeout period elapsed prior to the completion of the operation or the server is not responding”.

El motivo es que las conexiones remotas tienen un tiempo máximo y sino se completa el proceso se cierra la misma produciéndose así el error.

La mayoría de las veces se soluciona aumentando el tiempo de la conexión que Plesk establece, para hacerlo hay que editar las siguientes entradas en el registro (regedit).

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Plesk\PSA Config\Config\ADOConnectionTimeout
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Plesk\PSA Config\Config\ADOCommandTimeout

Para poner un valor similar al que tiene por defecto SQL Server, podemos ponerlo a 600 y probar.

Si la base de datos es demasiado pesada y queremos permitir hacer backup, tendremos que ajustar además el valor del propio SQL Server por uno más alto, si lo ponemos a 0 será ilimitado.

El comando para ver el timeout es:

EXEC sp_configure

Si queremos cambiarlo por ejemplo a 1000, ejecutamos:

EXEC SP_CONFIGURE 'remote query timeout', 1000
reconfigure

También se puede hacer desde las propiedades de Sql Server > Connections.

Timeout en SQL al hacer el backup

Cómo solucionar el error de timeout al realizar el backup de SQL Server

 

1 comentario | Archivado como Sistemas TI | 08/05/2013

Anteriormente veíamos como reparar una base de datos. Si el estado es cualquiera de los otro dos (REPAIR MODE o EMERGENCY), entonces tendremos que recurrir a otro tipo de apaños. En mi caso he experimentado el problema tras tratar de recrear un nuevo transaction log para una bbdd, pero también puede servir en casos en el que el archivo de datos este dañado.

Voy a indicar lo que hice para reproducir el problema. Separé una base de datos y borré su .LDF, luego al adjuntarla obtenía este error:

Error al adjuntar las bases de datos. Haga clic en el hipervínculo de la columna de mensajes para obtener más información.

Crearlo a mano no es muy buena idea según nos muestra el siguiente error:

The operating system returned error 38(Se ha alcanzado el final del archivo.) to SQL Server during a read at offset 0000000000000000 in file ‘C:Archivos de programaSWsoftPleskDatabasesMSDEMSSQLDatasergiodb_log.ldf’. Additional messages in the SQL Server error log and system event log may provide more detail. This is a severe system-level error condition that threatens database integrity and must be corrected immediately. Complete a full database consistency check (DBCC CHECKDB). This error can be caused by many factors; for more information, see SQL Server Books Online. (Microsoft SQL Server, Error: 823)

Dado que no era posible adjuntar la bbdd, el siguiente paso fue renombrar el archivo de datos sergiodb.mdf por sergiodb_bak.mdf y crear una nueva base de datos con el nombre sergiodb. Con esto obtenemos un nuevo mdf y un ldf limpio.

El siguiente paso fue detener SQL Server y sobrescribir sergiodb.mdf por el bueno e iniciar de nuevo SQL. Con esto se produce el siguiente error al intentar por ejemplo ver las propiedades de la bbdd:

Unable to open the physical file “C:Archivos de programaSWsoftPleskDatabasesMSDEMSSQLDatasergiodb.mdf”. Operating system error 5: “5(Acceso denegado.)”. (Microsoft SQL Server, Error: 5120)

Tras dar permisos NTFS al archivo de datos, el error cambiaba a:

Database ‘sergiodb’ cannot be opened due to inaccessible files or insufficient memory or disk space. See the SQL Server errorlog for details. (Microsoft SQL Server, Error: 945)

Con todo esto el estado de mi BD era RECOVERY_PENDING

SELECT state_desc FROM sys.databases WHERE name =‘sergiodb’;

SOLUCION

ALTER DATABASE sergiodb SET EMERGENCY ;– lo primero que haremos es pasar la bbdd del modo “RECOVERY_PENDING” al modo “EMERGENCY” (es necesario tener privilegio de sysadmin)

ALTER DATABASE sergiodb SET SINGLE_USER ;– La ponemos en modo de usuario único.

DBCC CHECKDB (sergiodb, REPAIR_ALLOW_DATA_LOSS )WITH NO_INFOMSGS ;– Chequeamos la bd con la opción REPAIR_ALLOW_DATA_LOSS

ALTER DATABASE sergiodb SET MULTI_USER ;– Por ultimo la ponemos en modo multiusuario

Ahora debería estar en modo ONLINE y funcionando.

1 comentario | Archivado como Sistemas TI | 02/05/2012

Debido a múltiples circunstancias como cortes eléctricos inesperados, problemas de espacio en disco, fallos de hardware, que hayas borrado el archivo de log (.ldf), etc. Una bbdd puede corromperse, normalmente la mejor manera de solucionar esto es recurrir a la última copia de seguridad pero como puede ocurrir en estos casos no hay copia o la que tenemos disponible es ya algo vieja. En esos casos quizá aún podamos recuperar la información.

Una bbdd puede tener estos estados (LINK):

  • ONLINE: La base de datos está disponible para su acceso. El grupo de archivos principal está en línea, aunque la fase de deshacer de la recuperación puede no haberse completado.
  • OFFLINE: La base de datos no está disponible. Una base de datos pasa a estar sin conexión por la acción explícita del usuario y permanece sin conexión hasta que el usuario toma otra acción. Por ejemplo, la base de datos puede desconectarse para mover un archivo a un nuevo disco. La base de datos se vuelve a poner en línea una vez completado el traslado.
  • RESTORING: Uno o varios archivos del grupo de archivos principal se está restaurando, o uno o varios archivos secundarios se están restaurando sin conexión. La base de datos no está disponible.
  • RECOVERING: Se está recuperando la base de datos. El proceso de recuperación es un estado transitorio, la base de datos se pone automáticamente en línea si la recuperación tiene éxito. Si la recuperación no tiene éxito, la base de datos pasa a ser sospechosa. La base de datos no está disponible.
  • RECOVERY PENDING: SQL Server ha encontrado un error relacionado con un recurso durante la recuperación. La base de datos no está dañada pero pueden faltar archivos o bien limitaciones de recursos del sistema pueden estar impidiendo que se inicie. La base de datos no está disponible. Se necesita una acción adicional por parte del usuario para resolver el error y permitir que se complete el proceso de recuperación.
  • SUSPECT: Como mínimo un grupo de archivos principal es sospechoso y puede estar dañado. La base de datos no se puede recuperar durante el inicio de SQL Server. La base de datos no está disponible. Se requiere una acción adicional por parte del usuario para resolver el problema.
  • EMERGENCY: El usuario ha cambiado la base de datos y ha establecido el estado en EMERGENCY. La base de datos está en modo de usuario único y se puede reparar o restaurar. La base de datos está marcada como READ_ONLY, el registro está deshabilitado y el acceso está limitado a miembros de la función fija de servidor sysadmin. EMERGENCY se utiliza principalmente para solucionar problemas. Por ejemplo, una base de datos marcada como sospechosa se puede establecer en el estado EMERGENCY. Esto puede permitir al administrador del sistema acceso de sólo lectura a la base de datos. Sólo los miembros de la función fija de servidor sysadmin pueden establecer una base de datos en el estado EMERGENCY.

Cuando se corrompe la tendremos seguramente en Online, Recovery pendingSuspect.

Puedes ver el estado de la BD utilizando esta consulta (sustituye blackslotdb por la bd a consultar):

SELECT state_desc FROM sys.databases WHERE name = ‘blackslotdb’;

Si la bd está en estado ONLINE, lo más fácil es intentar un checkdb con la opción REPAIR_ALLOW_DATA_LOSS.

DBCC CHECKDB (MAGIC, REPAIR_ALLOW_DATA_LOSS)WITH NO_INFOMSGS

Más info en http://technet.microsoft.com/es-es/library/ms188422.aspx

En la segunda parte de este post comentaremos como reparar si la bd se encuentra en alguno de los otros 2 modos o no se puede adjuntar.

Comentarios desactivados | Archivado como Sistemas TI | 25/04/2012

Las 10 consultas que más CPU consumen en SQL Server

Escrito por Sergio el 28-03-2012

En ocasiones nuestro SQL Server consume demasiada CPU, un buen comienzo es localizar cuales son las consultas que más sobrecargan de media nuestro servidor.

Para ello, podemos utilizar el siguiente script que lista el top ten de las consultas que más cargan la CPU de nuestro servidor SQL.

SELECT TOP 10
qs.total_worker_time/qs.execution_count as [Avg CPU Time],
SUBSTRING(qt.text,qs.statement_start_offset/2,
(case when qs.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else qs.statement_end_offset end -qs.statement_start_offset)/2)
as query_text,
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
[Avg CPU Time] DESC

Comentarios desactivados | Archivado como Sistemas TI | 28/03/2012

Las 10 consultas que más se ejecutan en Sql Server

Escrito por Sergio el 27-03-2012
En las tareas de administración  de SQL Server, es necesario recabar información a fin de conocer las sentencias que más hacen trabajar al servidor.
El siguiente script nos mostrará el top ten de las consultas que más veces se repiten.
En muchos casos se pueden usar servicios de caché para evitar que las mismas consultas se repitan una y otra vez.

SELECT TOP 10
qs.execution_count,
SUBSTRING(qt.text,qs.statement_start_offset/2,
(case when qs.statement_end_offset = -1
then len(convert(nvarchar(max), qt.text)) * 2
else qs.statement_end_offset end -qs.statement_start_offset)/2)
as query_text,
qt.dbid, dbname=db_name(qt.dbid),
qt.objectid
FROM sys.dm_exec_query_stats qs
cross apply sys.dm_exec_sql_text(qs.sql_handle) as qt
ORDER BY
qs.execution_count DESC

2 comentarios | Archivado como Sistemas TI | 27/03/2012

Modo exclusivo en Sql Server

Escrito por Sergio el 21-02-2012

Ciertas operaciones requieren acceso exclusivo a la bbdd por lo que si hay conexiones abiertas contra ella obtenemos un error como este:

Mens. 5030, Nivel 16, Estado 2, Línea 1
No se puede bloquear de forma exclusiva la base de datos para realizar la operación.

Debemos ir a las propiedades de la BBDD > Opciones > Estado > Restringir acceso y seleccionamos single.

También se puede ejecutar la consulta:

ALTER DATABASE [nombre_bd] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

Ahora se pueden hacer los cambios necesarios.

Para volver al modo de multiples usuarios hay que matar la conexión y cambiar el modo, se puede hacer fácilmente con esta consulta:

Kill [spid]

ALTER DATABASE [nombre_bd] SET MULTI_USER

1 comentario | Archivado como Sistemas TI | 21/02/2012

Agregar o quitar una interfaz de red en SQL Server

Escrito por Sergio el 02-02-2012

Cuando se instala SQL Server, este se configura teniendo en cuenta las interfaces habilitada en ese momento. Pero si más tarde habilitamos una nueva interfaz o la deshabilitamos esta no aparece/desaparece de la configuración de red.


La forma para hacer esto es editando el registro, toda la información se guarda en:

[HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQL.1MSSQLServerSuperSocketNetLibTcp]

Por tanto una forma de quitar una IP es borrar su registro y para añadirla lo que yo hago es exportar una clave ya existente y editarla como deseo antes de ejecutar el .reg para que inserte los cambios.

Comentarios desactivados | Archivado como Desarrollo web, Nuestros servicios, Sistemas TI | 02/02/2012

Lenguaje de SQL Server (dateformat)

Escrito por Sergio el 23-01-2012

Este es un problema que puede suceder al migrar una base de datos a otro entorno mssql que no comparta el mismo lenguaje de instalación que el que teníamos en un principio.

En este caso ha sido al restaurar una base de datos que se encontraba en un sql con lenguaje “español” a otro que habían instalado en “us_english”. Con el primero las fechas (campos de tipo datetime) se muestran en formato “dd/mm/yyy” pero en inglés las fechas tienen el formato “mm/dd/yyyy”.

Si mostramos la tabla desde el Microsoft Sql Server Managmentent Studio veremos que las fechas se muestran tal y como hemos importado, pero el problema viene cuando queremos hacer una consulta por ejemplo desde nuestra web y Sql Server nos devuelve la fecha, entonces veremos que se produce un error que esta relacionado con el formato de la fecha.

Puestos en situación, vamos manos a la obra.

¿Como ver el lenguaje de Sql Server?

select @@language

Si mssql ha sido instalado en inglés seguramente obtendrás us_english como resultado.

¿Como ver todos los lenguajes disponibles y sus propiedades?

sp_helplanguage


¿Como establecer el lenguaje?

De esta manera establecemos el lenguaje español para todas las consultas que lancemos desde la sesión y con el usuario que estemos conectados:

SET LANGUAGE Español

También podemos, por ejemplo en el caso de nuestra web, antes de lanzar una consulta sql especificar el dateformat deseado en cada caso, indicando: �

set dateformat dmy

¿Como establecer el lenguaje predeterminado para TODAS las bases de datos del servidor?

De esta manera conseguimos que por defecto se devuelvan las fechas en formato dd/mm/yyyy. Lo que debemos hacer es abrir Microsoft Sql Server Managmentent Studio, ir a las propiedades del servidor SQL y en el apartado avanzado, modificar la opción idioma predeterminado por Español.


Además hay que tener en cuenta el lenguaje por defecto de los Inicios de sesión que existan en el servidor, ya que los que creemos nuevos a partir de ahora lo harán con lenguaje español. Para ello:

USE [master]
GO
ALTER LOGIN [serversqlsergiosainz] WITH DEFAULT_DATABASE=[master], DEFAULT_LANGUAGE=[Spanish]
GO

También es posible modificar el idioma por el deseado desde las propiedades del usuario.


 

¡¡NO PIERDAS LA OPORTUNIDAD DE ALOJAR TUS BASES DE DATOS SQLSERVER CON BLACKSLOT!!

Contempla nuestras ofertas de

HOSTING COMPARTIDO WINDOWS

SERVIDORES CLOUD WINDOWS

o solicítanos un plan de prueba escribiendo a

info@blackslot.com

Promoción Windows

Comentarios desactivados | Archivado como Sistemas TI | 23/01/2012

Recuperar una BBDD sin archivo de log en Sql Server

Escrito por Sergio el 23-11-2011

Si por cualquier motivo no tienes el archivo de transacciones (.ldf) obtendrás un error de este tipo a la hora de intentar adjuntar una BD desde el Wizard de SQL.


Suponiendo que el .mdf esté en buenas condiciones puedes adjuntar la BD y forzando la reconstrucción del archivo de transacciones.

El siguiente ejemplo muestra como adjuntar la BD “sergiosainz” indicando el path a mí .mdf (sustituye esos valores por los que correspondan en tu caso):

USE [master]
GO
CREATE DATABASE [sergiosainz] ON
(FILENAME = N’C:Program FilesMicrosoft SQL ServerMSSQL10.MSSQLSERVERMSSQLDATAsergiosainz.mdf’)
FOR ATTACH_REBUILD_LOG
GO

Comentarios desactivados | Archivado como Sistemas TI | 23/11/2011

Los días 5, 6 y 7 de julio contaremos en la sede de Blackslot con Eladio Rincón (@erincon), director de Tecnologías de Bases de Datos para Solid Quality Mentors en España y Portugal.

Nos explicará el arte de indexar las tablas para mejorar el rendimiento de nuestras bases de datos, así cómo los planes de ejecución generados por el optimizador de consultas y cómo los operadores se utilizan para acceder a los datos.

Se tratarán las siguientes áreas de optimización de índices montones, índice agrupado, índice no agrupado, índice de cobertura, índices filtrados, índice único, índice calculado, vistas indizadas.

En la sección de los planes de ejecución se explicarán las siguientes áreas: optimizador de consultas, estadísticas, plan de caché, parameter sniffing, hints, muchos de los planes de ejecución de los operadores, correlación de columna de tipo fecha, claves externas confiables, restricciones CHECK, selectividad, densidad, cardinalidad, detecciones de contradicciones, argumento SARG, cruce Hash Joins, Merge Joins, Nested Loop, DMVs, reglas del optimizador, índices hipotéticos y mucho más.

Este curso está recomendado para todos nuestros clientes y partners que trabajan con SQL Server y necesitan mejorar su rendimiento.

También se celebrará en Madrid, Barcelona y Sevilla.

Aquellos que estéis interesados podéis ver todos los detalles e inscribiros en AulaVulcan.

Comentarios desactivados | Archivado como Eventos | 12/05/2011

Para los que aún no utilicéis el driver oficial de SQL Server, os dejo un pequeño tip para recuperar el último id insertado en una consulta de SQL Server con la obsoleta extensión mssql de php.


$q = mssql_query("INSERT INTO TableName(...) VALUES(...); SELECT LAST_INSERT_ID=@@IDENTITY");
$r = mssql_fetch_assoc($q);

1 comentario | Archivado como Desarrollo web | 24/08/2010

Hace unos días podíamos leer que por fín el driver de php para trabajar con SQL Server desde php contará con soporte para PDO en su versión 2.0.

php_sqlsrv_pdo

Esto es un gran avance para los desarrolladores que trabajen con php bajo entornos Microsoft ya que los orm más importantes escritos en este lenguaje, y algunos cms como Drupal, se basan en PDO y se integran en la mayoría de los framework más usados.

Por nuestra parte en Blackslot, procederemos a implantar este driver en nuestros servicios de hosting grid Microsoft, en cuanto la versión estable esté disponible.

Comentarios desactivados | Archivado como Desarrollo web | 08/05/2010

Importar una base de datos a SQL Azure (I de II)

Escrito por Sergio el 02-04-2010

En el siguiente post veremos como subir una base de datos local en SQL Server 2008 al servicio SQL Azure.

Existen varias maneras de importar una base de datos a SQL Azure.

1) Mediante los servicios de integración de SQL Server 2008 (SSIS)
2) Usando la utilidad BCP
3) Desde código, usando la clase System.Data.SqlClient.SqlBulkCopy
4) Utilizando wizards o scripts para cargar datos.

En este artículo, utilizaremos la ultima opción.

En SQL Azure no se soporta:

1) Importar mediante un “restore”.
2) Adjuntar la base de datos al servidor SQL Azure.

La primera tarea es crear un servidor SQL Azure y copiarnos el nombre del servidor que nos hará falta para saber a donde tenemos que conectarnos.

Yo he aprovechado para crear una nueva base de datos a la que he llamado “eventos”. Este paso es opcional, ya que como veremos más adelante se pueden crear las bases de datos desde el propio wizard (Hasta 149 por servidor SQL Azure y con un tamaño máximo de 1 GB o 10 GB).

SQL Azure

En la pestaña Firewall Settings tenemos que añadir al menos una regla que permita la conexión desde nuestro equipo, en mi caso tengo 3.

Firewall

Ahora utilizaremos SQL Azure Migration Wizard para migrar la base de datos. La descarga está disponible en CodePlesk. Sólo hay que seguir el asistente, es tan sencillo que con los pantallazos sobran las explicaciones:

SQL Migration Wizard 1SQL Azure Migration Manager 2SQL Azure Migration Manager 3SQL Azure Migration Manager 4SQL Azure Migration Manager 5SQL Azure Migration Manager 6SQL Azure Migration Manager 7SQL Azure Migration Manager 8SQL Azure Migration Manager 9

Si tenemos instalado Microsoft SQL Server Management Studio R2 podemos conectarnos a nuestro servidor SQL Azure (Descarga).

sql2008R2

SQL 2008 Management Studio R2

1 comentario | Archivado como Cloud Computing, Sistemas TI | 02/04/2010