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 ,安裝過程很簡單,在這裏: perl-DBI連接mysql
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 http://down1.chinaunix.net/distfiles/DBD-mysql-3.0002.tar.gz
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> 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
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>
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>