Mysqlhotcopy备份方法
Mysqlhotcopy 是一个 PERL 程序。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径,但它只能运行在数据库文件(包括数据表定义文件、数据文件、索引文件)所在的机器上。
mysqlhotcopy 只能用于备份 MyISAM,并且只能运行在 类Unix 和 NetWare 系统上。 mysqlhotcopy 支持一次性拷贝多个数据库,同时还支持正则表达。
msqlhotcopy和mysqldump对比:
1、前者是文件意义上的COPY,后者是一个数据库端的SQL语句集合。 2、前者只能运行在数据库目录所在的机器上,后者可以用在远程客户端。 3、相同的地方都是在线执行LOCK TABLES 以及 UNLOCK TABLES
4、前者恢复只需要COPY备份文件到源目录覆盖即可,后者需要倒入SQL文件到原来库中。(source 或者\.或者 mysql < 备份文件)。
5、前者只适用于 MyISAM 引擎,而后则则可同时使用于MyISAM引擎和InodDB引擎. 6、前者在使用前必须安装perl-DBD-mysql包,而后者则不需要.
试验环境:
虚拟机操作系统:Centos 5.5 数据库版本:mysql 5.1.49
perl-DBD-mysql-4.014 (Mysqlhotcopy需要有perl-dbd模块的支持) mysql数据库目录:/var/lib/mysql mysql数据库备份路径:/backup/mysql
1、设置/etc/my.cnf,重启mysqld服务,之后使用msqlhotcopy就不用输入用户密码 [mysqlhotcopy] interactive-timeout user=root
password=123456 port=3306
2、备份方法
# mysqlhotcopy mysqldb_name /backup/
// 备份mysql整个数据库
# mysqlhotcopy -u root -p 123456 mysql /backup/mysql
// 同时备份mysql和test1两个数据库
# mysqlhotcopy -u root -p 123456 mysql test1 /backup/mysql
// 备份 mysql数据库里的user表,支持正则表达式
# mysqlhotcopy -u root -p 123456 mysql./user*/ /backup/mysql
3、备份查询
可以将每次的备份写入数据库,日后查询备份记录.
// 创建hotcopy数据库并建立表格
mysql> create database hotcopy; mysql> use hotcopy
mysql> create table checkpoint(time_stamp timestamp not null,src varchar(32),dest varchar(60), msg varchar(255)); mysql> select * from checkpoint;
+---------------------+-------+------------+-----------+ | time_stamp | src | dest | msg | +---------------------+-------+------------+-----------+ | 2010-07-30 14:11:45 | mysql | /tmp/mysql | Succeeded | | 2010-07-30 14:12:37 | test1 | /tmp/test1 | Succeeded | +---------------------+-------+------------+-----------+ 2 rows in set (0.00 sec)
4、恢复方法
// 复制备份的数据库test到相应目录,注意目录的权限。
# /bin/cp -rf /backup/mysql/test/ /var/lib/mysql/ 5、选项解释
// 显示帮助消息并退出。
--help
// 如果目标存在不放弃(加上一个_old后缀重新命名它)。
--allowold
// 不要重命名目标目录(如果存在);新的备份自动覆盖原来的,可以实现增量备份。
--addtodest
// 在指定的db_name.tbl_name插入检查点条目。
--checkpoint=db_name.tbl_name
// 启用调试输出。
--debug
// 报告动作而不执行它们。
--dryrun,-n
// 所有表锁定后刷新日志。
--flushlog
// 完成后不删除以前(重新命名的)的目标。
--keepold
// 复制方法(cp或scp)。
-- method=command
// 备份中不包括全部索引文件。这样使备份更小、更快。可以在以后用myisamchk -rq重新构建索引。
--noindices
// 当连接服务器时使用的密码。请注意该选项的密码值是不可选的,不象其它MySQL程序。
--password=password,-p password
// 当连接本地服务器时使用的TCP/IP端口号。
--port=port_num,-P port_num
// 除了出现错误时保持沉默。
--quiet,-q
// 复制所有数据库名匹配给出的正则表达式的数据库。
--regexp=expr
// 用于连接的Unix套接字文件。
--socket=path,-S path
// 所复制的数据库名的后缀。
--suffix=str
// 临时目录(代替/tmp)。
--tmpdir=path
// 当连接服务器时使用的MySQL用户名.要想执行mysqlhotcopy,你必须可以访问备份的表文件,具有那些表的SELECT权限和RELOAD权限(以便能够执行FLUSH TABLES).
--user=user_name,-u user_name
6、备份脚本
1)建立数据库自动备份脚本 # vi mysql-backup.sh
#!/bin/bash
PATH=/usr/local/sbin:/usr/bin:/bin # The Directory of Backup BACKDIR=/backup/mysql
# The Password of MySQL ROOTPASS=123456
# Remake the Directory of Backup rm -rf $BACKDIR mkdir -p $BACKDIR
# Get the Name of Database
DBLIST=`ls -p /var/lib/mysql | grep / | tr -d /` # Backup with Database for dbname in $DBLIST do
mysqlhotcopy $dbname -u root -p $ROOTPASS $BACKDIR | logger -t mysqlhotcopy done
2)测试脚本运行
// 给脚本增加执行权限
# chmod 700 mysql-backup.sh
// 运行脚本
# ./mysql-backup.sh
// 查看备份是否成功
# ll /backup/mysql
// 设置备份脚本每天自动运行
# crontab –e
// 在文本里添加下面一行
00 03 * * * /root/mysql-backup.sh
// 查看作业情况
# crontab -l
00 03 * * * /root/mysql-backup.sh