一、引言
昨天下午老大让我查资料看一下mysql的内存表在主从备份中是否能被复制,我还没听说过内存表呢,于是上网查资料,记录一下,以便查阅、学习
二、进展
参考:
http://www.cnblogs.com/sunss/p/3191137.html
内存表: 复制代码 session 1 $ mysql -uroot root@(none) 10:05:06>use test Database changed root@test 10:06:06>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY; Query OK, 0 rows affected (0.00 sec) root@test 10:08:46>insert into tmp_memory values (1); Query OK, 1 row affected (0.00 sec) root@test 10:08:46> session2 $ mysql -uroot test root@test 10:05:12>CREATE TABLE tmp_memory (i INT) ENGINE = MEMORY; ERROR 1050 (42S01): Table 'tmp_memory' already exists root@test 10:16:27>select * from tmp_memory; +------+ | i | +------+ | 1 | +------+ 1 row in set (0.00 sec) 复制代码 1. 多个session,创建表的名字不能一样 2. 一个session创建会话后,对其他session也是可见的 3. data目录下只有tmp_memory.frm ,表结构放在磁盘上,数据放在内存中 4. mysql 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在 5. 可以创建索引,删除索引,支持唯一索引 6. 不影响主备,主库上插入的数据,备库也可以查到 7. show tables 看得到表
http://www.cnblogs.com/sunss/archive/2011/03/16/1986050.html
“内存表”顾名思义创建在内存中的表,真是这样吗?其实不然,MySQL的内存表,表结构创建在磁盘上,数据存放在内存中,所以当MySQL启动着的时候,这个表是存在的,数据也是存在的,如果用户有查看这个表的权限,在所有会话里面,都可以访问这个内存表的数据;当MySQL重启后,数据消失,结构还存在。 内存表的创建: CREATE TABLE test( id int(10), num int(10) ) ENGINE=MEMORY DEFAULT CHARSET=utf8; 查看是否创建成功: show tables; 使用完内存表后,如果我们想释放掉占用掉的内存,可以有两种方法: -- 删除数据 delete from test; 或者 -- 清空表 truncate table test; 再或者 -- 删除表 drop table test; 对于我们常用的功能来说,内存有以下特征: 1.对于varchar等变长类型,内存表使用固定的长度来存放; 2.内存表可以有非唯一键; 3.内存表不能包含BLOB或者TEXT列; 4.内存表支持AUTO_INCREMENT列; 5.内存表支持插入延迟,使读取优先; 6.非临时内存表和其它非内存表一样在所有客户端直接共享; 我们使用内存表的时候,需要注意以下几个方面: 1.服务器内存足够大; 2.我们创建的内存表和MySQL内部临时表有所不同: 内存表的数据存放在内存中,而内部临时表(我们的query语句产生的)在恰当的时候存放在内存中,当内部临时表变得很大时,MySQL会自动地把它转化为 在磁盘上存储的表,而我们创建的内存表,却不会自动转换。 3.当我们单独地delete from 某个内存表的时候,不会回收内存;只有当整个表被delete的时候,才会回收内存; 4.在MySQL的主从服务器上,内存表可以被复制
http://dev.mysql.com/doc/refman/5.0/en/memory-storage-engine.html (mysql官方文档,英文不好,参考的不多,英文还需继续努力)
自己的实践--mysql单机
可见执行insert into tblName select * from heapTbl;是可以将数据复制的。
实践--mysql主备--结构:192.168.0.161:2000--192.168.0.161:2001
1.在2000节点上创建内存数据库testHeap并插入数据 create table testHeap(i int) type=heap; 在2001节点上show tables是可以看到testHeap的,并且是有数据的。 2.在2001节点上对表testHeap插入一些数据 在2000节点上select * from testHeap;是可以看到新数据的。
三、结论
内存表在主从备份结构中是可以被复制的。