公司之前都是使用mysqldump 备份数据,前面有备份脚本,但是倒入的时候很慢.我们的数据量很大,如果恢复 将是一个漫长的时间,恢复时间太长,影响业务.

        我就另想他法,load data恢复的时候比mysqldump恢复时间要快,但是需要一个表一个表的操作.如果写脚本容易出现错误.

    ACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多,都是锁表,然后拷贝数据文件。它能实现在线备份,但是效果不理想,因此不推荐使用。它只拷贝表结构文件和数据文件,不同时拷贝索引文件,因此恢复时比较慢。

        然后想到了mysqlhotcopy备份方式.适合我们myisam的存储引擎.copy速度相当快.但是不知道什么原因一直报错误如下.

如有高手请指出 此错如何解决

  [root@db7 ~]# mysqlhotcopy --allowold  --flushlog   --host=localhost --user=root --password=123456 mysql  /tmp
DBD::mysql::db do failed: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'all TABLES' at line 1 at /mysql/bin/mysqlhotcopy line 452.

查看mysqlhotcopy脚本 第452行如下

  450 else {
451     my $start = time;
452     $dbh->do("LOCK all TABLES ");
453     printf "Locked $num_tables tables in %d seconds.\n", time-$start unless $opt{quiet};
454     $hc_started = time; # count from time lock is granted
455
456     # flush tables to make on-disk copy up to date
 

google baidu 都没有找到,既然mysqlhotcopy是先锁表,然后调用linux 上的cp scp命令直接拷贝数据文件.然后就自己写了一个.测试之后挺好用.现在贴出脚本.有什么好的方法希望指出.

 

 #/bin/bash

  #This script backup mysqld data.edit badboy,connect [email protected]

user=root
host=localhost
passwd=123456
database=mysql
bak_dir=/backup/${database}
DATE=`date '+%Y%m%d'`
logfile=/backup/log/${DATE}.log
C_DATE=`date "-d 7 day ago" '+%Y%m%d'`
MYSQL="mysql -u${user} -p$passwd -h $host $database"

echo "================================================" >>$logfile
echo "=       `date '+%Y-%m-%d %H:%M:%S'`"   >>$logfile
#database tables

i=1

tables=($(${MYSQL} -A -Bse "show tables"))
tab_num=`echo ${#tables[@]}`

for arg in ${tables[@]}
do
if [ $i -eq $tab_num ]
then
echo $arg|awk '{print $1,"read"}' >>/tmp/tables
else
echo $arg|awk '{print $1,"read,"}' >>/tmp/tables

fi
i=$(($i+1))
done
lock_tables=`cat /tmp/tables|awk '{printf("%s",$0)}'`
echo "`date '+%Y-%m-%d %H:%M:%S'` start backup database $database" >> $logfile
$MYSQL -A -Bse "lock table $lock_tables ;system cp -r "'/data/mysql'" "'/backup/'";" >>$logfile 2>&1
#echo $?
if [ $? -eq 0 ]
then
echo "`date '+%Y-%m-%d %H:%M:%S'`Backup $database successed" >> $logfile
cd /backup
if [ -d ${database}${DATE} ]
then
echo "`date '+%Y-%m-%d %H:%M:%S'` ${database}${DATE} is exist" >> $logfile
else
mv $database ${database}${DATE}
echo "`date '+%Y-%m-%d %H:%M:%S'` del useless file" >> $logfile
rm -rf /tmp/tables
cd /backup/${database}${DATE}
rm -rf im* cdr* oplog*
fi
else
echo "`date '+%Y-%m-%d %H:%M:%S'` Backup $database Failed" >> $logfile
fi

cd /backup
if [ -d $database${C_DATE} ]
then
echo "`date '+%Y-%m-%d %H:%M:%S'` $database database exist" >> $logfile
tar -zcvf $database${C_DATE}.tar $database >> $logfile 2>&1
echo "`date '+%Y-%m-%d %H:%I:%S'` Delete 7 days before the data $database " >> $logfile
rm -rf $database
else
echo "`date '+%Y-%m-%d %H:%I:%S'` $database${C_DATE} not exist" >> $logfile
fi