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.常规表空间
系统表空间包含,
除此之外它还包含,
相关文件是 .idbdata1
innodb_file_per_table选项在MySQL 5.6及更高版本中默认启用,允许在每个表的文件表空间中创建表,每个表都有一个单独的数据文件.启用innodb_file_per_table选项可以使用其他MySQL功能,例如表压缩和可传输表空间.
相关文件是 .idbd
InnoDB在MySQL 5.7.6中引入了通用表空间.常规表空间是使用CREATE TABLESPACE语法创建的共享表空间.它们可以在MySQL数据目录之外创建,能够保存多个表,并支持所有行格式的表.
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 文档。
默认情况下,InnoDB 仅包含一个称为系统表空间的表空间,其标识符为 0。可以使用 innodb_file_per_table 配置参数间接创建更多表空间。表空间由一系列文件组成。文件的大小不必被数据库块大小整除,因为我们可能只保留最后一个不完整的块未使用。将新文件附加到表空间时,还会指定文件的最大大小。目前,我们认为最好在创建文件时就将文件扩展到其最大大小,因为这样我们可以避免在表空间需要更多空间时动态扩展文件。数据文件是动态扩展的,但重做日志文件是预先分配的。此外,正如前面已经提到的,只有系统表空间可以有多个数据文件。还明确提到,即使表空间可以有多个文件,它们也被认为是连接在一起的一个大文件。所以表空间中文件的顺序很重要。
来自https://blogs.oracle.com/mysqlinnodb/entry/data_organization_in_innodb
| 归档时间: |
|
| 查看次数: |
15290 次 |
| 最近记录: |