首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 熱拷貝:mysqlhotcopy 快速備份 MyISAM 表

     編輯:MySQL 綜合教學

MySQL 熱拷貝:mysqlhotcopy 快速備份 MyISAM 表

上一篇介紹了 mysqldump 熱備份,本文分享另一種熱備方式——熱拷貝。它使用 mysqlhotcopy 命令(Perl 腳本),同樣在 MySQL 運行狀態下進行備份,優勢是速度極快、性能開銷小;但劣勢明顯:僅支持 MyISAM 存儲引擎,無法備份 InnoDB 表。生產環境中需根據表引擎類型酌情選用。

熱拷貝示意圖

熱拷貝架構示意圖

熱拷貝實戰模擬

步驟 1:嘗試執行 mysqlhotcopy(缺少 Perl 依賴)

[root@serv01 databackup]# mysqlhotcopy -uroot -p123456 --database larrydb > larrydb_hostcopy.sql
Can't locate DBI.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/mysql/bin/mysqlhotcopy line 25.
BEGIN failed--compilation aborted at /usr/local/mysql/bin/mysqlhotcopy line 25.

步驟 2:安裝 Perl 依賴包

[root@serv01 databackup]# yum install perl* -y

步驟 3:查看 mysqlhotcopy 幫助並執行備份

[root@serv01 databackup]# mysqlhotcopy --help

寫法一:

[root@serv01 databackup]# mysqlhotcopy --user=root --password=123456 larrydb /databackup/

寫法二(推薦):

[root@serv01 databackup]# mysqlhotcopy -u root -p 123456 larrydb /databackup/
Flushed 2 tables with read lock (`larrydb`.`class`, `larrydb`.`stu`) in 0 seconds.
Locked 0 views () in 0 seconds.
Copying 5 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 2 tables (5 files) in 0 seconds (0 seconds overall).

步驟 4:驗證備份文件並模擬數據丟失

[root@serv01 databackup]# ll larrydb
total 36
-rw-rw----. 1 mysql mysql 8590 Sep 10 19:07 class.frm
-rw-rw----. 1 mysql mysql 65 Sep 10 19:07 db.opt
-rw-rw----. 1 mysql mysql 8618 Sep 10 19:07 stu.frm
-rw-rw----. 1 mysql mysql 48 Sep 10 19:07 stu.MYD
-rw-rw----. 1 mysql mysql 1024 Sep 10 19:07 stu.MYI

mysql> use larrydb;
mysql> show tables;
+-------------------+
| Tables_in_larrydb |
+-------------------+
| class | | stu |
+-------------------+
2 rows in set (0.00 sec)
mysql> show create table class \G;
*************************** 1. row ***************************
Table: class
Create Table: CREATE TABLE `class` ( `cid` int(11) DEFAULT NULL, `cname` varchar(30) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=latin1
mysql> show create table stu \G;
*************************** 1. row ***************************
Table: stu
Create Table: CREATE TABLE `stu` ( `sid` int(11) DEFAULT NULL, `sname` varchar(30) DEFAULT NULL, `cid` int(11) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=latin1

# 刪除表(注意:class 為 InnoDB,mysqlhotcopy 無法備份,恢復會失敗)
mysql> drop table class,stu;
Query OK, 0 rows affected (0.01 sec)
mysql> show tables;
Empty set (0.00 sec)

# 徹底刪除庫目錄
[root@serv01 databackup]# rm -rf /usr/local/mysql/data/larrydb/*
[root@serv01 databackup]# rm -rf /usr/local/mysql/data/larrydb/

步驟 5:嘗試從熱拷貝文件恢復(直接複製文件)

[root@serv01 databackup]# cp larrydb /usr/local/mysql/data/ -arvf
`larrydb' -> `/usr/local/mysql/data/larrydb'
`larrydb/stu.MYI' -> `/usr/local/mysql/data/larrydb/stu.MYI'
`larrydb/stu.MYD' -> `/usr/local/mysql/data/larrydb/stu.MYD'
`larrydb/stu.frm' -> `/usr/local/mysql/data/larrydb/stu.frm'
`larrydb/db.opt' -> `/usr/local/mysql/data/larrydb/db.opt'
`larrydb/class.frm' -> `/usr/local/mysql/data/larrydb/class.frm'

mysql> use larrydb;
mysql> show tables;
+-------------------+
| Tables_in_larrydb |
+-------------------+
| class | | stu |
+-------------------+
2 rows in set (0.00 sec)
mysql> select * from class;
ERROR 1146 (42S02): Table 'larrydb.class' doesn't exist
mysql> select * from stu;
+------+---------+------+
| sid | sname | cid |
+------+---------+------+
| 1 | larry01 | 1 |
| 2 | larry02 | 2 |
+------+---------+------+
2 rows in set (0.00 sec)

關鍵發現: class 表為 InnoDB 引擎,mysqlhotcopy 僅複製了 .frm 結構文件,未複製 .ibd 數據文件,導致恢復後表不存在。而 MyISAM 表 stu 完美恢復。

步驟 6:配合 mysqldump 完成 InnoDB 表恢復

mysql> drop database larrydb;
Query OK, 2 rows affected (0.00 sec)
# 使用之前的 mysqldump 備份文件恢復
[root@serv01 databackup]# mysql -uroot -p123456 < larrydb.sql
mysql> use larrydb;
mysql> show tables;
+-------------------+
| Tables_in_larrydb |
+-------------------+
| class | | stu |
+-------------------+
2 rows in set (0.00 sec)
mysql> select * from stu;
+------+---------+------+
| sid | sname | cid |
+------+---------+------+
| 1 | larry01 | 1 |
| 2 | larry02 | 2 |
+------+---------+------+
2 rows in set (0.00 sec)
mysql> select * from class;
+------+--------+
| cid | cname |
+------+--------+
| 1 | linux | | 2 | oracle |
+------+--------+
2 rows in set (0.00 sec)

總結:mysqlhotcopy 適合純 MyISAM 環境的高速熱備份;混合引擎環境下,需結合 mysqldump 或其他工具(如 Percona XtraBackup)實現全引擎覆蓋。實戰中請根據業務場景選擇合適工具。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved