Advertisement
Guest User

Untitled

a guest
Aug 13th, 2017
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 6.37 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #MySQL option: -m
  4. #+Client dependencies: Bash, OpenSSH (daemon), mysqldump
  5. #+Server dependencies: Bash, OpenSSH (client)
  6. #+Create a file at /etc/mysql/mysql.cred which contains the MySQL credentials as such:
  7. #user=someuser
  8. #password=somepass
  9. #+Make sure only your backupuser account can read this: chown backupuser:backupuser /etc/mysql/mysql.creds && chmod 660 /etc/mysql/mysql.creds
  10. #+Use the following create statement to create a backup user in MySQL:
  11. #CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'CHANGEPASSHERE';
  12. #+Use the following grant statement to allow the user to back up the data:
  13. #GRANT SHOW DATABASES, SELECT, LOCK TABLES, RELOAD ON *.* to backupuser@localhost IDENTIFIED BY 'CHANGEPASSHERE';FLUSH PRIVILEGES;
  14. #+MySQL slaves also need to add an additional grant:
  15. #GRANT SUPER ON *.* to backupuser@localhost IDENTIFIED BY 'CHANGEPASSHERE';FLUSH PRIVILEGES;
  16. #+These lines may be useful for backing up a slave, do your research before using this and know how your servers are set up.
  17. #ssh $SSHUSER@$MYSQLSRV "mysqladmin --user='$MYSQLUSER' --password='$MYSQLPASS' stop-slave" || _printerr "ERROR - $LINENO - Unable to stop MySQL slave replication on $MYSQLSRV." 1>> $LOG 2>> $LOG #Only needed for slave servers,
  18. #ssh $SSHUSER@$MYSQLSRV "mysqladmin --user='$MYSQLUSER' --password='$MYSQLPASS' start-slave" || _printerr "ERROR - $LINENO - Unable to start MySQL slave replication on $MYSQLSRV." 1>> $LOG 2>> $LOG #Only needed for slave servers,
  19. #MYSQLRSYNCFILES=( "/etc/my.cnf" "/var/lib/mysql/master.info" "/var/lib/mysql/relay-log.info")
  20. #for EACHFILE in "${MYSQLRSYNCFILES[@]}";do
  21. #scp -q $SSHUSER@$MYSQLSRV:$EACHFILE /backup/someserver/$EACHFILE || _printerr "ERROR - $LINENO - Unable to scp MySQL slave file $EACHFILE on $MYSQLSRV." 1>> $LOG 2>> $LOG
  22. #done
  23.  
  24. #MySQL configuration
  25. MYSQLSRV="Viridian" #The hostname of the MySQL server.
  26. MYSQLUSER=$(awk -F'=' '$1 ~ /user/ { print $2 }' /etc/mysql/mysql.cred)
  27. MYSQLPASS=$(awk -F'=' '$1 ~ /pass/ { print $2 }' /etc/mysql/mysql.cred)
  28.  
  29. if [ "$MYSQLOPT" = 1 ]; then #MySQL section
  30. echo "$($TIME) - Backing up MySQL on $MYSQLSRV" | tee -a $LOG
  31.   for EACHMYSQLDIR in "MySQL" "MySQL/Temp" "MySQL/Daily" "MySQL/Weekly" "MySQL/Monthly" "MySQL/Yearly"; do
  32.     if [ ! -d $BKUPDIR/$MYSQLSRV/$EACHMYSQLDIR ];then
  33.       mkdir -p $BKUPDIR/$MYSQLSRV/$EACHMYSQLDIR 1>>$LOG 2>>$LOG || _printerr "ERROR - $LINENO - Unable to create MySQL backup directory $EACHMYSQLDIR for $MYSQLSRV in $BKUPDIR." 1>>$LOG 2>>$LOG
  34.     fi
  35.   done
  36.   if ! grep -i $MYSQLSRV /home/$SSHUSER/.ssh/known_hosts > /dev/null; then
  37.     echo "Host key for $MYSQLSRV:" 1>> /home/$SSHUSER/.ssh/known_hosts
  38.     ssh-keyscan -t rsa,dsa $MYSQLSRV 1>> /home/$SSHUSER/.ssh/known_hosts 2>>$LOG || _printerr "ERROR - $LINENO - Unable to add host key for $MYSQLSRV to known host key list." 2>>$LOG
  39.   fi
  40.   if ssh $SSHUSER@$MYSQLSRV : 1>> $LOG 2>> $LOG;then
  41.     ssh $SSHUSER@$MYSQLSRV "echo 'show databases\g' | mysql --user='$MYSQLUSER' --password='$MYSQLPASS' | sed '/^information_schema\|^Database\|lost+found/d'" | (while read -r EACHDBNAME;do
  42.     echo "Working on $EACHDBNAME"
  43.     DUMPDAY=$(date +%F)
  44.     DUMPTIME=$(date +%H-%M-%S)
  45.     ssh $SSHUSER@$MYSQLSRV -n "mysqldump --user='$MYSQLUSER' --password='$MYSQLPASS' $EACHDBNAME | gzip" 1> $BKUPDIR/$MYSQLSRV/MySQL/Temp/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz || _printerr "ERROR - $LINENO - Unable to back up MySQL database $EACHDBNAME on $MYSQLSRV."
  46.     if [ -s $BKUPDIR/$MYSQLSRV/MySQL/Temp/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz ];then #If the DB backup exists and is non-zero in size, copy the daily and move on.
  47.       echo "Total bytes received for database $EACHDBNAME: $(/bin/ls $BKUPDIR/$MYSQLSRV/MySQL/Temp/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz -l | cut -d' ' -f5)"
  48.       mv $BKUPDIR/$MYSQLSRV/MySQL/Temp/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz $BKUPDIR/$MYSQLSRV/MySQL/Daily/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz || _printerr "ERROR - $LINENO - Unable to copy new daily MySQL backup for $MYSQLSRV."
  49.       ls -1 -t $BKUPDIR/$MYSQLSRV/MySQL/Daily/$EACHDBNAME* | awk --assign=NUMDAILYDUMPFILES=$NUMDAILYDUMPFILES '{ if (NR > NUMDAILYDUMPFILES) {print}}' | xargs rm -f ; [ $(echo "${PIPESTATUS[*]}" | sed 's/ //g') -eq "0" ] || _printerr "ERROR - $LINENO - Unable to remove old daily MySQL backup for $MYSQLSRV."
  50.       if [ $(date +%a) = "Sat" ];then #Copy the weekly
  51.     cp $BKUPDIR/$MYSQLSRV/MySQL/Daily/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz $BKUPDIR/$MYSQLSRV/MySQL/Weekly/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz || _printerr "ERROR - $LINENO - Unable to copy new weekly MySQL backup for $MYSQLSRV."
  52.     ls -1 -t $BKUPDIR/$MYSQLSRV/MySQL/Weekly/$EACHDBNAME* | awk --assign=NUMWEEKLYDUMPFILES=$NUMWEEKLYDUMPFILES '{ if (NR > NUMWEEKLYDUMPFILES) {print}}' | xargs rm -f ; [ $(echo "${PIPESTATUS[*]}" | sed 's/ //g') -eq "0" ] || _printerr "ERROR - $LINENO - Unable to remove old weekly MySQL backup for $MYSQLSRV."
  53.       fi
  54.       if [ $(date +%d) = "01" ];then #Copy the monthly
  55.     cp $BKUPDIR/$MYSQLSRV/MySQL/Daily/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz $BKUPDIR/$MYSQLSRV/MySQL/Monthly/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz || _printerr "ERROR - $LINENO - Unable to copy new monthly MySQL backup for $MYSQLSRV."
  56.     ls -1 -t $BKUPDIR/$MYSQLSRV/MySQL/Monthly/$EACHDBNAME* | awk --assign=NUMMONTHLYDUMPFILES=$NUMMONTHLYDUMPFILES '{ if (NR > NUMMONTHLYDUMPFILES) {print}}' | xargs rm -f ; [ $(echo "${PIPESTATUS[*]}" | sed 's/ //g') -eq "0" ] || _printerr "ERROR - $LINENO - Unable to remove old monthly MySQL backup for $MYSQLSRV."
  57.       fi
  58.       if [ $(date +%j) = "001" ];then #Copy the yearly
  59.     cp $BKUPDIR/$MYSQLSRV/MySQL/Daily/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz $BKUPDIR/$MYSQLSRV/MySQL/Yearly/$EACHDBNAME-on-$DUMPDAY-at-$DUMPTIME.sql.gz || _printerr "ERROR - $LINENO - Unable to copy new yearly MySQL backup for $MYSQLSRV."
  60.     ls -1 -t $BKUPDIR/$MYSQLSRV/MySQL/Yearly/$EACHDBNAME* | awk --assign=NUMYEARLYDUMPFILES=$NUMYEARLYDUMPFILES '{ if (NR > NUMYEARLYDUMPFILES) {print}}' | xargs rm -f ; [ $(echo "${PIPESTATUS[*]}" | sed 's/ //g') -eq "0" ] || _printerr "ERROR - $LINENO - Unable to remove old yearly MySQL backup for $MYSQLSRV."
  61.       fi
  62.     else
  63.       _printerr "ERROR - $LINENO - Backup of DB $EACHDBNAME failed (zero length backup file or it doesn't exist), keeping old backup (if one exist)."
  64.     fi
  65.     done) 1>>$LOG 2>>$LOG
  66.   else
  67.     _printerr "ERROR - $LINENO - SSH to $MYSQLSRV failed." 1>>$LOG 2>>$LOG
  68.   fi
  69. fi
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement