【问题标题】:MySQL | The user specified as a definer ('test'@'%') does not existMySQL |指定为定义者的用户 ('test'@'%') 不存在
【发布时间】:2021-07-28 12:03:44
【问题描述】:

在我的phpmyadmin 中,我有一个名为“testDB”的数据库,我正在尝试使用命令行导出数据库,但每次我尝试运行此命令时都会收到mysql 错误 1449:

mysqldump -u root -p testDB > data-dump.sql

错误是这样的: “使用 LOCK TABLES 时,指定为定义者 ('myuser'@'%') 的用户不存在”

我分析了sql文件,发现这个用户名只出现在文件底部一次:

"/* 50013 DEFINER='myuser'@'%' sql security definer */"

没有导出数据库,也没有创建新用户,因为我不能,我该如何解决这个问题?

是否可以用我的数据库的特定 SQL 命令替换此值?

我的服务器的详细信息:

-Apache/2.4.29

-MariaDB 10.4.18

-PHP 7.4.18

【问题讨论】:

    标签: php mysql database mariadb


    【解决方案1】:

    用户名仅在底部出现一次,因为mysqldump 在完成数据导出之前已退出。我能想到两种可能的解决方案:

    1. 如果您有可用的表、例程和触发器创建文件,您可以导出数据:
      mysqldump -u [user] -p --no-create-info testDB > data-dump.sql
      
    2. 如果“没有人在看”,那么您可以临时创建一个'myuser'@'%' 帐户,授予适当的权限,执行转储,然后删除用户。您正在使用root 执行数据导出,因此您拥有城堡的钥匙:
      mysql > CREATE USER IF NOT EXISTS 'myuser'@'%' IDENTIFIED WITH mysql_native_password BY 'superSecretPassword!123';
      mysql > GRANT USAGE ON `testDB`.* TO 'myuser'@'%';
      mysql > FLUSH PRIVILEGES;
      mysql > exit;
      
      然后转储数据:
      $ mysqldump -u root -p testDB > data-dump.sql
      
      然后删除用户帐户(如有必要):
      mysql > DROP USER 'myuser'@'%';
      mysql > FLUSH PRIVILEGES;
      mysql > exit;
      
      如果您希望从 SQL 导出中删除 DEFINER 行,您可以在 mysqldump 使用 sed 完成后执行此操作:
      sed -i 's/DEFINER=[^*]*\*/\*/g' data-dump.sql
      
    3. 如果您想以“DBA 方式”执行此操作,请修改数据库中所有对象的DEFINER。 DBA Stack 站点上的This answer 可以帮助您开始了解如何实现这一目标。完成后,您应该不会再看到该错误。

    【讨论】:

      猜你喜欢
      • 2013-12-09
      • 2022-01-14
      • 2012-04-27
      • 2016-07-13
      • 2019-01-04
      • 2020-09-25
      • 2017-02-16
      • 2019-11-07
      相关资源
      最近更新 更多