迁移旧版MySQL数据到Docker容器,关键步骤包括定位原数据目录、停库、校验权限与版本兼容性,再用绝对路径挂载到容器内。镜像版本不可低于旧版,文件属主需匹配,否则容器启动失败。常见问题由权限、锁文件或SELinux导致。
### 确认旧MySQL数据目录位置
定位宿主机上的MySQL数据目录是迁移的第一步,路径错误会导致后续操作全部偏离。可通过执行`mysql --help | grep "datadir"`或查看`/etc/my.cnf`中的`datadir`配置项获取路径。最常见的路径为`/var/lib/mysql`,但生产环境中常自定义为`/data/mysql`或`/opt/mysql/data`。为保险起见,建议使用`mysqld --verbose --help | grep "datadir"`再次确认。
### 停库与权限及一致性校验
迁移前务必先停止原MySQL服务:`systemctl stop mysqld`(或`service mysql stop`)。停止后检查以下三项:
- 原`datadir`下所有文件的属主是否为`mysql:mysql`(Docker内MySQL进程默认以`mysql`用户运行)。若不是,需在宿主机上执行`chown -R mysql:mysql /path/to/old/datadir`。
- 确认原MySQL版本(`mysqld --version`),新Docker镜像版本不能低于旧版。例如,旧版为5.7,则不应直接使用8.0镜像挂载,否则`ibdata1`格式不兼容,容器会启动失败。
- 检查`my.cnf`中`lower_case_table_names`的值,确保容器内外一致,否则表名识别可能出现问题。
### 启动容器时正确挂载数据目录
不建议使用`docker commit`或`mysqldump`导入(属于逻辑迁移),本文采用物理目录映射方式。关键命令如下:
```
docker run -d \
--name mysql-migrated \
-p 3306:3306 \
-v /path/on/host:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=yourpass \
-e TZ=Asia/Shanghai \
mysql:5.7
```
需注意三点:
- `/path/on/host`必须是宿主机上原`datadir`的**绝对路径**,且目录下应包含`ibdata1`、`ib_logfile*`、`mysql`、`performance_schema`等原始文件及文件夹。
- 务必指定与原环境一致的镜像标签(如`mysql:5.7`),避免版本越级。
- 若原MySQL启用了SSL或自定义socket路径,需同步挂载`/etc/mysql/conf.d/`或`/var/run/mysqld`等配套目录,否则容器可能报错退出。
### 启动失败时常见卡点
容器反复重启,或`docker logs mysql-migrated`显示`Can't start server : Bind on unix socket`、`InnoDB: Unable to lock ./ibdata1`,通常由以下原因导致:
- **ibdata1被锁**:原MySQL进程未完全停止。确认`systemctl is-active mysqld`返回`inactive`,再用`lsof /path/to/old/datadir/ibdata1`检查并清除占用。
- **权限不对**:进入容器执行`docker exec -it mysql-migrated ls -l /var/lib/mysql`,查看文件属主是否为`999:999`(MySQL 5.7官方镜像默认uid/gid)。若宿主机原目录属主为`27:27`,需提前执行`chown -R 999:999 /path/on/host`。
- **SELinux拦截**:在CentOS/RHEL上可临时关闭`setenforce 0`,或设置上下文`chcon -Rt svirt_sandbox_file_t /path/on/host`。
物理目录迁移的本质是复用InnoDB存储引擎的原始文件,任何元数据不匹配都会导致启动失败。它不像SQL导入那样容忍错误,必须严格对齐版本、权限、配置这三个关键要素。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述