出于好奇,假设您有一个巨大的 MySQL 数据库,其中充满了用户信息,并且它现在已满。如何在同一台服务器和另一台具有更多存储空间的服务器上运行相同的 MySQL 数据库?
如果问题只是存储空间的问题,那么最简单的解决方案是将数据库转移到另一个容量更大的系统。
另一种解决方案可能是向同一系统添加磁盘,并且
上述文件可以移动到不同的硬盘驱动器(它们可能需要从原始位置进行符号链接)。
然而,真正广泛可扩展的解决方案是数据库集群,例如MySQL 集群。
您可能还想关注这个问题,其中这个问题目前正在真实环境中得到解决。
[编辑]详细说明:
以下信息仅在 Linux 服务器上有效。Windows下可能可以,但我不知道。无论如何,在大规模环境中,在 Windows 上运行 MySQL 数据库可能不是一个好主意。
这三个选项依赖于相同的原则:
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根本不会使用第二个文件,直到第一个文件已满,这不允许进行微调。好的一面是您只需要编辑配置文件并重新启动服务器即可。就是这样。
innodb_file_per_table
顾名思义,该选项指示 MySQL 为每个新表创建一个单独的文件。“新表”意味着更改设置后现有表不会受到影响。为了避免这种情况,可以转储、删除并重新创建要从共享表空间“提取”的表。
这些文件是[datadir]/[database]/[table].ibd
,其中[datadir]
是由选项定义的datadir
,[database]
是数据库名称,[table]
是表名称。这些文件可以像 MyISAM 表一样移动(参见下一个选项)。
对于每个MyISAM表,MySQL创建三个名为 的文件[datadir]/[database]/[table].[type]
,其中[datadir]
是由选项定义的datadir
,[database]
是数据库的名称,[table]
是表名。
[type]
将用于frm
表描述(结构)、MYD
用于数据、MYI
用于索引。
现在,关于选项 2. 和 3.,您会注意到所有文件大致位于同一目录中,或者至少共享一个父目录。要将它们实际存储在新硬盘上,有两种选择。
1) 移动整个数据库:
MySQL 恢复正常,就像什么都没发生过一样。
2) 移动单个表:
MySQL 在幸福的无知中恢复。