Как сделать логи изменения отдельной таблицы в MariaDB?

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

1. Использование триггеров:
Создайте таблицу логирования, которая будет хранить информацию об изменении данных в целевой таблице. Например:

   CREATE TABLE table_name_log (
     id INT AUTO_INCREMENT PRIMARY KEY,
     operation_type ENUM('INSERT', 'UPDATE', 'DELETE'),
     operation_time TIMESTAMP,
     old_data TEXT,
     new_data TEXT
   );

Затем создайте триггеры, которые будут вызываться при изменении данных в целевой таблице и записывать соответствующую информацию в таблицу логирования.

Например, для логирования операции вставки (INSERT):

   DELIMITER //

   CREATE TRIGGER table_name_insert_trigger AFTER INSERT ON table_name FOR EACH ROW
   BEGIN
     INSERT INTO table_name_log (operation_type, operation_time, new_data)
     VALUES ('INSERT', NOW(), JSON_OBJECT('column1', NEW.column1, 'column2', NEW.column2));
   END //

   DELIMITER ;

Аналогично, создайте триггеры для логирования операций обновления (UPDATE) и удаления (DELETE), подобными образом изменяя их содержимое.

2. Использование журналирования изменений (Change Data Capture):
Здесь используется наличие движка MariaDB, который поддерживает журналирование изменений, такой как MariaDB Enterprise Server или MariaDB MaxScale.

Включите журналирование изменений в конфигурации MariaDB, изменяя параметры в файле my.cnf (или my.ini в Windows) следующим образом:

   # Включить журналирование изменений
   server_id=1
   log_bin=mysql-bin
   binlog_format=row

После перезагрузки сервера MariaDB станет доступен журнал изменений.

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

   CREATE TABLE table_name_log (
     id INT AUTO_INCREMENT PRIMARY KEY,
     operation_type ENUM('INSERT', 'UPDATE', 'DELETE'),
     operation_time TIMESTAMP,
     old_data TEXT,
     new_data TEXT
   );

   CREATE TABLE changes_subscription (
     id INT AUTO_INCREMENT PRIMARY KEY,
     last_read_event VARCHAR(100)
   );

   CREATE FUNCTION process_changes_event()
   RETURNS BOOLEAN
   BEGIN
     DECLARE last_event VARCHAR(100);
     
     SET last_event = (SELECT last_read_event FROM changes_subscription);

     -- Обработка изменений в журнале

     SET @query = CONCAT('SELECT * FROM mysqlbinlog WHERE EventID > ', last_event, ' INTO OUTFILE '/tmp/changes.log'');
     PREPARE stmt FROM @query;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;

     -- Обработка записей в журнале
     -- Запись в таблицу логирования, анализируя содержимое записей

     SET @query = 'INSERT INTO table_name_log (...) VALUES (...)';
     PREPARE stmt FROM @query;
     EXECUTE stmt;
     DEALLOCATE PREPARE stmt;

     -- ...

     -- Обновление последнего прочитанного события

     SET last_event = (SELECT EventID FROM mysqlbinlog ORDER BY EventID DESC LIMIT 1);
     UPDATE changes_subscription SET last_read_event = last_event;

     RETURN TRUE;
   END;

   -- Запустите функцию process_changes_event при каждом изменении данных в целевой таблице

   DELIMITER //

   CREATE TRIGGER table_name_log_trigger AFTER INSERT ON table_name FOR EACH ROW
   BEGIN
     CALL process_changes_event();
   END //

   DELIMITER ;

   -- Создайте задачу, чтобы функция process_changes_event запускалась с определенным интервалом

   CREATE EVENT IF NOT EXISTS process_changes_event_job ON SCHEDULE EVERY 1 MINUTE DO CALL process_changes_event();

Это один из возможных способов реализации журналирования изменений в MariaDB, используя триггеры или журналирование изменений. Выбор конкретного подхода зависит от требований вашего приложения и доступных возможностей MariaDB.