mysql 热备

在运维中需定期备份mysql,为崩溃后的恢复数据做准备。一般分为冷备和热备,冷备就是停掉mysql服务,直接cp文件,但是在生产环境中,很 少有机会这样,一般都是在mysql提供服务的时候就进行备份,因此这牵扯到数据一致性的问题。所以,在MyISAM存储引擎下,我们的思路就是:锁表 –>备份–>解锁

# 进入mysql环境 锁表root@mysql : test > flush tables with read lock;# 在系统环境下 备份cp -R test /tmp/backup/test_back# 进入mysql环境 解锁root@mysql : test > unlock tables;

mysqlhotcopy 热备工具

当然也可通过mysql自带的工具 mysqlhotcopy 解决,事实上mysqlhotcopy是个perl程序,提供MyISAM下的锁表备份解锁操做。因为是perl脚本,所以需要机器上有PERL-DBD 模块,不然会报错: Can’t locate DBI.pm in @INC ,安装过程很简单,在这里: 

mysqlhotcopy也很简单,参数可用 –help 查看

# 备份test库为新的test_tmp库,与test同级目录 mysqlhotcopy  --user=root  --password=root   test   test_tmp # 备份test库 到 /tmp/ 目录下 mysqlhotcopy  --user=root  --password=root   test   /tmp/ # --checkpoint dbinfo.checkpoint 这个是指定存放操作记录的数据库/表# --addtodest 增量备份,新的备份自动覆盖掉原来的mysqlhotcopy  --user=root  --password=root  --checkpoint=dbinfo.checkpoint  --addtodest  test  /tmp/
 
 
mysqlhotcopy的安装方法如下:
yum -y install perl perl-DBI wget tar zxvf  DBD-mysql-3.0002.tar.gz cd DBD-mysql-3.0002 perl Makefile.PL  –mysql_config=/usr/local/mysql/bin/mysql_config make make test
make install
 
记录到到数据库的方法:
1、在数据库段分配一个专门用于备份的用户
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)
2、在/etc/my.cnf或者登陆用户的个人主文件.my.cnf里面添加
[mysqlhotcopy]
interactive-timeout
user=hotcopyer
password=123456
port=3306
 
重新加载mysql
3、可以把记录写到专门的表中。具体察看帮助。
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> quit;
4、备份数据(写入数据库{备份的结果},增量备份)
/usr/local/mysql/bin/mysqlhotcopy --user=root --password=mysql --checkpoint=hotcopy.checkpoint --addtodest radius /bak
 
5、查看
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| 1234la             |
| conntrack          |
| hotcopy            |
| mysql              |
| pinphp             |
| radius             |
| test               |
| vod                |
| web                |
+--------------------+
10 rows in set (0.00 sec)
mysql> show tables;
+-------------------+
| Tables_in_hotcopy |
+-------------------+
| checkpoint        |
+-------------------+
1 row in set (0.00 sec)
mysql> select * from checkpoint;
+---------------------+--------+---------------+-----------+
| time_stamp          | src    | dest          | msg       |
+---------------------+--------+---------------+-----------+
| 2012-08-25 21:50:26 | radius | /bak/radius   | Succeeded |
+---------------------+--------+---------------+-----------+
1 row in set (0.00 sec)
mysql>