运维实践|MySQL命令之perror

本文介绍了MySQL中perror命令的使用背景、位置查找、帮助命令以及在实际问题中的应用。作者通过实例展示了如何通过perror解析错误码13(Permissiondenied),并提供了解决权限问题的方法,包括检查和修改tmpdir设置。
摘要由CSDN通过智能技术生成

在这里插入图片描述

📫 作者简介:「六月暴雪飞梨花」,专注于研究Java,就职于科技型公司后端工程师
🏆 近期荣誉:华为云云享专家、阿里云专家博主、腾讯云优秀创作者
🔥 三连支持:欢迎 ❤️关注、👍点赞、👉收藏三连,支持一下博主~

今天在服务器上面出现了下面的错误,看了一眼,感觉很熟悉,我记得在我安装MySQL时也出现过这个问题。

Can’t create/write to file ‘/tmp/MYIo9T2Q’ (OS errno 13 - Permission
denied); nested exception is java.sql.SQLException: Can’t create/write
to file ‘/tmp/MYIo9T2Q’ (OS errno 13 - Permission denied)

解决问题固然重要,但是好奇心驱使我又看向了 系统错误编码 13(OS errno 13),很熟悉的一个编码。当时很快就想到了mysql的perror命令。所以,现在回顾下,也想来说说这个命令。

使用背景

在mysql 的使用过程中,可能会出现各种各样的错误信息。这些error有些是由于操作系统引起的,比如文件或者目录不存在等等,使用perror的作用就是解释这些错误代码的详细含义。从官网我们其实也可以查询到一些蛛丝马迹来帮助我们快速了解perror命令。官网介绍如下:
Perror显示MySQL或操作系统误差代码的错误消息
官网地址:https://dev.mysql.com/doc/refman/8.0/en/perror.html

perror位置

如何找到perror小工具的位置,一般情况下,我们会使用whereis perror或者which perror来定位。针对MySQL封装调用的工具,一般在MySQL_HOME/bin下就可以找到perror命令。例如我这里:

$ whereis perror
perror: /usr/local/bin/perror
$
$ cd /usr/local/bin/
$ ll perror
lrwxr-xr-x  1 501  wheel  33 12 17  2022 perror@ -> ../Cellar/mysql/8.0.31/bin/perror
$
$ cd ../Cellar/mysql/8.0.31/bin/
$
$ ll perror
-r-xr-xr-x  1 Aion  admin  7327264 12 17  2022 perror*

帮助命令

如果刚开始使用命令,建议使用–help命令查询具体的使用方法,下面是我在MacOS 13.2上执行的帮助命令。从下面的命令也可以看出来我当前安装的mysql版本为8.0.31 ,使用安装工具为 Homebrew 。

$ perror --help
perror  Ver 8.0.31 for macos13.0 on x86_64 (Homebrew)
Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Print a description for a system error code or a MySQL error code.
If you want to get the error for a negative error code, you should use
-- before the first error code to tell perror that there was no more options.

Usage: perror [OPTIONS] [ERRORCODE [ERRORCODE...]]
  -?, --help          Displays this help and exits.
  -I, --info          Synonym for --help.
  -s, --silent        Only print the error message.
  -v, --verbose       Print error code and message (default).
                      (Defaults to on; use --skip-verbose to disable.)
  -V, --version       Displays version information and exits.

Variables (--variable-name=value)
and boolean options {FALSE|TRUE}  Value (after reading options)
--------------------------------- ----------------------------------------
verbose                           TRUE
$ 

使用实践

使用格式

perror [options] errorcode…
perror [选项] [错误码]

对于使用格式,perror试图灵活理解其参数,例如,对于ER_WRONG_VALUE_FOR_VAR错误,perror理解这些参数中的任何一个:1231、001231、MY-1231或MY-001231,或ER_WRONG_VALUE_FOR_VAR。说到这里,其实这里好像是一个模糊的准确定位,你可以输入上述任何一种来展示错误的详细信息,以帮助理解当前机器或程序出现的问题。

回到问题

从上面我的错误码可以看出来,这里提示的是错误码 13,后续跟着无权限。我们也可以使用命令来查询下这个错误码。

$ perror 13
OS error code  13:  Permission denied
MySQL error code MY-000013: Can't get stat of '%s' (OS errno %d - %s)

这里有一个很有意思的事情,我在执行命令perror 13时,返回了两行信息。

  • 第一行:系统错误码:无权限
  • 第二行:MySQL 错误码 MY-000013:无法获取参数格式,系统错误。

从这里也可以看出来,结合前面的问题,可以确定的是,这里是系统错误,而非MySQL的错误码,这里需要留意一个问题:如果错误号在MySQL和操作系统错误重叠的范围内,perror会显示两条错误消息。

注意⚠️:使用perror是在单机上使用,如果是在集群中,请使用命令ndb_perror。

解决问题

针对开篇的问题Can't create/write to file '/tmp/MYIo9T2Q',其实也比较简单。查阅下MySQL中的所有文件目录,找到tmpdir的参数值,修改其权限即可。当然,你也可以指定到具体的参数来查看目录。修改完成后,记得重新启动下mysql。想要完全解决这个问题建议在mysql的配置文件中增加tmpdir参数即可(也是需要重启生效)。

mysql> show variables like '%dir%';

复现问题

在执行完命令之后,为了可靠的解决现在按照如下方式处理。

  • (1)创建临时目录并赋权
mkdir /data/mysql_tmp
cd /data/
chown mysql:mysql mysql_tmp -R
  • (2)修改配置文件
    在配置文件中增加临时目录的配置,永绝后患。使用vim打开文件后,输入下面的信息
# 临时文件目录
tmpdir=/data/mysql_tmp
  • (3)重启mysql
    至于你使用什么命令重启都可以,我这里是用的是systemctl。
# 重启mysql
systemctl restart msyqld

# 查看msyql状态
systemctl status msyqld
  • (4)验证目录是否被修改
    登录到mysql,然后执行参数验证。
mysql> show variables like '%tmpdir%';
+-----------------------------------------+------------------------------------------------------+
| Variable_name                           | Value                                                |
+-----------------------------------------+------------------------------------------------------+
| tmpdir                                  | /data/mysql_tmp                                      |
+-----------------------------------------+------------------------------------------------------+
19 rows in set (0.00 sec)

穷举错误码信息

为了以后更直观的学习,当然你也可以查询资料来获取所有的错误码以及详细信息,这里给出来一个学习方法,那就是循环遍历获取这些信息。我们约定大约有10000个错误码(当然这些都是尝试出来的)以及信息,执行命令如下:

$ for i in $(seq 1 10000); do perror $i; done > 10000.txt 2> /dev/null

稍等片刻,你可以泡上一杯咖啡,回来后就可以看这些命令隐藏在10000.txt文本中了。
在这里插入图片描述
在这里插入图片描述

总结

学以致用,出现问题,解决问题,引申问题,举一反三。在前面几章中讲到了常用的几个工具,mysqlimport、mysqlhotcopy、mysqlshow等等。最后熟练使用这些工具,将会带来很大便利。

[引用]
1、显示MySQL错误消息信息:https://dev.mysql.com/doc/refman/8.0/en/perror.html


欢迎关注博主 「六月暴雪飞梨花」 或加入【六月暴雪飞梨花社区】一起学习和分享Linux、C、C++、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

六月暴雪飞梨花

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值