翼度科技»论坛 编程开发 .net 查看内容

运维脚本: Mysql数据库备份

9

主题

9

帖子

27

积分

新手上路

Rank: 1

积分
27
背景介绍


  • 在数据库管理和运维中,定期备份数据库是防止数据丢失和灾难恢复的基础。对于 MySQL 数据库,手动备份可能会导致频繁的操作失误或遗漏,因此,自动化备份脚本的编写变得尤为重要。
  • 本文将为你介绍如何编写一个简单且实用的 MySQL 备份脚本,通过该脚本,用户可以轻松自动化备份过程,确保数据库数据的安全
目标和用途


  • 创建一个简单的 Bash 脚本,用于自动备份 MySQL 数据库。
  • 通过自动化脚本来减轻数据库管理负担,确保定期备份。
  • 提供自动化的备份策略,例如按日期创建备份文件,保留历史备份等。
备份工具


  • 采用percona-xtrabckup实现MySQL数据库物理热备。
  • xtrabckup 优点

    • 备份速度快,物理备份可靠。
    • 备份过程不会打断正在执行的事务(无需锁表)
    • 自动备份校验
    • 还原速度快

脚本示例
  1.   1 #!/bin/bash
  2.   2 # 作者: 阿杰
  3.   3 # 说明:Mysql数据库备份脚本
  4.   4 # 备份工具: percona-Xtrabackup
  5.   5 # 备份策略:
  6.   6 #     (1) 每周日凌晨2点进行全量备份
  7.   7 #     (2) 每周一至周六凌晨两点进行增量备份
  8.   8 # 定时任务配置策略
  9.   9 # 0 2 * * * bash /data/mysql_backup/mysql_backup.sh
  10. 10 # 告警:可根据备份失败触发邮件告警机制。告警需自行配置
  11. 11
  12. 12
  13. 13 # 日志记录
  14. 14 log_err() {
  15. 15     printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[31mERROR: \033[0m$@\n" >> /data/mysql_backup/error.log
  16. 16     exit 1
  17. 17 }
  18. 18
  19. 19 log_info() {
  20. 20     printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[32mINFO: \033[0m$@\n" >> /data/mysql_backup/info.log
  21. 21 }
  22. 22
  23. 23 log_warning() {
  24. 24     printf "[$(date +'%Y-%m-%dT%H:%M:%S')]: \033[33mWARNING: \033[0m$@\n" >> /data/mysql_backup/warning.log
  25. 25 }
  26. 26
  27. 27
  28. 28
  29. 29 # 初始化函数
  30. 30 init
  31. 31 function init() {
  32. 32     init_config
  33. 33     check_backup_is_exist
  34. 34 }
  35. 35
  36. 36 # 初始化配置
  37. 37 function init_config() {
  38. 38     # 备份工具
  39. 39     xtrabckup_path="/usr/bin/innobackupex"
  40. 40     # Mysql配置文件路径
  41. 41     mysql_cnf_path="/etc/my.cnf"
  42. 42     # 线程数
  43. 43     thread_cnt=4
  44. 44     #备份路径, 时间格式:年-周
  45. 45     backup_base_dir="/data/mysql_backup/$(date "+%Y-%U")"
  46. 46     # 当前备份文件
  47. 47     current_backup_path="${backup_base_dir}/$(date "+%Y-%m-%d")"
  48. 48
  49. 49     # 数据库信息
  50. 50     db_host="localhost"
  51. 51     db_user="root"
  52. 52     db_password="xxxxxxx"
  53. 53
  54. 54 }
  55. 55
  56. 56 # 检查是否存在percona-Xtrabackup 工具
  57. 57 function check_backup_is_exist() {
  58. 58     if [ -z "$(rpm -qa | grep xtrabackup)" ];then
  59. 59         curl -o /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm  https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.9/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm > /dev/null 2>&1
  60. 60         if [ $? -ne 0 ];then
  61. 61             log_err "[check_backup_is_exist] 在线安装 percona-xtrabackup 备份工具失败! 请检查是否可出网"
  62. 62         fi
  63. 63         yum -y install /tmp/percona-xtrabackup-24-2.4.9-1.el7.x86_64.rpm 1> /dev/null
  64. 64         if [ $? -ne 0 ];then
  65. 65             log_err "[check_backup_is_exist] yum 安装 percona-xtrabackup 备份工具失败! "
  66. 66         fi
  67. 67     fi
  68. 68 }
  69. 69
  70. 70 # 全量备份
  71. 71 function full_backup() {
  72. 72     # 不存在则创建
  73. 73     if [ ! -d "$backup_base_dir" ];then
  74. 74         mkdir -pv $backup_base_dir > /dev/null 2>&1
  75. 75         if [ $? -ne 0 ];then
  76. 76             log_err "[full_backup] 创建备份目录 $backup_base_dir 失败!"
  77. 77         fi
  78. 78         # 全量备份
  79. 79         full
  80. 80     else
  81. 81         # 目录存在,目录下内容为空 则执行全量备份
  82. 82         if [ -z "$(ls $current_backup_path | wc -l)" ];then
  83. 83             full
  84. 84         else
  85. 85             log_warning "[full_backup] 存在已有备份数据, 跳过全量备份!"
  86. 86             return
  87. 87         fi
  88. 88     fi
  89. 89
  90. 90
  91. 91 }
  92. 92
  93. 93 function full() {
  94. 94     $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp $current_backup_path 1> /dev/null
  95. 95     if [$? -ne 0 ];then
  96. 96         log_err "[full_backup] 执行备份失败 备份路径: $current_backup_path"
  97. 97     fi
  98. 98     log_info "[full_backup] 全量备份结束, 备份路径: $current_backup_path"
  99. 99     # 全量备份完成后退出脚本
  100. 100     exit 1
  101. 101 }
  102. 102
  103. 103 # 增量备份
  104. 104 function incremental_backup() {
  105. 105     prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-1day" "+%Y-%m-%d")"
  106. 106     stat $prev_backup_dir > /dev/null 2>&1
  107. 107     if [ $? -ne 0 ];then
  108. 108         log_warning "[incremental_backup] 前一天执行备份失败 备份路径:$prev_backup_dir"
  109. 109         # 查找上一次备份结果
  110. 110         while true;do
  111. 111             local i=2
  112. 112             prev_backup_dir="/data/mysql_backup/$(date "+%Y-%U")/$(date -d "-${i}day" "+%Y-%m-%d")"
  113. 113             stat $prev_backup_dir > /dev/null 2>&1
  114. 114             if [ $? -eq 0 ];then
  115. 115                 break
  116. 116             fi
  117. 117             ((i++))
  118. 118         done
  119. 119     fi
  120. 120     $xtrabckup_path --defaults-file=$mysql_cnf_path --host=$db_host --user=$db_user --password=$db_password --parallel=$thread_cnt --slave-info --safe-slave-backup --no-timestamp $current_backup_path --incremental-basedir=${prev_backup_dir} 1> /dev/null
  121. 121     if [ $? -ne 0 ]; then
  122. 122         log_err "[incremental_backup] 执行增量备份失败, 备份路径: $current_backup_path"
  123. 123     fi
  124. 124     log_info "[incremental_backup] 增量备份结束, 备份路径: $current_backup_path"
  125. 125 }
  126. 126
  127. 127
  128. 128 # 主函数
  129. 129 function main() {
  130. 130     full_backup
  131. 131     incremental_backup
  132. 132 }
  133. 133
  134. 134 main
复制代码
 

来源:https://www.cnblogs.com/chang157122/p/18581622
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具