Advertisement
Guest User

Untitled

a guest
Jul 29th, 2017
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.80 KB | None | 0 0
  1. #!/bin/bash
  2. #=====================================================================
  3. # Set the following variables to your system needs
  4. # (Detailed instructions below variables)
  5. #=====================================================================
  6. #
  7. # Username to access the MySQL server e.g. dbuser
  8. USERNAME=ROOT
  9. #
  10. # Username to access the MySQL server e.g. password
  11. PASSWORD=PASSWORD
  12. #
  13. # Host name (or IP address) of MySQL server e.g localhost
  14. DBHOST=localhost
  15. #
  16. # List of DBNAMES for Daily/Weekly Backup e.g. "DB1 DB2 DB3"
  17. DBNAMES="all"
  18. #
  19. # Backup directory location e.g /backups
  20. BACKUPDIR="/home/sql_backups"
  21. #
  22. # Mail setup
  23. # What would you like to be mailed to you?
  24. # - log : send only log file
  25. # - files : send log file and sql files as attachments (see docs)
  26. # - stdout : will simply output the log to the screen if run manually.
  27. # - quiet : Only send logs if an error occurs to the MAILADDR.
  28. MAILCONTENT="log"
  29. #
  30. # Set the maximum allowed email size in k. (4000 = approx 5MB email [see docs])
  31. MAXATTSIZE="4000"
  32. #
  33. # Email Address to send mail to? (user@domain.com)
  34. MAILADDR="YOU@YOU.COM"
  35. #
  36. #
  37. # ============================================================
  38. # === ADVANCED OPTIONS ( Read the doc's below for details )===
  39. #=============================================================
  40. #
  41. # List of DBBNAMES for Monthly Backups.
  42. MDBNAMES="mysql $DBNAMES"
  43. #
  44. # List of DBNAMES to EXLUCDE if DBNAMES are set to all (must be in " quotes)
  45. DBEXCLUDE="cphulkd eximstats horde information_schema leechprotect modsec mysql roundcube rvadmin_news"
  46. #
  47. # Include CREATE DATABASE in backup?
  48. CREATE_DATABASE=yes
  49. #
  50. # Separate backup directory and file for each DB? (yes or no)
  51. SEPDIR=yes
  52. #
  53. # Which day do you want weekly backups? (1 to 7 where 1 is Monday)
  54. DOWEEKLY=6
  55. #
  56. # Choose Compression type. (gzip or bzip2)
  57. COMP=gzip
  58. #
  59. # Compress communications between backup server and MySQL server?
  60. COMMCOMP=no
  61. #
  62. # Additionally keep a copy of the most recent backup in a seperate directory.
  63. LATEST=yes
  64. #
  65. # The maximum size of the buffer for client/server communication. e.g. 16MB (maximum is 1GB)
  66. MAX_ALLOWED_PACKET=16MB
  67. #
  68. # For connections to localhost. Sometimes the Unix socket file must be specified.
  69. SOCKET=
  70. #
  71. # Command to run before backups (uncomment to use)
  72. #PREBACKUP="/etc/mysql-backup-pre"
  73. #
  74. # Command run after backups (uncomment to use)
  75. #POSTBACKUP="/etc/mysql-backup-post"
  76. #
  77. echo "Repairing and Optimising Databases before dumping"
  78. mysqlcheck -Aors -u root -pPASSWORD
  79. echo "Repair and optimise completed, errors reported above"
  80. #=====================================================================
  81. #
  82. # Should not need to be modified from here down!!
  83. #
  84. #=====================================================================
  85. #=====================================================================
  86. #=====================================================================
  87. PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/mysql/bin
  88. DATE=`date +%Y-%m-%d_%Hh%Mm` # Datestamp e.g 2002-09-21
  89. DOW=`date +%A` # Day of the week e.g. Monday
  90. DNOW=`date +%u` # Day number of the week 1 to 7 where 1 represents Monday
  91. DOM=`date +%d` # Date of the Month e.g. 27
  92. M=`date +%B` # Month e.g January
  93. W=`date +%V` # Week Number e.g 37
  94. VER=2.5 # Version Number
  95. LOGFILE=$BACKUPDIR/$DBHOST-`date +%N`.log # Logfile Name
  96. LOGERR=$BACKUPDIR/ERRORS_$DBHOST-`date +%N`.log # Logfile Name
  97. BACKUPFILES=""
  98. OPT="--quote-names --opt" # OPT string for use with mysqldump ( see man mysqldump )
  99. #
  100. # Add --compress mysqldump option to $OPT
  101. if [ "$COMMCOMP" = "yes" ];
  102. then
  103. OPT="$OPT --compress"
  104. fi
  105. #
  106. # Add --compress mysqldump option to $OPT
  107. if [ "$MAX_ALLOWED_PACKET" ];
  108. then
  109. OPT="$OPT --max_allowed_packet=$MAX_ALLOWED_PACKET"
  110. fi
  111. #
  112. # Create required directories
  113. if [ ! -e "$BACKUPDIR" ] # Check Backup Directory exists.
  114. then
  115. mkdir -p "$BACKUPDIR"
  116. fi
  117. #
  118. if [ ! -e "$BACKUPDIR/daily" ] # Check Daily Directory exists.
  119. then
  120. mkdir -p "$BACKUPDIR/daily"
  121. fi
  122. #
  123. if [ ! -e "$BACKUPDIR/weekly" ] # Check Weekly Directory exists.
  124. then
  125. mkdir -p "$BACKUPDIR/weekly"
  126. fi
  127. #
  128. if [ ! -e "$BACKUPDIR/monthly" ] # Check Monthly Directory exists.
  129. then
  130. mkdir -p "$BACKUPDIR/monthly"
  131. fi
  132. #
  133. if [ "$LATEST" = "yes" ]
  134. then
  135. if [ ! -e "$BACKUPDIR/latest" ] # Check Latest Directory exists.
  136. then
  137. mkdir -p "$BACKUPDIR/latest"
  138. fi
  139. eval rm -fv "$BACKUPDIR/latest/*"
  140. fi
  141. #
  142. # IO redirection for logging.
  143. touch $LOGFILE
  144. exec 6>&1 # Link file descriptor #6 with stdout.
  145. # Saves stdout.
  146. exec > $LOGFILE # stdout replaced with file $LOGFILE.
  147. touch $LOGERR
  148. exec 7>&2 # Link file descriptor #7 with stderr.
  149. # Saves stderr.
  150. exec 2> $LOGERR # stderr replaced with file $LOGERR.
  151. #
  152. #
  153. # Functions
  154. #
  155. # Database dump function
  156. dbdump () {
  157. mysqldump --user=$USERNAME --password=$PASSWORD --host=$DBHOST $OPT $1 > $2
  158. return 0
  159. }
  160. #
  161. # Compression function plus latest copy
  162. SUFFIX=""
  163. compression () {
  164. if [ "$COMP" = "gzip" ]; then
  165. gzip -f "$1"
  166. echo
  167. echo Backup Information for "$1"
  168. gzip -l "$1.gz"
  169. SUFFIX=".gz"
  170. elif [ "$COMP" = "bzip2" ]; then
  171. echo Compression information for "$1.bz2"
  172. bzip2 -f -v $1 2>&1
  173. SUFFIX=".bz2"
  174. else
  175. echo "No compression option set, check advanced settings"
  176. fi
  177. if [ "$LATEST" = "yes" ]; then
  178. cp $1$SUFFIX "$BACKUPDIR/latest/"
  179. fi
  180. return 0
  181. }
  182. #
  183. #
  184. # Run command before we begin
  185. if [ "$PREBACKUP" ]
  186. then
  187. echo ======================================================================
  188. echo "Prebackup command output."
  189. echo
  190. eval $PREBACKUP
  191. echo
  192. echo ======================================================================
  193. echo
  194. fi
  195. #
  196. #
  197. if [ "$SEPDIR" = "yes" ]; then # Check if CREATE DATABSE should be included in Dump
  198. if [ "$CREATE_DATABASE" = "no" ]; then
  199. OPT="$OPT --no-create-db"
  200. else
  201. OPT="$OPT --databases"
  202. fi
  203. else
  204. OPT="$OPT --databases"
  205. fi
  206.  
  207. # Hostname for LOG information
  208. if [ "$DBHOST" = "localhost" ]; then
  209. HOST=`hostname`
  210. if [ "$SOCKET" ]; then
  211. OPT="$OPT --socket=$SOCKET"
  212. fi
  213. else
  214. HOST=$DBHOST
  215. fi
  216. #
  217. # If backing up all DBs on the server
  218. if [ "$DBNAMES" = "all" ]; then
  219. DBNAMES="`mysql --user=$USERNAME --password=$PASSWORD --host=$DBHOST --batch --skip-column-names -e "show databases"| sed 's/ /%/g'`"
  220. #
  221. # If DBs are excluded
  222. for exclude in $DBEXCLUDE
  223. do
  224. DBNAMES=`echo $DBNAMES | sed "s/\b$exclude\b//g"`
  225. done
  226.  
  227. MDBNAMES=$DBNAMES
  228. fi
  229. #
  230. echo ======================================================================
  231. echo AutoMySQLBackup VER $VER
  232. echo Backup of Database Server - $HOST
  233. echo ======================================================================
  234. #
  235. # Test is seperate DB backups are required
  236. if [ "$SEPDIR" = "yes" ]; then
  237. echo Backup Start Time `date`
  238. echo ======================================================================
  239. # Monthly Full Backup of all Databases
  240. if [ $DOM = "01" ]; then
  241. for MDB in $MDBNAMES
  242. do
  243. #
  244. # Prepare $DB for using
  245. MDB="`echo $MDB | sed 's/%/ /g'`"
  246.  
  247. if [ ! -e "$BACKUPDIR/monthly/$MDB" ] # Check Monthly DB Directory exists.
  248. then
  249. mkdir -p "$BACKUPDIR/monthly/$MDB"
  250. fi
  251. echo Monthly Backup of $MDB...
  252. dbdump "$MDB" "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql"
  253. compression "$BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql"
  254. BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$MDB/${MDB}_$DATE.$M.$MDB.sql$SUFFIX"
  255. echo ----------------------------------------------------------------------
  256. done
  257. fi
  258. #
  259. for DB in $DBNAMES
  260. do
  261. # Prepare $DB for using
  262. DB="`echo $DB | sed 's/%/ /g'`"
  263. #
  264. # Create Seperate directory for each DB
  265. if [ ! -e "$BACKUPDIR/daily/$DB" ] # Check Daily DB Directory exists.
  266. then
  267. mkdir -p "$BACKUPDIR/daily/$DB"
  268. fi
  269. #
  270. if [ ! -e "$BACKUPDIR/weekly/$DB" ] # Check Weekly DB Directory exists.
  271. then
  272. mkdir -p "$BACKUPDIR/weekly/$DB"
  273. fi
  274. #
  275. # Weekly Backup
  276. if [ $DNOW = $DOWEEKLY ]; then
  277. echo Weekly Backup of Database \( $DB \)
  278. echo Rotating 5 weeks Backups...
  279. if [ "$W" -le 05 ];then
  280. REMW=`expr 48 + $W`
  281. elif [ "$W" -lt 15 ];then
  282. REMW=0`expr $W - 5`
  283. else
  284. REMW=`expr $W - 5`
  285. fi
  286. eval rm -fv "$BACKUPDIR/weekly/$DB_week.$REMW.*"
  287. echo
  288. dbdump "$DB" "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql"
  289. compression "$BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql"
  290. BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/$DB/${DB}_week.$W.$DATE.sql$SUFFIX"
  291. echo ----------------------------------------------------------------------
  292. #
  293. # Daily Backup
  294. else
  295. echo Daily Backup of Database \( $DB \)
  296. echo Rotating last weeks Backup...
  297. eval rm -fv "$BACKUPDIR/daily/$DB/*.$DOW.sql.*"
  298. echo
  299. dbdump "$DB" "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql"
  300. compression "$BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql"
  301. BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DB/${DB}_$DATE.$DOW.sql$SUFFIX"
  302. echo ----------------------------------------------------------------------
  303. fi
  304. done
  305. echo Backup End `date`
  306. echo ======================================================================
  307. #
  308. #
  309. else # One backup file for all DBs
  310. echo Backup Start `date`
  311. echo ======================================================================
  312. # Monthly Full Backup of all Databases
  313. if [ $DOM = "01" ]; then
  314. echo Monthly full Backup of \( $MDBNAMES \)...
  315. dbdump "$MDBNAMES" "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"
  316. compression "$BACKUPDIR/monthly/$DATE.$M.all-databases.sql"
  317. BACKUPFILES="$BACKUPFILES $BACKUPDIR/monthly/$DATE.$M.all-databases.sql$SUFFIX"
  318. echo ----------------------------------------------------------------------
  319. fi
  320. #
  321. # Weekly Backup
  322. if [ $DNOW = $DOWEEKLY ]; then
  323. echo Weekly Backup of Databases \( $DBNAMES \)
  324. echo
  325. echo Rotating 5 weeks Backups...
  326. if [ "$W" -le 05 ];then
  327. REMW=`expr 48 + $W`
  328. elif [ "$W" -lt 15 ];then
  329. REMW=0`expr $W - 5`
  330. else
  331. REMW=`expr $W - 5`
  332. fi
  333. eval rm -fv "$BACKUPDIR/weekly/week.$REMW.*"
  334. echo
  335. dbdump "$DBNAMES" "$BACKUPDIR/weekly/week.$W.$DATE.sql"
  336. compression "$BACKUPDIR/weekly/week.$W.$DATE.sql"
  337. BACKUPFILES="$BACKUPFILES $BACKUPDIR/weekly/week.$W.$DATE.sql$SUFFIX"
  338. echo ----------------------------------------------------------------------
  339. #
  340. # Daily Backup
  341. else
  342. echo Daily Backup of Databases \( $DBNAMES \)
  343. echo
  344. echo Rotating last weeks Backup...
  345. eval rm -fv "$BACKUPDIR/daily/*.$DOW.sql.*"
  346. echo
  347. dbdump "$DBNAMES" "$BACKUPDIR/daily/$DATE.$DOW.sql"
  348. compression "$BACKUPDIR/daily/$DATE.$DOW.sql"
  349. BACKUPFILES="$BACKUPFILES $BACKUPDIR/daily/$DATE.$DOW.sql$SUFFIX"
  350. echo ----------------------------------------------------------------------
  351. fi
  352. echo Backup End Time `date`
  353. echo ======================================================================
  354. fi
  355. echo Total disk space used for backup storage..
  356. echo Size - Location
  357. echo `du -hs "$BACKUPDIR"`
  358. #
  359. # Run command when we're done
  360. if [ "$POSTBACKUP" ]
  361. then
  362. echo ======================================================================
  363. echo "Postbackup command output."
  364. echo
  365. eval $POSTBACKUP
  366. echo
  367. echo ======================================================================
  368. fi
  369. #
  370. #Clean up IO redirection
  371. exec 1>&6 6>&- # Restore stdout and close file descriptor #6.
  372. exec 1>&7 7>&- # Restore stdout and close file descriptor #7.
  373. #
  374. if [ "$MAILCONTENT" = "files" ]
  375. then
  376. if [ -s "$LOGERR" ]
  377. then
  378. # Include error log if is larger than zero.
  379. BACKUPFILES="$BACKUPFILES $LOGERR"
  380. ERRORNOTE="WARNING: Error Reported - "
  381. fi
  382. #Get backup size
  383. ATTSIZE=`du -c $BACKUPFILES | grep "[[:digit:][:space:]]total$" |sed s/\s*total//`
  384. if [ $MAXATTSIZE -ge $ATTSIZE ]
  385. then
  386. BACKUPFILES=`echo "$BACKUPFILES" | sed -e "s# # -a #g"` #enable multiple attachments
  387. mutt -s "$ERRORNOTE MySQL Backup Log and SQL Files for $HOST - $DATE" $BACKUPFILES $MAILADDR < $LOGFILE #send via mutt
  388. else
  389. cat "$LOGFILE" | mail -s "WARNING! - MySQL Backup exceeds set maximum attachment size on $HOST - $DATE" $MAILADDR
  390. fi
  391. elif [ "$MAILCONTENT" = "log" ]
  392. then
  393. cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR
  394. if [ -s "$LOGERR" ]
  395. then
  396. cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
  397. fi
  398. elif [ "$MAILCONTENT" = "quiet" ]
  399. then
  400. if [ -s "$LOGERR" ]
  401. then
  402. cat "$LOGERR" | mail -s "ERRORS REPORTED: MySQL Backup error Log for $HOST - $DATE" $MAILADDR
  403. cat "$LOGFILE" | mail -s "MySQL Backup Log for $HOST - $DATE" $MAILADDR
  404. fi
  405. else
  406. if [ -s "$LOGERR" ]
  407. then
  408. cat "$LOGFILE"
  409. echo
  410. echo "###### WARNING ######"
  411. echo "Errors reported during AutoMySQLBackup execution.. Backup failed"
  412. echo "Error log below.."
  413. cat "$LOGERR"
  414. else
  415. cat "$LOGFILE"
  416. fi
  417. fi
  418. #
  419. if [ -s "$LOGERR" ]
  420. then
  421. STATUS=1
  422. else
  423. STATUS=0
  424. fi
  425. #
  426. # Clean up Logfile
  427. eval rm -f "$LOGFILE"
  428. eval rm -f "$LOGERR"
  429. #
  430. exit $STATUS
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement