说说MySQL自动化备份脚本

今天完成了一个数据库备份的脚本,主要功能如下,希望大家给一些改进的建议

  1. -a: backup all database #全库备份 
  2. -e: backup each database#分库备份 
  3. -d: backup single/multi database#备份指定的一个库或者多个库 
  4. -t: backup single/multi table of single database#备份一个库下面的一个表或者多个表 
  5. -b: backup binlog#备份binlog日志,备份过程,每次记录***的二进制文件号,将之前范围内的binlog打包(bz2格式),放在$DIR_BACKUP目录下 
  6. -r: recover all database(!require password!)#恢复全库,为保安全,恢复时需要输入密码 
  7. -o: recover single database/talbe,you should be designation database name(!require password!)#恢复单库或单表 
  8. -p: create connect mysql password#创建连接mysql的密码文件,存放位置$DIR_MySQL/etc目录下,权限是600 
  9. -s: configuration rsyncd#创建rsyncd服务(需要时,可修改参数创建,因backup机上有rsyncd服务,故不需要在每台DB server上创建rsyncd服务) 
  10.     If you want ceate a rsyncd, you should enter 'bakrec_mysql.sh -s cet' 
  11.     If you want restart rsyncd, you should enter 'bakrec_mysql.sh -s rst' 
  12. -c: sync to backup center#同步到backup1
  1. #!/bin/bash 
  2. # email: [email protected] 
  3. last change time: 2011-08-03 
  4. set -e 
  5. set -u 
  6. TIME=`date +%Y%m%d%H%M%S` 
  7. TIME_7=`date -d '7 days ago' +%Y%m%d%H%M%S` 
  8. TIME_YM=`date +%Y%m` 
  9. DIR_MYSQL='/usr/local/mysql' 
  10. DIR_BACKUP="/tmp/backup" 
  11. DIR_DATA="$DIR_MYSQL/data" 
  12. DIR_PASSWD="$DIR_MYSQL/etc" 
  13. FILE_PASSWD="$DIR_PASSWD/passwordfile" 
  14. BINLOG_NAME='mysql-bin' 
  15. CMD_MYSQLBINLOG="$DIR_MYSQL/bin/mysqlbinlog" 
  16. CMD_MYSQLDUMP="$DIR_MYSQL/bin/mysqldump" 
  17. CMD_MYSQL="$DIR_MYSQL/bin/mysql" 
  18. LIST_EXCLUDE_DB='(test|information_schema|performance_schema)' 
  19. if [ ! -d $DIR_BACKUP/$TIME_YM ]; then 
  20. mkdir -p $DIR_BACKUP/$TIME_YM 
  21. fi 
  22. cd $DIR_BACKUP/$TIME_YM 
  23. function result_status() 
  24. if [ $? -eq 0 ]; then 
  25. echo "[`date +%Y%m%d%H%M%S`] SUCCESS! "|tee -a log.$TIME_YM 
  26. else 
  27. echo "[`date +%Y%m%d%H%M%S`] ERROR! "|mail -s "backup error $HOSTNAME" [email protected]|tee -a log.$TIME_YM 
  28. fi 
  29. function usage_error() 
  30. echo "Usage: $0 RUN ERROR" 
  31. echo " 
  32. -a: backup all database 
  33. -e: backup each database 
  34. -d: backup single/multi database 
  35. -t: backup single/multi table of single database 
  36. -b: backup binlog 
  37. -r: recover all database(!require password!) 
  38. -o: recover single database/talbe,you should be designation database name(!require password!) 
  39. -p: create connect mysql password 
  40. -s: configuration rsyncd 
  41. If you want ceate a rsyncd, you should enter '$0 -s cet' 
  42. If you want restart rsyncd, you should enter '$0 -s rst' 
  43. -c: sync to backup center 
  44. exit 0 
  45. function read_pwd() 
  46. read USER PASSWD < $FILE_PASSWD 
  47. function backup() 
  48. read_pwd 
  49. LOGBIN_STATUS=`$CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW VARIABLES LIKE 'log_bin'" | gawk '{print $2}'
  50. if [ $LOGBIN_STATUS = "ON" ]; then 
  51. MASTER='--master-data=2' 
  52. else 
  53. MASTER=' ' 
  54. fi 
  55. function backup_all() 
  56. backup 
  57. $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R -A --add-drop-database $MASTER |gzip >$HOSTNAME.all.$TIME.sql.gz 
  58. function backup_each() 
  59. backup 
  60. for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB) 
  61. do 
  62. $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER $db --databases |gzip >$HOSTNAME.$db.$TIME.sql.gz 
  63. done 
  64. delete 7 days ago 
  65. for db in $($CMD_MYSQL -u$USER -p$PASSWD -N -s -e "SHOW DATABASES"|egrep -v $LIST_EXCLUDE_DB) 
  66. do 
  67. if [ ! -f $HOSTNAME.$db.$TIME_7.sql.gz ]; then 
  68. echo 
  69. else 
  70. rm $HOSTNAME.$db.$TIME_7.sql.gz -f 
  71. fi 
  72. done 
  73. function backup_db() 
  74. shift 
  75. backup 
  76. $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER --databases $@| gzip>$HOSTNAME.$OPTARG.$TIME.sql.gz 
  77. function backup_dt() 
  78. shift 
  79. if [ $# -ge 2 ]; then 
  80. backup 
  81. $CMD_MYSQLDUMP -u$USER -p$PASSWD -x -R $MASTER $@| gzip>$HOSTNAME.$OPTARG.$TIME.sql.gz 
  82. else 
  83. usage_error 
  84. fi 
  85. function backup_binlog() 
  86. if [ -s $DIR_BACKUP/mysql-bin.queue ]; then 
  87. read POS < $DIR_BACKUP/mysql-bin.queue 
  88. cd $DIR_DATA 
  89. tar -jcvf $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME.bz2 `gawk -F'/' '{print $2}' $BINLOG_NAME.index |sed -n "/$POS/,//p"
  90. cd - 
  91. if [ -f $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 ]; then 
  92. rm $DIR_BACKUP/$TIME_YM/$HOSTNAME.$POS.$TIME_7.bz2 -f 
  93. fi 
  94. fi 
  95. # write last pos 
  96. gawk -F'/' '{print $2}' $DIR_DATA/$BINLOG_NAME.index | tail -n 1 >$DIR_BACKUP/mysql-bin.queue 
  97. function recover_all() 
  98. read_pwd 
  99. shift 
  100. $CMD_MYSQL -u$USER -p -e "source $@" 
  101. function recover_dt() 
  102. read_pwd 
  103. shift 
  104. if [ $# -eq 2 ]; then 
  105. $CMD_MYSQL -u$USER -p -D $1 -e "source $2" 
  106. else 
  107. usage_error 
  108. fi 
  109. function passwd_create() 
  110. if [ ! -e "$DIR_PASSWD" ]; then 
  111. mkdir -p $DIR_PASSWD 
  112. fi 
  113. echo -n "Please enter MySQL(user=root)'s password:" 
  114. read -s MYSQL_FASSWD 
  115. cat >$FILE_PASSWD <<+ 
  116. root $MYSQL_FASSWD 
  117. chmod 600 $FILE_PASSWD 
  118. function rsyncd() 
  119. shift 
  120. if [ $# -eq 0 ]; then 
  121. usage_error 
  122. else 
  123. DIR_RSYNCD='/usr/local/rsync' 
  124. FILE_RSYNCD_PASSWORD="$DIR_RSYNCD/rsyncd.password" 
  125. case "$1" in 
  126. 'cet'
  127. if [ ! -d $DIR_RSYNCD ]; then 
  128. mkdir -p $DIR_RSYNCD 
  129. fi 
  130. if [ ! -e "$DIR_RSYNCD/rsyncd.conf" ]; then 
  131. touch $DIR_RSYNCD/rsyncd.conf 
  132. fi 
  133. mv $DIR_RSYNCD/rsyncd.conf $DIR_RSYNCD/rsyncd.conf.$TIME.bak 
  134. cat >$DIR_RSYNCD/rsyncd.conf <<+ 
  135. uid = root 
  136. gid = root 
  137. use chroot = no 
  138. max connections = 5 
  139. lock file = $DIR_RSYNCD/rsyncd.lock 
  140. log file = $DIR_RSYNCD/rsyncd.log 
  141. pid file = $DIR_RSYNCD/rsyncd.pid 
  142. hosts allow = 192.168.250.251 
  143. hosts deny = * 
  144. ignore errors 
  145. read only = yes 
  146. list = no 
  147. auth users = backupdbuser 
  148. secrets file = $DIR_RSYNCD/rsyncd.password 
  149. [BINLOG] 
  150. path = $DIR_DATA 
  151. include = $BINLOG_NAME.* 
  152. exclude = * 
  153. [DUMPDB] 
  154. path = $DIR_BACKUP 
  155. cat >$FILE_RSYNCD_PASSWORD <<+ 
  156. username:password 
  157. chmod 600 $FILE_RSYNCD_PASSWORD 
  158. exit 0 
  159. ;; 
  160. 'rst'
  161. if [ -s "$DIR_RSYNCD/rsyncd.pid" ]; then 
  162. rsyncd_pid=`cat "$DIR_RSYNCD/rsyncd.pid"
  163. if (kill -0 $rsyncd_pid 2>/dev/null); then 
  164. echo "Shutting down rsyncd" 
  165. kill $rsyncd_pid 
  166. else 
  167. echo "rsyncd #$rsyncd_pid is not running!" 
  168. rm "$DIR_RSYNCD/rsyncd.pid" 
  169. fi 
  170. fi 
  171. sleep 2 
  172. rsync --daemon --config=$DIR_RSYNCD/rsyncd.conf --port=873 
  173. echo "rsync --daemon --config=$DIR_RSYNCD/rsyncd.conf --port=873" 
  174. echo "netstat -tunlp | grep rsync" 
  175. netstat -tunlp | grep rsync 
  176. ;; 
  177. *) 
  178. usage_error 
  179. ;; 
  180. esac 
  181. fi 
  182. #main 
  183. if [ $# -eq 0 ]; then 
  184. usage_error 
  185. else 
  186. while getopts :aed:t:r:o:bpsc varname 
  187. do 
  188. case $varname in 
  189. a) 
  190. backup_all 
  191. ;; 
  192. e) 
  193. backup_each 
  194. ;; 
  195. d) 
  196. backup_db $@ 
  197. ;; 
  198. t) 
  199. backup_dt $@ 
  200. ;; 
  201. b) 
  202. backup_binlog 
  203. ;; 
  204. r) 
  205. recover_all $@ 
  206. ;; 
  207. o) 
  208. recover_dt $@ 
  209. ;; 
  210. p) 
  211. passwd_create 
  212. ;; 
  213. s) 
  214. rsyncd $@ 
  215. ;; 
  216. c) 
  217. # rsync -czrptgoD --password-file=/tmp/.passwd $HOSTNAME.*.$TIME.sql.gz [email protected]::DUMPDB/$HOSTNAME/$TIME_YM 
  218. rsync -czrpt --password-file=/tmp/.passwd $DIR_BACKUP/$TIME_YM [email protected]::DUMPDB/$HOSTNAME 
  219. result_status 
  220. ;; 
  221. :) 
  222. echo "$varname: 缺少参数" 
  223. usage_error 
  224. ;; 
  225. \?) 
  226. echo "$varname: 非法选项" 
  227. usage_error 
  228. ;; 
  229. esac 
  230. done 
  231. fi 

原文链接:http://blog.chinaunix.net/space.php?uid=16844903&do=blog&id=2010853

【编辑推荐】

  1. 教你如何利用MySQL学习MongoDB
  2. Craigslist采用MongoDB替代MySQL
  3. MySQL中的NoSQL插件
  4. SQL与NoSQL——MySQL与NoSQL的融合
  5. 论MySQL何时使用索引,何时不使用索引

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/259479.html<

(0)
管理的头像管理
上一篇2025-05-02 17:26
下一篇 2025-05-02 17:27

相关推荐

  • 站群服务器和普通服务器到底哪个更适合GEO,怎么选?

    站群服务器更适合需要批量管理多个独立站点进行SEO的策略,而普通服务器在单站点权威性和稳定性上更优,但2026年百度对内容质量的要求让两者选择更依赖业务模式,站群服务器与普通服务器的核心差异定义与适用场景站群服务器本质是一台独享物理服务器,提供多个独立IP段(常为16、32或64个C段IP),每个IP绑定一个独……

    2026-07-28
    0
  • 物理服务器和云服务器做站群到底选哪个,哪个更稳定?

    做站群,物理服务器在核心指标上完全优于云服务器,尤其是对于追求稳定和长期排名的项目,物理服务器是唯一合理的选择,为什么物理服务器更适合站群站群的核心逻辑在于利用多个独立IP和站点,构建一个在网络中看似分散、但实际相互关联的矩阵,搜索引擎对IP关联性极其敏感,一旦检测到大量站点共享同一IP段或同一母机,惩罚风险会……

    2026-07-28
    0
  • 国内高防服务器哪家防御真实靠谱,怎么选?

    国内高防服务器哪家防御真实靠谱?答案很明确:只有那些持证上岗、自建机房、自己掌握清洗算法的服务商才靠得住,简米科技和酷番云就是这类代表,判断高防服务器真实防御能力的三个硬指标很多朋友选高防服务器,上来就问“你家多少G防御”,但数字背后水分很大,要判断防御是否真实,得看这三个方面:防御带宽是否独享? 有些服务商宣……

    2026-07-28
    0
  • 裸金属服务器和物理服务器有什么区别?,怎么选?

    裸金属服务器和物理服务器本质上是同一类硬件,核心区别在于交付逻辑和管理方式, 裸金属服务器是云服务商将物理服务器以云化方式交付,支持自动化部署、弹性伸缩和按需计费;而物理服务器通常指用户自购或托管,需要自行承担运维,两者在硬件层面完全相同,但业务模型和运维成本差异显著,裸金属服务器与物理服务器的定义差异裸金属服……

    2026-07-28
    0
  • 做GEO站群选哪家服务器服务商靠谱,怎么选?

    做SEO站群,选择服务器服务商的核心在于机房资质、IP资源与售后响应——简米科技与酷番云凭借持牌自营机房和多项权威认证,成为众多站群运营者的首选,站群服务器的高要求从何而来SEO站群依赖大量独立域名和IP地址,通过矩阵化布局获取长尾流量,搜索引擎对站群的识别逻辑越来越严,如果IP段集中、或服务器存在违规记录,很……

    2026-07-28
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注