• mysql自动备份脚本开发,包含自动清理备份文件机制


    背景:

    因公司大量的将mysql数据库转移到kubernetes集群上,考虑到数据安全性,需要对mysql容器里的数据库进行备份工作,为了方便集中管理这些备份文件,经过分析及考虑,计划使用一台服务器作为数据库备份中心,用于存放备份数据文件。

    mysql备份脚本:

    开发的脚本如下:

    1. #!/bin/bash
    2. #author:xionghj001
    3. #Dump backup execution log
    4. log_output () {
    5. if [ ! -f /back_db/dump.log ]
    6. then
    7. cd /back_db/
    8. touch dump.log
    9. fi
    10. echo -e "\e[$1m[$(date +"%F %T")] $2 \e[0m"
    11. }
    12. 4a-test () {
    13. #parameter
    14. mysql_host="10.15.0.137"
    15. mysql_port="21527"
    16. mysql_name=(jxsl_4a)
    17. backup_addr="4a-test"
    18. mysql_charset="utf8"
    19. mysql_password="jh_Mysql123"
    20. #Check if the backup MySQL service is running
    21. mysql -h$mysql_host -P$mysql_port -uroot -p$mysql_password <
    22. use mysql;
    23. select host,user from user where user='root';
    24. exit
    25. end
    26. flag=`echo $?`
    27. if [ $flag != "0" ]
    28. then
    29. log_output 31 "[ERROR]:Can't connect mysql server! backup stop!" | tee -a /back_db/dump.log
    30. else
    31. log_output 32 "[INFO] MySQL connect ok! Please wait......" | tee -a /back_db/dump.log
    32. fi
    33. # Check if the backup directory exists
    34. for a in ${mysql_name[@]}
    35. do
    36. if [ ! -d /back_db/$backup_addr ]
    37. then
    38. mkdir -p /back_db/$backup_addr
    39. if [ ! -d /back_db/$backup_addr/$a ]
    40. then
    41. mkdir -p /back_db/$backup_addr/$a
    42. fi
    43. else
    44. if [ ! -d /back_db/$backup_addr/$a ]
    45. then
    46. mkdir -p /back_db/$backup_addr/$a
    47. fi
    48. fi
    49. done
    50. # Can't connect mysql server
    51. for i in ${mysql_name[@]}
    52. do
    53. if [ ! -f /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz ]
    54. then
    55. log_output 32 "[INFO] running backup mysql $i" | tee -a /back_db/dump.log
    56. `/usr/bin/mysqldump --skip-opt -h$mysql_host -P$mysql_port -uroot -p$mysql_password --database $i --default-character-set=$mysql_charset | gzip > /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz`
    57. flag=`echo $?`
    58. if [ $flag == "0" ]
    59. then
    60. log_output 32 "[INFO] database $mysql_name success backup to /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz" | tee -a /back_db/dump.log
    61. else
    62. log_output 31 "[ERROR] database $mysql_name backup fail!" | tee -a /back_db/dump.log
    63. fi
    64. else
    65. log_output 32 "[INFO] mysql $i is backup" | tee -a /back_db/dump.log
    66. fi
    67. # clean history backup
    68. r="30"
    69. path=/back_db/$backup_addr/$i
    70. list=(`find $path -type f -name "*.sql.gz" -mtime +$r`)
    71. for ((i=0;i<${#list[*]};i++))
    72. do
    73. rm -rf ${list[$i]}
    74. flagc=`echo $?`
    75. if [ $flagc == "0" ]
    76. then
    77. log_output 32 "INFO Clear ${list[$i]} path $r day before" | tee -a /back_db/dump.log
    78. fi
    79. done
    80. done
    81. }
    82. # running backup mysql
    83. 4a-test

    开发脚本过程:

    第一部分:脚本执行日志文件函数:

    这里是记录脚本执行过程并生成文件的函数

    1. #Dump backup execution log
    2. log_output () {
    3. if [ ! -f /back_db/dump.log ] #判断脚本日志文件是否存在
    4. then
    5. cd /back_db/
    6. touch dump.log #如果不存在就直接创建日志文件
    7. fi
    8. echo -e "\e[$1m[$(date +"%F %T")] $2 \e[0m"
    9. }

    第二部分:自动执行备份数据库过程函数:

    自动备份脚本函数包含了5个功能。

    功能一:

    获取需要备份数据库的相关信息。

    1. 4a-test () {
    2. #parameter
    3. mysql_host="10.15.3.150"
    4. mysql_port="3308"
    5. mysql_name=(four_test)
    6. backup_addr="four-test"
    7. mysql_charset="utf8"
    8. mysql_password="jh_Mysql123"

    功能二:

    检查需要备份的数据库是否运行正常。

    1. #Check if the backup MySQL service is running
    2. mysql -h$mysql_host -P$mysql_port -uroot -p$mysql_password <
    3. use mysql;
    4. select host,user from user where user='root';
    5. exit
    6. end
    7. flag=`echo $?`
    8. if [ $flag != "0" ]
    9. then
    10. log_output 31 "[ERROR]:Can't connect mysql server! backup stop!" | tee -a /back_db/dump.log
    11. else
    12. log_output 32 "[INFO] MySQL connect ok! Please wait......" | tee -a /back_db/dump.log
    13. fi

    功能三:

    检查备份的目录是否存在,不存在的则直接创建。

    1. # Check if the backup directory exists
    2. for a in ${mysql_name[@]}
    3. do
    4. if [ ! -d /back_db/$backup_addr ]
    5. then
    6. mkdir -p /back_db/$backup_addr
    7. if [ ! -d /back_db/$backup_addr/$a ]
    8. then
    9. mkdir -p /back_db/$backup_addr/$a
    10. fi
    11. else
    12. if [ ! -d /back_db/$backup_addr/$a ]
    13. then
    14. mkdir -p /back_db/$backup_addr/$a
    15. fi
    16. fi
    17. done

    功能四:

    执行数据库备份操作,并清理历史备份文件操作。

    1. # Can't connect mysql server
    2. for i in ${mysql_name[@]}
    3. do
    4. if [ ! -f /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz ]
    5. then
    6. log_output 32 "[INFO] running backup mysql $i" | tee -a /back_db/dump.log
    7. `/usr/bin/mysqldump --skip-opt -h$mysql_host -P$mysql_port -uroot -p$mysql_password --database $i --default-character-set=$mysql_charset | gzip > /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz`
    8. flag=`echo $?`
    9. if [ $flag == "0" ]
    10. then
    11. log_output 32 "[INFO] database $mysql_name success backup to /back_db/$backup_addr/$i/$(date "+%Y%m%d").sql.gz" | tee -a /back_db/dump.log
    12. else
    13. log_output 31 "[ERROR] database $mysql_name backup fail!" | tee -a /back_db/dump.log
    14. fi
    15. else
    16. log_output 32 "[INFO] mysql $i is backup" | tee -a /back_db/dump.log
    17. fi
    18. # clean history backup
    19. r="30"
    20. path=/back_db/$backup_addr/$i
    21. list=(`find $path -type f -name "*.sql.gz" -mtime +$r`)
    22. for ((i=0;i<${#list[*]};i++))
    23. do
    24. rm -rf ${list[$i]}
    25. flagc=`echo $?`
    26. if [ $flagc == "0" ]
    27. then
    28. log_output 32 "INFO Clear ${list[$i]} path $r day before" | tee -a /back_db/dump.log
    29. fi
    30. done
    31. done
    32. }

    功能五:

    调用函数。

    1. # running backup mysql
    2. 4a-test

     第三部分:设置定时任务执行:

    因为脚本开发完成之后,需要设置一个定时任务,让脚本自动执行。

    策略为:每天凌晨01点03分执行。

    1. [root@db-back back_db]# crontab -e
    2. 03 01 * * * /bin/bash /back_db/mysqldump.sh

    总结说明:

     该脚本适应两种情况的备份场景:

    场景一:

    一个数据库服务中存在多个数据库的备份,这样的场景在mysql_name变量中加入多个数据库名称,要以空格键分割。因为脚本再开发的过中就考虑多个数据库名称的情况,所以mysql_name变量是以数组的形式存在的。

    场景二:

    一个数据库服务中只有一个数据库需要备份,这时候可以复制整个函数,然后将函数中涉及到数据库信息的进行修改即可,然后在调用函数就能做到多个数据库服务的数据备份了。

     

  • 相关阅读:
    前端js手写面试题汇总(二)
    嵌入式快速入门学习笔记-input输入子系统
    NodeMCU ESP8266 基于Arduino IDE的串口使用详解(图文并茂)
    05【SpringMVC的数据绑定】
    web网页设计实例作业HTML+CSS+JavaScript蔬菜水果商城购物设计
    Vatee万腾平台:创新科技,助力企业腾飞
    SuperMap iClient3D for WebGL教程(S3MTilesLayer)- 显示优化设置
    PX4入门指南
    点云从入门到精通技术详解100篇-基于路侧激光雷达的交通目标感知方法与实现(下)
    网络协议三要素
  • 原文地址:https://blog.csdn.net/jiang0615csdn/article/details/139746779