mysqldump来备份MYSQL数据库(脚本)

转载地址: http://hi.baidu.com/dmkj2008/item/412753f59420d8da6225d252


改良版本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 -------------------------------------------------------------------------------- 使用mysqldump定时备份数据库的脚本 2009-02-02 10:26  2.1、备份脚本
使用脚本每天定期执行数据库备份操作,对每个使用mysql数据库的人来说都很有必要,这样的脚本网上有很多,这里摘抄一个朋友的脚本 dbbackup:
这个脚本每天最多只执行一次,而且只保留最近五天的备份在服务器上。

dbbackup代码: 

#!/bin/bash 
#This is a ShellScript. For Auto DB Backup 
#Powered by aspbiz 
#2004-09 

#Setting 
#设置数据库名,数据库登录名,密码,备份路径,日志路径,数据文件位置,以及备份方式
#默认情况下备份方式是tar,还可以是mysqldump,mysqldotcopy 
#默认情况下,用root(空)登录mysql数据库,备份至/root/dbxxxxx.tgz 
DBName=mysql 
DBUser=root 
DBPasswd= 
BackupPath=/root/ 
LogFile=/root/db.log 
DBPath=/var/lib/mysql/ 
#BackupMethod=mysqldump 
#BackupMethod=mysqlhotcopy 
#BackupMethod=tar 
#Setting End 


NewFile="$BackupPath"db$(date +%y%m%d).tgz 
DumpFile="$BackupPath"db$(date +%y%m%d) 
OldFile="$BackupPath"db$(date +%y%m%d --date='5 days ago').tgz 

echo "-------------------------------------------" >> $LogFile 
echo $(date +"%y-%m-%d %H:%M:%S") >> $LogFile 
echo "--------------------------" >> $LogFile 
#Delete Old File 
if [ -f $OldFile ] 
then 
rm -f $OldFile >> $LogFile 2>&1 
echo "[$OldFile]Delete Old File Success!" >> $LogFile 
else 
echo "[$OldFile]No Old Backup File!" >> $LogFile 
fi 

if [ -f $NewFile ] 
then 
echo "[$NewFile]The Backup File is exists,Can't Backup!" >> $LogFile 
else 
case $BackupMethod in 
mysqldump) 
     if [ -z $DBPasswd ] 
     then 
        mysqldump -u $DBUser --opt $DBName > $DumpFile 
     else 
        mysqldump -u $DBUser -p$DBPasswd --opt $DBName > $DumpFile 
     fi 
     tar czvf $NewFile $DumpFile >> $LogFile 2>&1 
     echo "[$NewFile]Backup Success!" >> $LogFile 
     rm -rf $DumpFile 
     ;; 
mysqlhotcopy) 
     rm -rf $DumpFile 
     mkdir $DumpFile 
     if [ -z $DBPasswd ] 
     then 
       mysqlhotcopy -u $DBUser $DBName $DumpFile >> $LogFile 2>&1 
     else 
        mysqlhotcopy -u $DBUser -p $DBPasswd $DBName $DumpFile >>$LogFile 2>&1 
     fi 
     tar czvf $NewFile $DumpFile >> $LogFile 2>&1 
     echo "[$NewFile]Backup Success!" >> $LogFile 
     rm -rf $DumpFile 
     ;; 
*) 
     /etc/init.d/mysqld stop >/dev/null 2>&1 
     tar czvf $NewFile $DBPath$DBName >> $LogFile 2>&1 
     /etc/init.d/mysqld start >/dev/null 2>&1 
     echo "[$NewFile]Backup Success!" >> $LogFile 
     ;; 
esac 
fi 

echo "-------------------------------------------" >> $LogFile


2.2、放入crontab定期执行dbbackup
假定dbbackup在/root目录下。我们通过使用crontab命令,设置每天0点10分执行/root/dbbakup脚本。
1、 使用crontab –e 编辑crontab
2、 在crontab中加入:

#back for mysql database
10 0 * * * /root/dbbackup


新增:

1)、把远程mysql服务器上的选定表的指定数据导入到本地的文本文件中: 
[hello@localhost hello]$ mysqldump -hhostname -uusername -p -w "last>'2007-01-01'" dbname tablename > ./filename 
Enter password: 

2)、把远程mysql服务器上的选定数据库的全部数据导入到本地的文本文件中: 
[hello@localhost hello]$ mysqldump -hhostname -uusername -p dbname > ./filename 
Enter password:

3)、把远程mysql服务器上的选定表的指定数据导入到服务器的文本文件中(所以在本地不能操作如下): 
mysql> use dbname; 
mysql> select fieldname into outfile '/home/hello/a.txt' from tablename where last>"2007-1-1"; 
ERROR 1045: Access denied for user: 'hello@%' (Using password: YES) 
mysql>

4)、把远程mysql服务器上的选定表的指定数据导入到本地的文本文件中:

[hello@localhost hello]$ mysql -e "select fieldname from tablename where last>'2007-1-1'" -hhostname -uusername -p dbname > ./filename 
Enter password:







直接复制data目录其实也可以,但是如果有innodb引擎表的话,还要拷贝my.ini文件以及innodb表空间文件以及他的回滚日志文件

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28371090/viewspace-768849/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/28371090/viewspace-768849/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值