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
相关产品推荐
相关产品推荐

