2011-04-12 57 views
1

我有一個MySQL數據庫,它在給定的時間(約120萬行)每週的特定一天每週接收一次數據,並將其存儲在中,讓我們稱之爲「活」表。每週使用PHP存檔MySQL數據

我想將「實時」表中的所有數據複製到歸檔文件中,並截斷活動表格以爲下一週的下一個「當前數據」留出空間。

任何人都可以提出一個有效的方法來做到這一點。我真的試圖避免 - 從live直接插入archive_table select *。我希望能夠使用PHP來運行這個存檔器,所以我不能使用Maatkit。有什麼建議麼?

編輯:此外,存檔的數據需要隨時訪問。由於每個刀片都帶有時間戳,如果我要尋找從上個月的數據,我可以尋找它在檔案

+1

你試過mysqldump嗎? – halfdan 2011-04-12 19:43:07

+1

那麼mysqldump到你的PHP可以接受的文件的cron作業呢? – SorcyCat 2011-04-12 19:44:33

回答

2

鬼鬼祟祟的方式:

不要複製記錄。這需要很長時間。

相反,只是重命名活動表的方式進行,並重新創建:

RENAME TABLE live_table TO archive_table; 
CREATE TABLE live_table (...); 

它應該是相當快,無痛。

編輯:我描述的方法最有效的,如果你想要一個存檔表每旋轉週期。如果你想維護一個歸檔表,可能需要變得更加棘手。但是,如果您只想對歷史數據進行臨時查詢,則可以使用UNION。

如果您只想保存幾段時間的數據,則可以使用類似於日誌旋轉的方式重複執行幾次重命名操作。然後,您可以定義一個視圖,將UNION的歸檔表放入一個大型的honkin表中。

EDIT2:如果你想保持自動遞增的東西,你可能會希望嘗試:

RENAME TABLE live TO archive1; 
CREATE TABLE live (...); 
ALTER TABLE LIVE AUTO_INCREMENT = (SELECT MAX(id) FROM archive1); 

但可悲的是,這是行不通的。但是,如果您使用PHP驅動流程,那麼解決這個問題非常容易。

+0

我可以這樣做一個活的表,這可能會獲得約100行,然後將重命名錶移動到另一個數據庫,而新表仍然在活動數據庫中,並沒有鬆動任何插入,它會開始自動遞增,即時只是研究做正確的事感謝:) – JRowan 2016-08-04 02:09:35

1

編寫一個腳本來作爲cron作業運行:

  1. 轉儲從「活動」表中歸檔數據(這可能會更有效地使用來自shell腳本的mysqldump)
  2. 截斷活動表
  3. 修改轉儲文件中的INSERT語句,以便表名引用歸檔表而不是直播表
  4. 追加檔案e數據到歸檔表(再次,可以通過shell腳本從轉儲文件導入,例如, mysql dbname < dumpfile.sql)
+0

當然,活動表有一個auto_increment(也是主鍵)並將數據從live轉儲到sql文件,然後截斷活動表將重置auto_increment,然後下一個存檔插入將失敗。 – 2011-04-12 19:53:39

+0

@Rohit - 在第3步中,從插入語句中刪除主鍵,並允許歸檔表自動分配一個。另外,刪除行不會影響表的自動增量值。修改自動增量的唯一方法是DDL:http://dev.mysql.com/doc/refman/5.0/en/example-auto-increment.html – 2011-04-12 20:01:24

+0

嗯,我只是試圖確保,TRUNCATE TABLE'x'將auto_increment重置爲1 – 2011-04-12 20:02:13

0

這取決於您對數據進行歸檔後的處理方式,但是您是否考慮過使用MySQL複製?

您可以將另一臺服務器設置爲複製從服務器,並且一旦所有數據都被複制,請先執行刪除操作或截斷其前面的SET BIN-LOG 0以避免該語句也被複制。

+0

我曾考慮複製,但目前還沒有其他服務器可供選擇:( – 2011-04-12 19:52:10

+0

另外,歸檔數據需要易於訪問,因爲每個插入都有時間戳,如果我想查找上個月的數據,我可以搜索它 – 2011-04-12 19:54:42

+0

沒有服務器使用是有點showstopper那裏我必須承認:)如果你有這一切進入一張桌子,雖然我不認爲交易會是一個問題,除非我失蹤很多一些東西。 – Simon 2011-04-12 20:08:08