You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Galera Cluster for MariaDB的wsrep_notify_cmd调用Shell脚本失败求助

问题描述

在AWS Ubuntu 20.04 LTS实例上测试MariaDB的Galera集群节点状态变更通知机制时,遇到以下异常:

  • 基于Galera示例简化的Shell脚本,手动在命令行执行时可正常写入内容到/home/ubuntu/Notification.txt;
  • 由Galera通知机制调用执行时,脚本提示无法创建文件,报错目录不存在;
  • 已验证:以MariaDB运行用户登录可操作目标文件,目标文件权限为-rw-rw-rw-;替换脚本解释器为#!/bin/bash后,命令行执行仍正常,但Galera调用时错误依旧;
  • 脚本可被执行,排除脚本自身权限问题。

脚本内容

#!/bin/sh -eu

echo "Node Status Change:" > /home/ubuntu/Notification.txt

while [ $# -gt 0 ]
do
   case $1 in
      --status)
         echo "  STATUS=$2" > /home/ubuntu/Notification.txt
         shift
         ;;
      --uuid)
         echo "  CLUSTER_UUID=$2" > /home/ubuntu/Notification.txt
         shift
         ;;
      --primary)
         echo "  PRIMARY=$2" > /home/ubuntu/Notification.txt
         shift
         ;;
      --index)
         echo "  INDEX=$2" > /home/ubuntu/Notification.txt
         shift
         ;;
      --members)
         echo "  MEMBERS=$2" > /home/ubuntu/Notification.txt
         shift
         ;;
         esac
         shift
   done

exit 0

Galera调用时的报错信息

原解释器(#!/bin/sh -eu)报错:

/etc/mysql/scripts/wsrep_notify.sh: 3: cannot create /home/ubuntu/Notification.txt: Directory nonexistent

替换为#!/bin/bash后报错:

/etc/mysql/scripts/wsrep_notify.sh: line 3: /home/ubuntu/Notification.txt: No such file or directory
/etc/mysql/scripts/wsrep_notify.sh: line 9: /home/ubuntu/Notification.txt: No such file or directory
/etc/mysql/scripts/wsrep_notify.sh: line 13: /home/ubuntu/Notification.txt: No such file or directory
/etc/mysql/scripts/wsrep_notify.sh: line 17: /home/ubuntu/Notification.txt: No such file or directory
/etc/mysql/scripts/wsrep_notify.sh: line 21: /home/ubuntu/Notification.txt: No such file or directory
/etc/mysql/scripts/wsrep_notify.sh: line 25: /home/ubuntu/Notification.txt: No such file or directory

排查思路

  • 检查MariaDB的chroot环境:部分系统中MariaDB会运行在chroot jail内,此时/home/ubuntu在chroot环境中不存在。查看MariaDB配置文件(如/etc/mysql/my.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf)中的chroot配置项,若启用则需将目标文件改为chroot内的路径,或评估后关闭chroot。
  • 对比环境变量差异:手动登录MariaDB用户和Galera调用脚本时的环境可能不同,尤其是路径相关变量。在脚本开头添加env > /tmp/mariadb_env.txt(确保/tmp可写),对比两种执行场景的环境变量,重点检查HOME等路径参数。
  • 检查父目录权限:目标文件权限为-rw-rw-rw-,但父目录/home/ubuntu的权限是否允许MariaDB用户(通常为mysql)访问?执行ls -ld /home/ubuntu确认,需保证该用户有x(执行)权限进入目录,以及w(写入)权限操作文件。
  • 临时替换测试路径:将目标文件改为/tmp/Notification.txt测试,若Galera调用时能正常写入,说明原路径存在权限或环境问题,再针对性处理/home/ubuntu路径的问题。
  • 添加脚本调试信息:在脚本开头加入pwd > /tmp/script_pwd.txt和whoami > /tmp/script_user.txt,查看Galera调用时的工作目录和执行用户,确认是否与手动执行时一致。
  • 检查AppArmor限制:Ubuntu默认启用AppArmor,可能限制MariaDB访问/home/ubuntu目录。执行aa-status查看状态,检查MariaDB的profile(通常在/etc/apparmor.d/usr.sbin.mysqld)是否允许访问该目录,若未授权则添加规则并重新加载AppArmor。

内容的提问来源于stack exchange,提问作者Dan Parker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 20:42:09