一、概念
MySQL Cluster採用一系列的Disk Data objects來實現磁碟表。
Tablespaces:作用是作為其他Disk Data objects的容器。
Undo log files:儲存事務進行復原需要的資訊,一個或者多個undo log files組成一個log files group,最後,該log file group關聯到一個tablespaces。
Data files:作用是儲存表中的資料,data file直接關聯到tablespaces。
在每一個資料節點上undo log files和data files都是實際的檔案,預設的,存放在ndb_node_id_fs檔案夾下,該路徑是在MySQL Cluster的config.ini中用DataDir指定的,node_id是data node的node ID。可以用絕對路徑或者相對路徑指定undo log或者data file的路徑。tablespaces和log file group則不是實際的檔案。
注意:儘管不是所有的Disk Data Object都作為檔案儲存體,但是他們共用同一的命名空間,這意味著每個Disk Data Object必須唯一命名。
二、建立步驟
MySQL Cluster建立一個磁碟表需要包含以下幾步:
2.1、建立一個log file group,將一個或者多個undo log files關聯到它上面(undo log file也叫做 undofile)。注意,undo log file只是在建立磁碟表的時候才需要,建立ndb的記憶體表的時候不需要。
2.2、建立一個tablespaces,關聯一個log file group和一個或者多個data files到上面。
2.3、使用該tablespaces建立一個磁碟表格儲存體資料。
下面做一個例子:
2.4、建立log file group:
我們建立一個名為lg_cloudstor的log file group,包含cloudstor_undo_1.log和cloudstor_undo_2.log兩個undo log file。初始大小分別為200M和100M(預設的undo log file的初始大小為128M),你還可以指定log file group的重寫緩衝大小(預設為8M),這裡我們設定為20M。建立log file group的時候必須和一個undo log file一起建立。如下: 複製代碼 代碼如下:CREATE LOGFILE GROUP lg_cloudstor
ADD UNDOFILE 'cloudstor_undo_1.log'
INITIAL_SIZE 200M
UNDO_BUFFER_SIZE 20M
ENGINE NDBCLUSTER;
該語句可能會出錯,出現ERROR 1064 (42000)語法錯誤的資訊,原因是字元集的問題,先執行:set character_set_client=latin1; 在執行:
添加新的undo log file: 複製代碼 代碼如下:ALTER LOGFILE GROUP lg_cloudstor
ADD UNDOFILE 'cloudstor_undo_2.log'
INITIAL_SIZE 100M
ENGINE NDBCLUSTER;
2.5、建立tablespace
下來我們建立一個tablespace,建立tablespace必須指明一個log file group用於儲存undo log。還必須指定一個data file,tablespace建立完成後,你可以稍後添加更多的data file到tablespace。下來我們建立一個使用log file group為lg_cloudstor名為 ts_cloudstore的資料表空間,這個資料表空間包含cloudstore_data_1.dbf和cloudstore_data_2.dbf兩個data file,初始大小為100M(預設為128M),自動擴充為10M。 複製代碼 代碼如下:CREATE TABLESPACE ts_cloudstore
ADD DATAFILE 'cloudstore_data_1.dbf'
USE LOGFILE GROUP lg_cloudstor
INITIAL_SIZE 100M
AUTOEXTEND_SIZE 10M
ENGINE NDBCLUSTER;
添加新的datafile 複製代碼 代碼如下:ALTER TABLESPACE ts_cloudstore
ADD DATAFILE 'cloudstore_data_2.dbf'
INITIAL_SIZE 100M
AUTOEXTEND_SIZE 10M
ENGINE NDBCLUSTER;
下來我們可以看下建立的這些檔案在物理磁碟上的資料檔案:
2.6、建立磁碟表
下來建立一個將沒有索引的列儲存在資料表空間ts_cloudstore的磁碟表。 複製代碼 代碼如下:create table Disktable
(
id int auto_increment primary key,
c1 varchar(50) not null,
c2 varchar(30) default null,
c3 date default null,
index(c1)
)
TABLESPACE ts_cloudstore STORAGE DISK
ENGINE NDBCLUSTER;
這樣,列c2,c3的資料將會儲存在磁碟上,id和c1的資料仍會儲存在記憶體中,因為只有沒有索引的列才能儲存在磁碟上。建立完成後,就可以進行正常的資料操作了。
log file group,tablespaces,Disk Data tables需要按照一定的順序執行,刪除這些的時候也是這樣,刪除規則為:有任何錶空間使用log file group時,log file group不能刪除;資料表空間含有任何data files的時候,不能刪除資料表空間;Data files含有任何錶殘餘的時候,不能從資料表空間刪除資料檔案。
2.7、刪除資料表 複製代碼 代碼如下:drop table Disktable;
2.8、刪除資料檔案
當沒有表在關聯到資料表空間的時候,我們一個一個刪除data files。 複製代碼 代碼如下:alter tablespace ts_cloudstore
drop datafile 'cloudstore_data_1.dbf'
engine ndbcluster;
alter tablespace ts_cloudstore
drop datafile 'cloudstore_data_2.dbf'
engine ndbcluster;
2.9、刪除資料表空間 複製代碼 代碼如下:drop tablespace ts_cloudstore
engine ndbcluster;
2.10、刪除日誌組 複製代碼 代碼如下:drop logfile group lg_cloudstor
engine ndbcluster;
下來查看物理檔案是否已經刪除:
可以在INFORMATION_SCHEMA資料庫中的FILES表中查看磁碟表的資訊。
2.11、幾點注意的
在磁碟資料表中,TEXT和BLOB列的前256bytes儲存在記憶體中,剩餘內容儲存在磁碟上;磁碟表中的每一行需要在記憶體中儲存8bytes的資料用於指向磁碟上的資料,使用--initial選項啟動叢集時,不會刪除磁碟上的資料檔案,必須手動刪除。