一.准备条件,得先安装一个mysql数据库
mysql5.7数据库安装教程
https://www.cnblogs.com/magepi/p/16983507.html
二.然后准备编写shell脚本
编写备份单个库shell脚本
#!/bin/bash #保存备份个数,备份3天数据 number=3 #备份保存路径 backup_dir=/opt/mysqlbackup #日期 dd=`date +%Y-%m-%d-%H-%M-%S` #备份工具(mysql自带得备份工具) tool=mysqldump #用户名 username=root #密码 password=123456 #将要备份的数据库(-A备份所有) database_name=home #如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi #简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql $tool -u $username -p$password $database_name > $backup_dir/$dd.sql #写创建备份日志 echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt #找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1` #判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then #删除最早生成的备份,只保留number数量的备份 rm -f $delfile #写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi
备份多个库且每个库分别备份命名
#!/bin/bash #保存备份个数,备份3天数据 number=3 #备份保存路径 backup_dir=/opt/mysqlbackup #日期 dd=`date +%Y-%m-%d-%H-%M-%S` #备份工具 tool=mysqldump #用户名 username=root #密码 password=123456 #host=127.0.0.1 #将要备份的数据库(-A备份所有) #database_name=chinaoly_test #如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi #查询mysql所有的表 DATABASES=$(mysql -u$username -p$password -s -e "SHOW DATABASES") for db in $DATABASES; do #去掉系统默认表 if [ "$db" != "information_schema" ] && [ "$db" != "mysql" ] && [ "$db" != "sys" ] && [ "$db" != "performance_schema" ]; then echo "backed up successfully" #简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql $tool -u $username -p$password --skip-lock-tables $db > $backup_dir/"$db"_$dd.sql #进行压缩 gzip $backup_dir/"$db"_$dd.sql #写创建备份日志 echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt #找出需要删除的备份 delfile=`ls -l -crt $backup_dir/"$db"* | awk '{print $9 }' | head -1` #判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/"$db"* | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then #删除最早生成的备份,只保留number数量的备份 rm -f $delfile #写删除文件日志 echo "delete $delfile" >> $backup_dir/log.txt fi fi done echo "All databases backed up successfully"
三. 编写crontab定期执行备份脚本
#每分钟执行一次该脚本mysql_backup.sh
*/1 * * * * /opt/mysqlbackup/mysql_backup.sh
四.验证备份脚本与crontab定时任务
准备得数据库及数据表
name表中有两个字段
编写单个数据库备份脚本
[root@VM-0-3-linux mysqlbackup]# pwd /opt/mysqlbackup [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# cat mysql_backup.sh #!/bin/bash #保存备份个数,备份3天数据 number=3 #备份保存路径 backup_dir=/opt/mysqlbackup #日期 dd=`date +%Y-%m-%d-%H-%M-%S` #备份工具(mysql自带得备份工具) tool=mysqldump #用户名 username=root #密码 password=123456 #将要备份的数据库(-A备份所有) database_name=home #如果文件夹不存在则创建 if [ ! -d $backup_dir ]; then mkdir -p $backup_dir; fi #简单写法 mysqldump -u root -p123456 users > /root/mysqlbackup/users-$filename.sql $tool -u $username -p$password $database_name > $backup_dir/$dd.sql #写创建备份日志 echo "create $backup_dir/$dd.dupm" >> $backup_dir/log.txt #找出需要删除的备份 delfile=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | head -1` #判断现在的备份数量是否大于$number count=`ls -l -crt $backup_dir/*.sql | awk '{print $9 }' | wc -l` if [ $count -gt $number ] then
编写crontab脚本
[root@VM-0-3-linux mysqlbackup]# ls mysql_backup.sh mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# cat mysqlRollBack.cron */1 * * * * /opt/mysqlbackup/mysql_backup.sh [root@VM-0-3-linux mysqlbackup]#
然后先单独测试下备份脚本mysql_backup.sh看能不能创建成功
执行报错,找不到mysqldump工具
[root@VM-0-3-linux mysqlbackup]# sh mysql_backup.sh mysql_backup.sh: line 25: mysqldump: command not found [root@VM-0-3-linux mysqlbackup]#
将mysqldump建立软连接
ln -s /usr/local/mysql/bin/mysqldump /usr/bin
再次执行 sh mysql_backup.sh
#对密码得警告不影响数据备份
[root@VM-0-3-linux mysqlbackup]# sh mysql_backup.sh mysqldump: [Warning] Using a password on the command line interface can be insecure. [root@VM-0-3-linux mysqlbackup]#
可以看到生成了sql文件且对应的日志文件log.txt也生成了
du -sh *|sort -h(对文件夹大小进行排序命令)
[root@VM-0-3-linux mysqlbackup]# ls 2024-01-29-11-37-21.sql log.txt mysql_backup.sh mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]# du -sh *|sort -h 4.0K 2024-01-29-11-37-21.sql 4.0K log.txt 4.0K mysql_backup.sh 4.0K mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]#
这个库的备份sql已经生成,那我们将原来home库中name表的数据修改下
然后将备份sql下载下来在navicat运行sql即可
刷新一下就还原回原本数据了
只有上面备份脚本还不行, 必需结合linux自带的定时器crontab使用
# 添加定时任务 mysqlRollBack.cron这个文件内的定时任务 crontab mysqlRollBack.cron
执行 crontab -l 查看定时任务是否已经生效
[root@VM-0-3-linux mysqlbackup]# crontab mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]# crontab -l */1 * * * * /opt/mysqlbackup/mysql_backup.sh [root@VM-0-3-linux mysqlbackup]#
过了一分钟后发现没生成sql文件,后面通过查找资料定位到crontab没有生效
使用 crontab 来定时执行脚本,无法执行,但是如果直接通过命令(如:sh mysql_backup.sh)又可以正常执行,这主要是因为无法读取环境变量的原因
#这是crontab的相关文档,里面有记录原因及怎么配置(脚本无法执行问题) https://www.runoob.com/linux/linux-comm-crontab.html
crontab新的执行文件改成这样就可以执行
*/1 * * * * . /etc/profile;/bin/sh /opt/mysqlbackup/mysql_backup.sh
查看/opt/mysqlbackup文件夹发现sql文件始终是三个, log.txt记录了创建及删除备份的操作记录(备份脚本定义保存三个)
[root@VM-0-3-linux mysqlbackup]# ls 2024-01-29-11-58-01.sql 2024-01-29-11-59-01.sql 2024-01-29-12-00-01.sql log.txt mysql_backup.sh mysqlRollBack.cron [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# cat log.txt create /opt/mysqlbackup/2024-01-29-11-37-21.dupm create /opt/mysqlbackup/2024-01-29-11-55-01.dupm create /opt/mysqlbackup/2024-01-29-11-56-01.dupm create /opt/mysqlbackup/2024-01-29-11-57-02.dupm delete /opt/mysqlbackup/2024-01-29-11-37-21.sql create /opt/mysqlbackup/2024-01-29-11-58-01.dupm delete /opt/mysqlbackup/2024-01-29-11-55-01.sql create /opt/mysqlbackup/2024-01-29-11-59-01.dupm delete /opt/mysqlbackup/2024-01-29-11-56-01.sql create /opt/mysqlbackup/2024-01-29-12-00-01.dupm delete /opt/mysqlbackup/2024-01-29-11-57-02.sql [root@VM-0-3-linux mysqlbackup]#
其实备份全部库也是一样,执行命令都差不多,无非把单个的脚本换成备份多个的脚本
逻辑相当于先查询了该mysql所有数据库,然后依次遍历数据库进行一个一个的生成备份sql(去掉了四个默认数据库,不去掉会报错)
mysql创建两个数据库
将mysql_backup.sh脚本替换成备份全部的
重新执行 crontab mysqlRollBack.cron
[root@VM-0-3-linux mysqlbackup]# ls home_2024-01-29-12-33-01.sql.gz home_2024-01-29-12-35-02.sql.gz homeTest_2024-01-29-12-34-01.sql.gz log.txt mysqlRollBack.cron home_2024-01-29-12-34-01.sql.gz homeTest_2024-01-29-12-33-01.sql.gz homeTest_2024-01-29-12-35-02.sql.gz mysql_backup.sh [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]# [root@VM-0-3-linux mysqlbackup]#
每个库生成自己对应的sql文件且最多也只有三个(生成sql时间可能跟系统时间差8小时,可以自己调整下)
标签:shell,root,备份,mysqlbackup,crontab,01,sql,mysql,backup From: https://www.cnblogs.com/magepi/p/17994951