AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 15906
Accepted
newbie14
newbie14
Asked: 2012-04-01 19:44:49 +0800 CST2012-04-01 19:44:49 +0800 CST 2012-04-01 19:44:49 +0800 CST

innodb_file_per_table 是否可取?

  • 772

我们有一个应用程序,其中只有一个表将增长到数百万行,而其余的将略低于一百万。那么我们应该使用 innodb_file_per_table 还是保留一个 .ibd 的建议是什么?我读过一些文章说不要使用它,因为在执行连接时需要更多的磁盘访问权限?我们将在此表和其他表之间连接以生成报告。

mysql innodb
  • 3 3 个回答
  • 18378 Views

3 个回答

  • Voted
  1. Best Answer
    RolandoMySQLDBA
    2012-04-01T20:18:44+08:002012-04-01T20:18:44+08:00

    您必须使用innodb_file_per_table并且需要使用 InnoDB 的当前基础架构进行一些清理。

    我见过许多数据库托管客户端设置 MySQL 并将 InnoDB 保留在默认状态。这会导致系统表空间(更好地称为 ibdata1)急剧增长。

    即使您切换到 innodb_file_per_table,.ibd 文件也必须从 ibdata1 中提取,并且 ibdata 永远不会缩小。例如,如果您在 ibdata1 中有一个名为 mydb.mytable 的表占用 2GB,那么要提取它,您必须执行以下操作:

    步骤 01) 将此添加到 /etc/my.cnf

    [mysqld]
    innodb_file_per_table
    

    步骤 02)service mysql restart

    步骤 03)ALTER TABLE mydb.mytable ENGINE=InnoDB;

    这将使文件 /var/lib/mysql/mydb/mytable.ibd

    遗憾的是,更改前该表占用的 2GB 空间无法回收。我写过关于如何以及为什么清理 InnoDB 基础设施的帖子:

    • 为什么 InnoDB 将所有数据库存储在一个文件中?
    • MySQL InnoDB 中表的计划优化
    • ERROR 1114 (HY000) at line 6308 in file & The table user_analysis is full
    • 我在 StackOverflow 中的原始帖子

    一旦你做出这个重大改变,不要忘记增加innodb_open_files (default 300)。否则,磁盘访问非常有限。

    关于连接,请确保您有支持连接条件的适当索引。

    更新 2012-04-02 11:30 EDT

    在全新安装中使用 innodb_file_per_table 会导致 ibdata1 增长非常缓慢,因为所有 DDL 都是在 ibdata 外部完成的。您可以像我之前提到的那样收缩任何 InnoDB 表:

    ALTER TABLE mydb.mytable ENGINE=InnoDB;
    

    更新 2012-04-02 16:50 EDT

    在备份方面,制作 .ibd 文件的副本时要格外小心。为什么?

    在每个 .ibd 文件中都有一个特殊的值,称为 tablespace_id。ibdata1 中有一个 tablespace_id 值列表。如果您曾经执行需要删除和重新创建表的表维护,tablespace_id 将变得不同。如果您还制作了 ibdata1 的副本,则制作此类 .ibd 文件的副本只能集成回数据库以供使用。这会危及所有其他 InnoDB 表的 tablespace_id。鉴于此,最好执行 mysqldump 备份,因为 mysqldump 是数据的逻辑副本。换句话说,备份独立于 ibdata1 的时间点,您可以自由地重新加载而不会出现可操作性问题。

    • 25
  2. Jan Steinman
    2012-04-03T10:09:20+08:002012-04-03T10:09:20+08:00

    同意@RolandoMySQLDBA,因为他没有提到:备份。

    如果您的 MySQL 备份机制已全部解决,并且您没有在文件系统备份策略中包含它的 .ibd 文件,那么这并不是那么重要。但考虑到向任何 innodb 表添加 ONE BYTES 会导致 .ibd 表的增量备份,否则您会发现备份存储很快就会用完。

    • 7
  3. glglgl
    2012-04-04T00:00:26+08:002012-04-04T00:00:26+08:00

    我有一个应用程序正好遇到这种情况:一些大表和一些小表。

    我决定把小的放在ibdata1一边,把大的放在自己的文件里。

    我这样做innodb_file_per_table是默认打开的,只是暂时关闭它以将表格移动到ibdata1with ALTER TABLE。

    • 4

相关问题

  • 是否有任何 MySQL 基准测试工具?[关闭]

  • 我在哪里可以找到mysql慢日志?

  • 如何优化大型数据库的 mysqldump?

  • 什么时候是使用 MariaDB 而不是 MySQL 的合适时机,为什么?

  • 组如何跟踪数据库架构更改?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何查看 Oracle 中的数据库列表?

    • 8 个回答
  • Marko Smith

    mysql innodb_buffer_pool_size 应该有多大?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    从 .frm 和 .ibd 文件恢复表?

    • 10 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve