强制整个MySQL数据库位于内存中
为了运行大量与数据库交互的测试,我想做两件事:强制整个MySQL数据库位于内存中,mysql,database,linux,unit-testing,Mysql,Database,Linux,Unit Testing,为了运行大量与数据库交互的测试,我想做两件事: 我希望复制数据库的模式,而不复制其数据。我可以使用一个脚本来实现这一点,该脚本从数据库中的每个表中获取CREATETABLE语句 在创建这个数据库时,我想强制它100%在内存中 我一直在讨论如何执行第2部分-除了指定每个表的引擎之外,还有更简单的方法吗?不知何故,这似乎是一种糟糕的做法 SET storage_engine=MEMORY; 这将为当前会话设置默认存储引擎。在/dev/shm(ubuntu | debian)中创建数据库,它将位于R
SET storage_engine=MEMORY;
这将为当前会话设置默认存储引擎。在
/dev/shm
(ubuntu | debian)中创建数据库,它将位于RAM中。它可以增加到0.5个可用内存。正如dtmilano所说,您可以将它放在安装了tmpfs的文件系统上。它不必是/dev/shm,但这是一个通常安装tmpfs的地方
您可以在任何地方创建一个新的,但是:
mount none -t tmpfs /path/to/dir
如果它填满了所有可用的RAM,它将使用交换作为备份
将其放入/etc/fstab以在引导时重新装载。请记住,它是一个ram磁盘,所以每次重新启动时它都是空的。见:
或者,按照yuxhuang的建议,您可以创建一个类型为
MEMORY
的表。它也会在重新启动时清空,尽管表定义仍然保留。不过,内存
表类型有一些限制。例如,它使用固定大小的行,因此不允许使用text
和blob
列,并且varchar
不是可变长度。请参阅:如果您使用的是Windows,则可以在数据库创建脚本中创建表,添加内存参数,如下所示:
CREATE TABLE IF NOT EXISTS `user` (
`id` varchar(23) NOT NULL,
`username` varchar(250) NOT NULL,
...
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
内存表的大小是有限制的。数据库中的所有表是否都能成为内存表是值得怀疑的(但有可能),内存表的元数据仍然存储在磁盘上,并且它们的行为与其他引擎不同。进一步扩展@MarkR comment:
MyISAM
和Innodb
已经非常不同,可能导致不同的行为,导致只发生在一台发动机上的故障。因此,我建议不要将您的数据库引擎更改为内存
,因为它很可能会引入特定于引擎的错误。这听起来不错,但CentOS是否有类似的解决方案?请检查是否有:$mount | grep shm。否则,您可以在/dev/ram*之一上创建一个文件系统,并将其装载到某个位置。Centos 5.0+总是装载/dev/shm。但是,您可以在任何地方安装tmpfs。tmpfs已经有一段时间了。伙计们,不知道它是否可以,只是试了一下:mv/usr/local/mysql/data/blah/dev/shm。。。。ln-s/dev/shm/blah->data/blah。。。。重新启动mysql。。。它在飞翔