MySQL 是一个关系型数据库管理系统,用于存储和管理数据。查询表修改记录通常指的是跟踪表中数据的变更历史,包括插入、更新和删除操作。
pt-online-schema-change、gh-ost 等来跟踪表的修改记录。解决方法:
-- 创建一个日志表
CREATE TABLE table_log (
id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(255),
operation ENUM('INSERT', 'UPDATE', 'DELETE'),
old_data TEXT,
new_data TEXT,
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 创建触发器
DELIMITER $$
CREATE TRIGGER after_table_change
AFTER INSERT ON your_table
FOR EACH ROW
BEGIN
INSERT INTO table_log (table_name, operation, new_data)
VALUES ('your_table', 'INSERT', CONCAT('ID: ', NEW.id, ', Data: ', NEW.column_name));
END$$
DELIMITER ;
CREATE TRIGGER after_table_change_update
AFTER UPDATE ON your_table
FOR EACH ROW
BEGIN
INSERT INTO table_log (table_name, operation, old_data, new_data)
VALUES ('your_table', 'UPDATE', CONCAT('ID: ', OLD.id, ', Data: ', OLD.column_name), CONCAT('ID: ', NEW.id, ', Data: ', NEW.column_name));
END$$
CREATE TRIGGER after_table_change_delete
AFTER DELETE ON your_table
FOR EACH ROW
BEGIN
INSERT INTO table_log (table_name, operation, old_data)
VALUES ('your_table', 'DELETE', CONCAT('ID: ', OLD.id, ', Data: ', OLD.column_name));
END$$
DELIMITER ;参考链接:
解决方法:
-- 创建一个日志表
CREATE TABLE table_log (
id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(255),
operation ENUM('INSERT', 'UPDATE', 'DELETE'),
old_data TEXT,
new_data TEXT,
change_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 在应用层记录修改操作
DELIMITER $$
CREATE PROCEDURE log_table_change(
IN p_table_name VARCHAR(255),
IN p_operation ENUM('INSERT', 'UPDATE', 'DELETE'),
IN p_old_data TEXT,
IN p_new_data TEXT
)
BEGIN
INSERT INTO table_log (table_name, operation, old_data, new_data)
VALUES (p_table_name, p_operation, p_old_data, p_new_data);
END$$
DELIMITER ;
-- 在应用层调用存储过程记录修改操作
CALL log_table_change('your_table', 'INSERT', NULL, CONCAT('ID: ', NEW.id, ', Data: ', NEW.column_name));
CALL log_table_change('your_table', 'UPDATE', CONCAT('ID: ', OLD.id, ', Data: ', OLD.column_name), CONCAT('ID: ', NEW.id, ', Data: ', NEW.column_name));
CALL log_table_change('your_table', 'DELETE', CONCAT('ID: ', OLD.id, ', Data: ', OLD.column_name), NULL);参考链接:
通过触发器或日志表可以有效地记录 MySQL 表的修改记录。触发器可以在数据库层面自动记录修改操作,而日志表需要在应用层面手动记录。选择哪种方法取决于具体的需求和应用场景。
没有搜到相关的文章