none
Lettura FILE LDF in SQL Server 2008 R2 RRS feed

  • Domanda

  • Salve a tutti,

    ho una domanda da porvi:

    Su un Server ho una applicazione VB6 multiutente che lavora con database su SQL Server 2008 R2 Express,

    a volte capita(ancora non ho capito come, sto appunto indagando) che un utente mi segnala di aver perso

    diverse fatture registrate correttamente(senza visualizzazione di errori, senza rollback, senza nessuna segnalazione), parliamo di decine di fatture.

    Le domande che volevo porvi sono queste :

    1. è possibile capire qualcosa dal Log di SQL Server( il file LDF), magari capire i dati che ho perso?

    2. Come posso leggere in modo comprensibile il file LDF?

    3. Esistono tool di microsoft, magari delle versioni non express di SQL Server?

    4. Esistono altri modi ?

    Grazie per le eventuali informazioni in anticipo.

    salve

    mercoledì 20 maggio 2015 10:22

Risposte

  • Ciao Angelo,

    per quanto riguarda la perdita di dati, se fossi in te installerei un semplice meccanismo di auditing per scoprire l'applicazione, il comando SQL, l'utente, la data e l'ora in cui sono stati eliminati i dati.

    Se l'utente dichiara che le fatture erano state registrate correttamente, non penso sia colpa dell'applicazione, ma di un evento successivo.

    Installando un sistema di auditing, scoprirai cose interessanti :) ovviamente in accordo con la proprietà dell'azienda e senza fare troppa pubblicità.

    Puoi trovare informazioni su meccanismi di auditing in questo articolo Meccanismi di auditing.. potresti iniziare con un semplice Trigger sull'evento ONDELETE per la tabella relativa alle fatture (testate e righe).

    Ciao!


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    martedì 2 giugno 2015 14:18
    Moderatore

