出于好奇,假设您有一个充满用户信息的巨大 MySQL 数据库,现在它已满。您将如何在同一台服务器和另一台具有更多存储空间的服务器上运行相同的 MySQL 数据库?
2 回答
如果问题只是存储空间的问题,那么最简单的解决方案是将数据库转移到另一个容量更大的系统。
另一种解决方案可能是将磁盘添加到同一系统,并且
- (InnoDB)将表空间扩展到该驱动器(InnoDB 甚至允许将每个表存储在单独的文件中)
- (MyIsam) 将一些 *.MYD 和/或 *.MYI 文件移动到此驱动器
上述文件可以移动到不同的硬盘驱动器(它们可能需要从其原始位置进行符号链接)。
但是,真正可广泛扩展的解决方案是数据库集群,例如MySQL 集群。
您可能还想关注这个问题,其中这个问题目前正在真实环境中得到解决。
[编辑] 详细说明:
以下信息仅在 Linux 服务器上有效。在Windows下可能是可能的,但我不知道。无论如何,在 Windows 上运行 MySQL 数据库在大规模环境中可能不是一个好主意。
这三个选项依赖于相同的原则:
- 将另一个磁盘挂载到文件系统中
- 将一些现有的 MySQL 数据文件移动到这个新硬盘,即到新目录,和/或指示 MySQL 在这个新目录中创建新的数据文件
- 如果需要,创建一个指向新位置的符号链接,以欺骗 MySQL 认为文件没有移动
1.扩展InnoDB表空间
InnoDB 引擎允许将表空间分布在许多文件中。调整 (in my.cnf
) 的配置选项是innodb_data_file_path
. 例子:
innodb_data_file_path=/mnt/hard_disk1/ibdata:50G;/mnt/hard_disk2/ibdata:200G;
... 指示 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)移动整个数据库:
MySQL 恢复,好像什么都没发生过一样。
2) 移动单个表格:
- 将新磁盘挂载到您喜欢的任何位置
- 停止服务器
- 将每个文件单独移动到新硬盘
- 在其原始位置创建一个符号链接,与原始文件同名
- 重启服务器
MySQL 在幸福的无知中恢复。
如我所见,最好的解决方案是将数据库移动到容量更大的新服务器并在那里恢复当前数据库。当前服务器缺乏磁盘空间和内存等关键资源,因此严重影响了数据库的性能。
- 在新服务器上安装mysql
- 从现有数据库中获取数据库表结构(就 CREATE TABLE xxx 而言)(这可以很容易地使用我的 sql 数据库管理工具,例如 SQLYog)
- 在新服务器中运行新创建数据库的这个 DDL 脚本
- 使用现有数据库创建 .dat 文件
- 将其复制到新服务器并针对新数据库运行该 .dat 文件
进一步阅读
迁移后,它需要为使用相同数据库的任何引用应用程序更改适用的数据源文件。