將 InnoDB 還原到不同的機器
我目前有使用 Percona XtraBackup 對我的所有 MySQL 數據庫進行的備份。
我的具體情況是我想將一個月前的 InnoDB 數據庫快照恢復到我的本地機器進行測試,但我似乎無法在 Percona 文件中找到執行此操作的說明。
在Google上閱讀我得出的結論是我必須
tar.gz
在我的機器上提取文件並“重放”事務日誌。所以我的問題是需要哪些具體步驟,以及將數據庫快照恢復到我的機器的注意事項是什麼。
最後,似乎單獨使用 XtraBackup 並不能保證在出現問題時您能夠恢復數據。例如,如果伺服器要死了,那麼如果沒有事務日誌,我的備份將毫無用處。所以我的問題的一般措辭可能是需要採取哪些步驟來確保我可以在我希望的任何機器上恢復我的數據。
請記住,我的主要專業領域不是數據庫管理!
按照在回答中給我的說明,我提取了備份存檔並“準備”了
innobackupex --apply-log .
完成良好的備份。然後我停止了 mysql,將所有文件從備份目錄複製到 mysql 數據目錄並重新啟動了 mysql。一旦我登錄(重置root密碼後),我可以看到數據庫及其表(使用管理員)但是一旦我選擇了一個表,我就會遇到表不存在錯誤。所以我仍然在我最初的問題上,首先是如何恢復到另一台機器,其次是如何確保我的備份隨時隨地可用。
在旁注中,從我正在閱讀的內容來看,每個表都應該有一個 .idb 文件,但我沒有看到類似的東西。
看來我做的一切都是正確的。我的備份腳本包括
#!/bin/bash BDIR="/disk2/backup/mysql" /usr/bin/innobackupex --user=backup --password=xxx --ibbackup=xtrabackup --stream=tar /tmp | gzip -c -9 > $BDIR/`date -u +%Y-%m-%dT%H:%M:%SZ`.tar.gz
它還會在異地同步文件。
我下載文件,解壓(
tar -ixvzf
),如上所述應用日誌,停止mysql並將文件複製到數據目錄(cp),應用權限,啟動和登錄。瀏覽到我的備份數據庫給了我錯誤140730 16:28:49
$$ ERROR $$儘管存在表的 .frm 文件,但無法從 InnoDB 的內部數據字典中找到或打開表 Lead@002dmanager@002dbackup/crm_word_ban。也許您已經刪除並重新創建了 InnoDB 數據文件,但忘記刪除 InnoDB 表的相應 .frm 文件,或者您已將 .frm 文件移動到另一個數據庫?或者,該表包含此版本的引擎不支持的索引。
對於所有數據庫表。
伺服器上的 MySQL 版本是 5.1,本地版本是 5.5
好的,按照@jynus 的指示,我終於得到了要恢復的備份。我最終在伺服器上創建了另一個 mysql 實例並在那裡恢復。
萬一有人遇到同樣的問題,我採取的步驟如下……
我的環境是 CentOS 6.4,MySQL 5.1 和股票 InnoDB 據我所知,
innobackupex --version
給我InnoDB Backup Utility v1.5.1-xtrabackup
,xtrabackup --version
給我xtrabackup version 2.1.8 for Percona Server 5.1.73
,伺服器安裝了 Plesk 11.0.9。
/etc/init.d/mysql
首先,我通過複製和修改預設啟動腳本來設置另一個 mysql 實例。我遇到的問題是為該伺服器載入不同的配置文件,需要的--defaults-file
參數mysqld_safe
必須在任何其他參數之前給出(參見此處)。然後我複制了預設/etc/my.cnf
文件並修改了其中的值(埠、日誌位置等)以適合我的設置。要登錄到新的 mysql 實例並設置新的 root 使用者,第一次
mysqld_safe
執行是使用--skip-grant-tables
init 腳本中的選項(參見此處)。為了能夠使用 phpmyadmin 管理新的 mysql 實例,我在 Plesk 中創建了一個新的數據庫伺服器(伺服器-> 數據庫伺服器-> 添加數據庫伺服器)並輸入了新的埠和/或新的伺服器正在執行的 ip 和新的管理員我在上一步中設置的使用者。Plesk 不允許您使用“root”使用者名,因此我必須在上一步中添加具有 root 權限的不同使用者名。
之後,可以使用類似
/etc/init.d/mysql-backup start
.對於實際的恢復過程,我提取了備份文件(注意使用
-i
tar 標誌),一旦進入備份目錄,我使用xtrabackup
執行檔本身(xtrabackup --prepare --target-dir=/path/to/extracted/backup/
)應用日誌,因為innobackupex
需要它連接到正在執行的 mysql 伺服器以確定版本,我不想弄清楚該怎麼做。我停止了我的新 mysql 伺服器,將包含我的數據庫的文件夾複製到 datadir,複製了 ibdata1 文件,更改了權限並啟動了伺服器。
然後我可以使用 phpmyadmin 瀏覽/管理我的備份數據庫。
請參考官方文件,了解如何使用 Percona XtraBackup 創建、儲存和恢復完整備份。Percona XtraBackup確實保證一切都不會失去:
可以概括為:
- 執行備份 (
innobackupex
)。您可以選擇在備份執行的同時遠端發送、壓縮、加密等。這是您需要訪問原始數據庫伺服器的唯一點。- 如果您在第一步沒有遠端發送,請立即發送。本地備份雖然有用,但並不是真正的備份策略。為了完成備份,您可能還需要複製您的配置文件(/etc/my.cnf 和您的二進制執行檔,如果您無法從其他來源獲取它們 - 例如,您的發行版)。
- 在備份和恢復過程之間的任何時間,您都需要執行準備階段 (
innobackupex --apply-log
)。這只需要備份文件,而不需要原始伺服器。這將為您創建事務日誌- 應用後,只需在伺服器關閉時將文件複製回原始目錄即可。如果您在本地有文件,則可以這樣做
innobackupex --copy-back
,或者只做(s)cp/rsync
. 請記住將文件權限更改為適當的使用者(通常是 mysql 使用者)。- 啟動伺服器。你完成了。
這將恢復完整備份。為了向您保證這是一種安全的方法,Galera 集群可以使用它來自動複製節點(無需人工干預),這是最安全、最快速的方法。
如果您沒有看到單獨的 .ibd 文件,可能有幾個原因——您使用的是 MyISAM 或其他不使用這些的引擎,或者您使用 InnoDB
innodb_file_per_table = 0
,或者您在復製過程中失去了一些文件(或者他們有錯誤的權限)。請提供自上次啟動以來的完整錯誤消息和錯誤日誌,以及您的數據目錄的遞歸列表。作為 Percona XtraBackup 培訓的作者,我非常熟悉我們在使用它時所犯的所有典型愚蠢錯誤。
感謝您提供額外的資訊,以下是我的後續建議:
- 如果沒有 innodb 外掛,最新版本的 XtraBackup與 5.1 不兼容。你是否使用 MySQL 5.1 和庫存 InnoDB(不是外掛,或 Percona/MariaDB)?此外,以二進制形式恢復到更新版本的 MySQL 可能需要額外的升級步驟/注意事項——它可以以二進制形式完成。建議:嘗試使用舊版本的 Xtrabackup 或升級伺服器。沒有外掛的 5.1 是一個 6 年的版本,幾乎沒有任何地方的支持。如果您想堅持 <5.1(但很少有這麼快),我還可以提供替代備份工具。
- 我不喜歡數據庫/表名稱 - 只是為了仔細檢查,您能否確認 db: lead@002dmanager@002dbackup table: crm_word_ban 是您的一個表的正確名稱,並且它是 .frm 的確切名稱文件?我想丟棄文件系統問題。