Версии базы данных MySQL, когда база кода не имеет ORM

Я некоторое время думал об этой проблеме и еще не придумал никаких стабильных/элегантных идей.

Я знаю, что с таблицами MyISAM вы можете получить время обновления таблицы def, но это не так верно в InnoDB, и я нашел, что он даже не надежен смотреть на файл .frm, чтобы понять, когда определение могло быть изменен.... никогда не изменится, если набор данных был изменен.

У меня была идея каждые 30 минут mysqld накатывать содержимое схемы, разбивая ее на AWK script, а затем отличая ее от последней версии... но это кажется немного чрезмерным и может быть проблемой, если набор данных большой.

3 ответа

Это напоминает мне этот вопрос: Как вы управляете изменениями базы данных в проекте среднего размера с веткими? но, может быть, я буду генералом...

http://odetocode.com/Blogs/scott/archive/2008/01/30/11702.aspx

Кодовая база, над которой я сейчас работаю, не имеет ORM, но мы все еще используем решение на основе вышеприведенного блога. Он работает.


Если вы запустите mysqldump -d, он удалит только схему:

[gary.richardson@server ~]$ mysqldump -d -u root mysql user
-- MySQL dump 10.11
--
-- Host: localhost Database: mysql
-- ------------------------------------------------------
-- Server version 5.0.45
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `user`
--
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
 `Host` char(60) collate utf8_bin NOT NULL default '',
 `User` char(16) collate utf8_bin NOT NULL default '',
 `Password` char(41) character set latin1 collate latin1_bin NOT NULL default '',
 `Select_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Insert_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Update_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Delete_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Create_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Drop_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Reload_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Shutdown_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Process_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `File_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Grant_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `References_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Index_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Alter_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Show_db_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Super_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Create_tmp_table_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Lock_tables_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Execute_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Repl_slave_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Repl_client_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Create_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Show_view_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Create_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Alter_routine_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `Create_user_priv` enum('N','Y') character set utf8 NOT NULL default 'N',
 `ssl_type` enum('','ANY','X509','SPECIFIED') character set utf8 NOT NULL default '',
 `ssl_cipher` blob NOT NULL,
 `x509_issuer` blob NOT NULL,
 `x509_subject` blob NOT NULL,
 `max_questions` int(11) unsigned NOT NULL default '0',
 `max_updates` int(11) unsigned NOT NULL default '0',
 `max_connections` int(11) unsigned NOT NULL default '0',
 `max_user_connections` int(11) unsigned NOT NULL default '0',
 PRIMARY KEY (`Host`,`User`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='Users and global privileges';
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2008-10-02 20:06:38

Затем вы можете выполнить разбор.

Там другое решение вашей проблемы, но требует дисциплины. Вы можете добавить поле COMMENT в столбцы и таблицы:

CREATE TABLE example (
 name varchar(32) COMMENT='Name of a person'
) COMMENT='example table';

Мне нравится указывать номер версии. Вы можете связать это с вашим RCS:

CREATE TABLE example (
 name varchar(32) COMMENT='Name of a person'
) COMMENT='VERSION=1.2.3 example table';


Да, это тяжело. Вот почему я использую innodb. Легче делать дамп/импорт, мы даже ставим схемы под VC.

licensed under cc by-sa 3.0 with attribution.