You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MySQL Server:如何将部分数据库迁移至其他存储位置?

解决MySQL迁移特定数据库目录至新磁盘的问题

你遇到的这个InnoDB错误很典型,主要是因为InnoDB对数据路径的权限和安全性有严格要求,直接用软链接很容易触发它的路径解析或权限校验问题。下面给你两种靠谱的解决方法,都是官方支持或经过验证的方案:

一、先做好前置准备

不管用哪种方法,先完成这几步基础操作:

  1. 停止MySQL服务,确保数据不会在操作过程中被修改:
    sudo systemctl stop mysql
    # 如果是老系统,用 sudo service mysql stop
    
  2. 创建新磁盘的目标目录,并赋予MySQL运行用户(通常是mysql)完整权限:
    sudo mkdir -p /new_disk/mysql_data
    sudo chown -R mysql:mysql /new_disk/mysql_data
    sudo chmod -R 700 /new_disk/mysql_data
    
  3. 完整复制原数据库目录到新位置,一定要保留文件权限和属性:
    sudo rsync -av /var/lib/mysql/your_db_name /new_disk/mysql_data/
    # 用rsync比cp更稳妥,也可以用 cp -a 代替
    
  4. 复制完成后,删除原数据目录里的数据库文件夹
    sudo rm -rf /var/lib/mysql/your_db_name
    

二、推荐方法:使用官方ALTER DATABASE指定数据目录

这是MySQL 5.7及以上版本官方支持的方案,不需要软链接,完全规避符号链接带来的问题:

  1. 启动MySQL服务:
    sudo systemctl start mysql
    
  2. 登录MySQL控制台(输入你的root密码):
    mysql -u root -p
    
  3. 执行修改数据库路径的SQL命令:
    ALTER DATABASE your_db_name 
    DATA DIRECTORY = '/new_disk/mysql_data/your_db_name';
    
  4. 最后重启MySQL服务,让配置生效:
    sudo systemctl restart mysql
    

三、备选方法:开启符号链接支持(适合MyISAM或旧版本MySQL)

如果你的数据库是MyISAM引擎,或者使用的是MySQL 5.7之前的版本,可以通过开启符号链接来解决,但要注意安全风险:

  1. 编辑MySQL的配置文件(常见路径是/etc/mysql/mysql.conf.d/mysqld.cnf/etc/my.cnf),在[mysqld]段添加:
    symbolic-links=ON
    
  2. 在原数据目录创建指向新位置的软链接,并修正软链接的权限:
    sudo ln -s /new_disk/mysql_data/your_db_name /var/lib/mysql/your_db_name
    sudo chown -h mysql:mysql /var/lib/mysql/your_db_name
    
  3. 启动MySQL服务:
    sudo systemctl start mysql
    

为什么你原来的方法会出错?

你看到的InnoDB: os_file_readdir_next_file() returned -1错误,通常是这几个原因:

  • MySQL默认禁用了符号链接(symbolic-links=OFF),InnoDB会拒绝解析软链接路径
  • 新磁盘目录的权限不对,mysql用户没有读写权限
  • InnoDB的安全机制会校验数据路径的真实性,跨磁盘的软链接可能被判定为不安全路径

注意事项

  • 操作前一定要备份数据库,避免意外:
    mysqldump -u root -p your_db_name > your_db_backup.sql
    
  • 如果是InnoDB数据库,确保开启了innodb_file_per_table(默认是开启的),否则无法单独迁移单个数据库的表空间

内容的提问来源于stack exchange,提问作者Denis Kulagin

火山引擎 最新活动