跳转至

MySQL 导入数据 ERROR 1227 错误


2026-01-16 by dongnan

问题描述

mysql 导入数据时,提示如下错误:

ERROR 1227 (42000) at line 9972 in file: '/root/demo.sql': Access denied; you need (at least one of) the SUPER privilege(s) for this operation

环境描述

MySQL 5.7.37

问题原因

导入视图(VIEW)时,如果 SQL 中的 DEFINER 用户与你当前导入用户不同,MySQL 需要 SUPER 权限才能继续,否则直接报错。

首先定位到 9972行

sed -n '9972p' demo.sql

/*!50001 CREATE ALGORITHM=UNDEFINED */

然后定位其 10行范围

sed -n '9970,9979p' demo.sql 

/*!50001 SET character_set_results     = utf8mb4 */;
/*!50001 SET collation_connection      = utf8mb4_general_ci */;
/*!50001 CREATE ALGORITHM=UNDEFINED */
/*!50013 DEFINER=`demo-user`@`%` SQL SECURITY DEFINER */
/*!50001 VIEW `view_cxgmqd` AS select `p`.`product_code` AS `product_code`,round((coalesce(`n`.`asset_nav_total`,0) / 10000),2) AS `asset_nav_total`,coalesce(`n`.`nav_date`,now()) AS `nav_date`,`p`.`product_name` AS `product_name` from (((select `demo-db`.`cd_product`.`product_code`

解决方法

把 .sql 文件中所有 DEFINER=... 删除:

sed -i 's/\/\*!50013 DEFINER=`demo-user`@`%` SQL SECURITY DEFINER \*\///g' demo.sql

或更干脆删掉所有 DEFINER:

sed -i 's/DEFINER=`[^`]*`@`[^`]*`//g' demo.sql

然后再导入即可成功。


其它

对比 sed、awk、head、tail 定位到目标行需要的时间:

文件信息

du -h demo.sql 
568M    demo.sql

wc -l demo.sql 
10096 demo.sql

sed 花费时间

time sed -n '9972p' /root/demo.sql
/*!50001 CREATE ALGORITHM=UNDEFINED */

real    0m0.607s
user    0m0.121s
sys 0m0.217s

head/tail 花费时间

time head -n 9972 /root/demo.sql | tail -n 1
/*!50001 CREATE ALGORITHM=UNDEFINED */

real    0m0.717s
user    0m0.331s
sys 0m0.833s

awk 花费时间

time awk 'NR==9972' /root/demo.sql
/*!50001 CREATE ALGORITHM=UNDEFINED */

real    0m0.173s
user    0m0.064s
sys 0m0.108s

小结

  • awk 最快,适合大文件。
  • sed 其次,
    • 单行:sed -n 'Np'
    • 范围:sed -n 'N,Mp'
  • head与tail 组合低后。

参考

  • ChatGPT
回到页面顶部