Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Monitorar novos dados na tabela MySQL


Sua pergunta continua incerta. Monitorar apenas um tipo de alteração - "novos dados" (INSERT) conforme o título - é mais complicado do que detectar qualquer alteração (conforme I want to detect the Changes in my table nos comentários que é mais simples).

MySql fornece os meios para obter a soma de verificação de uma tabela:
checksum table TABLE_NAME [QUICK | EXTENDED]

Resultados do MySQL Workbench para uma tabela InnoDB e MyISAM:



Observando as alterações nesses valores de retorno, você pode detectar qualquer alteração. Mas observe:
  • A tabela deve ter sido criada com o Checksum = 1 opção
  • O QUICK A opção não funciona em tabelas InnoDB anteriores à versão 5.7.2 (IIRC e a versão atual da comunidade é 5.7.14).

Felizmente, se você não especificar uma opção, o MySQL parece escolher a mais rápida que retornará um valor. Assim, fica fácil acompanhar as alterações por tabela em um 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)

Inicializar:
Timer1.Enabled = True

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

O evento 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

Meu método do algo nos apenas relatando as alterações em uma caixa de listagem:
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



Para realmente observar algo como apenas INSERTS, você precisaria usar algum tipo de tabela de log. Adicione um gatilho que atualize essa tabela com um TimeStamp e talvez um código de ação ("inserir", "excluir"). Em seguida, basta verificar o TimeStamp quanto a alterações, talvez filtrando ações não observadas.

Particularmente, uma versão para observar várias tabelas ou determinados eventos de alteração funcionará melhor como uma classe. O código do temporizador pode ser encapsulado e pode gerar eventos para alterações de tabela.