首页 > 数据库 >linux利用shell+crontab自动备份mysql数据库

linux利用shell+crontab自动备份mysql数据库

时间:2024-01-29 20:45:04浏览次数:32  
标签:shell root 备份 mysqlbackup crontab 01 sql mysql backup

一.准备条件,得先安装一个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

相关文章

  • 记一次MySQL从节点服务器宕机重启后,从节点出现主键冲突异常的处理
    环境MySQL5.7非GTID模式多线程复制。现象某MySQL数据库从节点因故障宕机(因故障直接宕机,非正常关闭),重启之后发现复制状态异常,showslave的结果中Slave_SQL_Running为No,错误代码为1062errorcode,从系统表performance_schema.replication_applier_status_by_worker以及errorl......
  • MySQL-基础
    1.DQL语句完整语法和执行顺序select...from...where...groupby...having...orderby...limit...顺序:51234672.添加外键altertableempaddconstraintf_keyforeignkey(dept_id)referencesdept(id)onupdatecascadeondeletecascade;dept为父表,id为......
  • MySQL迁移人大金仓kingbase
    前言:前段时间接到一个任务,说是数据库要由mysql改成人大金仓,项目代码也需要修改适配(另一个同事负责),而我则是负责数据库的迁移工作,期限是七天(2024-01-26已上线),在这之前我甚至都没听过人大金仓这个名词,而且也没有相关文档的交接更没有技术人员支撑,起初我还让项目负责人去跟集团的DBA......
  • MySQL金额数字转为大写中文
    MySQL版本:5.7.34-log*通过创建函数的方法,目前可以实现整数金额的转换,网上暂未找到MySQL版本的故自己参照其他数据库版本的改编了一下,*仅供参考!!!使用方法:selectrmb(10000)CREATEDEFINER=`root`@`%`FUNCTION`rmb_upper`(jeint)RETURNSvarchar(200)DETERMINISTICBE......
  • 配置mysql (Redhat)
    前提准备:MySQL下载 https://dev.mysql.com/downloads/mysql/ 当前安装版本5.71.检查是否安装mysql:rpm-aq|grepmysql 如果有输出则先停止服务:servicemysqldstart批量删除包rpm-eXXX--nodeps2.检查mariadb:rpm-qa|grepmariadb如果有输出则删除相关包 rpm-e......
  • 【MYSQL】4、mysql中的Innodb_buffer_pool_reads和Innodb_buffer_pool_read_requests
    原文链接:https://blog.csdn.net/qq_35462323/article/details/1318115931、Innodb_buffer_pool_reads和Innodb_buffer_pool_read_requests的含义?Innodb_buffer_pool_readsInnodb_buffer_pool_readsThenumberoflogicalreadsthatInnoDBcouldnotsatisfyfromthebuffer......
  • 解决MySQL设置时区时的错误Unknown or incorrect time zone: 'Asia/Shanghai'
    问题描述:在trino中配置了mysql.properties文件,但是通过trino客户端,执行命令showschemasfrommysql;查看数据库信息时报错:Errorlistingschemasforcatalogmysql:java.sql.SQLNonTransientConnectionException:Couldnotcreateconnectiontodatabaseserver.Attempted......
  • MySQL 常用工具
    系统数据库MySQL数据库安装完成后,自带了以下四个数据库,具体作用如下: 常用工具mysql该mysql不是指mysql服务,而是指mysql的客户端工具 mysqladminmysqladmin是一个执行管理操作的客户端程序。可以用它来检查服务器的配置和当前状态、创建并删除数据库等。 my......
  • GaussDB(for MySQL)剪枝功能,让查询性能提升70倍!
    作者,祝青平,华为云数据库内核高级工程师。擅长数据库优化器内核研发,9年数据库内核研发经验,参与多个TP以及AP数据库的研发工作。近日,华为云数据库社区下面有这样一条用户提问留言:请问,如何通过MySQL提升DISTINCT,尤其是多表连接下DISTINCT的查询效率?在回答这个问题之前,我们先了解一......
  • MySQL InnoDB MVCC
    MVCC-基本概念当前读读取的是记录的最新版本,读取时还要保证其他并发事务不能修改当前记录,会对读取的记录进行加锁。对于我们日常的操作,如:select...lockinsharemode(共享锁),select...forupdate,update,insert,delete(排他锁)都是一种当前读。快照读简单的selec......