Skip to content

Commit dc82d6e

Browse files
committed
Mysql 自动备份脚本安全加锁机制
1 parent 05d6734 commit dc82d6e

File tree

5 files changed

+175
-15
lines changed

5 files changed

+175
-15
lines changed

Nginx-Rtmp/Shell_script.md

+2-1
Original file line numberDiff line numberDiff line change
@@ -66,4 +66,5 @@ main(){
6666

6767
#Exec
6868
main $1
69-
```
69+
```
70+

Nginx-Rtmp/backup_mysql.sh

+95
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
#!/bin/bash
2+
#######################################################
3+
# $Name: mysql_backup.sh
4+
# $Version: v1.0
5+
# $Function: Backup MySQL Databases Script
6+
# $Author: ShaoBo Wan (Tinywan)
7+
# $organization: https://github.com/Tinywan
8+
# $Create Date: 2017-06-29
9+
# $Description: Mysql 自动备份脚本安全加锁机制
10+
#######################################################
11+
12+
# Shell Env
13+
SHELL_NAME="mysql_backup.sh"
14+
SHELL_TIME=$(date "+%Y-%m-%d")
15+
SHELL_DIR="/home/www/database_back"
16+
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}-${SHELL_TIME}.log"
17+
LOCK_FILE="/tmp/${SHELL_NAME}.lock"
18+
MYSQL_DUMP="/usr/bin/mysqldump"
19+
MYSQL_BACKUP_DB_NAME="tinywan_mysql"
20+
BACKUP_NAME=${MYSQL_BACKUP_DB_NAME}"-${SHELL_TIME}.sql"
21+
22+
# Write Log
23+
loglevel=0 #debug:0; info:1; warn:2; error:3
24+
TIME=`date '+%Y-%m-%d %H:%M:%S'`
25+
shell_log(){
26+
local log_type=$1
27+
local LOG_CONTENT=$2
28+
logformat="`date '+%Y-%m-%d %H:%M:%S'` \t[${log_type}]\t [${SHELL_NAME}] Function: ${FUNCNAME[@]}\t[line:`caller 0 | awk '{print$1}'`]\t [log_info: ${LOG_CONTENT}]"
29+
{
30+
case $log_type in
31+
debug)
32+
[[ $loglevel -le 0 ]] && echo -e "\033[34m${logformat}\033[0m" ;;
33+
info)
34+
[[ $loglevel -le 1 ]] && echo -e "\033[32m${logformat}\033[0m" ;;
35+
warn)
36+
[[ $loglevel -le 2 ]] && echo -e "\033[33m${logformat}\033[0m" ;;
37+
error)
38+
[[ $loglevel -le 3 ]] && echo -e "\033[31m${logformat}\033[0m" ;;
39+
esac
40+
} | tee -a $SHELL_LOG
41+
}
42+
43+
44+
shell_usage(){
45+
echo $"Usage: $0 {backup}"
46+
}
47+
48+
shell_lock(){
49+
touch ${LOCK_FILE}
50+
}
51+
52+
shell_unlock(){
53+
rm -f ${LOCK_FILE}
54+
}
55+
56+
mysql_zip(){
57+
cd $SHELL_DIR
58+
/bin/bzip2 $BACKUP_NAME
59+
find ./ -mindepth 1 -maxdepth 3 -type f -name *.bz2 -mmin +43200 | xargs rm -rf
60+
find ./ -mindepth 1 -maxdepth 3 -type f -name *.sql -mmin +1440 | xargs rm -rf
61+
find ./ -mindepth 1 -maxdepth 3 -type f -name *.log -mmin +1440 | xargs rm -rf
62+
}
63+
64+
# Backup MySQL weblive Database with mysqldump or innobackupex
65+
mysql_backup(){
66+
if [ -f "$LOCK_FILE" ];then
67+
shell_log warn "${SHELL_NAME} is running"
68+
exit 1
69+
fi
70+
shell_log info "mysql backup start"
71+
shell_lock
72+
#sleep 10
73+
BACKUP_RES=$($MYSQL_DUMP $MYSQL_BACKUP_DB_NAME > $SHELL_DIR/$BACKUP_NAME && echo "success" || echo "fail")
74+
if [ "${BACKUP_RES}" == "fail" ];then
75+
shell_log error "MYSQL_BACKUP_DB error : ${BACKUP_RES}"
76+
shell_unlock
77+
exit 1
78+
fi
79+
mysql_zip
80+
shell_log info "mysql backup stop"
81+
shell_unlock
82+
}
83+
84+
# Main Function
85+
main(){
86+
case $1 in
87+
backup) mysql_backup
88+
;;
89+
*) shell_usage
90+
;;
91+
esac
92+
}
93+
94+
#Exec
95+
main $1

Nginx-Rtmp/shell_usage.sh

+75-14
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,41 @@
1010
#######################################################
1111

1212
# Shell Env
13-
SHELL_NAME="backup_db.sh"
13+
SHELL_NAME="test.sh"
14+
SHELL_TIME=$(date "+%Y-%m-%d")
1415
SHELL_DIR="/home/www/database_back"
15-
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}.log"
16+
SHELL_LOG="${SHELL_DIR}/${SHELL_NAME}-${SHELL_TIME}.log"
1617
LOCK_FILE="/tmp/${SHELL_NAME}.lock"
17-
BACKUP_NAME="${SHELL_DIR}/${SHELL_NAME}.log"
18+
MYSQL_DUMP="/usr/bin/mysqldump"
19+
MYSQL_BACKUP_DB_NAME="weblive"
20+
BACKUP_NAME=${MYSQL_BACKUP_DB_NAME}"-${SHELL_TIME}.sql"
1821

19-
#Write Log
22+
#设置日志级别
23+
loglevel=0 #debug:0; info:1; warn:2; error:3
24+
TIME=`date '+%Y-%m-%d %H:%M:%S'`
2025
shell_log(){
21-
LOG_INFO=$1
22-
echo "$(date "+%Y-%m-%d") $(date "+%H-%M-%S") : ${SHELL_NAME} : ${LOG_INFO}" >> ${SHELL_LOG}
26+
local log_type=$1
27+
local LOG_CONTENT=$2
28+
# 这里的写入日志时间修改掉,经过一段时间的测试${TIME} 每次都是一个固定的时间,所以在这里修改为每次写入是自动获取当前时间写入日志
29+
logformat="`date '+%Y-%m-%d %H:%M:%S'` \t[${log_type}]\t [${SHELL_NAME}] Function: ${FUNCNAME[@]}\t[line:`caller 0 | awk '{print$1}'`]\t [log_info: ${LOG_CONTENT}]"
30+
{
31+
case $log_type in
32+
debug)
33+
[[ $loglevel -le 0 ]] && echo -e "\033[34m${logformat}\033[0m" ;;
34+
info)
35+
[[ $loglevel -le 1 ]] && echo -e "\033[32m${logformat}\033[0m" ;;
36+
warn)
37+
[[ $loglevel -le 2 ]] && echo -e "\033[33m${logformat}\033[0m" ;;
38+
error)
39+
[[ $loglevel -le 3 ]] && echo -e "\033[31m${logformat}\033[0m" ;;
40+
esac
41+
} | tee -a $SHELL_LOG
2342
}
2443

2544
# Shell Usage shell_usage函数,用来告诉用户,这个脚本的使用方法
2645
shell_usage(){
27-
echo $"Usage: $0 {backup}"
46+
#echo $"Usage: $0 {backup}"
47+
echo '你没有输入 1 到 4 之间的数字'
2848
}
2949

3050
# 函数shell_lock和shell_unlock非常简单,就是创建一个锁文件
@@ -36,7 +56,7 @@ shell_unlock(){
3656
rm -f ${LOCK_FILE}
3757
}
3858

39-
# Backup MySQL All Database with mysqldump or innobackupex
59+
# Backup MySQL weblive Database with mysqldump or innobackupex
4060
mysql_backup(){
4161
if [ -f "$LOCK_FILE" ];then
4262
shell_log "${SHELL_NAME} is running"
@@ -45,20 +65,61 @@ mysql_backup(){
4565
shell_log "mysql backup start"
4666
shell_lock
4767
sleep 10
68+
$MYSQL_DUMP $MYSQL_BACKUP_DB_NAME > $SHELL_DIR/$BACKUP_NAME
69+
cd $SHELL_DIR
70+
/bin/bzip2 $BACKUP_NAME
4871
shell_log "mysql backup stop"
4972
shell_unlock
5073
}
5174

5275
# Main Function
5376
main(){
5477
case $1 in
55-
backup)
56-
mysql_backup
57-
;;
58-
*)
59-
shell_usage;
78+
1) echo '你选择了 1'
79+
;;
80+
2) echo '你选择了 2'
81+
;;
82+
3) echo '你选择了 3'
83+
;;
84+
4) echo '你选择了 4'
85+
;;
86+
*) shell_usage
87+
;;
6088
esac
6189
}
6290

91+
main2(){
92+
case $1 in
93+
backup) mysql_backup
94+
;;
95+
*) shell_usage
96+
;;
97+
esac
98+
}
99+
100+
63101
#Exec
64-
main $1
102+
main $1
103+
104+
database=weblive
105+
databak_dir=/home/www/database_back
106+
logs_dir=/home/www/database_back/logs
107+
dumpbin=/usr/bin/mysqldump
108+
109+
DATE=$(date +%Y%m%d)
110+
date_time=$(date +"%y-%m-%d %H:%M:%S")
111+
backup_name=sansan_bak1_${DATE}.sql
112+
logFile=$logs_dir/sansan_${DATE}.log
113+
114+
echo " " > $logFile
115+
echo "-------------$(date +"%y-%m-%d %H:%M:%S") backup start ----------------------" >> $logFile
116+
117+
$MYSQL_DUMP $MYSQL_BACKUP_NAME >$databak_dir/$backup_name
118+
cd $databak_dir
119+
/bin/bzip2 $backup_name
120+
# 1 mouth = 44640 min
121+
find ./ -mindepth 1 -maxdepth 3 -type f -name *.bz2 -mmin +43200 | xargs rm -rf
122+
find ./ -mindepth 1 -maxdepth 3 -type f -name *.sql -mmin +1440 | xargs rm -rf
123+
echo "-------------$(date +"%y-%m-%d %H:%M:%S") backup end ----------------------" >> $logFile
124+
125+
FFMPEG_JPG=$(/usr/bin/ffmpeg -y -ss 00:00:10 -i ${FULL_NAME} -vframes 1 ${DIR_NAME}/${BASE_NAME}.jpg && echo "success" || echo "fail")

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
- [x] Shell脚本实现分日志级别记录日志
1212
- [x] Nginx日志定时备份和删除
1313
- [x] SHELL脚本小技巧
14+
- [x] Mysql 自动备份脚本安全加锁机制
1415
+ [Lua基础知识](#Lua_base_knowledge)
1516
+ [Lua 基础语法](#Lua-base)
1617
+ [luajit 执行文件默认安装路径](#Nginx_base_knowledge)
@@ -119,6 +120,7 @@
119120
+ [shell脚本实现分日志级别记录日志](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Log.sh)
120121
+ [Nginx日志定时备份和删除](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_Nginx_Log_cut.sh)
121122
+ [SHELL脚本小技巧](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/Shell_script.md)
123+
+ [Mysql 自动备份脚本安全加锁机制](https://github.com/Tinywan/Lua-Nginx-Redis/blob/master/Nginx-Rtmp/backup_mysql.sh)
122124
## <a name="Lua_base_knowledge"/> Lua基础知识
123125
#### Lua 基础语法 <a name="Lua-base"/>
124126
+ 删除一个全局变量,只要将变量值赋值为nil:`a = nil`,当且仅当一个变量不为nil 时,这个变量存在

Shell/write-shell-suggestions.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
### 编写快速安全Bash脚本的建议
2+
+ [编写快速安全 Bash 脚本的建议 ](https://www.oschina.net/translate/bash-scripting-quirks-safety-tips)
23
+ 变量赋值
34
+ Bash变量并不要求全部大写,但是通常是大写的
45
+ 变量赋值不要在`=`运算符的两边放置空格符

0 commit comments

Comments
 (0)