2012-03-30 19 views
5

Sto lavorando a un progetto per il quale è necessario utilizzare "journaling delle transazioni" nel nostro DBMS (MySQL). Siamo già passati a utilizzare InnoDB per utilizzare le transazioni per un altro requisito. Sto cercando di capire cos'è il journal delle transazioni. Ho cercato per oltre un giorno ora, compresa la lettura attraverso la documentazione di MySQL. Forse non sto cercando le parole chiave giuste, non sono sicuro. O forse "journal journaling" è una terminologia inappropriata.Inserimento nel diario di transazioni MySQL

Da quanto ho capito, l'inserimento nel diario delle transazioni del database è simile a un file system di journaling in quanto le modifiche vengono apportate a un giornale prima che vengano trasferite al file system. Da quello che ho letto, sembra che il motore InnoDB memorizzi le transazioni in una sorta di diario prima che vengano trasferite su disco. Questo suona accurato? In tal caso, dov'è il giornale delle transazioni? È ib_logfile0 e ib_logfile1?

risposta

9

Sei decisamente sulla strada giusta.

Ogni volta che InnoDB esegue una transazione che deve essere impegnata, viene eseguita come commit a due fasi. La transazione viene scritta prima in questi registri. Quindi, sono impegnati da lì.

Questo aiuta molto in caso di arresto anomalo di MySQL o del server.

Quando si riavvia mysql, tutte le voci non impegnati in ib_logfile0 e ib_logfile1 vengono riprodotti come parte del recupero di arresto di InnoDB per portare InnoDB ad uno stato armonico (Questo è coerente e parti durevoli di ACID Compliance)

Se si elimina ib_logfile0 e ib_logfile1 e avviare mysql, qualsiasi transazione non salvata che quei file contenuti sono persi. Durante il ciclo di ripristino di emergenza, se i file di registro sono mancanti, vengono rigenerati in base all'impostazione innodb_log_file_size.

Vedere MySQL Documentation for a detailed explanation of InnoDB.

@karatedog la parte MVCC di InnoDB si verifica all'interno del tablespace di sistema, meglio noto come ibdata1. Qualsiasi dato appaia prima dell'inizio di una transazione viene registrato per consentire ad altri utenti che accedono alle righe necessarie di avere una vista dei dati prima che gli aggiornamenti venissero imposti. Ciò è consentito per ciò che viene chiamato REPEATABLE-READ. Questo rientra nella I della conformità ACID, intendendo l'Isolamento. Ho scritto post su questo in StackExchange DBA in relazione a vari scenari in cui l'isolamento della transazione è buono, cattivo o brutto.

Per quanto riguarda MyISAM, crash recovery is not automatic. It crashes rather easily. Ecco perché esiste il comando SQL REPAIR TABLE. Questo è anche il motivo per cui l'utilità MySQL myisamchk ha l'opzione -r per eseguire REPAIR TABLE per le tabelle MyISAM che non sono online.

MariaDB and Aria sono stati tentativi di creare un motore di archiviazione sicuro come sostituto di MyISAM.

+0

Capisco che questi file di registro sono per il ripristino in caso di arresto anomalo, ma il meccanismo MVCC non è responsabile del corretto funzionamento di una "transazione" quando non si verifica un arresto anomalo del sistema? MyISAM ha un certo grado di recupero di emergenza mentre non ha transazioni. – karatedog

+0

Grazie per la risposta dettagliata e tempestiva. Sono un po 'confuso sulla riproduzione delle voci nei registri.Se ci fosse stato un fallimento nel mezzo di una transazione, prima che il commit fosse emesso, penserei che non si voglia riprodurre le voci poiché le transazioni sono tutte o niente (non si vorrebbe una parte della transazione a essere impegnati). O stai dicendo che verrebbero riprodotti solo se ci fosse un commit, ma l'errore si è verificato prima che la transazione fosse impegnata nel database, ma dopo che è stata salvata nei file di log? – alfredough