Tutte le risposte

  • potrebbero esserci decine di cause per cui le fatture non vengono ritrovate compresa quella che una parte dell'applicazione, se scritta in maniera sbagliata, vada a cancellarle (ovviamente questa è solo una remotissima ipotesi). questo per dirti che non c'è un tool automatico che ti dica dove vadano a finire i dati persi ma dovresti acquisire maggiori informazioni dal tuo cliente per fare delle ricerche un po' più mirate magari formulando qualche  ipotesi ed indagando in quella direzione.

    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    giovedì 21 maggio 2015 10:04
    Moderatore
  • Cercare di ottenere dettagli dai clienti, talvolta, è un'impresa disperata, vedrò di scovare più informazioni.

    Grazie del suggerimento

    P.S.:

    Quindi, se ho capito bene, non esiste un Tool della Microsoft(nè gratuito, nè a pagamento) per leggere in modo autonomo il file LDF, in modo comprensibile?

    giovedì 21 maggio 2015 13:37
  • per esaminare il contenuto dei files ldf vedi qui

    http://solutioncenter.apexsql.com/it/aprire-file-ldf-e-visualizzarne-il-contenuto/


    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    giovedì 21 maggio 2015 13:59
    Moderatore
  • Girando su internet, avevo intravisto questo tool, lo guarderò con più attenzione;

    ma, mi chiedevo, non esiste nessun tool microsoft con questo scopo?

    giovedì 21 maggio 2015 14:48
  • che sappia io, no.

    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    venerdì 22 maggio 2015 08:28
    Moderatore
  • Grazie delle informazioni
    venerdì 22 maggio 2015 08:45
  • Osservando meglio i database interessati nell'SQL Managment ho notato che spesso

    1. lo stato del database va  'in recupero', mi chiedevo se questo "dettaglio" può incidere sulla perdita delle transazioni di cui ti parlavo?

    2. Invece, nel Registro eventi di Win 2012, ho notato più volte nella giornata questo messaggio:

    È stato eseguito il page out di una parte significativa della memoria del processo di SQL Server. Potrebbe verificarsi un calo di prestazioni. Durata: 14429 secondi. Working set (KB): 69676, commit completato (KB): 145684, utilizzo memoria: 47%%.

    • Modificato AngeloNew martedì 26 maggio 2015 10:52
    martedì 26 maggio 2015 08:55
  • dai sintomi descritti sembra che questo sql server sia un po' carente di risorse (ram e disco) oppure che siano mal configurate ma questo non giustifica la perdita dei dati che più probabilmente secondo me sono imputabili all'applicazione.

    Edoardo Benussi
    Microsoft MVP - Directory Services
    edo[at]mvps[dot]org

    giovedì 28 maggio 2015 09:45
    Moderatore
  • Il server è un win server 2012 con 8 GB ram e 366 GB spazio libero su C;

    Il server SQL ha impostata la max memory a 512 MB;


    La perdita di dati non si verifica in modo assiduo, dell'ordine di poche volte al mese
    • Modificato AngeloNew giovedì 28 maggio 2015 11:06
    giovedì 28 maggio 2015 11:04
  • Ciao Angelo,

    per quanto riguarda la perdita di dati, se fossi in te installerei un semplice meccanismo di auditing per scoprire l'applicazione, il comando SQL, l'utente, la data e l'ora in cui sono stati eliminati i dati.

    Se l'utente dichiara che le fatture erano state registrate correttamente, non penso sia colpa dell'applicazione, ma di un evento successivo.

    Installando un sistema di auditing, scoprirai cose interessanti :) ovviamente in accordo con la proprietà dell'azienda e senza fare troppa pubblicità.

    Puoi trovare informazioni su meccanismi di auditing in questo articolo Meccanismi di auditing.. potresti iniziare con un semplice Trigger sull'evento ONDELETE per la tabella relativa alle fatture (testate e righe).

    Ciao!


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    martedì 2 giugno 2015 14:18
    Moderatore
  • Due domande:

    Questi meccanismi di auditing rilevano anche transazioni non committate?

    Posso usare questi meccanismi su SQL Server Express Edition?


    • Modificato AngeloNew mercoledì 3 giugno 2015 08:45
    mercoledì 3 giugno 2015 08:31
  • ho provato questo codice inserendolo in un trigger on insert, delete, update sulla tabella che mi interessa

    DECLARE @TextData NVARCHAR(2000),

    CREATE TABLE #TraceInfo
    (EventType NVARCHAR(30),
    Parameters INTEGER,
    EventInfo NVARCHAR(2000))
    INSERT INTO #TraceInfo EXEC('DBCC INPUTBUFFER(@@SPID) WITH NO_INFOMSGS')

    tuttavia usando la mia applicazione VB6 i  recordset DAO, nella tabella #TraceInfo(in realtà copio i dati su una tabella fisica i un altro database) trovo dati incomprensibili, tipo questi:

    (@Param000004 varchar(8),@Param000005 datetime,@Param000006 varchar(10),@Param000007 varchar(5),@Param000008 float,@Param000009 float,@Param000010 smallint,@Param000011 bit,@Param000012 varchar(4),@Param000013 float,@Param000014 float,@Param000015 varchar(10),@Param000016 varchar(4),@Param000017 datetime,@Param000018 float,@Param000019 float,@Param000020 text,@Param000021 varchar(4),@Param000022 varchar(4),@Param000023 varchar(4),@Param000024 varchar(20),@Param000025 datetime,@Param000026 varchar(4),@Param000027 varchar(4),@Param000028 varchar(4),@Param000029 int,@Param000030 bit,@Param000031 float,@Param000032 float,@Param000033 float,@Param000034 real,@Param000035 varchar(5),@Param000036 varchar(5),@Param000037 real,@Param000038 float,@Param000039 real,@Param000040 varchar(40),@Param000041 varchar(10),@Param000042 float,@Param000043 float,@Param000044 float,@Param000045 smallint,@Param000046 int,@Param000047 varchar(4))UPDATE [MIODB].[dbo].[OrdCliTest] SET [OrdNum]=@Param000004,[OrdDat]=@Param000005,[CodCli]=@Param000006,[CodPag]=@Param000007,[Sconto1]=@Param000008,[Sconto2]=@Param000009,[FlagEvaso]=@Param000010,[FlagConferma]=@Param000011,[CodVal]=@Param000012,[Cambio]=@Param000013,[CambioBil]=@Param000014,[CodDiv]=@Param000015,[CodBan]=@Param000016,[PrevCons]=@Param000017,[TotQta]=@Param000018,[TotImp]=@Param000019,[Note]=@Param000020,[Agente]=@Param000021,[CodLis]=@Param000022,[Deposito]=@Param000023,[NumOrdCli]=@Param000024,[DataOrdCli]=@Param000025,[CodSpe1]=@Param000026,[CodSpe2]=@Param000027,[CodPor]=@Param000028,[BanCli]=@Param000029,[ScorpIVA]=@Param000030,[TotSpese]=@Param000031,[TotSconti]=@Param000032,[TotIva]=@Param000033,[volume]=@Param000034,[CodGruppo]=@Param000035,[CodLiv]=@Param000036,[colli]=@Param000037,[TotImpIVA]=@Param000038,[Anticipo]=@Param000039,[SettCons]=@Param000040,[IVAagevolata]=@Param000041,[VarVolume]=@Param000042,[Peso]=@Param000043,[VarPeso]=@Param000044,[VarColli]=@Param000045,[IdConvenzione]=@Param000046,[CodComm]=@Param000047

    mercoledì 3 giugno 2015 18:11
  • Questi meccanismi di auditing rilevano anche transazioni non committate?

    Dipende dal meccanismo che utilizzi. Se ad esempio utilizzi un Trigger, il Trigger lavora sempre nella stessa "unit-of-work" del comando che l'ha scatenato.. se il comando che ha scatenato il Trigger viene respinto con un Rollback, anche il lavoro svolto dal Trigger verrà perso.. e quindi anche i dati che ha raccolto. Con SQL Trace puoi catturare tutti gli eventi che avvengono nell'istanza, nel momento in cui avvengono quindi prima di un eventuale Commit o Rollback.

    Posso usare questi meccanismi su SQL Server Express Edition?


    Sì, se utilizzi i Trigger. Se utilizzi SQL Trace.. dovrai tenere presente che nell'Edizione Express non è presente SQL Agent.. non potrai quindi schedulare Job.

    Ciao!


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    mercoledì 3 giugno 2015 20:56
    Moderatore
  • Ciao Angelo,

    le tabelle virtuali Inserted e Deleted ti saranno d'aiuto.. una alternativa al Trigger rimane SQL Trace..

    Ciao


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    mercoledì 3 giugno 2015 21:17
    Moderatore
  • Nel mio PC ho una versione di SQL Server che ha SQL Server Profiler, credo tu stia parlando di questo Tool,gli ho dato un'occhiata e sono riuscito a far partire il tracciamento "STANDARD" su File, ho notato che è poco chiara l'individuazione delle transazioni e delle operaazioni DML sul database, inoltre ho capito da questo limitato approccio al programma, che il tracciamento riguarda tutti i db agganciati all'istanza sql server.

    ho capito bene ? forse sbaglio nella scelta degli eventi da registrare?

    giovedì 4 giugno 2015 08:32
  • Ciao Angelo,

    hai capito bene :) il tool è SQL Profiler, ma per ragioni di performance e per la mole di dati che può raccogliere se non vengono filtrati correttamente gli eventi, non è consigliato lasciarlo attivo per molto tempo.

    Una alternativa è l'utilizzo di SQL Trace che è il servizio su cui si basa SQL Profiler.. trovi un esempio di configurazione in questo articolo:

    http://www.ugiss.org/Meccanismi-di-auditing

    Ciao


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    venerdì 5 giugno 2015 05:34
    Moderatore
  • Ho provato su un mio database AdventureWorks2008R2 i meccanismi di auditing discussi nell'articolo che mi hai suggerito, e funziona, ho però 2 considerazioni da farti :

    1. L'esempio così come viene proposto usa un trigger nella tabella Product, quindi posso utilizzarlo così come viene proposto anche su SQL Server Express Edition, giusto ?

    2. Provando l'esempio mi sono accorto che l'output nella mia tabella di AUDITING è diverso dall'output che si ha nell'esempio, cioè nel mio output non ci sono i valori dei parametri, così come puoi vedere:

    ID    RowID    EventClass    TextData    DatabaseID    NTUserName
    1    NULL    65533    NULL    NULL    NULL
    2    NULL    114    DELETE [Production].[Product]  WHERE [ProductId]=@1    99    NULL
    3    NULL    114    DELETE [Production].[Product]  WHERE [ProductId]=@1    99    NULL
    4    NULL    114    UPDATE [Production].[Product] set [ListPrice] = @1  WHERE [ProductId]=@2    99    NULL
    5    NULL    114    UPDATE [Production].[Product] set [ListPrice] = @1  WHERE [ProductId]=@2    99    NULL
    6    NULL    65534    NULL    NULL    NULL
    7    NULL    65528    NULL    NULL    NULL

    Come mai, c'è qualche impostazione che non faccio?

    grazie come sempre

    venerdì 5 giugno 2015 10:50
  • 1. L'esempio così come viene proposto usa un trigger nella tabella Product, quindi posso utilizzarlo così come viene proposto anche su SQL Server Express Edition, giusto ?

    Yes :)

    2. Provando l'esempio mi sono accorto che l'output nella mia tabella di AUDITING è diverso dall'output che si ha nell'esempio, cioè nel mio output non ci sono i valori dei parametri, così come puoi vedere

    Probabilmente dipende dalla connessione o dal provider utilizzato per la connessione.. appena ho un attimo farò qualche ricerca..

    Ciao


    Sergio Govoni
    SQL Server MVP
    MVP Profile | Italian Blog | English Blog | Twitter | LinkedIn

    domenica 7 giugno 2015 14:37
    Moderatore
  • Ho provato l'esempio usando SQL Server Managment
    lunedì 8 giugno 2015 07:52
  • Ricordo un bachetto per il discorso parametri/valore sostituito; ho avuto problemi anche con 2008 R2...

    Ma ho letto bene? 512Mb? Mega? O è scritto male? Perché se vero non avrei scommesso neppure sull'accensione del tutto ;-)

    lunedì 22 giugno 2015 09:19
  • Si 512 MB, esistono infatti altre 3 istanze di SQL Server on tale impostazione.

    Solo ora, per fare testing, ho rimesso la memoria al max , non è cambiato nulla.

    Mi viene in mente che ho provato a cambiare l'impostazione AWE, questa può influire nel contesto di questa discussione, cioè sulla lentezza dell'app vb6 ?

    giovedì 25 giugno 2015 11:31