使用mysqlhotcopy备份mysql数据库
2012-10-30 16:50:29 阿炯

MYSQLHOTCOPY是一个快速热备MYISAM引擎的工具。
mysqlhotcopy is a Perl script that was originally written and contributed by Tim Bunce. It uses FLUSH TABLES, LOCK TABLES, and cp or scp to make a database backup. It is a fast way to make a backup of the database or single tables, but it can be run only on the same machine where the database directories are located.  mysqlhotcopy works only for backing up MyISAM and ARCHIVE tables. It runs on Unix.

MYSQLHOTCOPY和MYSQLDUMP的比较:
1、前者是一个快速文件意义上的COPY,后者是一个数据库端的SQL语句集合。
2、前者只能运行在数据库目录所在的机器上,后者可以用在远程客户端。不过备份的文件还是保存在服务器上。
3、相同的地方都是在线执行LOCK TABLES 以及 UNLOCK TABLES
4、前者恢复只需要COPY备份文件到源目录覆盖即可,后者需要倒入SQL文件到原来库中。(source 或者\.或者 mysql < 备份文件)

用MYSQLHOTCOPY备份的步骤:
1、有没有PERL-DBD模块安装
[root@localhost data]# rpm -qa |grep perl-DBD | grep MySQL
perl-DBD-MySQL-3.0007-1.fc6

2、在数据库段分配一个专门用于备份的用户
mysql> grant select,reload,lock tables on *.* to 'hotcopyer'@'localhost' identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

3、在/etc/my.cnf或者登陆用户的个人主文件.my.cnf里面添加
[mysqlhotcopy]
interactive-timeout
user=hotcopyer
password=123456
port=3306

4、开始备份
[root@localhost ~]# mysqlhotcopy mydb mydb_new

Locked 4 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`id`, `mydb`.`parent`) in 0 seconds.
Copying 22 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 4 tables (22 files) in 5 seconds (5 seconds overall).

备份后的目录:
[root@localhost data]# du -h | grep mydb

213M ./mydb
213M ./mydb_copy
[root@localhost ~]#

5、MYSQLHOTCOPY用法详解
1)、mysqlhotcopy 原数据库名,新数据库名
[root@localhost ~]# mysqlhotcopy mydb mydb_new

Locked 4 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`id`, `mydb`.`parent`) in 0 seconds.
Copying 22 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 4 tables (22 files) in 5 seconds (5 seconds overall).

2)、mysqlhotcopy 原数据库名,备份的目录
[root@localhost ~]# mysqlhotcopy mydb /tmp/

Locked 4 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`id`, `mydb`.`parent`) in 0 seconds.
Copying 22 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 4 tables (22 files) in 6 seconds (6 seconds overall).

3)、对单个表支持正则表达式
(除了id 表外)
[root@localhost data]# mysqlhotcopy mydb./~id/

Using copy suffix '_copy'
Locked 3 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`parent`) in 0 seconds.
Copying 19 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 3 tables (19 files) in 6 seconds (6 seconds overall).

由于它是使用perl写成,因此也支持perl语言中的正则规则,比如我只想备份某一个表:
application_data./^content$/
将备份application_data库下的'content'表。

application_data./content$/
将备份application_data库下以'content'结尾的表。

mydb./~^id/
~是取反的操作,将不备份以'id'打头的mydb库的表。

4)、可以把记录写到专门的表中,具体察看帮助。
perldoc mysqlhostcopy

mysql> create database hotcopy;
Query OK, 1 row affected (0.03 sec)
mysql> use hotcopy
Database changed
mysql> create table checkpoint(time_stamp timestamp not null,src varchar(32),dest varchar(60), msg varchar(255));
Query OK, 0 rows affected (0.01 sec)
同时记得给hotcopyer用户权限。
mysql> grant insert on hotcopy.checkpoint to hotcopyer@'localhost';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> \q
Bye
重复第三步的操作

[root@localhost ~]# mysqlhotcopy mydb./~id/ --allowold --checkpoint hotcopy.checkpoint

Using copy suffix '_copy'
Existing hotcopy directory renamed to '/usr/local/mysql/data/mydb_copy_old'
Locked 3 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`parent`) in 0 seconds.
Copying 19 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 3 tables (19 files) in 12 seconds (13 seconds overall).

默认保存在数据目录下/mydb_copy/
看看记录表。
mysql> use hotcopy;
Database changed
mysql> select * from checkpoint;
+---------------------+--------+-----------------------------------+-----------+
| time_stamp | src | dest | msg |
+---------------------+--------+-----------------------------------+-----------+
| 2008-03-11 14:44:58 | mydb | /usr/local/mysql/data/mydb_copy | Succeeded |
+---------------------+--------+-----------------------------------+-----------+
1 row in set (0.00 sec)

5)、支持增量备份。
[root@localhost ~]# mysqlhotcopy mydb./~id/ --allowold --checkpoint hotcopy.checkpoint --addtodest mydb_new

Locked 3 tables in 0 seconds.
Flushed tables (`mydb`.`category`, `mydb`.`category_part`, `mydb`.`parent`) in 0 seconds.
Copying 19 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 3 tables (19 files) in 7 seconds (7 seconds overall).

如何还原
1、停止mysql服务器。
2、复制备份的数据库目录到mysql数据目录下。
3、更改目录所有者为mysql服务器运行的用户(如mysql)。
4、启动mysql服务器