什么是表空间,为什么使用它?

Bhu*_*ant 23 mysql database database-design tablespace

在调查问题时,我遇到了这个错误:

30503 [错误] InnoDB:尝试打开以前打开的表空间.以前的表空间mysql/innodb_index_stats在文件路径中使用空间ID:2:./ mysql/innodb_index_stats.ibd.无法在文件路径中打开使用空格ID:2的表空间Mydb/be_command_log:./ Model/be_command_log.ibd

在仔细阅读了这个问题后,我才知道这是一个已知的MySQL问题.

但我的问题是我不太了解表空间是如何工作的.它们有用吗?我读了这个定义,但它没有提供所有信息.

有人可以分享关于什么是表空间以及它们如何工作的一些详细信息

Pay*_*ati 17

添加@BhupeshPant 提供的优秀答案

InnoDB的存储分为表空间。表空间是与多个数据文件(对象)关联的逻辑结构。每个表空间包含页(块)、范围和段。

在此输入图像描述

- InnoDB 的最小数据块,也称为块。一页可以容纳一行或多行,具体取决于行大小。

一般来说,每个表都有自己的表空间,并与一个数据文件关联

以下命令显示表空间和相应数据文件的完整列表 -

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;
Run Code Online (Sandbox Code Playgroud)

为了获得更正确的理解,创建一个示例数据库 -database1

CREATE DATABASE database1;
USE database1;
Run Code Online (Sandbox Code Playgroud)

现在创建一个示例表table1-

CREATE TABLE table1 (
    -> col1 INT
    -> );
Run Code Online (Sandbox Code Playgroud)

现在我们可以看到相应的表空间和数据文件也已经创建了——

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+--------------------------+--------------------------+
| TABLESPACE_NAME          | FILE_NAME                |
+--------------------------+--------------------------+
|database1/table1          | ./database1/table1.ibd   |
+--------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

这里的.ibd扩展名表示Innodb数据文件

现在创建另一个示例表table2-

CREATE TABLE table2 (
    -> col1 INT
    -> );
Run Code Online (Sandbox Code Playgroud)

我们再次可以看到相应的表空间和数据文件已经创建了——

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+---------------------------+--------------------------+
| TABLESPACE_NAME           | FILE_NAME                |
+---------------------------+--------------------------+
| database1/table1          | ./database1/table1.ibd   |
| database1/table2          | ./database1/table2.ibd   |
+---------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

这里系统正在为表空间创建一个默认名称。这些系统生成的表空间称为 -单表表空间

单表表空间仅在innodb_file_per_table以下情况下由系统创建ON

可以通过以下方式检查 -

SHOW VARIABLES LIKE "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | ON    |
+-----------------------+-------+
Run Code Online (Sandbox Code Playgroud)

默认情况下,这些值为“开”。可以通过以下方式关闭它 -

SET GLOBAL innodb_file_per_table = OFF;

SHOW VARIABLES LIKE "innodb_file_per_table";
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| innodb_file_per_table | OFF   |
+-----------------------+-------+
Run Code Online (Sandbox Code Playgroud)

如果关闭该值,则不会创建单表表空间。

为了演示这一点,我们再次创建一个示例表 -

CREATE TABLE table10 (
    -> col1 INT
    -> );

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+---------------------------+--------------------------+
| TABLESPACE_NAME           | FILE_NAME                |
+---------------------------+--------------------------+
| database1/table1          | ./database1/table1.ibd   |
| database1/table2          | ./database1/table2.ibd   |
+---------------------------+--------------------------+
Run Code Online (Sandbox Code Playgroud)

因此,我们可以看到没有database1/table10创建名为 - 的表空间

在这种情况下,表存储在innodb_system表空间中;

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES WHERE FILE_NAME LIKE "%ibdata1";
+-----------------+-----------+
| TABLESPACE_NAME | FILE_NAME |
+-----------------+-----------+
| innodb_system   | ./ibdata1 |
+-----------------+-----------+
Run Code Online (Sandbox Code Playgroud)

但这不是一个好的做法,因为它会给系统表空间带来更多负担,从而导致性能相关问题。

如果是系统生成的表空间,则在删除表时,表空间也会自动删除。




还有另一种类型的表空间称为通用表空间,我们可以在其中为表空间创建自定义名称。

为此,我们需要发出以下命令 -

CREATE TABLESPACE tablespace1 ADD DATAFILE '/var/lib/mysql/tablespace1.ibd' engine = Innodb;
Run Code Online (Sandbox Code Playgroud)

我们可以检查表空间和相应的数据文件是否已创建 -

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+---------------------------+--------------------------------+
| TABLESPACE_NAME           | FILE_NAME                      |
+---------------------------+--------------------------------+
| database1/table1          | ./database1/table1.ibd         |
| database1/table2          | ./database1/table2.ibd         |
| tablespace1               | /var/lib/mysql/tablespace1.ibd |
+---------------------------+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

这里所有的表空间都是在Mysql中创建的,datadir默认情况下是/var/lib/mysql/

datadir可以通过以下命令检查该值 -

SELECT @@datadir;
+-----------------+
| @@datadir       |
+-----------------+
| /var/lib/mysql/ |
+-----------------+
Run Code Online (Sandbox Code Playgroud)

在 MySQL 中,每个表空间只能添加一个数据文件。但在 Oracle 或 SQL Server 中,可以将多个数据文件添加到表空间中。

要在表空间中创建表 -tablespace1我们需要发出命令 -

CREATE TABLE table3 (
    -> col1 INT 
    -> )
    -> TABLESPACE = tablespace1;
