mysql5.7 General tablespace使用说明

General tablespace

General tablespace 是一种共享的 innodb 表空间,有点类似 ibdata1 。可以在一个表空间数据文件下存储多张表,即使这些表来自不同的 schame 。

General tablespace 的优点

            类似系统表空间,可以存储多个 schema 下的多张表。

            与 file_per_table tablespace 相比, General tablespace 有潜在的内存的优点。这种方式存储表空间的元数据到内存中,可以减小内存消耗。

            General tablespace 可以将数据文件存在其它盘上。这样做的好处是,比如说我需要将几张热点表放到更快的存储盘上,就可以在更快的存储盘上创建 general tablespace ,将热点表放过去。

            General 支持所有的行格式,以及相关特性。

            数据表可以在 general tablespace 和 per_file_table  tablespace 之间来回移动。类似 Oracle 数据库的 move  table 。

创建 general tablespace 的语法

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

注意为了避免 data directory 冲突,表空间建立在 data directory 子目录下是不被支持的。因为 datadir 子目录会被 mysql认为是 database 。但是 general tablespace 可以建立在 datadir 下。 General tablespace 建立在非 datadir 目录下后,data directory 下会产生一个 .isl 文件,里面是详细路径。

            例如在 datadir 下面建一个 general tablespace , page_size 是 8k ,默认引擎 innodb :

mysql> create tablespace tbs01 add   datafile ‘tbs01.ibd’ file_block_size=8192 engine=innodb; 
Query OK, 0 rows affected (0.02 sec)
mysql> create tablespace tbs02 add   datafile ‘/u01/mysql/3306/general_tbs/tbs02.ibd’ engine=innodb;         
Query OK, 0 rows affected (0.01 sec)

Isl 其实是路径:

[root@oradb-2062 data]# more tbs02.isl
/u01/mysql/3306/general_tbs/tbs02.ibd

Information_schema 下的 INNODB_SYS_TABLESPACES 表有这些表空间的元数据信息:

mysql> select   space,name,FLAG,FILE_FORMAT,PAGE_SIZE,SPACE_TYPE,FILE_SIZE,ALLOCATED_SIZE   from INNODB_SYS_TABLESPACES where name like ‘tbs%’\G
*************************** 1. row   ***************************
           space: 61
            name: tbs01
            FLAG: 2089
     FILE_FORMAT: Barracuda
       PAGE_SIZE: 16384
      SPACE_TYPE: General
       FILE_SIZE: 65536
ALLOCATED_SIZE: 16384
*************************** 2. row   ***************************
           space: 63
            name: tbs02
            FLAG: 2048
     FILE_FORMAT: Any
       PAGE_SIZE: 16384
      SPACE_TYPE: General
       FILE_SIZE: 65536
ALLOCATED_SIZE: 32768
2 rows in set (0.00 sec)

General 表空间的使用

Tbs01 建表空间时指定 FILE_BLOCK_SIZE=8k

Tbs02 建表空间时没有指定 FILE_BLOCK_SIZE

FILE_BLOCK_SIZE 只有在存储压缩表的时候才能在建表空间的时候使用。否则建非压缩表会报错。也就是说 压缩表和非压缩表无法在同一个表空间中 。

mysql> create table tt(a int)   tablespace=tbs01;
ERROR 1478 (HY000): InnoDB: Tablespace   `tbs01` uses block size 8192 and cannot contain a table with physical page   size 16384

建压缩表是可以的。

mysql> create table tt(a int) tablespace=tbs01ROW_FORMAT=COMPRESSED;
Query OK, 0 rows affected (0.02 sec)

同样地,也不能在 tbs02 中建压缩表

mysql> create table tt01(a int)   tablespace=tbs02 ROW_FORMAT=COMPRESSED;
ERROR 1478 (HY000): InnoDB: Tablespace   `tbs02` cannot contain a COMPRESSED table
mysql> create table tt01(a int)   tablespace=tbs02;
Query OK, 0 rows affected (0.01 sec)

将表空间中到的表移动到 file_per_table tablespace 。

mysql> alter table tt   tablespace=innodb_file_per_table;
Query OK, 0 rows affected (0.06 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> alter table tt01   tablespace=innodb_file_per_table;
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

将一张 250 万的表从 file_per_table tablespace 移动到 general tablespace

mysql> alter table test02   tablespace=tbs02;
Query OK, 0 rows affected ( 9.41 sec )
Records: 0  Duplicates: 0  Warnings: 0

花了 9 秒多,说明这种移动大表还是很花时间的。

附,将表移动到系统表空间

ALTER TABLE test01 TABLESPACE  innodb_system;

删除表空间,注意表空间中有表的时候不能删除成功。

mysql> drop tablespace tbs02;
ERROR 1529 (HY000): Failed to drop   TABLESPACE tbs02

General tablespace 的限制

General tablespace 不支持临时表。

与系统表空间类似, truncate 或 drop table 只是标记空间为可用,但是不会还给操作系统。

MySQL 5.7.24 版本及之后的版本,不在支持将分区放到 general tablespace 中去了。

ALTER TABLE … DISCARD TABLESPACE and ALTER TABLE …IMPORT TABLESPACE 不支持 general tablespace 。

Image placeholder
正合适
未设置
  100人点赞

没有讨论,发表一下自己的看法吧

推荐文章
vue引入swiper vue使用swiper vue脚手架使用swiper /引入js文件/引入css文件

vue引入swipervue使用swipervue脚手架使用swiper/引入js文件/引入css文件欢迎加入前端交流群来获取视频资料以及前端学习资料:749539640转载文章请注明出处! 如果只是

【Golang+MySQL】记一次 MySQL 数据库迁移(一)

【Golang+mysql】记一次mysql数据库迁移(一)文章地址:https://github.com/stayfoo/stayfoo-hub一、准备目标: 腾讯云CVM自建mysql数据迁移到腾

Oracle/云MySQL/MsSQL“大迁移”真相及最优方案

最近一段时间碰到一些数据迁移的项目,如:Oracle迁移到MySQL,MsSQL迁移到MySQL,云MySQL迁移到本地MySQL。对于这方面做了系统的整理。包括:迁移方案的选择、如何跳出迁移遇到的坑

MySQL 性能优化:8 种常见 SQL 错误用法!

1、LIMIT语句分页查询是最常用的场景之一,但也通常也是最容易出问题的地方。比如对于下面简单的语句,一般DBA想到的办法是在type,name,create_time字段上加组合索引。这样条件排序都

一条SQL语句在MySQL中如何执行的

前两天发了一条SQL慢的原因有哪些,在那篇文章我没有说到优化器之类的,我觉得如果配合一条SQL是如何执行的,会更好,所以特地找了一篇。来源:JavaGuide  |作者:木木匠本篇文章会分析一个sql

mysql 进行update时,要更新的字段中有单引号或者双引号导致不能批量生成sql的问题

前言将数据从一张表迁移到另外一张表的过程中,通过mysql的concat方法批量生成sql时遇到了一个问题,即进行UPDATE更新操作时如果原表中的字段中包含单引号'或者双引号",那么就会生成不正确的

MySQL Batched Key Access (BKA)原理和设置使用方法举例

MySQL5.6版本开始增加了提高表join性能的算法:BatchedKeyAccess(BKA)的新特性。BKA算法原理:将外层循环的行/结果集存入joinbuffer,内存循环的每一行数据与整个b

pymysql fetchone () , fetchall () , fetchmany ()

最近在用python操作mysql数据库时,碰到了下面这两个函数,标记一下: 1.定义 1.1fetchone(): 返回单个的元组,也就是一条记录(row),如果没有结果则返回None 1.2fet

SQL Server 2014的数据库引擎新增功能(参考sqlserver官方文档)

SQLServer2014数据库引擎引入了一些新功能和增强功能,这些功能可以提高设计、开发和维护数据存储系统的架构师、开发人员和管理员的能力和工作效率。  以下是 数据库引擎已增强的方面。数据库引擎功

日均5亿查询量的京东订单中心,为什么舍MySQL用ES?

京东到家订单中心系统业务中,无论是外部商家的订单生产,或是内部上下游系统的依赖,订单查询的调用量都非常大,造成了订单数据读多写少的情况。我们把订单数据存储在MySQL中,但显然只通过DB来支撑大量的查

MySQL 中 JSON 字段的使用技巧

mysql5.7.8之后开始原生支持json.在类似mongodb这种nosql数据库中,json存储数据是非常自然的,在mysql中合理的使用json,能够带来极大的便利 Json字段的使用场景 在

为什么不建议在 MySQL 中使用 UTF-8?

最近我遇到了一个bug,我试着通过Rails在以“utf8”编码的MariaDB中保存一个UTF-8字符串,然后出现了一个离奇的错误:Incorrect string value: ‘😃 

MySQL优化之覆盖索引的使用

查看测试表结构:mysql>showcreatetableim_message\G ***************************1.row**************************

为什么mysql索引要使用B+树,而不是B树,红黑树

我们在MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片

Ubuntu18.04 安装 MySQL 以及设置远程访问

安装MySQL sudoapt-getinstallmysql-server sudoaptisntallmysql-client sudoaptinstalllibmysqlclient-dev

基础信息:MySQL 特性

MySQL数据库的优缺点: 关系型数据库管理系统(RDBMS):MySQL是一个典型的关系型数据库管理系统。 易用:MySQL很容易上手。只要你掌握一些简单的SQL知识,就可以构建SQL语句与My

基础信息:什么是 MySQL?

MySQL是一个开源的深受欢迎的关系型数据库管理系统(简称RDBMS)。目前排名第二,仅次于Oracle数据库。 MySQL可以免费下载,但是,还提供了几个付费版本,这些版本提供了附加功能。 顾名思义

MySQL 数据库操作:创建和查看数据库

数据库是数据的集合。MySQL允许我们高效地存储和检索数据库中的数据。在MySQL中,我们可以使用CREATEDATABASE语句创建数据库。但是,如果数据库已经存在,则会引发错误。为了避免该错误,我

MySQL 表结构生成 Markdown 文档 | 工具篇

背景 在实施软件工程的时候,当要将某一版本归档时,需要汇总的文档要求还是比较高的、各类文档齐全,包括项目架构、项目安装、接口等文档,而数据库表结构说明文档亦属于其一。记得很早之前想找一个可以导出MyS

MySQL 数据库操作:删除数据库

使用MySQL的DROPDATABASE命令可以很容易的删除一个数据库。数据库删除的同时,所属的数据表将一起被删除。如果删除的数据库不存在,则会引发错误。为了避免错误的发生,可以在DROPDATABA

MySQL 定时备份

1设置好crontab定时任务备份 #每天备份三次数据库 05,15,22***sh/data/script/alldatabase_back.sh&>/dev/null #每天2点备份 02***s

Laravel-Binlog 扩展(用于实时监听 MySQL 数据变更、数据同步等场景)

Laravel-Binlogv0.2.1 (该扩展当前用于我司测试环境实时同步Mysql数据变更到ElasticSearch,稳定性待测试!!哈哈哈)我司正式环境走的阿里云DTS数据订阅 基于Sw

MySQL 读后总结

一条SQL查询语句是如何执行的? Mysql基本架构示意图Mysql分为Server层和存储引擎层两部分 Server层包括连接器、查询缓存、分析器、优化器、执行器等,涵盖MySQL的大多数核心服务

MySQL 优化笔记

优化方向 SQL优化 sql优化分析 索引优化 优化数据库对象 优化表的数据类型 表拆分(水平、垂直) 反范式 使用中间表 优化mysqlserver mysql内存管理优化 log机制及优化

MySQL 优化笔记

优化方向 SQL优化 sql优化分析 索引优化 优化数据库对象 优化表的数据类型 表拆分(水平、垂直) 反范式 使用中间表 优化mysqlserver mysql内存管理优化 log机制及优化