Назад | Перейти на главную страницу

tail -f эквивалент для базы данных журналов MySQL

Было решено, что мы должны перейти к использованию базы данных (MySQL) для журналов наших приложений (это приложение Java, использующее библиотеку logback). Я надеюсь найти что-то вроде tail -f которую я могу использовать с определенной таблицей в этой базе данных, которая будет показывать мне новые строки по мере их добавления (аналогично тому, как tail -f работал с файлами журнала).

Я не думаю, что некоторые люди понимают вопрос (или я не понимаю). Вы не хотите регистрировать запросы к БД; скорее, журнал из приложения попадает в БД. Если бы это был файл, вы могли бы отслеживать журнал. Как вы следите за таблицей, чтобы при добавлении новой строки она выводилась?

Нетрудно написать простой цикл для обработки этого, если у вас есть уникальное поле, которое монотонно увеличивается со временем (например, порядковый номер).

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

Включите двоичное ведение журнала MySQL. Затем вы можете использовать mysqlbinlog , чтобы просмотреть все операторы, изменяющие данные.

Похоже, что многие из нас не совсем понимают ваш вопрос. Что вы подразумеваете под "база данных журналов", что не является стандартным термином MySQL.

Используйте MySQL Общий журнал запросов, который регистрирует каждое заявление, полученное от клиента.

Затем вы можете установить log_output = ТАБЛИЦА в вашем my.cnf. Файл будет записан в каталог $ mysql_data_directory / general_log.CSV. Ты можешь tail -f этот файл для просмотра запросов в реальном времени.

Вот что я использую. Кажется, самое простое решение, хотя и не очень эффективное:

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

Вы можете сделать это хитрым способом, используя tail -f в файле базы данных (/var/lib/mysql/database_name/table_name.MY*), а затем выполняя свой запрос каждый раз при чтении строки.

Я предлагаю добавить поле временной метки в любую таблицу, которую вы хотите отслеживать. Это позволит вам очень легко получить желаемые результаты с помощью простого запроса.

Вы могли бы попробовать это:

http://www.jetprofiler.com/blog/10/tail--f-table-with-myterm/#comments

Он старый, и его не трогали 3 года, но я только что попробовал, и он работает нормально. Клонируйте репозиторий BZR и прочтите README.

Вот java-библиотека, которая может "по-настоящему" tail -f бинлога:

shyiko / mysql-binlog-connector-java: Соединитель двоичного журнала MySQL

С участием mysql-binlog-connector-java ты действительно можешь реагировать асинхронно к изменениям в бинлоге без периодический опрос.

Это позволяет:

BinaryLogClient client = new BinaryLogClient("hostname", 3306, "username", "password");
EventDeserializer eventDeserializer = new EventDeserializer();
...
client.setEventDeserializer(eventDeserializer);
client.registerEventListener(new EventListener() {

    @Override
    public void onEvent(Event event) {
        ...
    }
});
client.connect();

Обратите внимание, что данные в Event event не очень удобно, как вы ожидаете от своего любимого клиента MySQL, так как данные ниже этого уровня. Подробнее см. Ссылку выше.

Кроме того, вот список проектов, которые позволят вам делать репликацию из MySQL в Kafka где я нашел mysql-binlog-connector-java. Вы также можете найти эквиваленты, по крайней мере, в go и python.