MySQL启动异常:【checksum mismatch in data file】 |
起因
起因本机安装了两不同版本的数据库 , 然后把新装的数据库又给删了,再次尝试启动老数据库时报 1067 异常。
解决
先查看下日志,看下是啥具体原因导致MySQL启动异常。
win10系统可以在 计算机管理 -> 系统工具 -> Windows日志 -> 应用程序 中查看错误日志情况
也可以在 MySQL的数据存储文件中 [data] 里找到日志文件,里面有更详细的记录。
日志记录:
[Note] Plugin 'FEDERATED' is disabled.
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use Windows interlocked functions
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Initializing buffer pool, size = 22.0M
InnoDB: Completed initialization of buffer pool
InnoDB: Error: checksum mismatch in data file D:\APP\MySQLData\ibdata1
InnoDB: Could not open or create data files.
InnoDB: If you tried to add new data files, and it failed here,
InnoDB: you should now edit innodb_data_file_path in my.cnf back
InnoDB: to what it was, and remove the new ibdata files InnoDB created
InnoDB: in this failed attempt. InnoDB only wrote those files full of
InnoDB: zeros, but did not yet use them in any way. But be careful: do not
InnoDB: remove old data files which contain your precious data!
[ERROR] Plugin 'InnoDB' init function returned error.
[ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
[ERROR] Unknown/unsupported storage engine: INNODB
[ERROR] Aborting
翻译后:
[注]插件'FEDERATED'被禁用。
InnoDB:关闭InnoDB内存堆
InnoDB:互斥锁和rw_locks使用Windows联锁函数
InnoDB:压缩表使用zlib 1.2.3
InnoDB:正在初始化缓冲池,size = 22.0M
InnoDB:完成缓冲池的初始化
InnoDB: Error: checksum mismatch in data file D:\APP\MySQLData\ibdata1
无法打开或创建数据文件。
InnoDB:如果你尝试添加新的数据文件,但是失败了,
InnoDB:你现在应该在my.cnf中编辑innodb_data_file_path
InnoDB:恢复原来的状态,并删除InnoDB创建的新的ibdata文件
InnoDB:尝试失败。InnoDB只写那些文件
InnoDB: 0,但还没有以任何方式使用它们。但是要小心,不要这样做
InnoDB:删除包含宝贵数据的旧数据文件!
[ERROR] Plugin 'InnoDB' init function返回错误
[ERROR] Plugin 'InnoDB'注册为存储引擎失败
[错误]未知/不支持的存储引擎:INNODB
(错误)流产
看了日志后,我尝试修改 my配置文件参数
default-storage-engine=INNODB 修改为 MyISAM
后重启服务。启动成功,但是因为之前的数据库全是 InnoDB存储引擎,所以数据库还在但表没了。
MyISAM引擎存储表信息用的文件有 .frm(存储表结构信息) .MYI(存储表索引信息).MYD(存储表数据信息) 这三种类型文件。而Innodb只有 .frm 。
这样也不是办法,原数据显示不出。下面继续 =>>
第一步:
数据库可能因为的之前的操作导致数据库表损坏,在你的 my配置文件中加上以下参数 :
[mysqld]
innodb_force_recovery = 6
此命令说明:
innodb_force_recovery参数说明:
innodb_force_recovery影响整个InnoDB存储引擎的恢复状况。默认为0,表示当需要恢复时执行所有的恢复操作(即校验数据页/purge undo/insert buffer merge/rolling back&forward),当不能进行有效的恢复操作时,mysql有可能无法启动,并记录错误日志;
innodb_force_recovery可以设置为1-6,大的数字包含前面所有数字的影响。当设置参数值大于0后,可以对表进行select,create,drop操作,但insert,update或者delete这类操作是不允许的。
1(SRV_FORCE_IGNORE_CORRUPT):忽略检查到的corrupt页。
2(SRV_FORCE_NO_BACKGROUND):阻止主线程的运行,如主线程需要执行full purge操作,会导致crash。
3(SRV_FORCE_NO_TRX_UNDO):不执行事务回滚操作。
4(SRV_FORCE_NO_IBUF_MERGE):不执行插入缓冲的合并操作。
5(SRV_FORCE_NO_UNDO_LOG_SCAN):不查看重做日志,InnoDB存储引擎会将未提交的事务视为已提交。
6(SRV_FORCE_NO_LOG_REDO):不执行前滚的操作
修改完后重启服务,这时发现可以启动,数据也恢复成功.但是不能插入数据。
第二步:
把你本地的数据库备份一遍,使用命令可以参考 备份数据库。
备份完后把老数据库删除,我使用的是MySQL8 ,安装程序里自带删除功能,所以下载后直接删除后安装。MySQL下载地址
安装好后配置下环境变量,然后在把备份文件导入即可。
在导入的过程中也遇到了问题::
新安装的8.0数据库DOS命令窗口可以正常登录,但是在Navcat视图工具中登录失败. 错误码是 2059
原因 :
mysql8 之前的版本中加密规则是mysql_native_password,而MySQL8.0.11版本启用了新特性,用户登录加密规则改为了caching_sha2_password,如果想使用caching_sha2_password新特性的话,那么就必须更新一下navct的驱动。否则用 navcat连接就会报2059错误,如果想继续使用以前的老特性,可以将 mysql用户登录的加密规则还原为 mysql_native_password
更改加密规则 =>
1.登录数据库后执行以下命令
select user,plugin from user where user=‘root’; #查看user数据库的加密规则
可以看到这时的加密规则为 caching_sha2_password
2.更改加密规则
ALTER USER ‘root’@‘localhost’ IDENTIFIED BY ‘password’ PASSWORD EXPIRE NEVER;
3.在刷新下权限
FLUSH PRIVILEGES;
这时在查看下是否更改成功,成功后即可登录数据库.