sql-server-2008-r2 - paso - ssas permissions
¿Cómo determinar qué SSAS Cube está procesando ahora? (5)
No creo que puedas evitar que un cubo se procese si alguien más ya lo está procesando. Lo que puede hacer para "ayudar" es ejecutar una consulta MDX para verificar la última vez que se procesó el cubo:
SELECT CUBE_NAME, LAST_DATA_UPDATE FROM $System.MDSCHEMA_CUBES
o verifique la tabla sys.process en la instancia del servidor sql realted para ver si se está ejecutando:
select spid, ecid, blocked, cmd, loginame, db_name(dbid) Db, nt_username, net_library, hostname, physical_io,
login_time, last_batch, cpu, status, open_tran, program_name
from master.dbo.sysprocesses
where spid > 50
and loginame <> ''sa''
and program_name like ''%Analysis%''
order by physical_io desc
go
Existe un problema cuando varios usuarios pueden procesar el mismo cubo de manera simultánea y, como resultado, falla el procesamiento del cubo. Entonces necesito verificar si cierto cubo está procesando en el momento actual.
Verá un trabajo ejecutándose en el Administrador de tareas llamado "MSDARCH" si un cubo está procesando. No estoy seguro de cómo puedes decir cuál.
Tuve un problema similar y lo resolví utilizando el conjunto de filas DISCOVER_LOCKS
proporcionado en el servidor SSAS. Para hacer esto, primero haga la siguiente consulta XMLA al servidor:
<Discover xmlns="urn:schemas-microsoft-com:xml-analysis">
<RequestType>DISCOVER_LOCKS</RequestType>
<Restrictions>
<RestrictionList>
<!-- I tried using this, but it wasn''t working and Microsoft documentation was little help. -->
</RestrictionList>
</Restrictions>
<Properties>
<PropertyList>
<Catalog>My_SSAS_Database</Catalog>
<Format>Tabular</Format>
</PropertyList>
</Properties>
</Discover>
En el XML que devuelve el servidor, debe haber un montón de elementos de row
que se parecen a esto:
<row>
<SPID>388303</SPID>
<LOCK_ID>0CC320DB-6B71-4341-B484-8D0A6C403AB9</LOCK_ID>
<LOCK_TRANSACTION_ID>335C5EE8-83C3-44D5-A653-655F933A0D2D</LOCK_TRANSACTION_ID>
<LOCK_OBJECT_ID>
<Object>
<DatabaseID>My_SSAS_Database</DatabaseID>
<CubeID>My_Cube</CubeID>
<MeasureGroupID>My_Measure_Group</MeasureGroupID>
<PartitionID>My_Partition</PartitionID>
</Object>
</LOCK_OBJECT_ID>
<LOCK_STATUS>1</LOCK_STATUS>
<LOCK_TYPE>4</LOCK_TYPE>
<LOCK_CREATION_TIME>2014-02-04T22:22:07.71</LOCK_CREATION_TIME>
<LOCK_GRANT_TIME>2014-02-04T22:22:07.71</LOCK_GRANT_TIME>
</row>
En este ejemplo, observe el elemento Object
bajo LOCK_OBJECT_ID
y el elemento LOCK_TYPE
. Según la documentación de Microsoft, un LOCK_TYPE
de 4 denota un bloqueo de escritura debido a una tarea de procesamiento. Por lo tanto, debería poder averiguar si un cubo se está procesando si LOCK_TYPE
es 4 y LOCK_OBJECT_ID/Object/CubeID
coincide con el ID del cubo que le interesa para un elemento de row
dado en los resultados de la consulta.
Probablemente, un mejor enfoque para los que ya se mencionan sería usar el Analizador de SQL Server para ver la actividad en el Servidor de Análisis. Como ya se dijo, la respuesta popular actual tiene dos defectos, la primera opción solo muestra la ÚLTIMA vez que se procesó el cubo. Y la segunda opción solo muestra si algo se está ejecutando. Pero no te dice qué se está ejecutando y qué ocurre si tu cubo no está procesando desde un servidor SQL sino una fuente de datos diferente.
Utilizar SQL Server Profiler le dirá no solo si algo está procesando, sino también detalles de lo que está procesando. La mayoría de los eventos que puedes filtrar. Mira el informe de progreso. Los eventos actuales si quieres información en tiempo real ... Por lo general, es demasiada información para obtener información real, pero sabrás bien que al menos hay un proceso en marcha. Ver informe de progreso Comience y termine eventos solo para obtener mejor información, como qué se está procesando actualmente, incluso hasta los niveles de partición. Otros eventos con buena información incluyen Command Begin / End y Query Begin / End .
use este código para seleccionar procesos en ejecución: (ejecútelo en OLAP)
select *
from $system.discover_Sessions
where session_Status = 1
¡Y este código para cancelar la ejecución de prossesess! Cambie PID para ejecutar SESSISONS_SPID como en el ejemplo:
<Cancel xmlns ="http://schemas.microsoft.com/analysisservices/2003/engine">
<SPID>92436</SPID>
<CancelAssociated>1</CancelAssociated>
</Cancel<