#!/bin/bash
#每天早上4点, mysql备份数据
#chmod 700 backup.sh
#crontab -e
#0 4 * * * /home/mysqlbackup/mysql_backup.sh
user="root"
password="root"
host="127.0.0.1"
db_name="shop-parent"
#backup directory
base_dir="/home/mysqlbackup"
backup_log="${base_dir}/mysql_backup.log"
backup_path=${base_dir}
#file info
date=$(date +"%Y-%m-%d")
filename=$backup_path/$db_name-$date.sql.gz
umask 177
#back up
mysqldump --user=$user --password=$password --host=$host $db_name | gzip > $filename
#Delete files older than 10 days
find $backup_path/* -mtime +10 -exec rm {} \;
echo "backup finished at $(date +'%Y-%m-%d %H:%M:%S')" >> "$backup_log"
重启:service crond restart
以下为遇到的问题:
一些人喜欢用vim来写linux shell script, 但是, 有的人喜欢在Windows下用一些方便的编辑器(比如鼎鼎大名的Notepad++)写好, 然后拷贝文件到linux下, 结果呢, 在执行脚本a.sh的时候, 会出现如下问题:
[plain] view plain copy
什么原因呢, 我们有理由怀疑是文件格式问题? 我们用vim a.sh进入a.sh这个文件, 然后在底部模式下, 执行:set ff查看一下, 结果发现fileformat=dos, 看看, 果然是文件格式问题, 那怎么解决呢?
方法一:vim a.sh进入a.sh后, 在底部模式下, 执行:set fileformat=unix后执行:x或者:wq保存修改。 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)
方法二:直接执行sed -i "s/\r//" a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我亲自试过, 是ok的)
方法三:直接执行dos2unix a.sh来转化, 然后就可以执行./a.sh运行脚本了。(我的linux上执行dos2unix ./a.sh失败, 但是不要放弃啊, 加个busybox就可以了), 如下:
[plain] view plain copy
先用一条find命令查找mysqldump的所载路径
find / -name mysqldump -print
然后再用ln命令链接到/usr/bin下面
ln -fs /usr/local/mysql/bin/mysqldump /usr/bin
注意 /usr/local/mysql/bin/mysqldump要为刚才输出的路径。
原理:直接输入命令mysqldump会发现提示命令不存在,是由于系统默认会查找/usr/bin下的命令,如果这个命令不在这个目录下,自然会找不到命令,并报错。
查看crontab 日志
tail -f /var/log/cron
可是我的mysql是用docker安装的,所以以上解决方法不可以解决
docker中备份mysql
docker exec -it mysql3306 mysqldump -uroot -proot shop-parent > /home/mysqlbackup/shop/shop-parent.sql
定时备份:
#!/bin/bash
#每天早上2点, mysql备份数据
#chmod 700 backup.sh
#crontab -e
#0 0 2 * * ? /home/mysqlbackup/mysql_backup.sh
user="root"
password="root"
host="localhost"
db_name="shop-parent"
#backup directory
base_dir="/home/mysqlbackup/shop"
backup_log="${base_dir}/mysql_backup.log"
backup_path=${base_dir}
#file info
date=$(date +"%Y-%m-%d")
filename=$backup_path/$db_name-$date.sql
umask 177
#back up
#docker exec -it mysql3306 mysqldump -u$user -p$password $db_name > $filename
#加 -it 每次输出的大小都为0,mysqldump 也要指定一下绝对路径 /usr/bin/mysqldump
#或用/usr/bin/docker exec mysql3306 /usr/bin/mysqldump -u$user -p$password $db_name > $filename
docker exec mysql3306 /usr/bin/mysqldump -u$user -p$password $db_name > $filename
#Delete files older than 10 days
find $backup_path/* -mtime +10 -exec rm {} \;
echo "backup finished at $(date +'%Y-%m-%d %H:%M:%S')" >> "$backup_log"
https://blog.csdn.net/muriyue6/article/details/82848358
今天遇到个问题,在定时备份时 去查看备份文件,发现大小竟然为0,执行 备份sh文件备份, 备份的sql文件大小正常.试了几种办法。
最终解决办法:
问题原因:
因为我设置的环境变量 就直接在sh中 使用 mysqldump xxx 备份. 在其他目录可以 但是在定时任务中 它是在/etc/crontab中执行
解决办法:
将mysqldum 设置为绝对路径 mysql安装目录/bin/mysqldum xxxx.
crontab执行的mysqldump要把命令的绝对路径写全,比如:
/usr/local/mysql/bin/mysqldump ...
这样就能正确执行了。
或docker exec -it mysql3306 /usr/bin/mysqldump -uroot -proot shop-parent > /home/mysqlbackup/shop/shop-parent.sql
或 但是crontab定时执行的时候dump出来的文件大小始终是0,后来发现去掉-it就可以了,按照文档解释-t是分配一个伪终端,但是crontab执行的时候实际是不需要的
docker exec mysql3306 /usr/bin/mysqldump -uroot -proot shop-parent > /home/mysqlbackup/shop/shop-parent.sql