小工具知识网

当前位置: 首页 > 行业知识 > MYSQL 设置不同数据库在不同的磁盘目录上

行业知识

MYSQL 设置不同数据库在不同的磁盘目录上

2026-11-01 19:39:57 来源:互联网转载

MYSQL 设置不同数据库在不同的磁盘目录上

  • 需求出发点
  • 可查阅资料
  • 采用方案
  • ���结

    需求出发点

    在本地 win10 电脑上,已安装一个 mysql 服务,且已在使用中,现有数据库 database1、database2、database3,一般来说在配置文件中只设置有一个 datadir 参数,所有数据库均存放在这个目录下,假设 datadir = D:\data,现在需要将 database3 移动到 E:\data 存放,且在连接到 mysql 服务时,依旧可以同时访问到 database1、database2、database3

    可查阅资料

    截至发文时间,网上能查到的类似需求文章,亦或是询问 GPT 工具,大致可汇总一以下几种解决方案:

    1、在配置文件中设置两个 datadir,大致如下图。

    失败:重启后实际上只能识别到最下面的参数,即db2的路径,且db2文件夹中需要复制db1同款参数文件才能启动成功(ibdata等文件)。没有达到预期效果,本质上就是换了个数据目录。

    2、在配置文件中设置两个并行的 datadir ,大致如下图。

    失败:服务启动后自动停止。怀疑这种语法的有效性。

    3、查阅到 mysql 有表分区技术,但这个技术是将一个表按某规则拆分为不同部分,按逻辑关系存储在不同目录上,但我需要的是整个数据表存在另一个地方,与需求略有不符。参考链接:

    MySql分表、分库、分片和分区知识

    Mysql数据库表分区跨磁盘存储 表分区放到不同的磁盘 表分区存储到指定磁盘路径


    采用方案

    最后查到这么一篇帖子:mysql-data-on-multiple-drives,符合我的需求,帖子中给出的主要观点是:

    1、早期版本的mysql中(myisam版本),可以使用 symbolic link 链接到另外一个磁盘的数据,但是这么做在某些场景下存在弊端

    2、使用 create table 语句利用参数 data directory指定表建立在哪个磁盘上,具体可以参考官方文档:官方说明文档

    大致操作步骤如下:

    (1)停掉 mysql 服务

    (2)配置文件中设置 innodb_file_per_table 参数为1

    (3)配置文件中设置 innodb_directories='F:/new_data',即 datadir 是主数据目录,这个是新的一个数据目录,并手动在对应路径下创建好这个空的目录

    原文:

    If the directory you want to use is unknown, add it to the innodb_directories setting before you create the table. The innodb_directories variable is read-only. Configuring it requires restarting the server.

    (4)启动 mysql 服务

    顺利的话可以成功启动。随便进入一个数据库下,执行以下测试语句

    CREATE TABLE t1 (c1 INT PRIMARY KEY) DATA DIRECTORY = 'F:/new_data';

    如果成功,则可以在新文件夹 F:/new_data 下看到新建的 t.idb,并且在例如 navicat 的客户端中可以看到原本的表文件和新建的 t 表

    接下来就是怎么转移现有数据表到新目录下。直观上,似乎可以:

    CREATE TABLE t1 AS select * from old_table DATA DIRECTORY = 'F:/new_data';

    但是实测是不行的,会报语法错误,那如果把 create table 换成 alter table 呢,根据官方文件描述,DATA DIRECTORY 参数只在 create table 时有用,在 alter table 中虽然有这个参数但是会被忽略掉,原文:

    The DATA DIRECTORY clause, which is supported with CREATE TABLE ... TABLESPACE, is not supported with ALTER TABLE ... TABLESPACE, and is ignored if specified. 原文链接(页面中搜索 data directory)

    所以只能稍微麻烦一下,先创建表结构,再将原表数据插入到新表中,大致就是:

    (1)create table new_table () DATA DIRECTORY = 'F:/new_data';

    (2)insert into new_table () select from old_table;

    (3)等待完成

    至此就可以完成需要的新表创建,如果需要整个库里面的表都转移,似乎需要每个表都这么操作一遍?但我个人而言只需要把最频繁IO的表移过去即可,所以还算是基本解决了我的需求。

    操作完成后发现的一些细节:

    1、同样的表,打开后确定数据一致,表中数据量也一致,但是新旧目录下的 .ibd 文件的大小不一样

    2、虽然可以在连接到服务时同时访问到两个目录下的数据,但在 show table status; 的查询下,新目录的文件读取不到准确信息。如下图 0_trade_info 是旧表, t 是转移后的新表,t 表的行数、数据长度等均不准确

    总结

    目前虽然找到方法解决了需求,但是操作上还是存在繁琐之处,且未知在长期的使用上是否会在某些细节处存在缺陷。在查阅相关方法的过程中,我始终感觉 mysql 是可以更轻松的完成多磁盘分区存储的,但又奈何没有找到具体可行的操作方法。是否在 mysql 服务初始化的时候有更方便的办法也未可知,因为我无法舍弃现有数据重新初始化 mysql,所以未做尝试。如果确实有更简单易懂的方法,欢迎交流!

上一篇:android开源投屏工具scrcpy简介

下一篇:宏观销售环境分析怎么?