0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MySQL数据库中通用表空间详解

OSC开源社区 来源:OSCHINA 社区 2024-01-10 09:33 次阅读

作者:爱可生开源社区

在 MySQL 数据库中有效管理存储和性能至关重要,通用表空间为实现这一目标提供了灵活性。本文讨论通用表空间并探讨其功能、优点和实际用法,并附有说明性示例。

什么是通用表空间?

与默认保存系统表的单个系统表空间不同,通用表空间是用户定义的多个 InnoDB 表的存储容器。与默认设置相比,它们在数据组织和性能优化方面提供了灵活性。

主要特征

多表存储:与将每个表存储在单独的文件中的独立表空间不同,通用表空间可以容纳大量的表,从而提高存储效率。

灵活的位置:数据文件可以驻留在 MySQL 的 data 目录或独立位置,从而可以更好地控制存储管理和性能调整。

支持所有表格式:通用表空间可容纳所有 InnoDB 表格式,包括冗余、紧凑、动态和压缩行格式,为特定需求提供灵活性。

内存优化:与每个表多个文件的表空间相比,共享表空间元数据减少了内存消耗。

使用通用表空间的好处

提高性能:有策略地将数据文件放置在更快的磁盘上或将表分布在多个磁盘上可以显着提高性能。

RAID 和 DRBD 集成:数据文件可以放置在 RAID 或 DRBD 卷上,以增强数据冗余和灾难恢复。

加密支持:MySQL 支持通用表空间加密,增强数据的安全性。

方便的表管理:通用表空间允许您将多个表分组在一起,从而更轻松地管理和组织数据库对象。

创建和管理通用表空间

可以使用CREATE TABLESPACE语句创建通用表空间,并指定数据文件位置和引擎选项。 创建通用表空间涉及几个简单的步骤。下面的CREATE TABLESPACE语句使用指定的数据文件general_tablespace.ibd创建一个名为my_general_tablespace的新表空间。此外,它还使用选项ENCRYPTION='Y'启用表空间加密,并使用FILE_BLOCK_SIZE = 16384选项设置文件块大小。 让我们创建一个名为my_general_tablespace的通用表空间:

mysql> CREATE TABLESPACE my_general_tablespace
   -> ADD DATAFILE 'general_tablespace.ibd'
   -> ENCRYPTION='Y'
   -> FILE_BLOCK_SIZE = 16384;
ERROR 3185 (HY000): Can't find master key from keyring, please check in the server log if a keyring is loaded and initialized successfully.
mysql>


mysql> pager grep -i keyring_file;
PAGER set to 'grep -i keyring_file'

mysql> SHOW PLUGINS;
50 rows in set (0.00 sec)

mysql> INSTALL PLUGIN keyring_file SONAME 'keyring_file.so';
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW PLUGINS;
| keyring_file                     | ACTIVE   | KEYRING            | keyring_file.so | GPL     |
50 rows in set (0.00 sec)

mysql> CREATE TABLESPACE my_general_tablespace
   -> ADD DATAFILE 'general_tablespace.ibd'
   -> ENCRYPTION='Y'
   -> FILE_BLOCK_SIZE = 16384;
Query OK, 0 rows affected (0.01 sec)

mysql>

现在,让我们看看如何在数据目录之外创建通用表空间。

root@mysql8:/var/lib# mkdir mysql_user_defined
root@mysql8:/var/lib# chown -R mysql.mysql mysql_user_defined
root@mysql8:/var/lib#

mysql> CREATE TABLESPACE user_defined_general_tablespace
    -> ADD DATAFILE '/var/lib/var/lib/mysql_user_defined/user_defined_general_tablespace.ibd'
    -> Engine=InnoDB;
ERROR 3121 (HY000): The DATAFILE location must be in a known directory.
错误 3121 (HY000):数据文件位置必须位于已知目录中。提示 MySQL 无法在指定目录中创建表空间,因为该目录未配置为数据文件的有效位置。 要解决此错误,请按照下列步骤操作:使用SHOW VARIABLES LIKE 'innodb_directories'检查配置的目录;如果/var/lib/mysql_user_define未列出,请继续添加该目录。
mysql> SHOW VARIABLES LIKE 'innodb_directories';
+--------------------+-------+
| Variable_name      | Value |
+--------------------+-------+
| innodb_directories |       |
+--------------------+-------+
1 row in set (0.00 sec)

root@mysql8:/etc/mysql/mysql.conf.d# grep -i innodb_directories mysqld.cnf
innodb_directories=/var/lib/mysql_user_defined
root@mysql8:/etc/mysql/mysql.conf.d# service mysql restart
root@mysql8:/etc/mysql/mysql.conf.d

mysql> CREATE TABLESPACE user_defined_general_tablespace
    -> ADD DATAFILE '/var/lib/mysql_user_defined/user_defined_general_tablespace.ibd'
    -> Engine=InnoDB;
Query OK, 0 rows affected (0.02 sec)

将表分配给通用表空间

