博客首页 注册 建议与交流 排行榜 加入友情链接
推荐 投诉 搜索: 帮助

上帝他爷

分别担任CU、ITPUB以及CSDN社区的MySQL版主! 我本来想说我是吃屎的! ^_^
  yueliangdao0608.cublog.cn

关于作者
姓名:杨涛
职业:DBA
年龄:25
位置:中国-武汉市
个性介绍:又长了一岁
QQ:38257291
MSN:yueliangdao0608@gmail.com
|| << >> ||
我的分类


【原创】改良版本mysqldump来备份MYSQL数据库
我的备份脚本都是在凌晨执行的,经常在慢查询日志里面看到这样的信息: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点备份数据,每个周五凌晨备份存储过程。

4、因为有人说碰到要恢复单表的数据,所以把备份单表脚本也贴上。

#!/bin/sh

#

# Created by david yeung.

#

# 20080707.

#

# Backup mysql's full data.

#

DBNAME=$1
USERNAME=backup_user
PASSWD=123456
PREFIX=/home/david_yeung/backup_new/
DIRNAME=$PREFIX`date '+%Y%m%d'`
echo $TARNAME
# Add your own database name here.
case "$1" in
  t_girl);;
  *) exit;;
esac
if [ ! -d "$DIRNAME" ]
then
  mkdir "$DIRNAME"
fi
# Get all the tables' name.
NUM=`/usr/local/mysql/bin/mysql -u$USERNAME -p$PASSWD -S/tmp/mysql50.sock -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/tmp/mysql50.sock -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" -S/tmp/mysql50.sock "$DBNAME" "$tmpFileName" > "$DIRNAME"/"$tmpFileName"
 let "i++"
done

发表于: 2008-07-20,修改于: 2008-08-11 17:29,已浏览674次,有评论5条 推荐 投诉


网友评论
网友: 本站网友 时间:2008-07-24 12:19:48 IP地址:59.40.127.★
直接停掉mysql,拷贝文件应该很快,5G也就10分钟搞定

Blog作者的回复:
前提是MYSQLD不能停!


网友: jingbao2004 时间:2008-07-24 21:47:49 IP地址:219.140.172.★
能不能在其中加上让MYSQL暂时关闭
备份完再重启..这样是不是更好

网友: vyouzhi 时间:2008-08-04 11:17:30 IP地址:116.232.94.★
把表一个一个的来备份,不错,不过如果有服务器多的话,最好弄一台从mysql来备份,这样不用费心机

Blog作者的回复:
唉,我现在没有多余的服务器。


网友: 本站网友 时间:2008-08-04 15:01:45 IP地址:219.143.217.★
我也用mysqldump备份过!!但是后来因为有一个附件过大!大概有30M!就提示有错误,错误如下:mysqldump: Error 2020: Got packet bigger than 'max_allowed_packet' 
bytes when dumping table `CMS_BACKUP_CONTENTS` at row: 5287
!所以我想在我本地测试一下修改my.ini文件!但是我本地30M的附件无法上传上去!!有什么好的办法可以赐教一下吗???

Blog作者的回复:
那就大点了
max_allowed_packet


网友: justinyun 时间:2008-09-04 11:10:45 IP地址:218.242.173.★
加个gzip,节省备份空间
还有,别什么都加双引号,看得眼花

 发表评论