file-type

解决MySQL用户不存在导致的错误问题

版权申诉

ZIP文件

5星 · 超过95%的资源 | 42KB | 更新于2025-01-20 | 32 浏览量 | 4 下载量 举报 收藏
download 限时特惠:#4.90
从提供的文件信息中,我们可以提取出关于解决MySQL中遇到的特定错误的详细知识点。错误信息是"The user specified as a definer ('mysql.infoschema'@'localhost') does not exist",这通常发生在导出或导入数据库对象时,尤其是触发器、视图和存储过程等。下面将详细介绍错误的含义、产生原因以及如何解决。 ### 知识点一:MySQL错误信息详解 当执行诸如`mysqldump`等导出操作时,MySQL数据库中的对象(如视图、存储过程和触发器)可能会引用特定的用户(definer),这在对象创建时被设置。错误信息表明,在尝试访问或操作这些对象时,指定的定义者用户不存在。错误中的`mysql.infoschema`代表`infoschema`数据库中的`mysql`用户,这是MySQL自带的系统用户,通常不应该被删除或修改。 ### 知识点二:错误产生的原因 1. **MySQL用户被误删除或权限修改**:如果系统中没有`mysql.infoschema`用户,或者该用户没有任何权限,那么访问任何引用该用户的数据库对象时,都可能遇到此错误。 2. **权限不一致**:在不同的MySQL实例或环境中,由于权限的不一致,也可能导致此错误。 3. **导出文件的兼容性问题**:在不同的MySQL版本或配置下,导出文件中的定义者信息可能不再适用,也会引发该错误。 ### 知识点三:解决方法 解决该错误通常有以下几种方法: 1. **创建或修复mysql.infoschema用户**: - 如果MySQL实例中不存在该用户,可以使用以下命令创建: ```sql CREATE USER 'mysql.infoschema'@'localhost' IDENTIFIED BY 'password'; GRANT SELECT ON mysql.infoschema TO 'mysql.infoschema'@'localhost'; FLUSH PRIVILEGES; ``` - 如果用户存在但权限不足,根据错误提示添加或修复权限。 2. **修改数据库对象中的定义者(Definer)信息**: - 通过修改MySQL数据库对象中的定义者信息,可以暂时解决该问题。这可以通过执行`mysqldump`命令并添加`--set-gtid-purged=OFF`参数来避免添加GTID相关设置,或者在命令行中添加`--skip-definer`参数来忽略定义者的设置: ```bash mysqldump -uroot -proot --skip-definer [database] > dumpfile.sql ``` - 注意:这种方法可能需要在导入导出文件时,手动指定定义者。 3. **使用mysqldump工具选项调整**: - 使用`--no-definer`选项,这样导出的SQL文件中不会包含定义者信息。当导入时,数据库将使用当前用户作为定义者。 ```bash mysqldump -uroot -proot --no-definer [database] > dumpfile.sql ``` ### 知识点四:预防措施 为了避免在将来遇到此类问题,应考虑以下预防措施: 1. **保留系统用户**:不要修改或删除系统自带的用户和权限,尤其是`mysql`数据库中的用户。 2. **规范数据库管理**:确保在数据库管理过程中遵循最佳实践,对用户和权限进行适当的管理。 3. **数据库备份与恢复策略**:在进行数据库备份和恢复时,注意检查备份文件中的定义者信息,并制定相应的导入策略。 ### 知识点五:参考资料的分析 通过分析文件列表中的文件名,可以知道提供了解决方案的来源: - `1.mysql -uroot -proot.txt` 可能是一个包含解决步骤的文本文件。 - `2.png` 和 `3.png` 可能是截图或者示意图,帮助更直观地理解问题和解决方案。 - `Mysql Error-The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist’ when trying to dump tablespaces – 小菜菜的博客.url` 和 `0.Mysql Error-The user specified as a definer (‘mysql.infoschema’@’localhost’) does not exist - u011394175的专栏 - CSDN博客.url` 指向了两篇可能详细介绍此问题解决过程的网络博客文章。 综上所述,理解了错误的含义、产生原因和解决方法之后,可以有效地处理MySQL数据库中的该类问题,并采取预防措施避免未来的错误。同时,通过研究相关资料,可以进一步加深对问题的理解,并获得其他可能的解决方案。

相关推荐

filetype
Mac OS X 10.15 下源码安装 mysql-8.0.20-macos10.15-x86_64 https://my.oschina.net/kinglyphp/blog/4281112 博客地址 下载mysql-8.0.20-macos10.15-x86_64.tar.gz 可以从mysql官网下载,如果比较慢, 从https://download.csdn.net/download/long4512524/12427861 中下载 解压 tar zxvf mysql-8.0.20-macos10.15-x86_64.tar.gz 移动解压后的二进制包到安装目录 sudo mv mysql-8.0.20-macos10.15-x86_64 /usr/local/mysql 在 /usr/local/mysql 目录新建 data目录文件 cd /usr/local/mysql sudo mkdir data 更改 mysql 安装目录所属用户与用户组 cd /usr/local sudo chown -R root:wheel mysql 在启动 mysql 之前,我们先需要指定my.cnf 文件 因为 mysql 5.7 版本开始 my-default.cnf 文件不会自带,需要手动创建。 cd /usr/local/mysql/support-files sudo vi my-default.cnf 在 /usr/local/mysql/support-files 目录下创建 my-default.cnf [mysqld] basedir = /usr/local/mysql datadir = /usr/local/mysql/data port = 3306 socket = /usr/local/mysql/data/mysql.sock log-error = /usr/local/mysql/data/mysqld.log [client] socket=/usr/local/mysql/data/mysql.sock 拷贝my-default.cnf到/etc/my.cnf sudo cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf 初始化 mysqld cd /usr/local/mysql sudo bin/mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 其中: basedir 是指你的mysql安装在哪儿了。 (具体需要换成你自己的路径) datadir 是指MySQL后续的数据存放在哪儿。(具体需要换成你自己的路径) 注意: 这儿执行完会生成mysql root账号的密码,后面在客户端连接时,5.7版本需要用到,自己别忘了记录下 类似这种: 其中 Wt#GeUu_q2oJ 就是root的密码。 [Note] A temporary password is generated for root@localhost: Wt#GeUu_q2oJ 启动MYSQL cd /usr/local/mysql sudo support-files/mysql.server start 如下: kingly@192 data % cd /usr/local/mysql kingly@192 mysql % sudo support-files/mysql.server start Starting MySQL . SUCCESS! 对应mysqld 启动起来接口 ps aux | grep mysqld 见到如下所示,证明mysql安装成功。 kingly@192 mysql % ps aux | grep mysqld kingly 40915 0.6 0.0 4285708 724 s000 S+ 5:47下午 0:00.00 grep --color=auto mysqld _mysql 40907 0.4 2.1 4907248 350300 s000 S 5:46下午 0:00.95 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/usr/local/mysql/data/mysqld.log --pid-file=/usr/local/mysql/data/192.168.0.103.pid --socket=/usr/local/mysql/data/mysql.sock --port=3306 使用 之前的记住的 Wt#GeUu_q2oJ的密码,测试mysql的链接情况 /usr/local/mysql/bin/mysql -uroot -P3306 -p kingly@192 bin % /usr/local/mysql/bin/mysql -uroot -P3306 -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 Server version: 8.0.20 Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> 修改root密码,并为 PASSWORD EXPIRE NEVER 永不过期 mysql> alter user 'root'@'localhost' identified by '12345678' PASSWORD EXPIRE NEVER; mysql> flush privileges; mysql> quit; 设置远程访问 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限。 如果出现 提示”Access denied for user ‘root’@’localhost’ (using password: YES)” mysql> use mysql; Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Database changed mysql> select user,host from user; +------------------+-----------+ | user | host | +------------------+-----------+ | epass | % | | epass | localhost | | mysql.infoschema | localhost | | mysql.session | localhost | | mysql.sys | localhost | | root | localhost | +------------------+-----------+ 6 rows in set (0.00 sec) mysql> 发现root只有本地权限, 那么, 我们需要给root 加上 127.0.0.1,% 还有指定服务器ip访问的权限, 注意: mysql版本8.0.13,在给新用户授权时,发生了变化 如果出现, 不能直接使用 grant all privileges on *.* to root@'%' identified by '12345678'; //给mysql用户分配远程访问权限 会出现, You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by "12345678"' at line 1 的错误,原因是新版本mysql版本把将创建账户和赋予权限分开了。 应该如下操作: mysql> use mysql; mysql> create user 'root'@'%' identified by 'password'; mysql> grant all privileges on *.* to 'root'@'%' with grant option; mysql> flush privileges; 如果使用 Navicat连接MySQL Server8.0版本时出现Client does not support authentication protocol requested by server; 解决办法: mysql> use mysql; mysql> alter user 'root'@'localhost' identified with mysql_native_password by '12345678'; mysql> flush privileges; 如上即可。 加入环境变量,编辑 /etc/profile,这样可以在任何地方用mysql命令了 sudo vi ~/.bash_profile 添加 export PATH=$PATH:/usr/local/mysql//bin 使~/.bash_profile环境变量生效 source ~/.bash_profile 这个就可以在 任何地方用 mysql 命令了。 mysql -uroot -p 启动、重启与停止,状态 启动 sudo /usr/local/mysql/support-files/mysql.server start 重启 sudo /usr/local/mysql/support-files/mysql.server restart 停止 sudo /usr/local/mysql/support-files/mysql.server stop 查看状态 sudo /usr/local/mysql/support-files/mysql.server status
lj_70596
  • 粉丝: 105
上传资源 快速赚钱