返回顶部
首页 > 资讯 > 操作系统 >linux中数据库的定时备份
  • 874
分享到

linux中数据库的定时备份

linux定时备份linux数据库备份定时备份数据库 2023-05-12 10:05:35 874人浏览 泡泡鱼
摘要

目录1 序言2 crond 相关知识点2.1 crond 是什么?2.2 crontab 进行定时任务设置2.2.1 crontab 指令选项说明2.2.2 crontab 指令使用格式2.2.4 crontab 设置步骤

目录
  • 1 序言

  • 2 crond 相关知识点

    • 2.1 crond 是什么?

    • 2.2 crontab 进行定时任务设置

      • 2.2.1 crontab 指令选项说明

      • 2.2.2 crontab 指令使用格式

      • 2.2.4 crontab 设置步骤

  • 3 各个数据库备份脚本

  • 4 定时备份数据库实际操作


    1 序言

    相信大家都还记得这则新闻吧,欧洲云计算巨头 OVH 位于法国斯特拉斯堡的机房发生严重火灾,大火彻底摧毁了五层高、占地 500 平方米的 SBG2 数据中心。

    当地报纸称 115 位消防员投入 6 个小时才将其扑灭。经过长达 6 个小时的持续燃烧,SBG2 内的数据恐怕已经彻底丢失。

    大火对欧洲范围内的众多网站造成严重影响。据 Netcraft 称,目前跨 464000 个域的多达 360 万个网站皆已下线。

    数据是无价的,所以生产环境中定时备份数据库显得尤为重要。备份能防止服务器故障和人为误操作带来的数据丢失。

    生产环境中linux操作系统也是服务器的首选,所以我们今天就以linux为例,说一说数据库备份。

    具体以什么数据库为例呢,就以这几年工作中接触到的几种常见数据库为例吧。

    在这里呢也给自己挖一个坑,工作中呢也用到winserver 作为服务器的情况,所以呢后面也整理更新下winserver 环境下数据库备份。


    2 crond 相关知识点


    2.1 crond 是什么?

    crond任务调度相当于我们日常生活中的闹钟。可以在某个时间点执行特定的命令和程序。 linux系统自身定期执行的任务工作:例如轮询系统日志、备份系统数据、清理系统缓存、杀毒等等 用户执行的工作任务:用户通过设置任务调度,定时执行自己添加shell脚本或简单的指令。例如每隔1分钟和互联网上时间服务器同步,每天凌晨1点备份数据库等等


    2.2 crontab 进行定时任务设置


    2.2.1 crontab 指令选项说明

    语法:

    crontab[-e|-l|-r]
    
    -e:编辑crontab 定时任务
    -l:查询crontab定时任务
    -r:删除当前用户所有的crontab定时任务


    2.2.2 crontab 指令使用格式

    crontab用户的定时任务一般分为6段(空格分隔,系统的定时任务则/etc/crontab分为7段),其中前五段位时间设定段,第六段为所要执行的命令或脚本任务段。

    ①语法:

    * * * * * cmd
    ①cmd为要执行的命令或脚本,例如/server/scripts/lee.sh
    ②每个段之间必须要有空格。

    ② crontab语法格式中时间段的含义表

    linux中数据库的定时备份

    含义取值范围
    第一个“*”一小时当中的第几分钟0-59
    第二个“*”一天当中的第几个小时0-23
    第三个“*”一个月当中的第几天1-31
    第四个“*”一年当中的第几个月1-12
    第五个“*”一周当中的星期几0-7(0和7都代表周天)

    ③ crontab语法格式中特殊符号的含义表

    特殊符号含义
    *"*" 表示任意时间都,就是“每”的意思,举例:如00 01 * * * cmd 表示每月每周每日的凌晨1点执行cmd任务。
    -"-" 表示分隔符,表示一个时间范围段,如17-19点,每小时的00分执行任务。00 17-19 * * * cmd 表示17,18,19点整点分别执行的意思。
    ,"," 表示分隔时间段的意思。30 17,18,19 * * * cmd 表示每天17,18,19点的半点执行cmd 也可以和“-”结合使用,如: 30 3-5,17-19 * * * cmd 表示每天3、4、5和17、18、19 执行
    /nn代表数字 即”每隔n单位时间”,例如:每10分钟执行一次任务可以写 */10 * * * * cmd,其中 /10,的范围是0-59,也可以写成0-59/10
    ① 30 23 * * * cmd    表示每天23:30分执行cmd命令
    ② 40 22 * * 1 cmd    表示每周一22:40分执行cmd命令
    ③ 30 0 1-12 * * cmd  表示每月1号和12号 00:30执行cmd命令
    ④ 30 0 * * 1-5 cmd   表示每周一和周五00:30执行命令
    ⑤ */10 4 * * * cmd   表示每天4:00每隔10分钟执行一次cmd命令


    2.2.4 crontab 设置步骤

    这里我们以每5分钟同步一次互联网时间为例进行说明

    ① 查看crond服务是否启动

    /sbin/service crond status --查看crond服务是否启动

    [root@xiezhr /]# /sbin/service crond status
    Redirecting to /bin/systemctl status crond.service
    ● crond.service - Command Scheduler
       Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; vendor preset: enabled)
       Active: active (running) since Sun 2021-01-10 21:14:50 CST; 1 months 25 days ago
     Main PID: 990 (crond)
       CGroup: /system.slice/crond.service
               └─990 /usr/sbin/crond -n
    
    Jan 25 14:00:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
    Jan 25 14:30:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
    Jan 25 15:00:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
    Jan 25 15:30:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
    Jan 25 16:00:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...ory
    Jan 25 16:24:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/yunjing)
    Jan 28 11:18:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/sgagenttask)
    Jan 28 11:18:01 xiezhr crond[990]: (root) RELOAD (/var/spool/cron/root)
    Feb 07 12:03:01 xiezhr crond[990]: (*system*) RELOAD (/etc/cron.d/yunjing)
    Feb 07 12:03:01 xiezhr crond[990]: (root) RELOAD (/var/spool/cron/root)
    Hint: Some lines were ellipsized, use -l to show in full.

    如果crond服务没启动则执行如下命令启动crond服务

    /sbin/service crond start          启动服务

    查看进程

    [root@xiezhr /]# ps -ef|grep crond
    root       990     1  0 Jan10 ?        00:00:22 /usr/sbin/crond -n
    root     19552 15271  0 16:10 pts/1    00:00:00 grep --color=auto crond

    ② 编写shell脚本

    在home路径下添加如下shell脚本

    [root@xiezhr home]# vim /home/my.sh
    /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1

    ③ 给脚本增加执行权限

    [root@xiezhr home]# chmod u+x /home/my.sh

    ④ 设置定时任务crontab

    [root@xiezhr home]# crontab -e
    */5 * * * * /home/my.sh

    linux中数据库的定时备份


    3 各个数据库备份脚本


    3.1 Oracle数据库

    #!/bin/bash
    export ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1;
    export ORACLE_SID=orcl;
    export PATH=$ORACLE_HOME/bin:/usr/sbin:$PATH;
    export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib;
    export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
    #以上代码为Oracle数据库运行账号oracle的系统环境变量设置,必须添加,否则crontab任务计划不能执行。
    
    date=date +%Y_%m_%d            #获取系统当前日期时间
    days=7                         #设置删除7天之前的备份文件
    orsid=192.168.1.100:1521/orcl  #Oracle数据库服务器IP、端口、SID
    orowner=scott                  #备份此用户下面的数据
    bakuser=system                 #用此用户来执行备份,必须要有备份操作的权限
    bakpass=oracle                 #执行备注的用户密码
    bakdir=/backup/oracledata      #备份文件路径,需要提前创建好
    bakdata=$orowner"_"$date.dmp   #备份数据库名称
    baklog=$orowner"_"$date.log    #备份执行时候生成的日志文件名称
    ordatabak=$orowner"_"$date.tar.gz #最后保存的Oracle数据库备份文件
    
    cd $bakdir                     #进入备份目录
    mkdir -p $orowner              #按需要备份的Oracle用户创建目录
    cd $orowner                    #进入目录
    exp $bakuser/$bakpass@$orsid grants=y owner=$orowner file=$bakdir/$orowner/$bakdata log=$bakdir/$orowner/$baklog #执行备份
    tar -zcvf $ordatabak $bakdata  $baklog                      #压缩备份文件和日志文件
    find $bakdir/$orowner  -type f -name "*.log" -exec rm {} \; #删除备份文件
    find $bakdir/$orowner  -type f -name "*.dmp" -exec rm {} \; #删除日志文件
    find $bakdir/$orowner  -type f -name "*.tar.gz" -mtime +$days -exec rm -rf {} \;  #删除7天前的备份(注意:{} \中间有空格)
    
    以上exp备份,如果要采用expd备份,只需将上面执行语句换成下面的即可
    expdp $bakuser/$bakpass@$orsid full=y cluster=n directory=$bakdir dumpfile=$bakdir/$orowner/$bakdata logfile=$bakdir/$orowner/$baklog


    3.2 Mysql数据库

    #!/bin/bash
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/bin
    export PATH
    dbuser='root'          #数据库用户名
    dbpasswd='123456'      #数据库密码
    dbname='test1 test2'   #数据库名,可以定义多个数据库,中间以空格隔开,如 test1 test2
    backtime=`date +%Y%m%d%H%M%S`    #备份时间
    logpath= '/home/mysql/backup'     #日志备份路径
    datapath='/home/mysql/backup'     #数据备份路径
    echo "备份时间为${backtime},备份数据库表 ${dbname} 开始" >> ${logpath}/mysqllog.log  #日志记录头部
    #正式备份数据库
    for table in $dbname; do  
    source=`mysqldump -u ${dbuser} -p${dbpasswd} ${table}> ${logpath}/${backtime}.sql` 2>> ${logpath}/mysqllog.log;
    #备份成功以下操作
    if [ "$?" == 0 ];then 
    cd $datapath
    tar jcf ${table}${backtime}.tar.bz2 ${backtime}.sql > /dev/null   #为节约硬盘空间,将数据库压缩
    rm -f ${datapath}/${backtime}.sql   #删除原始文件,只留压缩后文件
    cd $datapath
    rm -rf `find . -name '*.sql.gz' -mtime +30` >> ${logpath}/mysqllog.log 2>&1  #删除30天前备份文件
    echo "数据库表 ${dbname} 备份成功!!" >> ${logpath}/mysqllog.log
    else
    echo “数据库表 ${dbname} 备份失败!!” >> ${logpath}/mysqllog.log   #备份失败则进行以下操作
    fi
    done


    3.3 postgresql数据库

    #!/bin/bash
    pg_user ='postgres'
    export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'
    export exp_date=`date '+%Y%m%d'`
    pg_dump  -U postgres dbpostgres -f /u01/backup/$exp_date.sql  
    gzip -1 /u01/backup/$exp_date.sql       #压缩备份文件
    find /u01/backup -mtime +14 -exec rm {} \;   #删除七天前备份文件


    3.4 mongoDB数据库

    #!/bin/sh
    DUMP=/home/WEBapp/Downloads/mongoDB/mongodbserver/bin/mongodump #mongodump备份文件执行路径
    OUT_DIR=/home/webapp/backup/mongo_bak/mongod_bak_now #临时备份目录
    TAR_DIR=/home/webapp/backup/mongo_bak/mongod_bak_list #备份存放路径
    DATE=`date +%Y_%m_%d_%H_%M_%S` #获取当前系统时间
    DB_USER=XXXX#数据库账号
    DB_PASS=XXXX #数据库密码
    DB_NAME=TEST #数据库名称
    IP=xx.xx.xx.xx:27017
    DAYS=365 #DAYS=30代表删除30天前的备份,即只保留最近30天的备份
    TAR_BAK="mongod_bak_$DATE.tar.gz" #最终保存的数据库备份文件名
    cd $OUT_DIR
    rm -rf $OUT_DIR
    mkdir -p $OUT_DIR/$DATE
    $DUMP -h $IP -u $DB_USER -p $DB_PASS -d $DB_NAME -o $OUT_D

    --结束END--

    本文标题: linux中数据库的定时备份

    本文链接: https://lsjlt.com/news/202076.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作