Revision Engine – контроль версий данных для MySQL
Автор: Giuseppe Maxia
Оригинал статьи: A cool idea – Revision engine
Перевод: Ярослав Ворожко
Недавно в списке MySQL internals@list появился анонс, про выпуск нового storage engine. Компания DDengine создала новый движок revision engine, набор встроенных прокси внутри MySQL, которые следят за изменениями данных в вашей базе.
Идея отличная. Вы пишите в свою таблицу, обновляете и удаляете данные, не беспокоясь ни о чем, в то время как revision engine будет сохранять все ваши изменения работая за сценой.
На данный момент revision engine хорошо работает под Linux. Под другие системы пока, что есть проблемы, но это и понятно, так как версия пока еще 0.1.
В документации говорится, что существует два пути использования revision engine. Первый с встроенным хранением, которые тихо изменит структуру таблицы и добавит revision информацию в нее, и второй метод использует две таблицы, одна из которых создается за сценой.
Например:
create table t1 (id int not null primary key,c char(10)) engine=revision comment="InnoDB:DOUBLE";show tables;+----------------+| Tables_in_test |+----------------+| t1 || t1_revision |+----------------+desc t1;+-------+----------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+----------+------+-----+---------+-------+| id | int(11) | NO | PRI | NULL | || c | char(10) | YES | | NULL | |+-------+----------+------+-----+---------+-------+desc t1_revision;+--------------------+---------------------+------+-----+| Field | Type | Null | Key |+--------------------+---------------------+------+-----+| id | int(11) | NO | PRI || c | char(10) | YES | || revision_id | int(10) unsigned | NO | PRI || revision_timestamp | timestamp | NO | || revision_deleted | tinyint(3) unsigned | NO | |+--------------------+---------------------+------+-----+
Ключевое слово “InnoDB:DOUBLE” говорит engine, что надо использовать метод двух таблиц для хранения revision info, в данном случае t1_revision создается автоматически.
Операции над таблицами прозрачны.
insert into t1 (id,c) values (1, 'aaa'), (2, 'bbb');Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0insert into t1 (id, c) values (3, 'ccc'), (4, 'ddd');Query OK, 2 rows affected (0.01 sec)Records: 2 Duplicates: 0 Warnings: 0select * from t1;+----+------+| id | c |+----+------+| 1 | aaa || 2 | bbb || 3 | ccc || 4 | ddd |+----+------+4 rows in set (0.00 sec)select * from t1_revision;Empty set (0.00 sec)
Ничего необычного. Давайте попробуем, что нибудь поменять.
update t1 set c ='changed' where id = 3;Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0select * from t1;+----+---------+| id | c |+----+---------+| 1 | aaa || 2 | bbb || 3 | changed || 4 | ddd |+----+---------+4 rows in set (0.00 sec)show variables like '%revision%';+----------------------+---------+| Variable_name | Value |+----------------------+---------+| revision_select_mode | current |+----------------------+---------+1 row in set (0.00 sec)select * from t1_revision;+----+------+-------------+---------------------+------------------+| id | c | revision_id | revision_timestamp | revision_deleted |+----+------+-------------+---------------------+------------------+| 3 | ccc | 1 | 2008-09-30 05:45:49 | 0 |+----+------+-------------+---------------------+------------------+1 row in set (0.00 sec)delete from t1 where id = 2;Query OK, 1 row affected (0.01 sec)select * from t1_revision;+----+------+-------------+---------------------+------------------+| id | c | revision_id | revision_timestamp | revision_deleted |+----+------+-------------+---------------------+------------------+| 3 | ccc | 1 | 2008-09-30 05:45:49 | 0 |+----+------+-------------+---------------------+------------------+1 row in set (0.00 sec)set revision_select_mode = 'deleted';Query OK, 0 rows affected (0.01 sec)select * from t1_revision;+----+------+-------------+---------------------+------------------+| id | c | revision_id | revision_timestamp | revision_deleted |+----+------+-------------+---------------------+------------------+| 2 | bbb | 1 | 2008-09-30 05:47:14 | 1 |+----+------+-------------+---------------------+------------------+1 row in set (0.00 sec)select * from t1;+----+---------+| id | c |+----+---------+| 1 | aaa || 3 | changed || 4 | ddd |+----+---------+3 rows in set (0.00 sec)
Переменная сессии revision_select_mode , переключает режим отображения данных в revision engine.
На данный момент, механизма отката изменений нет (или есть, но не документирован), но идея отличная, и я думаю этот engine будет очень полезен в будущем.
Перевод не оригинальный, текст немного видоизменен, без потери смысла статьи передаваемого Автором текста.
