前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >运维实践|MySQL命令之perror

运维实践|MySQL命令之perror

作者头像
艾特
发布2024-02-28 08:25:06
1170
发布2024-02-28 08:25:06
今天在服务器上面出现了下面的错误,看了一眼,感觉很熟悉,我记得在我安装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命令。例如我这里:

代码语言:javascript
复制
$ 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 。

代码语言:javascript
复制
$ 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,后续跟着无权限。我们也可以使用命令来查询下这个错误码。

代码语言:javascript
复制
$ 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参数即可(也是需要重启生效)。

代码语言:javascript
复制
mysql> show variables like '%dir%';

复现问题

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

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

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

穷举错误码信息

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

代码语言:javascript
复制
$ 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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用背景
  • perror位置
  • 帮助命令
  • 使用实践
    • 使用格式
      • 回到问题
        • 解决问题
          • 复现问题
          • 穷举错误码信息
          • 总结
          相关产品与服务
          云数据库 MySQL
          腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档