260807-MySQL配置数据分散存储到多个磁盘-通用表空间 (General Tablespace)

MySQL 支持将数据分散存储到多个磁盘。

不过,具体怎么做,主要取决于你用的是哪种存储引擎。

对于现在广泛使用的 InnoDB 引擎,主要推荐使用表空间(Tablespace)机制来实现;而逐渐被淘汰的 MyISAM
引擎,则可以通过符号链接(Symbolic Link)的方式。

我把两种主流且安全的方式整理成了一个表格,方便你对比参考:

方案 适用引擎 核心操作方法 优点与注意点
通用表空间 (General Tablespace) InnoDB (官方推荐) 1. 在目标磁盘上创建一个表空间,指定文件路径: CREATE TABLESPACE ts_name ADD DATAFILE '/新磁盘路径/file.ibd'; 2. 将已有表迁移到这个表空间: ALTER TABLE 表名 TABLESPACE ts_name; 优点:路径完全可控,支持多个表共享,更灵活;MySQL 5.7+ 开始支持,8.0+ 下在线操作无需停机,是官方最推荐的方式。
每表独立表空间 (File-Per-Table Tablespace) InnoDB 在创建表时,使用 DATA DIRECTORY 子句来指定外部存储路径: CREATE TABLE 表名 (...) DATA DIRECTORY = '/新磁盘路径/'; 优点:操作直接,每个表的数据文件和表结构是分开的。前提是 innodb_file_per_table 设置必须为 ON(这是 5.6 版本后的默认值)。
符号链接 (Symbolic Link) MyISAM (不推荐) 1. 关闭 MySQL 服务,将表的 .MYD.MYI 文件移动到新磁盘。 2. 在原数据目录创建指向新位置的软链接。 风险:已被官方视为一种“万不得已”的方法,主要问题是 MySQL 8.0+ 默认禁用了符号链接支持,且操作不当易导致表损坏。

补充方案:RAID 或操作系统层面的条带化

除了在数据库内部操作,你也可以从操作系统层面解决。通过配置 RAID(独立磁盘冗余阵列),特别是 RAID 0(条带化)或 RAID
10,可以将多个物理磁盘组合成一个逻辑卷,然后直接把 MySQL 的数据目录放在这个逻辑卷上。这样,MySQL 本身无需任何特殊配置,就能享受到多磁盘带来的
I/O 性能提升。

⚠️ 重要注意事项

  • 分区(Partitioning)的限制:虽然 MySQL 支持对 InnoDB 表进行分区,但分区的目的主要是为了管理海量数据或优化查询,并不是
    用来将数据分散到不同物理磁盘的功能。需要注意的是,它不能
    让你把索引放在一个盘,数据放在另一个盘。
  • 操作前务必备份:无论使用哪种方法,对数据存储位置进行修改前,都一定要做好完整备份,以防万一。
  • 权限问题:确保新磁盘的目录对运行 MySQL 服务的系统用户(通常是 mysql)拥有正确的读写权限,否则操作会失败。