Mysql - 如何修改 partition 並還原資料
在測試環境中我們想要置換 partition 的分區方式,而我們不想要遺失測試資料,所以需要備份 partition table 的資料。因為要修改的資料欄位很多,我不想要直接使用 alter table 的方式來修改 partition 分區,取而代之的是,我想要用 Migration 的方式來管理,所以會採用先備份 -> 修改 -> 接著再還原的方式。
深入了解 mysqldump
一般我們在備份還原的時候會使用 Mysqldump,並使用還原指令來還原。但是因為這次我需要回復的資料已經經過 Partition 分區了。用一般的回復方式很可能會失敗。秉持的實驗精神,我就來看看 mysqldump 到底是怎麼運作的。輸入指令備份資料庫:
1 |
|
產生出來的檔案我們打開來看:
1 |
|
這不就是 SQL 的指令嘛? 邏輯如下:
- 如果
alert_logs
table 已經存在,就刪除掉並使用 Dump File 內的備份指令重新建立alert_logs
table - lock 住整個 table 並加入資料。
從這些步驟我們可以觀察到即使 db 內已經存在 alert_logs table 了,使用 dump.sql 還原時仍然會先刪除 alert_logs table,再使用 dump.sql 中的 schema 來重建 table。
知道這些情報之後 partition 的 backup 與 restore 有了頭緒。
Partition backup and restore
首先備份原先的 partition
1 |
|
關鍵在於: 需要加上 --no-create-info
產生的 dump.sql 不會把本來的 table 刪除,直接 insert 資料。
1 |
|
備份完資料後我們將原有的 database 刪除
1 |
|
用新的 create partition 方法建立 table,將本來用 alert_time 做分區,改成用 created_at 做分區。
1 |
|
最後將資料還原
1 |
|
檢視一下目前的 table
1 |
|
確認結果是否正確
檢視一下目前的 table
1 |
|
輸出
1 |
|
確認建立 table 的資料無誤後,
進入 Rails console 試試看 AlertLog 是否可以正常存取,
這樣就完成了整個 partition 轉換並還原的流程。
地雷 - created_at
需要特別注意的是 - partition 中 為 key 的值一定必須是 NOT NULL
,且不要設 DEFAULT VALUE
,否則 Rails 不會幫你自動填入 created_at。
Rails Migration
如果你使用的是 Rails Migration,步驟是:
- backup entire database
- dump the partition database
- rake db:rollback
- modify migration of partition
- rake db:migrate
- restore partition database