Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Monitoruj nowe dane w tabeli MySQL

Twoje pytanie pozostaje niejasne. Monitorowanie tylko jednego rodzaju zmiany – „nowych danych” (WSTAW) zgodnie z tytułem – jest bardziej skomplikowane niż wykrywanie jakiejkolwiek zmiany (zgodnie z I want to detect the Changes in my table w komentarzach, co jest prostsze).

MySql zapewnia środki do uzyskania sumy kontrolnej tabeli:

checksum table TABLE_NAME [QUICK | EXTENDED]

Wyniki MySQL Workbench dla tabeli InnoDB i MyISAM:

Obserwując zmiany w tych zwracanych wartościach, możesz wykryć każdą zmianę. Ale uwaga:

  • Tabela musi zostać utworzona z Checksum = 1 opcja
  • QUICK opcja nie działa na tabelach InnoDB przed wersją 5.7.2 (IIRC, a obecna wersja Community to 5.7.14).

Na szczęście, jeśli nie określisz opcji, MySQL wydaje się wybierać najszybszą, która zwróci wartość. Dzięki temu śledzenie zmian według tabeli na zegarze staje się łatwe:

' Track last checksum by table
Friend Class TableItem
    Public Property Name As String
    Public Property CheckSum As Int64

    Public Sub New(n As String)
        Name = n
        CheckSum = 0
    End Sub
End Class
' a list of them to track more than one table:
Private Tables As List(Of TableItem)

Zainicjuj:

Timer1.Enabled = True

Tables = New List(Of TableItem)
Tables.Add(New TableItem("Sample"))
Tables.Add(New TableItem("SampleISAM"))

Wydarzenie Timer Tick:

' Note: cannot use Parameters for table or col names
Dim sql = "CHECKSUM TABLE {0} "

Using dbcon As New MySqlConnection(mySQLConnStr)
    dbcon.Open()
    Using cmd As New MySqlCommand(sql, dbcon)
        ' loop thru collection, polling one at a time
        For Each tbl As TableItem In Tables
            cmd.CommandText = String.Format(sql, tbl.Name)

            Using rdr As MySqlDataReader = cmd.ExecuteReader()
                If rdr.Read Then
                    Dim thisResult = rdr.GetInt64(1)

                    ' ignore the first result
                    If tbl.CheckSum = 0 Then
                        tbl.CheckSum = thisResult
                        Return
                    End If
                    ' save the last non-zed value
                    If tbl.CheckSum <> thisResult Then
                        tbl.CheckSum = thisResult
                        ' method to do something when changed:
                        TableChanged(tbl.Name)
                    End If

                End If
            End Using
        Next
    End Using
End Using

Moja metoda zrób coś, po prostu zgłaszamy zmiany w polu listy:

Private Sub TableChanged(tbl As String)
    lb.Items.Add(String.Format("Table {0} changed {1}", tbl,
                               DateTime.Now.ToString("HH:mm:ss.ffffff")))
End Sub

Aby faktycznie szukać czegoś takiego jak tylko INSERTY, musiałbyś użyć jakiejś tabeli dziennika. Dodaj wyzwalacz, który aktualizuje tę tabelę za pomocą znacznika czasu i być może kodu akcji („wstaw”, „usuń”). Następnie po prostu sprawdź znacznik czasu pod kątem zmian, być może odfiltrowując działania, które nie są związane z oglądaniem.

Szczególnie wersja do oglądania wielu stołów lub niektórych wydarzeń związanych ze zmianą będzie działać lepiej jako klasa. Kod czasomierza może być hermetyzowany i może wywołać zdarzenia w przypadku zmian w tabeli.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Najlepsze alternatywy dla środowiska pracy MySQL

  2. Uszkodzone tabele MySQL InnoDB - jak to naprawić?

  3. Obetnij wszystkie tabele (z których większość ma ograniczenia). Jak tymczasowo je upuścić

  4. Migracja online z MySQL 5.6 bez GTID do MySQL 5.7 z GTID

  5. DATE() Przykłady – MySQL