MySQL空间不足怎么办?

Ale*_*lec 4 mysql

出于好奇,假设您有一个巨大的 MySQL 数据库,其中充满了用户信息,并且它现在已满。如何在同一台服务器和另一台具有更多存储空间的服务器上运行相同的 MySQL 数据库?

Ran*_*eed 5

如果问题只是存储空间的问题,那么最简单的解决方案是将数据库转移到另一个容量更大的系统。

另一种解决方案可能是向同一系统添加磁盘,并且

  1. (InnoDB)将表空间扩展到该驱动器(InnoDB甚至允许将每个表存储在单独的文件中
  2. (MyIsam) 将一些 *.MYD 和/或 *.MYI 文件移动到此驱动器

上述文件可以移动到不同的硬盘驱动器(它们可能需要从原始位置进行符号链接)。

然而,真正广泛可扩展的解决方案是数据库集群,例如MySQL 集群

您可能还想关注这个问题,其中这个问题目前正在真实环境中得到解决。


[编辑]详细说明:

以下信息仅在 Linux 服务器上有效。Windows下可能可以,但我不知道。无论如何,在大规模环境中,在 Windows 上运行 MySQL 数据库可能不是一个好主意。

这三个选项依赖于相同的原则:

  • 将另一个磁盘挂载到文件系统中
  • 将一些现有的MySQL数据文件移动到这个新的硬盘,即新的目录,和/或指示MySQL在这个新的目录中创建新的数据文件
  • 如果需要,创建一个指向新位置的符号链接,以欺骗 MySQL 认为文件尚未移动

1.扩展InnoDB表空间

InnoDB 引擎允许将表空间分布在多个文件中。要调整的配置选项(在my.cnf)是innodb_data_file_path。例子:

innodb_data_file_path=/mnt/hard_disk1/ibdata:50G;/mnt/hard_disk2/ibdata:200G;
Run Code Online (Sandbox Code Playgroud)

...指示 MySQL 创建/mnt/hard_disk1/ibdata1一个 50GB 文件以及一个 200GB 文件/mnt/hard_disk2/ibdata2

我个人不喜欢这个功能,因为MySQL根本不会使用第二个文件,直到第一个文件已满,这不允许进行微调。好的一面是您只需要编辑配置文件并重新启动服务器即可。就是这样。

2.将每个InnoDb表存储在单独的文件中

innodb_file_per_table顾名思义,该选项指示 MySQL 为每个表创建一个单独的文件。“新表”意味着更改设置后现有表不会受到影响。为了避免这种情况,可以转储、删除并重新创建要从共享表空间“提取”的表。

这些文件是[datadir]/[database]/[table].ibd,其中[datadir]是由选项定义的datadir[database]是数据库名称,[table]是表名称。这些文件可以像 MyISAM 表一样移动(参见下一个选项)。

3.移动MyISAM文件

对于每个MyISAM表,MySQL创建三个名为 的文件[datadir]/[database]/[table].[type],其中[datadir]是由选项定义的datadir[database]是数据库的名称,[table]是表名。

[type]将用于frm表描述(结构)、MYD用于数据、MYI用于索引。

现在,关于选项 2. 和 3.,您会注意到所有文件大致位于同一目录中,或者至少共享一个父目录。要将它们实际存储在新硬盘上,有两种选择。

1) 移动整个数据库:

  • 停止服务器
  • 将目录重命名database为您喜欢的另一个名称,例如backup
  • 将硬盘挂载为datadir/databse
  • 将内容backup移入datadir/databse
  • 重新启动服务器

MySQL 恢复正常,就像什么都没发生过一样。

2) 移动单个表:

  • 将新磁盘安装到您喜欢的任何位置
  • 停止服务器
  • 将每个文件单独移动到新硬盘驱动器
  • 在其原始位置创建一个符号链接,其名称与原始文件相同
  • 重新启动服务器

MySQL 在幸福的无知中恢复。