创建 MySQL 通用表空间后,您可以在表创建过程中或通过更改现有表为其分配表。以下是在my_general_tablespace中创建表的示例:

mysql> CREATE TABLE my_table (
    ->     id INT PRIMARY KEY,
    ->     name VARCHAR(50)
    -> ) TABLESPACE = my_general_tablespace;
ERROR 3825 (HY000): Request to create 'unencrypted' table while using an 'encrypted' tablespace.
mysql>

mysql> CREATE TABLE my_table (
    ->     id INT PRIMARY KEY,
    ->     name VARCHAR(50)
    -> ) TABLESPACE = my_general_tablespace
    ->   ENCRYPTION='Y';
Query OK, 0 rows affected (0.02 sec)
我们创建的user_define_general_tablespace未加密,允许我们在其中创建未加密的表。
mysql> CREATE TABLE my_unencrypted_table(
    -> id INT PRIMARY KEY,
    -> name VARCHAR(50)
    -> ) TABLESPACE = user_defined_general_tablespace;
Query OK, 0 rows affected (0.01 sec)

将表迁移到通用表空间

如果您有现有表并希望将它们移动到通用表空间,则可以使用ALTER TABLE语句。例如:

mysql> show create table authorsG
*************************** 1. row ***************************
       Table: authors
