[分享]mysql备份之mysqlhotcopy_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 2211 | 回复: 0   主题: [分享]mysql备份之mysqlhotcopy        下一篇 
Michelle
注册用户
等级:列兵
经验:88
发帖:58
精华:0
注册:2011-8-11
状态:离线
发送短消息息给Michelle 加好友    发送短消息息给Michelle 发消息
发表于: IP:您无权察看 2014-11-14 14:36:02 | [全部帖] [楼主帖] 楼主

我以前备份都使用mysqldump,导成文本文件便于存放,但是速度很慢的。最快的备份方法当然是直接把
数据目录copy一份了。但是一般来说,都要关闭 MySQL的服务才能做,不然在你copy的时候刚好还有人读
写表那麻烦就大了。这次朋友介绍我使用mysqlhotcopy。就相当于上面,不过他可以热备份.他备份非常快
,我测试一个2.8G的mysql他备份的时间在3分钟内完成.
    下面是它的介绍.
    mysqlhotcopy是一个Perl脚本,最初由Tim Bunce编写并提供。它使用LOCK TABLES、FLUSH TABLES和
cp或scp来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库目录所在的
机器上。mysqlhotcopy只用于备份MyISAM。它运行在Unix和NetWare中
    使用方法见下面的脚本.加入crotab中吧.

 #!/bin/sh
# Name:mysqlbackup.sh
# PS:MySQL DataBase Backup,Use mysqlhotcopy script.
# Last Modify:2008-06-12
# 定义变量,请根据具体情况修改
# 定义脚本所在目录
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!" >>MySQLBackup.log
fi
done
# 压缩备份文件
date=`date -I`
cd $tmpBackupDir
tar czf $backupDir/mysql-$date.tar.gz ./
#End完成


    加入到crontab中设置每周5运行

 0 0 * * 5 /backup/blackup.sh


    注意:恢复数据库到备份时的状态
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目录下建立一个.my.cnf文件,以便让mysqlhotcopy从
中读取用户名/密码。

 [mysqlhotcopy]
user=root
password=YourPassword


    然后安全起见,chmod一下。

 chmod 600 ~/.my.cnf


    附:mysqlhotcopy常用参数:

 ·     --allowold  如果目标存在不放弃(加上一个_old后缀重新命名它)。
·     --checkpoint=db_name.tbl_name 在指定的db_name.tbl_name插入检查点条目。
·     ---debug   启用调试输出。
·     --dryrun,-n  报告动作而不执行它们。
·     --flushlog  所有表锁定后刷新日志。
·     --keepold   完成后不删除以前(重新命名的)的目标。
·     -- method=command  复制方法(cp或scp)。
·     --noindices  备份中不包括全部索引文件。这样使备份更小、更快。可以在以后用


myisamchk -rq重新构建索引。

 ·     --password=password,-p password 当连接服务器时使用的密码。请注意该选项的密码值是


不可选的,不象其它MySQL程序。

 ·     --port=port_num,-P port_num 当连接本地服务器时使用的TCP/IP端口号。
·     --quiet,-q  除了出现错误时保持沉默。
·     --regexp=expr  复制所有数据库名匹配给出的正则表达式的数据库。
·     --socket=path,-S path 用于连接的Unix套接字文件。
·     --suffix=str  所复制的数据库名的后缀。
·     --tmpdir=path  临时目录(代替/tmp)。
·     --user=user_name,-u user_name 当连接服务器时使用的MySQL用户名。


    mysqlhotcopy从选项文件读取[client]和[mysqlhotcopy]选项组。要想执行mysqlhotcopy,你必须可
以访问备份的表文件,具有那些表的SELECT权限和RELOAD权限(以便能够执行FLUSH TABLES)。

--转自 北京联动北方科技有限公司




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论