mysql 5.7导入数据的时候报错如下:
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导入失败了. 我们查看日志验证下.
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导出的数据, 通常是
create database `dbname`;
use 'dbname';
drop table if exists xx;
create table xx;
也就是drop了db后, create的时候失败了. 而mysql下面的表是myisam存储引擎, 大概率是禁用了myisam存储引擎.
查看配置文件确认确实是禁用了mysiam存储引擎:
我们可以把该参数先注释掉, 等导入数据成功后, 再启用该参数. 修改该参数需要重启数据库, 重启肯定起不来, 毕竟mysql.db都没了. 报错如下:
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 到现有环境即可. 不用担心里面的内容, 毕竟我们只是要启动数据库, 启动之后还会执行导入数据操作, 把它覆盖掉即可.
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是个啥玩意? 虽然名字叫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 删除。