sql >> Database teknologi >  >> RDS >> Mysql

Overvåg nye data i MySQL-tabel

Dit spørgsmål er stadig uklart. Overvågning af kun én type ændring - "nye data" (INSERT) ifølge titlen - er mere kompliceret end at opdage enhver ændring (i henhold til Jeg ønsker at registrere ændringerne i min tabel i kommentarer, hvilket er enklere).

MySql giver mulighed for at få kontrolsummen af ​​en tabel:

checksum table TABLE_NAME [QUICK | EXTENDED]

MySQL Workbench-resultater for en InnoDB- og MyISAM-tabel:

Ved at holde øje med ændringer i disse returværdier kan du registrere enhver ændring. Men bemærk:

  • Tabellen skal være oprettet med Checksum =1 mulighed
  • Den HURTIGE option virker ikke på InnoDB-tabeller før version 5.7.2 (IIRC og den aktuelle fællesskabsversion er 5.7.14).

Heldigvis, hvis du ikke angiver en mulighed, ser MySQL ud til at vælge den hurtigste, som vil returnere en værdi. Så det bliver nemt at spore ændringer efter tabel på en timer:

' 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)

Initialiser:

Timer1.Enabled = True

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

Timer Tick-begivenheden:

' 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

Jeg gør noget-metoden, hvor vi bare rapporterer ændringerne til en listeboks:

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

For faktisk at se efter noget som kun INSERTS, skal du bruge en slags logtabel. Tilføj en trigger, som opdaterer den tabel med et tidsstempel og måske handlingskode ("indsæt", "slet"). Så skal du bare tjekke tidsstemplet for ændringer, måske filtrere handlinger, der ikke er overvåget, fra.

Især en version til at se flere borde eller visse ændringsbegivenheder vil fungere bedre som en klasse. Timerkoden kan indkapsles, og den kan rejse hændelser for en tabelændring.




  1. Vælg rækker fra MySQL-tabellen, hvor PHP-tidsstemplet er ældre end X

  2. Vælg tilbage en kommasepareret liste grupperet efter et ID

  3. Er der en Profiler-ækvivalent til MySql?

  4. Migrering af MySQL til PostgreSQL på AWS RDS, del 3