| 導購 | 订阅 | 在线投稿
分享
 
 
 

改良版本mysqldump來備份MYSQL數據庫

2008-07-28 07:49:24  編輯來源:互聯網  简体版  手機版  評論  字體: ||
 
  我的備份腳本都是在淩晨執行的,經常在慢查詢日志裏面看到這樣的信息:select * from table1;

  之前一直很納悶,最後才了解到原來是MYSQLDUMP搞的鬼。

  因爲MYSQLDUMP會爲整個庫來加一個全局鎖定。

  如果單純用MYSQLDUMP進行全庫備份會造成以下三個方面的影響。

  1、服務器CPU嚴重阻塞。

  2、磁盤I/O直線增加。

  3、所有的查詢都成了慢查詢。

  我現在的網站數據庫大概是5個G左右,而且每天都有增大。

  表結構是MYISAM,INNODB,MEMORY三者混合。

  所以單純用HOTCOPY工具恐怕有點困難。所以我今天簡單變了一下我上次寫的關于用OUTFILE來備份MYSQL的腳本。

  可以解決上面說的三個缺點。

  1、備份腳本內容

  [david_yeung@localhost ~]$ cat fast_backup

  #!/bin/sh

  #

  # Created by david yeung.

  #

  # 20080707.

  #

  # Backup mysql's full data.

  #

  DBNAME=$1

  BACKUPDIR=/home/david_yeung/backup_new

  USERNAME=backup_user

  PASSWD=123456

  TARNAME="$BACKUPDIR"/backup"$1"`date '+%Y%m%d'`

  # Add your own database name here.

  case "$1" in

   my_site);;

   *) exit;;

  esac

  # Get all the tables' name.

  NUM=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME|wc -l`

  HEADNUM=`expr ${NUM} - 3`

  TAILNUM=`expr ${NUM} - 7`

  ARR1=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME| head -n"$HEADNUM" | tail -n "$TAILNUM"`

  ARR2=($ARR1)

  i=0

  while [ "$i" -lt "${#ARR2[@]}" ]

  do

  tmpFileName=${ARR2[$i]}

  # The real dump process.

  /usr/local/mysql/bin/mysqldump -u$USERNAME -p"$PASSWD" "$DBNAME" "$tmpFileName" >> "$TARNAME"

  let "i++"

  done

  2、因爲我們一直用存儲過程,所以得單獨備份出來。

  [david_yeung@localhost ~]$ cat fast_sp

  #!/bin/sh

  # Created by david yeung 20080122.

  #

  # Backup site's routine.

  TARNAME=/home/david_yeung/backup_new/spBackup"$1"`date '+%Y%m%d'`

  /usr/local/mysql/bin/mysqldump -ubackup_user -p123456 -n -t -d -R my_site > "$TARNAME"

  3、丟到計劃任務裏面去,就不管了。

  [root@localhost backup_new]# crontab -l

  0 01 * * * /home/david_yeung/fast_backup my_site

  0 0 * * 5 /home/david_yeung/fast_sp

  每天淩晨1點備份數據,每個周五淩晨備份存儲過程。
 
我的備份腳本都是在淩晨執行的,經常在慢查詢日志裏面看到這樣的信息:select * from table1; 之前一直很納悶,最後才了解到原來是MYSQLDUMP搞的鬼。 因爲MYSQLDUMP會爲整個庫來加一個全局鎖定。 如果單純用MYSQLDUMP進行全庫備份會造成以下三個方面的影響。 1、服務器CPU嚴重阻塞。 2、磁盤I/O直線增加。 3、所有的查詢都成了慢查詢。 我現在的網站數據庫大概是5個G左右,而且每天都有增大。 表結構是MYISAM,INNODB,MEMORY三者混合。 所以單純用HOTCOPY工具恐怕有點困難。所以我今天簡單變了一下我上次寫的關于用OUTFILE來備份MYSQL的腳本。 可以解決上面說的三個缺點。 1、備份腳本內容 [david_yeung@localhost ~]$ cat fast_backup #!/bin/sh # # Created by david yeung. # # 20080707. # # Backup mysql's full data. # DBNAME=$1 BACKUPDIR=/home/david_yeung/backup_new USERNAME=backup_user PASSWD=123456 TARNAME="$BACKUPDIR"/backup"$1"`date '+%Y%m%d'` # Add your own database name here. case "$1" in my_site);; *) exit;; esac # Get all the tables' name. NUM=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME|wc -l` HEADNUM=`expr ${NUM} - 3` TAILNUM=`expr ${NUM} - 7` ARR1=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -s -vv -e "show tables" -D $DBNAME| head -n"$HEADNUM" | tail -n "$TAILNUM"` ARR2=($ARR1) i=0 while [ "$i" -lt "${#ARR2[@]}" ] do tmpFileName=${ARR2[$i]} # The real dump process. /usr/local/mysql/bin/mysqldump -u$USERNAME -p"$PASSWD" "$DBNAME" "$tmpFileName" >> "$TARNAME" let "i++" done 2、因爲我們一直用存儲過程,所以得單獨備份出來。 [david_yeung@localhost ~]$ cat fast_sp #!/bin/sh # Created by david yeung 20080122. # # Backup site's routine. TARNAME=/home/david_yeung/backup_new/spBackup"$1"`date '+%Y%m%d'` /usr/local/mysql/bin/mysqldump -ubackup_user -p123456 -n -t -d -R my_site > "$TARNAME" 3、丟到計劃任務裏面去,就不管了。 [root@localhost backup_new]# crontab -l 0 01 * * * /home/david_yeung/fast_backup my_site 0 0 * * 5 /home/david_yeung/fast_sp 每天淩晨1點備份數據,每個周五淩晨備份存儲過程。
󰈣󰈤
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
  免責聲明:本文僅代表作者個人觀點,與王朝網絡無關。王朝網絡登載此文出於傳遞更多信息之目的,並不意味著贊同其觀點或證實其描述,其原創性以及文中陳述文字和內容未經本站證實,對本文以及其中全部或者部分內容、文字的真實性、完整性、及時性本站不作任何保證或承諾,請讀者僅作參考,並請自行核實相關內容。
 
© 2005- 王朝網路 版權所有