溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

MySQL 5.7如何創(chuàng)建一個(gè)表空間

發(fā)布時(shí)間:2021-11-16 14:46:12 來(lái)源:億速云 閱讀:525 作者:柒染 欄目:MySQL數(shù)據(jù)庫(kù)

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)MySQL 5.7如何創(chuàng)建一個(gè)表空間,文章內(nèi)容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

MySQL里面的文件蠻有意思,之前大體有兩個(gè)參數(shù)來(lái)做基本的控制。一個(gè)是innodb_data_file_path就是一個(gè)共享表空間,數(shù)據(jù)都往這一個(gè)文件里放,也就是ibdata1,這個(gè)文件其實(shí)角色是有重復(fù)的,undo,數(shù)據(jù)都會(huì)放在一起。ibdata1會(huì)持續(xù)增長(zhǎng),無(wú)法收縮。另外一個(gè)參數(shù)是innodb_file_per_table,這樣一來(lái),就成了獨(dú)立表空間,通俗一些就是每一個(gè)表都有獨(dú)立的文件.frm和.ibd,而且實(shí)際中使用獨(dú)立表空間還是比較普遍的,對(duì)于delete的操作影響MySQL和Oracle就大大不同。

  后來(lái)到了MySQL 5.7.5,新增了在線(xiàn)階段undo log的功能,讓undo從原本的ibdata1剝離出來(lái),而對(duì)于通用的獨(dú)立表空間的應(yīng)用場(chǎng)景,MySQL也提供了另外一種管理方式,就是General tablespace。其實(shí)這個(gè)特性在Oracle中已經(jīng)非常普遍,換個(gè)角度來(lái)理解就很容易了,它沒(méi)有庫(kù)的概念,可以在多個(gè)庫(kù)里建屬于同一表空間的表。

為了支持這個(gè)特性,主要做了兩部分改動(dòng):Innodb層的支持及Server層對(duì)MDL子模塊的改動(dòng)。   

    創(chuàng)建一個(gè)表空間的語(yǔ)句很簡(jiǎn)單,語(yǔ)法如下:

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

大體的格式就是create tablespace xxx add datafile 'xxxx' engine=innodb; 這樣的方式,存儲(chǔ)單位默認(rèn)是16k。

create tablespace general_ts1  add datafile 'general_ts1_01.dbf'   engine=innodb;
ERROR 3121 (HY000): Incorrect File Name 'general_ts1_01.dbf'.

這里需要說(shuō)明的一點(diǎn)是,文件路徑可以是絕對(duì)的,也可以是相對(duì)的。但是文件名就得是.ibd的格式。

 create tablespace general_ts1  add datafile 'general_ts1_01.ibd'   engine=innodb;
Query OK, 0 rows affected (0.06 sec)

當(dāng)然我們可以使用create table xxx 指定tablespace的方式,或者是alter table 指定tablespace的方式。

下面這種方式在GTID下是不支持的,值得說(shuō)明一下。

create table test_ts tablespace general_ts1 as  select * from test ;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.

我們換一個(gè)姿勢(shì),創(chuàng)建一個(gè)表指定表空間。

create table test_ts (id int,name varchar(30)) tablespace general_ts1;
Query OK, 0 rows affected (0.04 sec)查看表的建表語(yǔ)句就可以看得很清楚了。

> show create table test_ts;
| test_ts | CREATE TABLE `test_ts` (
  `id` int(11) DEFAULT NULL,
  `name` varchar(30) DEFAULT NULL
) /*!50100 TABLESPACE `general_ts1` */ ENGINE=InnoDB DEFAULT CHARSET=utf8 |

我們來(lái)對(duì)比測(cè)試一下,重新指定一個(gè)表users,大概有80多萬(wàn)的數(shù)據(jù)量。

> select count(*)from users;
+----------+
| count(*) |
+----------+
|   817975 |
+----------+

可以看到在修改前的表usres是存在兩個(gè)獨(dú)立的文件。

-rw-r----- 1 mysql mysql       8606 Dec  4 22:48 users.frm
-rw-r----- 1 mysql mysql   41943040 Dec  4 22:48 users.ibd

使用alter語(yǔ)句來(lái)修改,整個(gè)過(guò)程很快

> alter table users tablespace general_ts1;
Query OK, 0 rows affected (1.87 sec)
Records: 0  Duplicates: 0  Warnings: 0

這個(gè)時(shí)候目錄下只存在一個(gè)定義文件了,數(shù)據(jù)都放到新建的表空間了。

-rw-r----- 1 mysql mysql       8606 Jan  4 22:46 users.frm

我們簡(jiǎn)單解析一下這個(gè)定義文件,看看內(nèi)容和原來(lái)有什么差別,可以看到有了新的表空間的標(biāo)識(shí)。

# strings users.frm
PRIMARY
InnoDB
general_ts1
)                                        
user_id
user_name
user_id
user_name

原本空白的數(shù)據(jù)文件馬上就有了數(shù)據(jù)。

-rw-r----- 1 mysql mysql   41943040 Jan  4 22:46 general_ts1_01.ibd

如果我們修改表空間為獨(dú)立表空間的方式,也是可以的。

> ALTER TABLE users TABLESPACE=innodb_file_per_table;
Query OK, 0 rows affected (2.17 sec)
Records: 0  Duplicates: 0  Warnings: 0

有一個(gè)差別就是建表DDL和原來(lái)的格式就不大一樣了。

> show create table users;
| users | CREATE TABLE `users` (
  `user_id` int(11) unsigned NOT NULL,
  `user_name` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`user_id`)
) /*!50100 TABLESPACE `innodb_file_per_table` */ ENGINE=InnoDB DEFAULT CHARSET=utf8 |

修改完成后.ibd文件會(huì)重新生成。

如果要查看表空間的信息,在使用general tablespace的情況下查看數(shù)據(jù)字典就會(huì)有一些差別。比如數(shù)據(jù)庫(kù)test下存在一個(gè)表users,在視圖INNODB_SYS_TABLESPACES中是只能看到表空間的基礎(chǔ)定義信息,general_ts1而找不到users的字樣。

上述就是小編為大家分享的MySQL 5.7如何創(chuàng)建一個(gè)表空間了,如果剛好有類(lèi)似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI