Advertisement
Guest User

backupDaily.sh

a guest
Jun 10th, 2016
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.37 KB | None | 0 0
  1. #!/bin/sh
  2. #
  3. # backup helper script for SWGemu Berkeley DB files
  4. #
  5. # V 0.1 2011-02 (c)UT aka lei
  6. # (r) GNU LGPL V2.0
  7. #
  8. # uses: awk, cat, df, du, fgrep, grep, gzip, head, sed ; db_hotbackup from bdb utils
  9. # and mysqldump
  10. #
  11. # In the given backup dir hotbackup will use db_hotbackup to create backup bdb files
  12. # from dbhome to backupdir/[1,2...n]. After that it will dump the mysql part and zip
  13. # it. The subdirs are cycled per call to have several backups at hand if an problem
  14. # isnt detected instantly. Subdir 0 is reserved for creating a db snapshot. It will
  15. # be overwritten each time called.
  16. # On start, the hotbackup utility estimates space and time needs for a backup and
  17. # gives a report after each run.
  18. #
  19. #
  20. # -t test mode, do nothing (default: run sharp)
  21. # -v be more verbose (default: run silent)
  22. # -l log to default logfile (default: no log, $DB_BACKUP/hotbackup.log)
  23. # -0 do backup to DB_BACKUP/0 (snapshot)
  24.  
  25. # known bugs (aka "features")
  26. #
  27. # 0.1 - unresolved error when using illegal arguments
  28. # 0.1 - if a backup needs more than a day, we put ourself on hold. Must reset manually.
  29. # ...
  30. # (to be continued)
  31.  
  32. #
  33. # release history
  34. # 0.1 - 2011-02-06 (c)UT aka lei
  35. #
  36.  
  37. #
  38. # please edit these settings according to your needs
  39. #
  40.  
  41. # add db utils dir to path
  42. PATH=$PATH:/usr/local/BerkeleyDB.5.0/bin
  43. export PATH
  44.  
  45. # databases directory , used by bdb utils too
  46. DB_HOME=/home/swgemu/workspace/Core3/MMOCoreORB/bin/databases
  47. export DB_HOME
  48.  
  49. # backup dir (should be on another filesystem)
  50. DB_BACKUP=/home/swgemu/nightwingBackup/daily
  51. export DB_BACKUP
  52.  
  53. # how much backups will we keep
  54. DB_CYCLE=7
  55. export DB_CYCLE
  56.  
  57. # how much space must be left on backup volume
  58. BACKUP_VOLUME_MINFREE_GB=8
  59. export BACKUP_VOLUME_MINFREE_GB
  60.  
  61. # mysqldump with user and pw
  62. #MYSQLDUMP="/usr/bin/mysqldump -u swgdump -p bla "
  63. MYSQLDUMP="/usr/bin/mysqldump --user=root --password=123456 "
  64. export MYSQLDUMP
  65.  
  66. #
  67. # nothing much should need a change from here
  68. #
  69. # config file
  70. CONFIG=$DB_BACKUP/config
  71. export CONFIG
  72.  
  73. LOGFILE=$DB_BACKUP/hotbackup.log
  74. export LOGFILE
  75. #
  76. # echo needs -e or not, depends on shell version
  77. #
  78. ECHO=`echo -e`
  79. if [ "$ECHO" = "-e" ] ; then ECHO="echo" ; else ECHO="echo -e " ; fi
  80. export ECHO
  81.  
  82.  
  83. #
  84. # do not edit below
  85. #
  86.  
  87. log () {
  88. if [ "$LOG" = "1" ] ; then
  89. if [ "$LOGFILE" != "" ] && [ ! -d $LOGFILE ]; then
  90. HEAD=`head -1 $LOGFILE 2>/dev/null`
  91. if [ -f $LOGFILE ] ; then
  92. if [ "$HEAD" = "# hotbackup LOGFILE" ]
  93. then echo "`date "+%Y.%m.%d-%H:%M:%S"` $*" >> $LOGFILE
  94. return 0
  95. else return 1
  96. fi
  97. else echo "# hotbackup LOGFILE" > $LOGFILE
  98. echo "`date "+%Y.%m.%d-%H:%M:%S"` $*" >> $LOGFILE
  99. return 0
  100. fi
  101. else return 1
  102. fi
  103. fi
  104. return 0
  105. }
  106. # must use as -f -c
  107. info () {
  108. CONT=""
  109. if [ "$1" = "-f" ] ; then VERBOSE=1 ; shift ; fi
  110. if [ "$1" = "-c" ] ; then CONT=1 ; shift ; fi
  111. if [ "$VERBOSE" = "1" ] ; then
  112. if [ "$CONT" = "1" ]; then $ECHO "$*"
  113. else $ECHO "`date` hotbackup: $*"
  114. fi
  115. fi
  116. if [ "$LOG" = "1" ] ; then
  117. if [ "$CONT" = "1" ]; then log "$*"
  118. else log "`date` hotbackup: $*"
  119. fi
  120. fi
  121.  
  122. }
  123. # get disk usage as MB
  124. disk_size() {
  125. if [ -d $1 ] ; then
  126. echo `du -B 1048576 -s $1|awk '{print $1}'|sed -e "s/\ //g"` ; return 0 ;
  127. else echo "0" ; return 1 ;
  128. fi
  129. }
  130. # get free disk space as MB
  131. free_space () {
  132. if [ -d $1 ] ; then
  133. echo `df -B 1048576 --total $1|fgrep total|awk '{print $4}'|sed -e "s/\ //g"`
  134. else echo "0" ; return 1 ;
  135. fi
  136. }
  137. db_disk_size () {
  138. disk_size $DB_HOME
  139. return 0
  140. }
  141. backup_free_space () {
  142. free_space $DB_BACKUP
  143. return 0
  144. }
  145.  
  146. # check for config file, create it if not exists
  147. check_config () {
  148. if [ ! -d $DB_HOME ] ; then echo "$0: `date`: ERROR - $DB_HOME must exist" ; exit ; fi
  149. if [ ! -d $DB_BACKUP ] ; then echo "$0: `date`: ERROR - $DB_BACKUP must exist" ; exit ; fi
  150. if [ -f $CONFIG ] ; then HEAD=`head -1 $CONFIG 2>/dev/null`
  151. if echo "$HEAD"|fgrep "# BDB HOTBACKUP UTIL CONFIG" >/dev/null 2>&1 ; then return 0 ; fi
  152. return 1
  153. else
  154. if [ -d $CONFIG ] ; then return 1 ; fi
  155. echo "# BDB HOTBACKUP UTIL CONFIG created `date` by `whoami`" > $CONFIG
  156. echo "# " >> $CONFIG
  157. echo "LASTRUNDATE=`date "+%Y-%m-%d_%H:%M"`" >> $CONFIG
  158. echo "LASTRUNTIME=00:00" >> $CONFIG
  159. echo "CYCLE=0" >> $CONFIG
  160. echo "SNAPSHOT=0000-00-00_00:00" >> $CONFIG
  161. echo "DUDBHOME=`db_disk_size`" >> $CONFIG
  162. echo "DFDBHOME=`free_space $DB_HOME`" >> $CONFIG
  163. echo "DFBACKUP=`backup_free_space`" >> $CONFIG
  164. echo "DUBACKUP=0" >> $CONFIG
  165. echo "BUACTIVE=none" >> $CONFIG
  166. echo "HOLD=0" >> $CONFIG
  167.  
  168. fi
  169. return 0
  170. }
  171.  
  172. #
  173. # update_config_item ITEMNAME ITEMVALUE
  174. # use with care
  175. #
  176. update_config_item () {
  177. I=`echo "$1"|sed -e "s/\ //g"`
  178. N=`echo $I|fgrep -c "="`
  179. if [ "$N" = "1" ] ; then C=`echo "$I"|awk -F\= '{print $2}'|sed -e "s/\ /_/g"`
  180. else C=`echo "$2"|sed -e "s/\ /_/g"`
  181. fi
  182. if [ "$I" = "" ] || [ "$C" = "" ] ; then return 1 ; fi
  183. X=0
  184. #do a simple locking
  185. while [ -f $CONFIG.lock ] ; do $ECHO ".\c" ; sleep 1 ; X=`expr $X + 1`; if [ $X -gt 30 ] ; then PID=`cat $CONFIG.lock` ; PS=`ps hp $PID` ; if [ "$PS" = "$PID" ] ; then $ECHO "\n$0: `date`: ERROR ... another backup seems to be active" ; exit ; else $ECHO "\n$0: `date`: warning - dead lock $PID - override lock." ; rm -f $CONFIG.lock ; fi ; fi ; done
  186. echo $$ > $CONFIG.lock
  187. O=`grep "^$I" $CONFIG`
  188. N=`echo "${I}=${C}"`
  189. mv $CONFIG $CONFIG.bak
  190. if sed -e "s/$O/$N/" < $CONFIG.bak > $CONFIG ; then
  191. rm -f $CONFIG.lock
  192. else info -f "update_config_item: ERROR replacing $O with $N."
  193. rm -f $CONFIG.lock
  194. return 1
  195. fi
  196. return 0
  197. }
  198.  
  199. #
  200. # get_config_item ITEMNAME
  201. #
  202. get_config_item () {
  203. Q=`echo "$1"|sed -e "s/\ //g"`
  204. R=`grep "^$Q=" $CONFIG |awk -F\= '{print $2}'|sed -e "s/\ //g"`
  205. if [ "$R" != "" ] ; then echo $R ; return 0; fi
  206. return 1
  207. }
  208.  
  209. #
  210. # main
  211. #
  212. #
  213. ARGS="$*"
  214. while [ "$1" != "" ] ; do
  215. if [ "$1" = "-v" ] ; then VERBOSE=1 ; export VERBOSE; fi
  216. if [ "$1" = "-t" ] ; then TESTING=1 ; export TESTING; fi
  217. if [ "$1" = "-0" ] ; then SNAPSHOT=1 ; fi
  218. if [ "$1" = "-l" ] ; then LOG=1 ; export LOG ; fi
  219. if [ "$1" = "-?" ] ; then echo "$0 usage: -v verobse, -0 snapshot, -t test only, -l write logfile, -? this help" ; exit ; fi
  220. shift;
  221. done
  222.  
  223. if [ "$LOG" = "1" ] ; then
  224. if log $0 $ARGS ; then info "Logging to $LOGFILE"
  225. else info "LOGFILE $LOGFILE wrong file or directory, LOG SUSPENDED"
  226. LOG=0 ; export LOG
  227. fi
  228. else info "log turned off."
  229. fi
  230.  
  231. if check_config ; then info "Config file checked OK"
  232. else info "there is a problem with the config file, please check settings."
  233. info "Config file is $CONFIG, maybe belongs to something else"
  234. exit
  235. fi
  236. HOLD=`get_config_item HOLD`
  237. if [ "$HOLD" = "1" ] ; then info -f "BACKUP PROCESS PUT ON HOLD ... cannot continue. Check log and config file!";exit;fi
  238.  
  239. update_config_item BUACTIVE $$
  240.  
  241. DF=`backup_free_space` ; DU=`db_disk_size` ; FM=`expr $DF - $DU` ; FG=`expr $FM / 1024`
  242.  
  243. # load config
  244. CYCLE=`get_config_item CYCLE` ; NEXTCYCLE=`expr $CYCLE + 1`
  245. if [ $NEXTCYCLE -gt $DB_CYCLE ] ; then NEXTCYCLE=1 ; fi
  246. LASTRUNDATE=`get_config_item LASTRUNDATE`
  247. LASTRUNTIME=`get_config_item LASTRUNTIME`
  248. LASTSNAPSHOT=`get_config_item SNAPSHOT`
  249. DUDBHOME=`get_config_item DUDBHOME`
  250. DFBACKUP=`get_config_item DFBACKUP`
  251. DUBACKUP=`get_config_item DUBACKUP`
  252. BACKUP_VOLUME_MINFREE_MB=`expr $BACKUP_VOLUME_MINFREE_GB \* 1024`
  253. LRD=`echo $LASTRUNDATE|awk -F\_ '{print $1}'`
  254. LRT=`echo $LASTRUNDATE|awk -F\_ '{print $2}'`
  255. if [ "$TESTING" = "1" ] ; then info "INVOKED WITH -t SO DOING TEST RUN ONLY" ; fi
  256. info "Using DB_HOME $DB_HOME and DB_BACKUP $DB_BACKUP"
  257. info "Last run was on $LRD at $LRT saving $DUBACKUP MB to DB_BACKUP/$CYCLE using $LASTRUNTIME hrs:mins"
  258. info "This run will use estimated $DU MB on $DB_BACKUP where $DF MB are available. ($BACKUP_VOLUME_MINFREE_MB MB reserved)"
  259.  
  260. if [ $FM -lt $BACKUP_VOLUME_MINFREE_MB ] ; then
  261. info -f "There happens to be a problem: Only $DF MB left on volume. STOP PROCESSING."
  262. exit
  263. else info "We got $FG GB ($FM MB), so clearance for a backup is given."
  264. fi
  265.  
  266. if [ "$SNAPSHOT" = "1" ] ; then info "A SNAPSHOT has been requested, so backup destination is $DB_BACKUP/0".
  267. NEXTCYCLE=0
  268. LASTRUNDATE=`get_config_item SNAPSHOT`
  269. info "Last SNAPSHOT was done $LASTRUNDATE."
  270. else info "Normal backup requested, destination is DB_BACKUP/$NEXTCYCLE."
  271. fi
  272. STARTD=`date +%Y%m%d`
  273. STARTH=`date +%H`
  274. STARTM=`date +%M`
  275. # db_hotbackup will create or clean the target dir by itself
  276. info "Starting the hotbackup process by now..."
  277. RUN="db_hotbackup -d $DB_HOME -b $DB_BACKUP/$NEXTCYCLE -v > $DB_BACKUP/db_hotbackup.out "
  278. if [ "$TESTING" != "1" ] ; then
  279. if db_hotbackup -d $DB_HOME -b $DB_BACKUP/$NEXTCYCLE -v > $DB_BACKUP/db_hotbackup.out 2>&1 ; then
  280. info "db_hotbackup done. See output in $DB_BACKUP/db_hotbackup.out."
  281. info "Starting mysql dump now...\c"
  282. $MYSQLDUMP --extended-insert=FALSE --complete-insert=TRUE swgemu > $DB_BACKUP/$NEXTCYCLE/swgemu.sql
  283. info -c "done."
  284. gzip $DB_BACKUP/$NEXTCYCLE/swgemu.sql
  285. info "Compressed dump to $DB_BACKUP/$NEXTCYCLE/swgemu.sql.gz"
  286. else
  287. info "db_hotbackp statet an error: See output in $DB_BACKUP/db_hotbackup.out."
  288. fi
  289. else
  290. info "TESTING MODE ... would run now: $RUN"
  291. info "TESTING MODE ... would run now: $MYSQLDUMP"
  292. fi
  293. STOPD=`date +%Y%m%d`
  294. STOPH=`date +%H`
  295. STOPM=`date +%M`
  296. D=`expr $STOPD - $STARTD`
  297. H=`expr $STOPH - $STARTH`
  298. M=`expr $STOPM - $STARTM`
  299. BT=`echo "$H:$M"`
  300. if [ $D -gt 0 ] ; then info -f "Backup needed more than a day - something seems to be wrong!"
  301. info -f "Putting backup on hold. Operator action requested."
  302. update_config_item HOLD 1
  303. fi
  304. update_config_item LASTRUNTIME $BT
  305. if [ "$NEXTCYCLE" = "0" ] ; then update_config_item SNAPSHOT `date "+%Y-%m-%d_%H:%M"`
  306. else update_config_item LASTRUNDATE `date "+%Y-%m-%d_%H:%M"`
  307. update_config_item CYCLE $NEXTCYCLE
  308. fi
  309. info "Updating config file ...\c"
  310. DUDBHOME=`get_config_item DUDBHOME`
  311. DFBACKUP=`get_config_item DFBACKUP`
  312. DUBACKUP=`get_config_item DUBACKUP`
  313. DF=`backup_free_space` ; update_config_item DFBACKUP $DF;
  314. DU=`db_disk_size` ; update_config_item DUDBHOME $DU;
  315. DB=`disk_size $DB_BACKUP/$NEXTCYCLE` ; update_config_item DUBACKUP $DB
  316. info -c "done."
  317. info "BACKUP DONE. Backed up $DB MB to $DB_BACKUP/$NEXTCYCLE using $BT hrs:mins. $DF MB left on backup volume ($BACKUP_VOLUME_MINFREE_MB reserved)"
  318. update_config_item BUACTIVE none
  319.  
  320. #
  321. # finis
  322. #
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement