mysql定时备份

#!/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

 

以下为遇到的问题:

bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory的解决方法

 

一些人喜欢用vim来写linux shell script, 但是, 有的人喜欢在Windows下用一些方便的编辑器(比如鼎鼎大名的Notepad++)写好, 然后拷贝文件到linux下, 结果呢, 在执行脚本a.sh的时候, 会出现如下问题:

 

[plain] view plain copy

  1. [taoge@localhost learn_shell]$ ./a.sh   
  2. bash: ./a.sh: /bin/bash^M: bad interpreter: No such file or directory  
  3. [taoge@localhost learn_shell]$   


      什么原因呢, 我们有理由怀疑是文件格式问题? 我们用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

  1. dos2unix a.sh   
  2. bash: dos2unix: command not found  
  3. [taoge@localhost learn_shell]$ busybox dos2unix a.sh   
  4. [taoge@localhost learn_shell]$  

 

 

 

mysqldump: command not found问题解决方法:

先用一条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

你可能感兴趣的:(mysql)