您的位置:首页 > 数据库 > SQL

类似mysqlhotcopy备份mysql myisam脚本

2011-01-12 17:13 441 查看
公司之前都是使用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 leezhenhua17@163.com

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息