Buenas tardes a la comunidad
Quiero saber como puedo limpiar los log de sap , para despejarlo un poco para que no se me pegue mucho cada vez que sacan informes . o si existen alguna sentencia de sql server para hacerlo ??
Buenas tardes a la comunidad
Quiero saber como puedo limpiar los log de sap , para despejarlo un poco para que no se me pegue mucho cada vez que sacan informes . o si existen alguna sentencia de sql server para hacerlo ??
Existe un mantenimiento de BD a nivel SQL, que realiza tareas de indexación , desfragmentacion y disminución del log de base de datos. (SQL SERVER)
Adicional, yo a través de los años y mi experiencia siempre ofrezco a mis clientes un proceso de limpieza de log de SAP B1 y configuro las mejores practicas para que crezca lo necesario solamente.
En las versiones actuales existe un proceso de SAP que segun hace esta tarea pero jamas la he usado y que resultados da.
He generado mi proceso de mantenimiento en BD que pesa 165gb o 200gb…y al terminar de realizar todo el proceso (proceso propio) esta bases de datos quedan en 85-90GB o aveces hasta un poco menos ..
Tu partner debería poder ayudarte.
Manualmente es sencillo de hacer y fácil…. procura hacerlo cuando no haya nadie trabajando.
Como te comenta @juliancab, deberías trasladarlo a tu partner. Es raro que en la consultoría de puesta en marcha no se contemple esto, el backup supongo que si te lo están haciendo…
Programar para que lo haga el sql con todo lo que tiene que hacer, es un tema complicado y que incluso el partner igual no te puede apoyar, pero sería el camino lógico.
Plan de mantenimiento del sql, de las bases de datos y de backup.
Se puede hacer tambien todo mediante la RSP, pero la tiene que configurar el partner y es un poco complejo ponerla en marcha y que funcione.
Si no tienes apoyo de tu Partner, me ofreceria apoyarte. Siempre bajo las reglas de la comunidad y poder hacer contacto.
Saludos
Buenos dias, que pena si claro que si, esto es basico pero no importa, mira aqui te coloco un scrip que debes reemplazar con la informacion de tu base de datos tambien se puede hacer desde el mismo SAP ya te comparto los pasos. debes seleccionar linea x linea y vas ejecutando paso por paso ok
/* ++++++++++++++++++++++++++++++++++++
/* NOMBREARCHIVO_log debe ser el
nombre lógico de la base de datos. */
ALTER DATABASE TUBASEDEDATOS
SET RECOVERY SIMPLE;
GO
DBCC SHRINKFILE (TUBASEDEDATOS_Log, 1);
GO
/* OPCIONAL */
ALTER DATABASE TUBASEDEDATOS
SET RECOVERY FULL;
En este ultimo punto solo das un click sobre el boton reestablecer.
Espero que te sirva cualquier cosa aqui a la orden no suelo escribir o entrar mucho aqui pero aqui hay mucha gente buena y que tiene un amplio conocimiento.
Buenas tardes @juliancab como podemos tener contacto , para entender mejor como funciona
@Jorge_Hernand un placer saludarte de nuevo. Espero me autorice el Administrador y poder darte dato….con gusto podemos ayudarte!
Esperemos entonces que responda , perome seria de mucha ayuda , hoy dia mi base pesa 250 GB
Amigo que paso con mi respuesta a su pregunta que no recibi nada de su parte en esa apoyo?
Quedo atento
Buenos dias @Luisam , el problema persiste aun , lo que me enviaste me reduce los log , pero creo que mi gran problema en el tamaño de la base de 250 GB . y se me pega mucho
Creo que hay algo que no has evaluado bien… el tamaño de la bbdd no va a bajar, se reduce el tamaño del log de transacciones de la bbdd, pero la bbdd en sí, no.
Hoy dia , esta de esta manera el tamaño de la BD y el LOG:
El detalle esta para darle un ejemplo cuando una persona saca el de auditoria de Stock o otro informe . sap se me pega y debo ir al monitor de sql server y sacar a la persona que lo esta pegando
Contactame: JulianCAB | SAP Team
Amigo viendo esto te hago dos preguntas
Esta base la tengo desde el 2016
Esta la base la tenemos desde el 2016 , si embargo estamos en proceso de un RollOut , pero todavía falta algunos meses , pero queria hacer algo para que no se pegue tanto
@Jorge_Hernand si tienes un partner de SAP analiza con el, si tienes tus servidores con un proveedor externo analiza con el, el que se pegue puede ser por distintas razones y se tiene que evaluar el contexto en que momento se pega , depende también con que motor de base de datos trabaja SAP si es SQL o Hana y desde ahi evaluar la infractructura en que esta montado el ERP. Te lo digo por que tambien sufri de eso con una base que pesa 290 GB pero que ahora despues de varios analices ya no se pega , pero se tuvo que trabajar con un incremento en el servidor tanto el ram como en nucleos, refactorizar procedimientos de almacenado, cambiar busquedas formateadas eliminar querys, analizar las aplicaciones o programas que hacian llamadas al servidor y analizar detalladamente que proceso hacia que bloqueara el sistema. Como ves son varias las ramas que puedes tener que hace que se pegue SAP
@Patricio_Guti , Parece el mismo escenario , tenemos muchas integraciones , igual e estado revisando los procedimientos y algunos select de tablas que no la suelta hasta que termine la busqueda
Si tienes motor SQL, tienes que generar una query que identifique que procesos estan bloqueando tu SAP o que generan mayor demanda , este ejemplo de Query te puede ayudar a identificar que proceso es el que bloquea al resto y pega SAP
WITH BlockingTree AS (
SELECT
r.session_id,
r.blocking_session_id,
s.login_name,
s.host_name,
s.program_name,
r.status,
r.command,
r.cpu_time,
r.total_elapsed_time,
DATEADD(SECOND, r.total_elapsed_time / 1000, 0) AS elapsed_time_readable,
r.wait_type,
r.reads,
r.writes,
t.text AS query_text,
CAST(r.session_id AS VARCHAR(MAX)) AS blocking_path,
0 AS level
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
WHERE r.blocking_session_id = 0
UNION ALL
SELECT
s.session_id,
CAST(0 AS SMALLINT) AS blocking_session_id,
s.login_name,
s.host_name,
s.program_name,
s.status,
'IDLE-BLOCKER' AS command,
CAST(0 AS INT) AS cpu_time,
CAST(DATEDIFF(ms, s.last_request_start_time, GETDATE()) AS INT) AS total_elapsed_time,
DATEADD(SECOND, DATEDIFF(SECOND, s.last_request_start_time, GETDATE()), 0) AS elapsed_time_readable,
'N/A' AS wait_type,
s.reads,
s.writes,
ISNULL(conn_t.text, 'No query available') AS query_text,
CAST(s.session_id AS VARCHAR(MAX)) AS blocking_path,
0 AS level
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_exec_connections conn ON s.session_id = conn.session_id
OUTER APPLY sys.dm_exec_sql_text(conn.most_recent_sql_handle) conn_t
WHERE s.session_id IN (
SELECT DISTINCT blocking_session_id
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
)
AND s.session_id NOT IN (
SELECT session_id
FROM sys.dm_exec_requests
)
UNION ALL
SELECT
r.session_id,
r.blocking_session_id,
s.login_name,
s.host_name,
s.program_name,
r.status,
r.command,
r.cpu_time,
r.total_elapsed_time,
DATEADD(SECOND, r.total_elapsed_time / 1000, 0) AS elapsed_time_readable,
r.wait_type,
r.reads,
r.writes,
t.text AS query_text,
CAST(bt.blocking_path + ' -> ' + CAST(r.session_id AS VARCHAR) AS VARCHAR(MAX)),
bt.level + 1
FROM sys.dm_exec_requests r
JOIN sys.dm_exec_sessions s ON r.session_id = s.session_id
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
INNER JOIN BlockingTree bt ON r.blocking_session_id = bt.session_id
)
SELECT
REPLICATE(' ', level) +
CASE
WHEN command = 'IDLE-BLOCKER' THEN '*** [BLOQUEADOR IDLE] *** Session '
WHEN blocking_session_id <> 0 THEN '[BLOQUEADO] Session ' -- Si tiene blocking_session_id, está bloqueado
WHEN session_id IN (SELECT DISTINCT blocking_session_id FROM sys.dm_exec_requests WHERE blocking_session_id <> 0)
THEN '[BLOQUEADOR] Session ' -- Si está bloqueando a alguien
ELSE 'Session ' -- Sesión normal
END + CAST(session_id AS VARCHAR) AS BlockingTreeView,
session_id,
blocking_session_id,
login_name,
host_name,
program_name,
status,
command,
cpu_time,
total_elapsed_time,
CONVERT(varchar(8), elapsed_time_readable, 108) AS elapsed_time_readable,
wait_type,
reads,
writes,
LEFT(query_text, 300) AS query_text,
blocking_path
FROM BlockingTree
ORDER BY blocking_path;
SELECT
s.session_id,
s.login_name + ' @ ' + s.host_name AS usuario_host,
s.program_name,
s.status,
ISNULL(tst.open_transaction_count, 0) AS trans_abiertas,
DATEDIFF(SECOND, ISNULL(tat.transaction_begin_time, s.last_request_start_time), GETDATE()) AS segundos_trans_abierta,
LEFT(ISNULL(t.text, conn_t.text), 200) AS ultima_query,
CASE
WHEN s.status = 'sleeping' AND ISNULL(tst.open_transaction_count, 0) > 0
AND DATEDIFF(SECOND, tat.transaction_begin_time, GETDATE()) > 300
THEN 'KILL ' + CAST(s.session_id AS VARCHAR) + '; -- Trans idle >5min'
WHEN s.status = 'sleeping' AND ISNULL(tst.open_transaction_count, 0) > 0
THEN 'ADVERTIR - Trans idle activa'
ELSE 'Proceso normal'
END AS accion_sugerida
FROM sys.dm_exec_sessions s
LEFT JOIN sys.dm_tran_session_transactions tst ON s.session_id = tst.session_id
LEFT JOIN sys.dm_tran_active_transactions tat ON tst.transaction_id = tat.transaction_id
LEFT JOIN sys.dm_exec_requests r ON s.session_id = r.session_id
LEFT JOIN sys.dm_exec_connections conn ON s.session_id = conn.session_id
OUTER APPLY sys.dm_exec_sql_text(r.sql_handle) t
OUTER APPLY sys.dm_exec_sql_text(conn.most_recent_sql_handle) conn_t
WHERE s.session_id IN (
SELECT DISTINCT blocking_session_id
FROM sys.dm_exec_requests
WHERE blocking_session_id <> 0
);
@Patricio_Guti quieres que corra esta consulta en mi Sql server para ver resultado me da ?