mysql之 表資料存放路徑非datadir目錄

張衝andy發表於2018-09-04

假如,新建一張表,並讓該表的儲存路徑 不是預設的/path/to/datadir/dbname 。而是 指定儲存的位置 應該如何處理?


方法一
shell> mkdir /Generalt1
shell> chown mysql.mysql /Generalt1
mysql> create table test_ger1 (a int) data directory='/Generalt1';
Query OK, 0 rows affected (0.15 sec)
shell> cd /Generalt1

shell> ll test_ger1* # 在datadir 的 test 目錄下
-rw-r-----. 1 mysql mysql 8554 Jan 3 16:41 test_ger1.frm
-rw-r-----. 1 mysql mysql 36 Jan 3 16:41 test_ger1.isl # 這是連結檔案,連結到上面的ibd檔案
shell> cat test_ger1.isl # 一個文字檔案,內容就是idb檔案的路徑
/Generalt1/test/test_ger1.ibd


方法二
在mysql 5.7之後,可以使用`通用表空間`

語法:
CREATE TABLESPACE tablespace_name ADD DATAFILE 'file_name' [FILE_BLOCK_SIZE = value] [ENGINE [=] engine_name]

-- 1: 建立一個通用表空間
mysql> create tablespace ger_space add datafile '/Generalt1/ger_space.ibd' file_block_size=8192;
Query OK, 0 rows affected (0.07 sec)
-- datafile 指定儲存路徑後,在datadir下會產生一個isl檔案,該檔案的內容為General space的ibd檔案的路徑
-- 如果datafile不指定路徑,則ibd檔案預設儲存在datadir目錄下,且不需要isl檔案了

mysql> create tablespace ger_space2 add datafile 'ger_space2.ibd' file_block_size=8192;
Query OK, 0 rows affected (0.06 sec)
shell> ll ger*
-rw-r-----. 1 mysql mysql 32768 Jan 3 16:51 ger_space2.ibd # 未指定路徑,存放於datadir目錄
-rw-r-----. 1 mysql mysql 26 Jan 3 16:50 ger_space.isl # 指定了其他路徑,存在isl連結檔案

shell> cat ger_space.isl
/Generalt1/ger_space.ibd # ibd檔案真實存在的路徑

mysql> select * from information_schema.innodb_sys_tablespaces where name='ger_space'\G
*************************** 1. row ***************************
SPACE: 96
NAME: ger_space
FLAG: 2304
FILE_FORMAT: Any
ROW_FORMAT: Any
PAGE_SIZE: 8192 -- page_size是8k
ZIP_PAGE_SIZE: 0
SPACE_TYPE: General -- General型別
FS_BLOCK_SIZE: 0
FILE_SIZE: 18446744073709551615
ALLOCATED_SIZE: 2
COMPRESSION: None
1 row in set (0.00 sec)

-- 2: 建立表
mysql> create table test_ger2 (a int) tablespace=ger_space;
Query OK, 0 rows affected (0.11 sec)

shell> ll test_ger* # 在datadir 的 test 目錄下
-rw-r-----. 1 mysql mysql 8554 Jan 3 16:41 test_ger1.frm
-rw-r-----. 1 mysql mysql 36 Jan 3 16:41 test_ger1.isl
-rw-r-----. 1 mysql mysql 8554 Jan 3 17:09 test_ger2.frm # 僅有一個frm檔案

shell> ll /Generalt1/
total 52
drwxr-x---. 2 mysql mysql 4096 Jan 3 16:41 test
-rw-r-----. 1 mysql mysql 49152 Jan 3 17:09 ger_space.ibd # test_ger2的ibd檔案其實儲存在ger_space.ibd的通用表空間中

mysql> create table test_ger3 (a int) tablespace=ger_space; -- test_ger3 也存放在ger_space.ibd中
Query OK, 0 rows affected (0.09 sec)


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31383567/viewspace-2213502/,如需轉載,請註明出處,否則將追究法律責任。

相關文章