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

mysqlhotcopy 熱備工具實戰:MyISAM 快速備份與增量策略

     編輯:MySQL 綜合教學

前言:mysqlhotcopy 定位與現狀

重要提示:mysqlhotcopy 是 Perl 腳本,**僅支援 MyISAM/Aria 引擎**,且已在 MySQL 5.7 中棄用、8.0 移除。現代 InnoDB 為主的生產環境,請使用 Percona XtraBackup(物理熱備)或 mydumper(邏輯並行備份)。本文僅供維護舊版 MyISAM 系統參考。

一、原理與 mysqldump 對比

維度mysqlhotcopymysqldump
本質檔案層級 COPY (FLUSH TABLES + LOCK + cp)SQL 語句集合 (SELECT ... INTO OUTFILE / INSERT)
引擎支援MyISAM、Aria、MEMORY所有引擎
執行位置必須在資料庫伺服器本機可遠端客戶端執行
鎖定方式LOCK TABLES ... READ (全域讀鎖)--single-transaction (InnoDB 無鎖) / LOCK TABLES
還原方式直接複製檔案覆蓋 datadirSOURCE / mysql < backup.sql
速度極快(IO 限制)較慢(解析/執行 SQL)
跨版本/架構不支援支援

二、前置需求

# 1. Perl DBD::MySQL 模組
yum install perl-DBD-MySQL -y
# 或 cpanm DBD::mysql

# 2. 專用備份帳號(最小權限)
mysql> GRANT SELECT, RELOAD, LOCK TABLES ON *.* TO 'hotcopyer'@'localhost' IDENTIFIED BY 'StrongPass123!';
mysql> FLUSH PRIVILEGES;

# 3. 配置檔 ~/.my.cnf 或 /etc/my.cnf
[mysqlhotcopy]
user=hotcopyer
password=StrongPass123!
port=3306
socket=/var/lib/mysql/mysql.sock

三、核心用法實戰

1. 備份資料庫到新資料庫(同實例)

mysqlhotcopy db_name db_name_backup
# 輸出範例:
Locked 10 tables in 0 seconds.
Flushed tables (`db_name`.`t1`, `db_name`.`t2`) in 0 seconds.
Copying 45 files...
Copying indices for 0 files...
Unlocked tables.
mysqlhotcopy copied 10 tables (45 files) in 3 seconds (3 seconds overall).

2. 備份到指定目錄(跨磁碟/備份存儲)

mysqlhotcopy db_name /backup/mysqlhotcopy/
# 產生 /backup/mysqlhotcopy/db_name/ 目錄

3. 正則表達式排除/包含表

# 排除名稱含 'log' 的表
mysqlhotcopy db_name./~log/ /backup/

# 僅備份 'order_' 開頭的表
mysqlhotcopy db_name./order_/ /backup/

4. 記錄備份歷史到資料表

# 建立記錄表
CREATE DATABASE IF NOT EXISTS backup_meta;
USE backup_meta;
CREATE TABLE `checkpoint` (
  `time_stamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `src` VARCHAR(64),
  `dest` VARCHAR(128),
  `msg` VARCHAR(255)
) ENGINE=InnoDB;

# 授權
GRANT INSERT ON backup_meta.checkpoint TO 'hotcopyer'@'localhost';
FLUSH PRIVILEGES;

# 執行備份並記錄
mysqlhotcopy db_name./~log/ --allowold --checkpoint backup_meta.checkpoint /backup/

5. 增量備份(--addtodest)

# 首次全量
mysqlhotcopy db_name /backup/db_full --checkpoint backup_meta.checkpoint

# 後續增量(僅複製變更檔案)
mysqlhotcopy db_name /backup/db_full --allowold --addtodest --checkpoint backup_meta.checkpoint

原理:比對檔案修改時間/大小,僅複製變更的 .MYD/.MYI 檔案。

四、還原操作

# 1. 停止 MySQL
systemctl stop mysqld

# 2. 覆蓋資料目錄(謹慎!建議先備份原目錄)
cp -r /backup/db_full/* /var/lib/mysql/db_name/

# 3. 修正權限
chown -R mysql:mysql /var/lib/mysql/db_name/

# 4. 啟動
systemctl start mysqld

五、常見問題與限制

問題原因/說明對策
InnoDB 表報錯工具不支援 InnoDB遷移至 XtraBackup/mydumper
FLUSH TABLES 等待超時長事務/長查詢阻塞設定 --flushlog / 低峰期執行 / kill 長查詢
磁碟空間不足目標分區剩餘空間 < 資料庫大小清理空間 / 掛載新磁碟 / 壓縮備份
權限不足缺少 RELOAD/LOCK TABLES/SELECT補全授權
檔案系統不支援硬連結--allowold 需要硬連結支援避免使用 --allowold / 換檔案系統

六、遷移建議:從 mysqlhotcopy 到現代備份棧

方案對比

工具類型引擎熱備並行增量壓縮學習曲線
XtraBackup物理InnoDB/MyISAM✅✅✅✅中
mydumper/myloader邏輯所有✅✅❌✅低
mysqldump邏輯所有⚠️ (單事務)❌❌✅ (管道)低
mysqlhotcopy物理MyISAM✅❌✅❌低

遷移步驟

  1. 評估現有 MyISAM 表是否可遷移至 InnoDB(強烈建議)
  2. 部署 XtraBackup,建立全量+增量備份策略
  3. 驗證還原流程(PITR 時間點恢復演練)
  4. 停用 mysqlhotcopy 排程,清理舊備份腳本
  5. 更新運維文檔與監控告警

總結

mysqlhotcopy 是 MyISAM 時代的產物,以檔案複製速度換取備份效能,但受限於引擎、架構、版本。現代 MySQL 生產環境以 InnoDB 為主,**XtraBackup(物理熱備)+ mydumper(邏輯並行導出)是標準組合**。若仍在維護 MyISAM 系統,請將遷移至 InnoDB 並升級備份工具列入技術債務清單優先處理。

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