Для реализации логирования изменений отдельной таблицы в 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.