mysql備份遇到#mysql50#不能匯出的問題
Contents
在使用 mysqldump 進行 MySQL 資料庫備份時,有時會遇到 #mysql50# 開頭的奇怪資料夾名稱,導致備份失敗。本文說明原因與解決方式,並整理常用的 mysqldump 選項。
#mysql50# 前綴的含義
#mysql50# 是 MySQL 5.0 引入的一種特殊命名規則,用來讓 MySQL 能夠儲存在檔案系統上可能造成問題的特殊名稱目錄。
具體來說,MySQL 的資料目錄(data directory)結構中,每個資料庫對應一個子目錄。如果 MySQL 使用者的家目錄($HOME)下有 .ssh 這類以 . 開頭的隱藏目錄,而這些目錄又被誤加入到 MySQL 的資料目錄中,MySQL 就會用 #mysql50#.ssh 這樣的名稱來表示它。
執行 mysqldump 時,它嘗試備份這個「假資料庫」,當然就會報錯,因為這個目錄根本不是 MySQL 資料庫。
解決方法
找到 MySQL 資料目錄(通常是 /var/lib/mysql/),刪除其中不屬於資料庫的隱藏目錄即可:
|
|
mysqldump 常用選項
備份單一資料庫
|
|
備份所有資料庫
|
|
包含 Stored Procedures 和 Triggers
預設情況下,mysqldump 不會備份 Stored Procedures(預存程序)和 Triggers(觸發器),需要明確加上:
|
|
常用選項說明
| 選項 | 說明 |
|---|---|
--all-databases / -A |
備份所有資料庫 |
--databases db1 db2 |
備份指定的多個資料庫 |
--routines / -R |
包含 Stored Procedures 和 Functions |
--triggers |
包含 Triggers(預設為 true) |
--events / -E |
包含 Event Scheduler 事件 |
--no-data / -d |
只備份結構,不備份資料 |
--single-transaction |
使用一致性快照(InnoDB 適用,不鎖表) |
--compress / -C |
壓縮傳輸(遠端備份時有用) |
--where="condition" |
只備份符合條件的資料列 |
推薦的完整備份指令
|
|
其他常見問題排查
問題:Access denied 錯誤
需要確認備份使用者有足夠的權限:
|
|
問題:備份中斷或資料不一致
對 InnoDB 資料表,加上 --single-transaction 可以在不鎖表的情況下取得一致性的快照:
|
|