Run Code Online (Sandbox Code Playgroud)

对于一般表空间,可以在一个表空间内创建多个表 -

CREATE TABLE table4 (
    -> col1 INT
    -> )
    -> TABLESPACE = tablespace1;
Run Code Online (Sandbox Code Playgroud)

创建表空间时,可能不会专门指定数据文件位置。以下命令也将起作用 -

CREATE TABLESPACE tablespace2 ADD DATAFILE 'tablespace2.ibd' engine = Innodb;

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+---------------------------+--------------------------------+
| TABLESPACE_NAME           | FILE_NAME                      |
+---------------------------+--------------------------------+
| database1/table1          | ./database1/table1.ibd         |
| database1/table2          | ./database1/table2.ibd         |
| tablespace1               | /var/lib/mysql/tablespace1.ibd |
| tablespace2               | ./tablespace2.ibd              |
+---------------------------+--------------------------------+
Run Code Online (Sandbox Code Playgroud)

datadir默认情况下,所有表空间都在目录中创建

表空间创建默认值的页面大小。但是,我们也可以在创建表空间时设置自己的页面大小。但尺寸必须在默认页面尺寸以内,否则会出现错误。默认页面大小可以在安装 MySQL 服务器时设置。

允许的页面大小为 - 4 kb、8 kb、16 kb、32 kb、64 kb。

一般在安装过程中,默认页面大小设置为 16 kb。

以下命令用于查看默认页面大小 -

SHOW VARIABLES LIKE 'innodb_page_size';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| innodb_page_size | 16384 |
+------------------+-------+
Run Code Online (Sandbox Code Playgroud)

创建具有自定义页面大小的表空间的命令是 -

CREATE TABLESPACE tablespace3_8kb ADD DATAFILE '/var/lib//mysql/tablespace3_8kb.ibd' FILE_BLOCK_SIZE = 8192 ENGINE = Innodb;

SELECT TABLESPACE_NAME, FILE_NAME FROM information_schema.FILES;

+---------------------------+-------------------------------------+
| TABLESPACE_NAME           | FILE_NAME                           |
+---------------------------+-------------------------------------+
| database1/table1          | ./database1/table1.ibd              |
| database1/table2          | ./database1/table2.ibd              |
| tablespace1               | /var/lib/mysql/tablespace1.ibd      |
| tablespace2               | ./tablespace2.ibd                   |
| tablespace3_8kb           | /var/lib//mysql/tablespace3_8kb.ibd |
+---------------------------+-------------------------------------+
Run Code Online (Sandbox Code Playgroud)

要将表存储在具有用户定义页面大小的表空间中,需要不同的语法 -

CREATE TABLE table5 (
    -> col1 INT
    -> )
    -> TABLESPACE = tablespace3_8kb 
    -> KEY_BLOCK_SIZE = 8;
Run Code Online (Sandbox Code Playgroud)

与系统生成的表空间不同,如果我们删除表,一般表空间不会自动删除,需要显式删除表空间。

命令是-

DROP TABLESPACE tablespace_name;
Run Code Online (Sandbox Code Playgroud)


Bhu*_*ant 10

一个数据文件,可以保存一个或多个InnoDB表和相关索引的数据.

根据每个表的信息通道配置,有许多类型的表空间.这些是,

一个.系统表空间b.每个表空间的文件c.常规表空间

系统表空间包含,

  1. InnoDB数据字典.
  2. DoubleWrite缓冲区.
  3. 改变缓冲区
  4. 撤消日志.

除此之外它还包含,

  1. 桌子和
  2. 索引数据

相关文件是 .idbdata1

innodb_file_per_table选项在MySQL 5.6及更高版本中默认启用,允许在每个表的文件表空间中创建表,每个表都有一个单独的数据文件.启用innodb_file_per_table选项可以使用其他MySQL功能,例如表压缩和可传输表空间.

相关文件是 .idbd

InnoDB在MySQL 5.7.6中引入了通用表空间.常规表空间是使用CREATE TABLESPACE语法创建的共享表空间.它们可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表.


S.K*_*kat 6

MySQL Innodb TableSpace是数据驻留在称为数据目录(默认为“系统表空间”)的磁盘中的位置。例子:

“/var/lib/mysql”

从 MySQL 5.6.6 版本开始,用户可以创建和指定他们想要存储数据的表空间,从而实现数据操作和恢复过程的吞吐量。InnoDB 的 file-per-table 特性为每个表提供了单独的.ibd数据和索引文件,代表一个单独的通用表空间。这样数据库中的每个表都可以指向数据目录的各个位置

前任 :

/home/{user}/test/data/{dbName}/{tableName}.ibd

/home/{user}/work/data/{dbName}/{tableName}.ibd

有关 file-per-table 表空间的更多信息,请参阅此mysql 文档


Ruk*_*sim 5

默认情况下,InnoDB 仅包含一个称为系统表空间的表空间,其标识符为 0。可以使用 innodb_file_per_table 配置参数间接创建更多表空间。表空间由一系列文件组成。文件的大小不必被数据库块大小整除,因为我们可能只保留最后一个不完整的块未使用。将新文件附加到表空间时,还会指定文件的最大大小。目前,我们认为最好在创建文件时就将文件扩展到其最大大小,因为这样我们可以避免在表空间需要更多空间时动态扩展文件。数据文件是动态扩展的,但重做日志文件是预先分配的。此外,正如前面已经提到的,只有系统表空间可以有多个数据文件。还明确提到,即使表空间可以有多个文件,它们也被认为是连接在一起的一个大文件。所以表空间中文件的顺序很重要。

来自https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb