tail -f odpowiednik bazy danych rejestrowania MySQL

12

Zdecydowano, że powinniśmy przejść do korzystania z bazy danych (MySQL) dla naszych dzienników aplikacji (jest to aplikacja Java korzystająca z biblioteki logback). Mam nadzieję, że znajdę coś takiego tail -f, czego mogę używać z konkretną tabelą w tej bazie danych, która pokaże mi nowe wiersze po ich dodaniu (podobnie jak tail -fw przypadku plików dziennika).

Nick Spacek
źródło

Odpowiedzi:

5

Włącz rejestrowanie binarne MySQL. Następnie możesz użyć mysqlbinlogpolecenia, aby wyświetlić wszystkie instrukcje modyfikujące dane.

200_sukces
źródło
czy możesz pokazać przykład, jak to zrobić w wybranym języku lub za pomocą bash?
Alexander Mills
7

Nie sądzę, że niektórzy ludzie rozumieją pytanie (lub nie rozumiem). Nie chcesz rejestrować zapytań w bazie danych; raczej dziennik z aplikacji przechodzi do bazy danych. Gdyby to był plik, można zmodyfikować dziennik. Jak ogonić tabelę, aby po dodaniu nowego wiersza był on wyprowadzany?

Nie powinno być trudno napisać prostą pętlę, aby sobie z tym poradzić, zakładając, że masz unikalne pole, które monotonicznie zwiększa się w czasie (np. Numer sekwencyjny).

current_pos = select max(seq) from table
while true
  new_pos = select max(seq) from table
  if new_pos > current_pos
    select * from table where seq > current_pos
    current_pos = new_pos
  endif
  sleep 1
endwhile
Mark Wagner
źródło
nazywa się to odpytywaniem i nie jest to zbyt zabawne :), ale chyba dobra technika, jeśli musisz użyć odpytywania.
Alexander Mills
3

Wygląda na to, że wielu z nas nie rozumie twojego pytania. Co rozumiesz przez „rejestrowanie bazy danych” , co nie jest standardowym terminem MySQL.

Użyj dziennika ogólnych zapytań MySQL , który rejestruje każdą instrukcję otrzymaną od klienta.

Następnie możesz ustawić log_output = TABLE w pliku my.cnf. Plik zostanie zapisany w katalogu $ mysql_data_data / general_log.CSV. Możesz tail -ften plik, aby wyświetlić zapytania w czasie rzeczywistym.

Stefan Lasiewski
źródło
2

Oto czego używam. Wydaje się najprostszym rozwiązaniem, choć nie jest bardzo wydajne:

watch "mysql db_name -e '(SELECT * FROM my_table ORDER BY id DESC LIMIT 10) ORDER BY id ASC;'"

Jud
źródło
1

Możesz to zrobić w hacky sposób, używając tail -f w pliku bazy danych (/var/lib/mysql/database_name/table_name.MY*), a następnie uruchamiając zapytanie za każdym razem, gdy czytany jest wiersz.

James L.
źródło
1

Sugeruję dodanie pola znacznika czasu do dowolnej tabeli, którą chcesz dopasować. To pozwoli ci bardzo łatwo uzyskać pożądane wyniki za pomocą prostego zapytania.

John Gardeniers
źródło