MySQL 数据目录迁移
本文将指导如何将 MySQL 数据目录(包含数据文件和数据日志)迁移到新的位置。此操作适用于需要更换存储路径、扩大存储容量或整理服务器文件结构的场景。
准备工作
在开始迁移前,需确保以下几点:
- 备份所有重要数据,包括数据文件和配置文件。
- 确保新路径存在且 MySQL 用户有读写权限。
- 确认 MySQL 服务已停止或使用在线DDL变更数据目录(需特定版本支持)。
详细操作步骤
步骤1:停止 MySQL 服务
在执行任何文件操作前,必须停止 MySQL 服务以避免数据损坏。
sudo systemctl stop mysql
# 或
service mysql stop
步骤2:创建新数据目录
在目标位置创建新的数据目录结构。
mkdir -p /new/data/mysql
chown -R mysql:mysql /new/data/mysql
chmod -R 700 /new/data/mysql
步骤3:修改配置文件
编辑 MySQL 配置文件 `my.cnf` 或 `my.ini`,修改 `datadir` 参数。
[mysqld]
datadir=/new/data/mysql
# 其他配置保持不变
步骤4:移动数据文件
将旧数据目录中的所有文件移动到新位置。注意保留 `ibdata1`(如果使用 InnoDB)和日志文件。
mv /old/data/mysql/* /new/data/mysql/
# 检查并修复文件权限
find /new/data/mysql -type d -exec chown mysql:mysql {} \;
find /new/data/mysql -type f -exec chmod 640 {} \;
步骤5:启动 MySQL 服务
启动 MySQL 服务并验证是否正常启动。
sudo systemctl start mysql
# 或
service mysql start
步骤6:验证数据目录
检查 MySQL 是否正确加载了新数据目录。
mysql -e "SHOW VARIABLES LIKE 'datadir';"
# 应输出 /new/data/mysql
注意事项
InnoDB 表空间迁移
如果使用 InnoDB 存储引擎,需要特别注意表空间文件(通常是 `.ibd` 文件)。
- 对于常规表空间:直接移动 `.ibd` 文件即可。
- 对于通用表空间:可能需要使用 `ALTER TABLE` 命令重新绑定表空间。
错误处理
如果遇到以下错误,可能需要:
- `Error in opening file`:检查文件路径和权限
- `Table ‘xxx’ cannot be opened`:尝试使用 `FLUSH TABLES WITH READ LOCK` 锁定表并重新启动
高级选项:在线迁移
对于生产环境,推荐使用在线迁移工具如 Percona XtraBackup 或 MySQL Workbench 的数据迁移向导。
# 示例:使用 Percona XtraBackup
xtrabackup --backup --target-dir=/backup
# 恢复到新目录
xtrabackup --copy-back --target-dir=/backup --datadir=/new/data/mysql