前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[MYSQL] mysql导入数据报错ERROR 1030处理

[MYSQL] mysql导入数据报错ERROR 1030处理

原创
作者头像
大大刺猬
发布2025-01-09 16:52:01
发布2025-01-09 16:52:01
1110
举报
文章被收录于专栏:大大刺猬大大刺猬

导读

mysql 5.7导入数据的时候报错如下:

代码语言:txt
复制
13:45:44 [root@ddcw21 ~]#mysql -h127.0.0.1 -P3308 -p123456 < t20250109.sql
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1030 (HY000) at line 63: Got error 168 from storage engine

该报错是存储引擎相关的, 凭经验基本上就能判断是系统表myisam导入失败了. 我们查看日志验证下.

代码语言:txt
复制
2025-01-09T05:43:29.770130Z 0 [Note] /soft/mysql_3308/mysqlbase/mysql/bin/mysqld: ready for connections.
Version: '5.7.38-log'  socket: '/tmp/mysql.sock'  port: 3308  MySQL Community Server (GPL)
2025-01-09T05:54:27.013107Z 48 [ERROR] InnoDB: Trying to create a MySQL system table `mysql`.`db` of type InnoDB. MySQL system tables must be of the MyISAM type!

从报错看是mysql.db表创建失败.

分析

我们知道mysqldump导出的数据, 通常是

代码语言:sql
复制
create database `dbname`;
use 'dbname';
drop table if exists xx;
create table xx;

也就是drop了db后, create的时候失败了. 而mysql下面的表是myisam存储引擎, 大概率是禁用了myisam存储引擎.

查看配置文件确认确实是禁用了mysiam存储引擎:

处理方法

我们可以把该参数先注释掉, 等导入数据成功后, 再启用该参数. 修改该参数需要重启数据库, 重启肯定起不来, 毕竟mysql.db都没了. 报错如下:

代码语言:txt
复制
2025-01-09T07:24:47.765277Z 0 [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.db' doesn't exist
2025-01-09T07:24:47.765321Z 0 [ERROR] Fatal error: Failed to initialize ACL/grant/time zones structures or failed to remove temporary table files.
2025-01-09T07:24:47.765354Z 0 [ERROR] Aborting
2025-01-09T07:24:47.765369Z 0 [Note] Binlog end

我们从其它地方拷贝db.frm,db.MYD,db.MYI 到现有环境即可. 不用担心里面的内容, 毕竟我们只是要启动数据库, 启动之后还会执行导入数据操作, 把它覆盖掉即可.

代码语言:shell
复制
vim /data/mysql_3308/conf/mysql_3308.cnf
cp -ra /tmp/db.* /data/mysql_3308/mysqldata/mysql
chown mysql:mysql /data/mysql_3308/mysqldata/mysql/db.*
chmod 640 /data/mysql_3308/mysqldata/mysql/db.*
systemctl restart mysqld_3308

数据库启动之后,即可导入数据, 数据导入完成后, 建议把参数修改回去.

额外问题

我们查看导出的.sql文件的时候发现mysql.db前面还有张mysql.columns_priv表, 不是应该先报错mysql.columns_priv么,

我们导入报错的时候, 登录数据库查看发现columns_priv变成了innodb...

在我们注释掉disabled_storage_engines后重新导入数据, columns_priv的存储引擎又是正常的myisam了....

mysql.db 是啥

上面的问题就留给有兴趣的同学去研究了.

最后我们再来看看 mysql.db是个啥玩意? 虽然名字叫db, 但实际上并不是记录的库名信息(虽然也有丢丢), 而是记录的权限信息. 严格来讲是记录的库级别的权限信息, 即使用grant x on dbname.* to user@host之后就会在mysql.db里面记录一行.(主键是host,db,user. 也就是每行是记录用户对某库的权限.). 对于*.*对象是记录在mysql.user表里面. 具体的权限可以查看:

https://dev.mysql.com/doc/refman/5.7/en/grant-tables.html

总结

本次的报错比较简单, 而且提示也比较明显. 认真查看报错提示, 基本上都能猜到原因(当然还是得靠点经验).

来个测试吧, 如下这个几个报错分别是什么原因? 怎么处理. (同一个报错,原因可能不同,解决方案也不同.所以本地没有答案, 主要是分析问题.)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 导读
  • 分析
  • 处理方法
  • 额外问题
  • mysql.db 是啥
  • 总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档