我以前备份都使用mysqldump导成文本文件便于存放但是速度很慢的最快的备份方法当然是直接把数据目录copy一份了但是一般来说都要关闭 MySQL的服务才能做不然在你copy的时候刚好还有人读写表那麻烦就大了这次朋友介绍我使用mysqlhotcopy就相当于上面不过他可以热备份他备份非常快我测试一个G的mysql他备份的时间在分钟内完成
下面是它的介绍
mysqlhotcopy是一个Perl脚本最初由Tim Bunce编写并提供它使用LOCK TABLESFLUSH TABLES和cp或scp来快速备份数据库它是备份数据库或单个表的最快的途径但它只能运行在数据库目录所在的机器上mysqlhotcopy只用于备份MyISAM它运行在Unix和NetWare中
使用方法见下面的脚本加入crotab中吧
#!/bin/sh
# Name:mysqlbackupsh
# PS:MySQL DataBase BackupUse mysqlhotcopy script
# Last Modify:
# 定义变量请根据具体情况修改
# 定义脚本所在目录
scriptsDir=`pwd`
# 数据库的数据目录
dataDir=/var/lib/mysql
# 数据备份目录
tmpBackupDir=/tmp/mysqlblackup
backupDir=/backup/mysql
# 用来备份数据库的用户名和密码
mysqlUser=root
mysqlPWD=you password
# 如果临时备份目录存在清空它如果不存在则创建它
if [[ e $tmpBackupDir ]]; then
rm rf $tmpBackupDir/*
else
mkdir $tmpBackupDir
fi
# 如果备份目录不存在则创建它
if [[ ! e $backupDir ]];then
mkdir $backupDir
fi
# 得到数据库备份列表在此可以过滤不想备份的数据库
for databases in `find $dataDir type d | \
sed e s/\/var\/lib\/mysql\/// | \
sed e s/test//`; do
if [[ $databases == ]]; then
continue
else
# 备份数据库
/usr/bin/mysqlhotcopy user=$mysqlUser password=$mysqlPWD q $databases $tmpBackupDir
dateTime=`date +%Y%m%d %H:%M:%S`
echo $dateTime Database:$databases backup success! >>MySQLBackuplog
fi
done
# 压缩备份文件
date=`date I`
cd $tmpBackupDir
tar czf $backupDir/mysql$datetargz /
#End完成
加入到crontab中设置每周运行
* * /backup/blackupsh
注意:恢复数据库到备份时的状态
mysqlhotcopy 备份出来的是整个数据库目录使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /var/lib/mysql/)目录下即可同时要注意权限的问题如下例
shell> cp rf db_name /var/lib/mysql/
shell> chown R mysql:mysql /var/lib/mysql/ (将 db_name 目录的属主改成 mysqld 运行用户)
本套备份策略只能恢复数据库到最后一次备份时的状态要想在崩溃时丢失的数据尽量少应该更频繁的进行备份要想恢复数据到崩溃时的状态请使用主从复制机制(replication)
小技巧:
不想写密码在shell中的话可以在root的home目录下建立一个f文件以便让mysqlhotcopy从中读取用户名/密码
[mysqlhotcopy]
user=root
password=YourPassword
然后安全起见chmod一下
chmod ~/f
附:mysqlhotcopy常用参数
· allowold 如果目标存在不放弃(加上一个_old后缀重新命名它)
· checkpoint=db_nametbl_name 在指定的db_nametbl_name插入检查点条目
· debug 启用调试输出
· dryrunn 报告动作而不执行它们
· flushlog 所有表锁定后刷新日志
· keepold 完成后不删除以前(重新命名的)的目标
· method=command 复制方法(cp或scp)
· noindices 备份中不包括全部索引文件这样使备份更小更快可以在以后用myisamchk rq重新构建索引
· password=passwordp password 当连接服务器时使用的密码请注意该选项的密码值是不可选的不象其它MySQL程序
· port=port_numP port_num 当连接本地服务器时使用的TCP/IP端口号
· quietq 除了出现错误时保持沉默
· regexp=expr 复制所有数据库名匹配给出的正则表达式的数据库
· socket=pathS path 用于连接的Unix套接字文件
· suffix=str 所复制的数据库名的后缀
· tmpdir=path 临时目录(代替/tmp)
· user=user_nameu user_name 当连接服务器时使用的MySQL用户名
mysqlhotcopy从选项文件读取[client]和[mysqlhotcopy]选项组要想执行mysqlhotcopy你必须可以访问备份的表文件具有那些表的SELECT权限和RELOAD权限(以便能够执行FLUSH TABLES)