Control de la versión de datos MySQL

¿Hay alguna forma de configurar MySQL cada vez que se cambia una fila, luego se crea una fila a otra tabla / database con los datos originalmente? (con estampado de time)

Si es así, ¿cómo podría hacerlo?

P.ej

UPDATE `live_db`.`people` SET `live_db`.`people`.`name` = 'bob' WHERE `id` = 1; 

Hace que esto suceda antes de la actualización:

 INSERT INTO `changes_db`.`people` SELECT * FROM `live_db`.`people` WHERE `live_db`.`people`.`id` = 1; 

Y si lo hicieras de nuevo, daría como resultado algo como esto:

 `live_db`.`people` +----+-------+---------------------+ | id | name | created | +----+-------+---------------------+ | 1 | jones | 10:32:20 12/06/2010 | +----+-------+---------------------+ `changes_db`.`people` +----+-------+---------------------+ | id | name | updated | +----+-------+---------------------+ | 1 | billy | 12:11:25 13/06/2010 | | 1 | bob | 03:01:54 14/06/2010 | +----+-------+---------------------+ 

El DB en vivo debe tener un sello de time creado en las filas, y los cambios en el DB deben tener un sello de time de cuando se actualizó la fila del DB vivo. Los cambios DB tampoco tendrán keys primarias y restricciones de key externa.

Estoy usando InnoDB y MySQL 5.1.49 pero puedo actualizar si es necesario.

Use un disparador

El soporte de MySQL para desencadenantes comenzó con MySQL versión 5.0.2.

Puedes crear un disparador :

 DELIMITER \\ CREATE TRIGGER logtrigger BEFORE UPDATE ON live_db.people FOR EACH ROW BEGIN INSERT INTO changes_db.people(id,name,updated) VALUES(OLD.id,OLD.name,now()); END; \\ 

Así es como terminé haciéndolo

 DELIMITER | # Create the log table CREATE TABLE IF NOT EXISTS `DB_LOG`.`TABLE` LIKE `DB`.`TABLE`| # Remove any auto increment ALTER TABLE `DB_LOG`.`TABLE` CHANGE `DB_LOG`.`TABLE`.`PK` `DB_LOG`.`TABLE`.`PK` INT UNSIGNED NOT NULL| # Drop the primary keys ALTER TABLE `DB_LOG`.`TABLE` DROP PRIMARY KEY| #Create the trigger DROP TRIGGER IF EXISTS `DB`.`update_TABLE`| CREATE TRIGGER `DB`.`update_TABLE` BEFORE UPDATE ON `DB`.`TABLE` FOR EACH ROW BEGIN INSERT INTO `DB_LOG`.`TABLE` SELECT `DB`.`TABLE`.* FROM `DB`.`TABLE` WHERE `DB`.`TABLE`.`PK` = NEW.`PK`; END| DELIMITER ; 

Lamento comentar una publicación anterior, pero estaba buscando resolver este problema exacto. Pensé que compartiría esta información.

Esto describe una solución perfectamente:

http://www.hirmet.com/mysql-versioning-records-of-tables-using-triggers