写点什么

数据库定时备份 linux 篇

用户头像
xiezhr
关注
发布于: 2021 年 03 月 08 日
数据库定时备份linux篇

1 序言


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


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


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


  • Oracle

  • mysql

  • postgresql

  • mongoDB


在这里呢也给自己挖一个坑,工作中呢也用到 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 语法格式中时间段的含义表



|段|含义|取值范围|

|-|-|-|

|第一个“*”|一小时当中的第几分钟|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 执行|

|/n|n 代表数字 即”每隔 n 单位时间”,例如:每 10 分钟执行一次任务可以写 /10 * * cmd,其中 /10,*的范围是 0-59,也可以写成 0-59/10|




2.2.3 特定时间执行任务例子


① 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 statusRedirecting 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...oryJan 25 14:30:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...oryJan 25 15:00:02 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...oryJan 25 15:30:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...oryJan 25 16:00:01 xiezhr crond[990]: /usr/sbin/sendmail: error while loading shared librari...oryJan 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 crondroot       990     1  0 Jan10 ?        00:00:22 /usr/sbin/crond -nroot     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
复制代码



3 各个数据库备份脚本


3.1 Oracle 数据库


#!/bin/bashexport 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、端口、SIDorowner=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/bashPATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:/usr/local/mysql/binexport PATHdbuser='root'          #数据库用户名dbpasswd='123456'      #数据库密码dbname='test1 test2'   #数据库名,可以定义多个数据库,中间以空格隔开,如 test1 test2backtime=`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 $datapathtar jcf ${table}${backtime}.tar.bz2 ${backtime}.sql > /dev/null #为节约硬盘空间,将数据库压缩rm -f ${datapath}/${backtime}.sql #删除原始文件,只留压缩后文件cd $datapathrm -rf `find . -name '*.sql.gz' -mtime +30` >> ${logpath}/mysqllog.log 2>&1 #删除30天前备份文件echo "数据库表 ${dbname} 备份成功!!" >> ${logpath}/mysqllog.logelseecho “数据库表 ${dbname} 备份失败!!” >> ${logpath}/mysqllog.log #备份失败则进行以下操作fidone
复制代码


3.3 postgresql 数据库


#!/bin/bashpg_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/shDUMP=/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:27017DAYS=365 #DAYS=30代表删除30天前的备份,即只保留最近30天的备份TAR_BAK="mongod_bak_$DATE.tar.gz" #最终保存的数据库备份文件名cd $OUT_DIRrm -rf $OUT_DIRmkdir -p $OUT_DIR/$DATE$DUMP -h $IP -u $DB_USER -p $DB_PASS -d $DB_NAME -o $OUT_DIR/$DATE #备份数据库tar -zcvf $TAR_DIR/$TAR_BAK $OUT_DIR/$DATE #压缩为.tar.gz格式find $TAR_DIR/ -mtime +$DAYS -delete #删除30天前的备份
exit
复制代码


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


每天凌晨 1 点备份以上常见数据库


① 创建备份脚本


在 home 路径下创建 backup.sh 并添加以上数据库备份 shell 脚本


[root@xiezhr home]#  vim /home/bakcup/backup.sh# 要备份那个数据库,就往backup.sh 添加对应的shell脚本即可
复制代码

③ 给脚本增加执行权限


[root@xiezhr home]# chmod u+x /home/bakcup/backup.sh
复制代码


③ 设置定时任务 crontab


[root@xiezhr home]# crontab -e0 1 * * * /home/bakcup/backup.sh
复制代码


发布于: 2021 年 03 月 08 日阅读数: 27
用户头像

xiezhr

关注

把分享变成一种习惯,再小的帆也能远航 2021.03.01 加入

还未添加个人简介

评论

发布
暂无评论
数据库定时备份linux篇