重要業務MySQL冷備解決方案,mysql冷備解決方案
1、概述
在公司業務裡面,當對應的業務數據不是很重要的時候,我們一般會簡單的寫個腳本,每天半夜把數據庫數據全量拉取下來,備份到本地磁盤。但當業務比較重要的時候,這樣簡單操作會存在許多問題,比如本地磁盤損壞。因此,為了保證數據的安全性和可恢復性,對於重要業務一般不會備份到本地磁盤。
下面描述一下自己在工作中用到的解決方案,總體的架構圖如下:DB系統為一主一從,然後第一步每天凌晨12點去備份從機上的數據;第二步凌晨1點再將備份數據庫上的數據備份到公司的磁盤上。接下來根據這個架構,給出詳細的備份代碼:

2、詳細備份方案
2.1 slave->備份服務器
采用的是mysqldump,slave數據庫為InnoDB引擎。

![]()
1 #!/bin/bash
2
3 PROGRAM_NAME="cold_backup"
4 LOG_FILE=$PROGRAM_NAME.log
5 PID_FILE=$PROGRAM_NAME.pid
6
7 LOG_LEVEL=0
8 LOG_LEVEL_STRING=("TRACE" "DEBUG" "INFO" "WARNING" "ERROR" "FATAL")
9
10 function LOG()
11 {
12 if [ $1 -gt $LOG_LEVEL ]; then
13 echo "[$(date "+%y-%m-%d %H:%M:%S")][${LOG_LEVEL_STRING[$1]}]$2" >> ${LOG_DIR}$LOG_FILE
14 fi
15 }
16
17 function LOG_FATAL()
18 {
19 LOG 5 "$1"
20 }
21
22 function LOG_ERROR()
23 {
24 LOG 4 "$1"
25 }
26
27 function LOG_WARNING()
28 {
29 LOG 3 "$1"
30 }
31
32 function LOG_INFO()
33 {
34 LOG 2 "$1"
35 }
36
37 function LOG_DEBUG()
38 {
39 LOG 1 "$1"
40 }
41
42 function LOG_TRACE()
43 {
44 LOG 0 "$1"
45 }
46
47 # 其實不需要,因為每天就備份一次,log完全不會超過32M
48 function shrink_file()
49 {
50 local file=$1
51 if [ ! -f $file ]; then
52 return 1
53 fi
54 local file_size=`du -b $file | awk '{print $1}'`
55 if [ $? -ne 0 ]; then
56 return 2
57 fi
58 max_size=32000000 #32M
59 if [ $file_size -lt $max_size ]; then
60 return 3
61 fi
62 truncate_row=$(wc -l $file | awk '{print $1}')
63 ((truncate_row=truncate_row/2))
64 if [ $truncate_row -ge 1 ]; then
65 sed -i "1,${truncate_row}d" $file
66 return 0
67 fi
68 return 4
69 }
70
71 function clear_file()
72 {
73 echo "" > $1
74 }
75
76 if [ -f $PID_FILE ]; then
77 program_pid=`cat $PID_FILE`
78 if [ $? -eq 0 ] && [ -n "$program_pid" ]; then
79 if ps u -p "$program_pid" | grep -wc $PROGRAM_NAME ; then
80 LOG_INFO "program is running, quit now"
81 exit 0
82 fi
83 fi
84 fi
85
86 # XXX業務數據庫
87 SLAVE_HOST="1.2.3.4:3306"
88 SERVER_NAME="[ShangHai_XX_YY_ZZ_Slave]"
89
90 BACKUP_DIR="/data/cold_backup"
91 TODAY=`date '+%Y%m%d'`
92 BACKUP_FILE=${SLAVE_HOST}_${SERVER_NAME}_${TODAY}.sql
93
94 echo "$$" > $PID_FILE
95 shrink_file $LOG_FILE
96 LOG_INFO "--------------------START BACKUP--------------------"
97 LOG_INFO "begindump:`date '+%y-%m-%d %H:%M:%S'`"
98
99 /usr/local/services/mysql/bin/mysqldump --single-transaction --socket=/tmp/mysql_3306.sock --databases XXX數據庫 > "$BACKUP_FILE"
100 rm -f $(find $BACKUP_DIR -name '*.sql' -mtime +7)
101
102 count=`ls -l | grep $TODAY | grep sql | wc -l`
103 if [ $count -eq 0 ];then
104 # alarm, no today sql data
105 LOG_WARNING " NO cold backup"
106 fi
107
108 LOG_INFO "enddump:`date '+%y-%m-%d %H:%M:%S'`"
109
110 # remove pid_file
111 rm $PID_FILE
View Code
2.2 備份服務器->公司磁盤
采用rsync備份,需要備份服務器和公司磁盤之間可以直接rsync,可以通過ssh來設置。
View Code
debian上怎對現有的mysql做冷備份
應該和其它LINUX系統做冷備一樣的
1、先查一下DATADIR
mysql> show variables like '%datadir%';
2、關閒數據庫
# mysqladmin shutdown
3、復制數據庫文件
cp -Rf $datadir /xxx
$datadir:就是你的數據目錄
數據庫熱備與冷備的不同是什
熱備份針對歸檔模式的數據庫,在數據庫仍舊處於工作狀態時進行備份.而冷備份指在數據庫關閉後,進行備份,適用於所有模式的數據庫.熱備份的優點在於當備份時,數據庫仍舊可以被使用並且可以將數據庫恢復到任意一個時間點.冷備份的優點在於它的備份與恢復操作相當簡單,並且由於冷備份的數據庫可以工作在非歸檔模式下,數據庫性能會比歸檔模式稍好