MySQL Server:如何将部分数据库迁移至其他存储位置?
解决MySQL迁移特定数据库目录至新磁盘的问题
你遇到的这个InnoDB错误很典型,主要是因为InnoDB对数据路径的权限和安全性有严格要求,直接用软链接很容易触发它的路径解析或权限校验问题。下面给你两种靠谱的解决方法,都是官方支持或经过验证的方案:
一、先做好前置准备
不管用哪种方法,先完成这几步基础操作:
- 停止MySQL服务,确保数据不会在操作过程中被修改:
sudo systemctl stop mysql # 如果是老系统,用 sudo service mysql stop - 创建新磁盘的目标目录,并赋予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 - 完整复制原数据库目录到新位置,一定要保留文件权限和属性:
sudo rsync -av /var/lib/mysql/your_db_name /new_disk/mysql_data/ # 用rsync比cp更稳妥,也可以用 cp -a 代替 - 复制完成后,删除原数据目录里的数据库文件夹:
sudo rm -rf /var/lib/mysql/your_db_name
二、推荐方法:使用官方ALTER DATABASE指定数据目录
这是MySQL 5.7及以上版本官方支持的方案,不需要软链接,完全规避符号链接带来的问题:
- 启动MySQL服务:
sudo systemctl start mysql - 登录MySQL控制台(输入你的root密码):
mysql -u root -p - 执行修改数据库路径的SQL命令:
ALTER DATABASE your_db_name DATA DIRECTORY = '/new_disk/mysql_data/your_db_name'; - 最后重启MySQL服务,让配置生效:
sudo systemctl restart mysql
三、备选方法:开启符号链接支持(适合MyISAM或旧版本MySQL)
如果你的数据库是MyISAM引擎,或者使用的是MySQL 5.7之前的版本,可以通过开启符号链接来解决,但要注意安全风险:
- 编辑MySQL的配置文件(常见路径是
/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/my.cnf),在[mysqld]段添加:symbolic-links=ON - 在原数据目录创建指向新位置的软链接,并修正软链接的权限:
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 - 启动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




