久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

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

142次閱讀
沒有評論

共計(jì) 2790 個字符,預(yù)計(jì)需要花費(fèi) 7 分鐘才能閱讀完成。

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

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

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

為了支持這個特性,主要做了兩部分改動:Innodb 層的支持及 Server 層對 MDL 子模塊的改動。   

  創(chuàng)建一個表空間的語句很簡單,語法如下:

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

大體的格式就是 create tablespace xxx add datafile xxxx engine=innodb; 這樣的方式,存儲單位默認(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 .

這里需要說明的一點(diǎn)是,文件路徑可以是絕對的,也可以是相對的。但是文件名就得是.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 下是不支持的,值得說明一下。

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

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

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

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 |

我們來對比測試一下,重新指定一個表 users,大概有 80 多萬的數(shù)據(jù)量。

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

可以看到在修改前的表 usres 是存在兩個獨(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 語句來修改,整個過程很快

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

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

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

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

# 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

有一個差別就是建表 DDL 和原來的格式就不大一樣了。

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 文件會重新生成。

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

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

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-07-19發(fā)表,共計(jì)2790字。
轉(zhuǎn)載說明:除特殊說明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 崇仁县| 兴宁市| 湖北省| 孝义市| 四子王旗| 盘山县| 阜平县| 梧州市| 江陵县| 隆德县| 乐至县| 乡城县| 阿城市| 汶川县| 青田县| 大埔县| 梅州市| 六枝特区| 旬邑县| 四子王旗| 抚松县| 读书| 福海县| 故城县| 郑州市| 屏东县| 雷山县| 凭祥市| 巴中市| 邹城市| 龙州县| 辛集市| 濮阳市| 阿合奇县| 准格尔旗| 鸡泽县| 漾濞| 陆丰市| 瑞丽市| 黔江区| 双流县|