这几天遇到一个数据迁移的需求,要把老服务器的数据迁移到新的服务器上去,因为Mysql是放在Docker里面的,所以只需要迁移配置文件和数据卷即可,但是这过程中并不是一帆风顺的,特此记录一下。
从旧的服务器上查看Mysql容器的信息。
首先使用docker ps来查看正在运行的容器,如果你的容器尚未运行,那么执行这条命令docker ps -a
使用docker inspect ContainName查看Mysql容器的信息

Mounts里面有数据卷的信息,它存放着这个容器的数据,所以我们前往这些路径,把文件发送到新的服务器即可。
发送文件可以用scp local_file remote_username@remote_ip:remote_folder进行发送,以下是示例:

将配置文件和数据迁移过来后,还需要迁移一个关键的文件,就是mysql安装目录data里的 ibdata1
ibdata用来储存文件的数据,而库名的文件夹里面的那些表文件只是结构而已,由于新版的mysql默认为innodb,所以ibdata1文件默认就存在了,少了这个文件有的数据表就会出错。
准备完毕后,我们在新的服务器把mysql拉取下来.

将旧服务器的文件放到对应的位置,然后执行以下指令进行映射端口,数据卷。
docker run -p 3306:3306 --name mysql -v $PWD/config:/etc/mysql/conf.d -v $PWD/logs:/logs -v /data/mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123 -d mysql:5.7
举例说明,-v /data/mysql-data:/var/lib/mysql的意思是,容器里的mysql目录的var/lib/mysql将使用宿主机的 /data/mysql-data ;-e则设定了数据库的连接密码;-d 表示该容器将在后台运行
执行了上面的操作后,我们还需要开启mysql的远程访问,让外部程序可以连接mysql进行操作。
- sudo docker exec -it mysql bash
- mysql -uroot -p123
- grant all privileges on . to root@'%' identified by "password";
CHECK TABLE失败如何处理
可能是因为Insert Buffer引起的
Insert Buffer是一颗B+树。它是全局唯一的(4.1版本后),负责对所有的表的辅助索引进行Insert Buffer。它存在共享表空间中,默认在ibdata1中。因此,试图通过独立表空间ibd文件恢复表中数据时,往往会导致CHECK TABLE失败。这是因为表的辅助索引中的数据可能还在Insert Buffer中,也就是共享表空间中,所以通过ibd文件进行恢复后,还需要进行REPAIR TABLE操作来重建表上所有的辅助索引。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?