一、概念 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選項啟動集群時,不會刪除磁盤上的數據文件,必須手動刪除。