MySQL 5.7如何创建一个表空间

60次阅读
没有评论

共计 2790 个字符,预计需要花费 7 分钟才能阅读完成。

这期内容当中丸趣 TV 小编将会给大家带来有关 MySQL 5.7 如何创建一个表空间,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

MySQL 里面的文件蛮有意思,之前大体有两个参数来做基本的控制。一个是 innodb_data_file_path 就是一个共享表空间,数据都往这一个文件里放,也就是 ibdata1, 这个文件其实角色是有重复的,undo,数据都会放在一起。ibdata1 会持续增长,无法收缩。另外一个参数是 innodb_file_per_table,这样一来,就成了独立表空间,通俗一些就是每一个表都有独立的文件.frm 和.ibd,而且实际中使用独立表空间还是比较普遍的,对于 delete 的操作影响 MySQL 和 Oracle 就大大不同。

 
后来到了 MySQL 5.7.5, 新增了在线阶段 undo
log 的功能,让 undo 从原本的 ibdata1 剥离出来,而对于通用的独立表空间的应用场景,MySQL 也提供了另外一种管理方式,就是 General
tablespace。其实这个特性在 Oracle 中已经非常普遍,换个角度来理解就很容易了,它没有库的概念,可以在多个库里建属于同一表空间的表。

为了支持这个特性,主要做了两部分改动:Innodb 层的支持及 Server 层对 MDL 子模块的改动。   

  创建一个表空间的语句很简单,语法如下:

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

大体的格式就是 create tablespace xxx add datafile xxxx engine=innodb; 这样的方式,存储单位默认是 16k。

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

这里需要说明的一点是,文件路径可以是绝对的,也可以是相对的。但是文件名就得是.ibd 的格式。

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

当然我们可以使用 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.

我们换一个姿势,创建一个表指定表空间。

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 多万的数据量。

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

可以看到在修改前的表 usres 是存在两个独立的文件。

-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

这个时候目录下只存在一个定义文件了,数据都放到新建的表空间了。

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

我们简单解析一下这个定义文件,看看内容和原来有什么差别,可以看到有了新的表空间的标识。

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

原本空白的数据文件马上就有了数据。

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

如果我们修改表空间为独立表空间的方式,也是可以的。

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 的情况下查看数据字典就会有一些差别。比如数据库 test 下存在一个表 users,在视图 INNODB_SYS_TABLESPACES 中是只能看到表空间的基础定义信息,general_ts1 而找不到 users 的字样。

上述就是丸趣 TV 小编为大家分享的 MySQL 5.7 如何创建一个表空间了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注丸趣 TV 行业资讯频道。

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-19发表,共计2790字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)