Create Table: CREATE TABLE `authors` (
  `id` int DEFAULT NULL,
  `first_name` varchar(50) DEFAULT NULL,
  `last_name` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

mysql> ALTER TABLE authors
    -> TABLESPACE = my_general_tablespace;
ERROR 3825 (HY000): Request to create 'unencrypted' table while using an 'encrypted' tablespace.

mysql> ALTER TABLE authors ENCRYPTION='Y';
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE authors
    -> TABLESPACE = my_general_tablespace;
Query OK, 0 rows affected (0.03 sec)
Records: 0  Duplicates: 0  Warnings: 0
mysql>
要将表从通用表空间转移到独立表空间,请指定“innodb_file_per_table”作为目标表空间名称。
mysql> ALTER TABLE authors
    -> TABLESPACE = innodb_file_per_table ENCRYPTION = 'Y';
Query OK, 0 rows affected (0.04 sec)
Records: 0  Duplicates: 0  Warnings: 0

监控

该查询检索指定 MySQL 表空间的信息,包括表空间名称、文件名、存储引擎、状态和可用的空闲数据空间。

mysql> SELECT TABLESPACE_NAME, FILE_NAME, ENGINE, STATUS, DATA_FREE FROM INFORMATION_SCHEMA.FILES WHERE TABLESPACE_NAME IN ('my_general_tablespace',
'user_defined_general_tablespace')G
*************************** 1. row ***************************
TABLESPACE_NAME: my_general_tablespace
      FILE_NAME: ./general_tablespace.ibd
         ENGINE: InnoDB
         STATUS: NORMAL
      DATA_FREE: 0
*************************** 2. row ***************************
TABLESPACE_NAME: user_defined_general_tablespace
      FILE_NAME: /var/lib/mysql_user_defined/user_defined_general_tablespace.ibd
         ENGINE: InnoDB
         STATUS: NORMAL
      DATA_FREE: 0
2 rows in set (0.00 sec)
以下查询有助于查找有关属于指定表空间的 InnoDB 表的信息。
mysql> SELECT NAME, SPACE_TYPE, TABLESPACE_NAME from INFORMATION_SCHEMA.INNODB_TABLES JOIN INFORMATION_SCHEMA.FILES ON FILE_ID=SPACE WHERE TABLESPACE_NAME='my_general_tablespace'G
*************************** 1. row ***************************
           NAME: mytestdb/my_table
     SPACE_TYPE: General
TABLESPACE_NAME: my_general_tablespace
*************************** 2. row ***************************
           NAME: mytestdb/books
     SPACE_TYPE: General
TABLESPACE_NAME: my_general_tablespace
2 rows in set (0.01 sec)

要检索特定 InnoDB 表的 TABLESPACE 信息,请使用以下查询。

mysql> SELECT NAME, SPACE_TYPE, TABLESPACE_NAME from INFORMATION_SCHEMA.INNODB_TABLES JOIN INFORMATION_SCHEMA.FILES ON FILE_ID=SPACE WHERE NAME='mytestdb/my_table'G
*************************** 1. row ***************************
           NAME: mytestdb/my_table
     SPACE_TYPE: General
TABLESPACE_NAME: my_general_tablespace
1 row in set (0.00 sec)

实际使用示例:

将频繁访问和很少使用的表进行分离:将频繁访问的表放置在 SSD 上的通用表空间中,以获得卓越的性能,同时将很少使用的表放置在基于 HDD 的通用表空间中,以优化存储成本。

平衡 I/O 负载:将表分布在位于不同磁盘上的多个通用表空间中,以避免 I/O 瓶颈并提高查询执行速度。

关键数据的专用存储:为关键表创建具有 RAID 或 DRBD 配置的独立通用表空间,确保最大程度的冗余并防止硬件故障。

结论

MySQL 通用表空间提供了强大而灵活的存储解决方案,用于优化数据组织和性能,了解其功能并有效部署它们可以显着改善您的数据库管理工作。为了最大限度地发挥其优势,请记住在实施通用表空间之前仔细考虑您的特定需求和工作负载特征。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3763

    浏览量

    64274
  • 开源
    +关注

    关注

    3

    文章

    3245

    浏览量

    42390
  • MySQL
    +关注

    关注

    1

    文章

    801

    浏览量

    26438

原文标题:MySQL通用表空间的这几个选项你会用么?

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    如何在Rust连接和使用MySQL数据库

    MySQL是一个广泛使用的关系型数据库,Rust作为一门相对较新的系统级编程语言,具有C语言般的高性能、安全、并发等特性,因此与MySQL一起使用是一种非常有趣的选择。在本教程,我们
    的头像 发表于 09-30 17:05 1614次阅读

    如何利用labview获取MySQL数据库某一列的最大值

    如题,想获取MySQL数据库的data7那一列的最大值,下面是程序框图一直报语法错误,但是该语句在mysql command line
    发表于 12-06 21:37

    MySQL数据库如何安装和使用说明

    MySQL数据库开发 基础概念 1.数据:描述事物特征的符号,属性 2.数据库的概念:管理计算机
    的头像 发表于 02-13 16:13 2767次阅读

    MySQL端口可以从MySQL数据库存储和检索数据

    MySQL端口可以从MySQL数据库存储和检索数据。 概览 建立连接后,端口读取数据库
    的头像 发表于 02-15 14:07 1646次阅读

    华为云数据库-RDS for MySQL数据库

    (for MySQL)为辅。 MySQL数据库是全球最受欢迎的一种数据库,它是属于 Oracle旗下的一款产品,MySQL是一种关系型
    的头像 发表于 10-27 11:06 1473次阅读

    MySQL数据库服务器、数据库之间是什么关系

    数据库服务器:MySQL安装后,会成为一个windows服务,这个windows服务可以看做是数据库服务器。用CMD登录MySQL,此时CMD就是一个客户端。
    的头像 发表于 01-31 14:59 1173次阅读
    <b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b>服务器、<b class='flag-5'>数据库</b>和<b class='flag-5'>表</b>之间是什么关系

    MySQL数据库管理与应用

    讨论MySQL数据库的管理和应用。 管理MySQL数据库 在管理MySQL数据库之前,我们需要了
    的头像 发表于 08-28 17:15 938次阅读

    数据库数据恢复—MySQL数据库误删除记录的数据恢复案例

    数据库数据恢复环境: 一台本地windows sever操作系统服务器,服务器上部署mysql数据库单实例,引擎类型为innodb,
    的头像 发表于 11-09 15:16 1280次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—<b class='flag-5'>MySQL</b><b class='flag-5'>数据库</b><b class='flag-5'>表</b>误删除记录的<b class='flag-5'>数据</b>恢复案例

    mysql是一个什么类型的数据库

    强、易于使用和管理。在本文中,我们将详尽、详实、细致地介绍MySQL的功能、优势、架构、语法等方面。 一、MySQL的功能: 数据库管理:MySQL具备创建和管理
    的头像 发表于 11-16 14:43 1680次阅读

    数据库mysql基本增删改查

    的基本增删改查操作。 一、增加数据(INSERT) 在MySQL,可以使用INSERT语句来向数据库添加
    的头像 发表于 11-16 16:35 1464次阅读

    mysql数据库如何创建数据表

    MySQL是一种常用的关系型数据库管理系统,可以用于创建和管理数据表。下面是一篇详细的关于MySQL数据库如何创建
    的头像 发表于 11-21 11:08 1748次阅读

    MySQL数据库基础知识

    的基础知识,包括其架构、数据类型、操作、查询语句和数据导入导出等方面。 MySQL 数据库架构 MyS
    的头像 发表于 11-21 11:09 947次阅读

    mysql数据库基础命令

    MySQL是一个流行的关系型数据库管理系统,经常用于存储、管理和操作数据。在本文中,我们将详细介绍MySQL的基础命令,并提供与每个命令相关的详细解释。 登录
    的头像 发表于 12-06 10:56 551次阅读

    数据库数据恢复—未开启binlog的Mysql数据库数据恢复案例

    mysql数据库数据恢复环境: 本地服务器,windows server操作系统 ,部署有mysql单实例,数据库引擎类型为innodb,
    的头像 发表于 12-08 14:18 1085次阅读
    <b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复—未开启binlog的<b class='flag-5'>Mysql</b><b class='flag-5'>数据库</b><b class='flag-5'>数据</b>恢复案例

    mysql怎么新建一个数据库

    mysql怎么新建一个数据库 如何新建一个数据库MySQL 创建一个数据库
    的头像 发表于 12-28 10:01 848次阅读