当前位置: 首页 > news >正文

/usr/bin/mysqldump: Permission denied问题分析

今天碰到SpringBoot调用mysqldump数据库备份报Permission denied,第一眼看到感觉很简单,添加权限就行,mysqldump和备份目录都加载权限,还是问题依旧。

  1. 认为是mysql版本问题,因为另一台机器可以。
  2. 手动执行备份是正常的,只有报个Warning,说密码不能放到命令中。
  3. 备份目录权限问题。

但最终发现都不是

这里直接strace看结果,主要是找到这个方法:

sudo strace -f -e trace=execve /home/app/jdk-17.0.9/bin/java TestPermission  

结果:发现是/home/app/jdk-17.0.9/lib/jspawnhelper没有权限

execve("/home/app/jdk-17.0.9/bin/java", ["/home/app/jdk-17.0.9/bin/j"..., "TestPermission"], 0x7ffcda3fd620 /* 13 vars */) = 0
strace: Process 26967 attached
[pid 26967] --- SIGSEGV {si_signo=SIGSEGV, si_code=SEGV_MAPERR, si_addr=NULL} ---
strace: Process 26968 attached
...
[pid 26985] execve("/home/app/jdk-17.0.9/lib/jspawnhelper", ["10:13"], 0x7fff76f01b30 /* 13 vars */) = -1 EACCES (Permission denied)
[pid 26985] +++ exited with 127 +++
[pid 26966] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=26985, si_uid=0, si_status=127, si_utime=0, si_stime=0} ---
Exception in thread "main" java.io.IOException: Cannot run program "/usr/bin/mysqldump": error=13, Permission denied
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1143)
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1073)
        at TestPermission.main(TestPermission.java:8)
Caused by: java.io.IOException: error=13, Permission denied
        at java.base/java.lang.ProcessImpl.forkAndExec(Native Method)
        at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:314)
        at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:244)
        at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1110)
        ... 2 more
[pid 26983] +++ exited with 0 +++
...

TestPermission 代码:

public class TestPermission {
    public static void main(String[] args) throws Exception {
        ProcessBuilder pb = new ProcessBuilder("/usr/bin/mysqldump", "--version");
        pb.redirectErrorStream(true);
        Process p = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }
        p.waitFor();
    }
}

相关文章:

  • Redis原理:setnx
  • 基于Springboot的网上订餐系统 【源码】+【PPT】+【开题报告】+【论文】
  • 深入剖析C++中的哈希表:从STL到底层实现
  • 2000-2019年各省地方财政罚没收入数据
  • 测试环境项目启动redis报错
  • 智能任务分配:Python高并发架构设计
  • 调速电机怎么测量好坏
  • 无人船信号探测与对接技术解析!
  • 【Linux】应用层协议 HTTP
  • 【MySQL】验证账户权限
  • Mysql-基础和DDL
  • DeepSeek 为何能在短时间内超过 ChatGPT?—— 技术变革与成本重构的双重胜利
  • Spring AI Alibaba EmbeddingModel使用
  • 堆的常见应用2
  • MySQL中的内连接与外连接详解:基础与进阶应用
  • 函数:链式访问
  • 【操作系统】(五)操作系统引导(Boot)
  • Leetcode13-罗马数字转整数
  • Django框架指南:从入门到进阶
  • 【蓝桥杯】3月27日笔记
  • 学3dmax做效果图的网站/蔡甸seo排名公司
  • 做游戏视频去哪个网站好/我要安装百度
  • 亚马逊网站入口/大连中小企业网络营销
  • 怎样创建网站网站/长沙网站开发
  • 中石化网站是哪个公司做的/百度广告屏蔽
  • 网站建设的工作描述/广州网站设计公司