前述
这次是接到一个新需求,需要将原本磁盘的数据转移到新的磁盘上,原本是一个复制粘贴然后修改配置的小事,却足足折腾了一天,为此,特意将此情况记录下,以此来加深自己的印象,同时也为大家在解决此类问题时提供一个方案借鉴。
一、 正确转移流程
首先停止mysql服务,然后将数据库的data文件夹整体复制到其他位置下,修改my.ini中的datadir到新位置
二、安装新数据库应用后旧数据库的转移
和上面类似,将my.ini中的datadir修改到旧数据库的位置,然后启动,此时有概率会报错,查看配置的data目录下WIN-**.err错误文件排查错误,如果是提示redo相关错误,将#innodb_redo下的文件删除即可。
三、遇到的问题
1. 启动mysql服务失败,但无错误日志输出
检查my.ini文件配置有无报错,如果没有配置错误,可能是文件编码错误,文件修改后默认存储时UTF-8格式,需要另存为ANSI格式
2. The innodb_temporary data file ‘ibtmp1’ must be writable
这个问题看似权限问题,但是在我增加了data目录的权限后仍然报出该问题,我的解决措施是将MySQL服务登录类型网络服务更改为了本地系统,以此解决了此问题,但是为什么会导致这个问题产生还有待深入研究。
3. 使用innodb_force_recovery修复
如果始终无法启动,查看err日志报出的问题仍然解决不了的话,可以使用innodb_force_recovery配置尝试修复启动。
[mysqld]
innodb_force_recovery=N # N=1~6
关于innodb_force_recovery的介绍可以参考MySQL 8.0 Forcing InnoDB Recovery
四、在解决过程中的其他思路
这些思路是在解决这次转移数据库的过程中排查问题时采取的措施,因为MySQL数据库一直报出的错误日志是关于ibd文件错误或表空间错误等情况,错误判断成了是ibd文件损坏等情况,所以刚开始的解决方向一直放在了处理ibd文件上,才有了下面几个措施。
1. 通过ibd文件恢复数据
可以在data中看到每个数据库的文件夹,里面存放了ibd格式的文件,对应了数据库中的每张表,可以直接使用该表恢复数据表的数据,但前提是当前数据库存在相同数据结构的表
# 解除表空间占用,此步骤会删除当前表对应的ibd文件
alter table 表名 discard tablespace;
然后将需要恢复的ibd文件放进去,需要和数据表同名
# 关联新的数据表空间,如果表结构不一样,此处会报错
alter table 表名 import tablespace;
2. 通过ibd文件获取表结构
如果仅仅只有ibd文件没有表结构的话比较棘手,需要通过MySQL自带的ibd2sdi工具将ibd导出成结构文件json。
ibd2sdi --dump-file=***.json ***.ibd
导出后是一串json,放到json格式化工具中查看column相关数据。
五、最后的话
这次出现这个情况主要还是在于自己缺乏数据库运维相关经验,没有对数据库管理有一个系统的操作,导致了操作期间出现了不符合规范的情况出现了本次问题,以此记录,警醒自己。