数据库
背景
无法备份每日的docker容器的mysql 数据
-rw-r--r-- 1 root root 0K Jul 16 05:15 2023-07-16.sql
-rw-r--r-- 1 root root 162 Jul 16 05:09 backup.sh
backup.sh
#!/bin/bash
t=`date "+%Y-%m-%d"`
/usr/bin/docker exec -it mysql /bin/mysqldump -uroot -p12345 backup > /data/backup/$t.sql
crontab
38 5 * * * sh /data/backup/backup.sh > /tmp/backup.log>&1
排查
日志
tail -f /var/log/cron
Jul 16 05:35:01 vm518398 crond[849]: (root) RELOAD (/var/spool/cron/root) Jul 16 05:35:01 vm518398 CROND[435664]: (root) CMD (sh /data/backup/backup.sh > /tmp/backup.log>&1) Jul 16 05:35:01 vm518398 CROND[435662]: (root) CMDOUT (the input device is not a TTY) Jul 16 05:35:04 vm518398 CROND[435662]: (root) CMDEND (sh /data/backup/backup.sh > /tmp/backup.log>&1)
其中CMDOUT (the input device is not a TTY),这句引起的我的注意,一顿百度+google
原因
主要原因是 -t 是指分配一个伪终端,去掉-t就可以了
最终解决方案
backup.sh 去掉-t
加上scp到备份服务器
#!/bin/bash t=`date "+%Y-%m-%d"` /usr/bin/docker exec -i mysql /bin/mysqldump -uroot -p12345 backup > /data/backup/$t.sql scp -P 1022 /data/backup/$t.sql root@xxx.xxx.xxx.xxx:/data