一、引言
昨天下午老大讓我查資料看一下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;是可以看到新數據的。
三、結論
內存表在主從備份結構中是可以被復制的。