MySQL多数据库分文件夹备份脚本报错求助
搞定MySQL多库分文件夹备份的问题
嘿,我帮你分析下你遇到的错误,然后给你一个能正常运行的脚本~
为啥会报错?
你看到的Errcode: 2 - No such file or directory,主要是这几个原因:
- 备份文件夹没提前建:
mysqldump不会自动帮你创建/backup/$dbname/这种子目录,它要写文件的时候找不到文件夹,直接就报错了。 -T参数和重定向冲突:-T本来是用来把每个表拆成建表SQL文件和纯数据文本文件(比如users.sql和users.txt)的,但你后面又加了> "$dbname".txt的重定向,这就乱套了。另外,如果MySQL的secure_file_priv配置限制了导出目录,也会触发类似的权限错误。- 额外坑点:
show databases会把系统库(比如mysql、information_schema)也列出来,这些一般不需要备份,直接循环的话可能会出不必要的问题。
修正后的可用脚本
我给你调整了脚本,解决了上面所有问题,你可以直接用:
#!/bin/bash # 备份根目录,你可以改成自己想要的路径 BACKUP_ROOT="/backup" # 先创建根目录,-p表示如果已经存在也不会报错 mkdir -p "$BACKUP_ROOT" # 获取需要备份的数据库,排除系统库 mysql -uroot -p你的密码 -e "SHOW DATABASES" | grep -vE "(information_schema|mysql|performance_schema|sys)" | while read dbname; do # 创建当前数据库的专属备份文件夹 DB_BACKUP_DIR="$BACKUP_ROOT/$dbname" mkdir -p "$DB_BACKUP_DIR" # 方式1:把整个数据库导出成一个完整的SQL文件(推荐,恢复方便) mysqldump -uroot -p你的密码 --databases "$dbname" > "$DB_BACKUP_DIR/${dbname}_全量备份.sql" # 方式2:如果你确实要按表拆分出建表SQL和数据文本(对应你原脚本的-T需求),就替换上面的mysqldump命令为下面这行: # mysqldump -uroot -p你的密码 -T"$DB_BACKUP_DIR" --fields-terminated-by="|" "$dbname" done
几个重要的细节说明
- 密码安全:脚本里直接写密码是为了自动化,但最好不要这么干!更安全的方式是创建
~/.my.cnf配置文件,内容如下:
然后脚本里的[mysqldump] user=root password=你的密码mysql和mysqldump命令就可以去掉-uroot -p你的密码,直接写命令就行,避免明文泄露密码。 - 目录权限:如果还是报权限错误,检查
/backup目录的所有者是不是mysql用户,或者给目录加权限:chmod -R 755 /backup。 secure_file_priv限制:如果用-T参数导出拆分文件,得先确认MySQL允许导出到这个目录。你可以登录MySQL执行SHOW VARIABLES LIKE 'secure_file_priv';查看,如果值是NULL,需要在my.cnf里添加secure_file_priv = /backup,然后重启MySQL服务。
小提示
如果备份的库比较大,可以给mysqldump加--quick参数,能加快大表的导出速度哦~
内容的提问来源于stack exchange,提问作者Dr Jay
相关产品推荐
相关产品推荐

