MySQL/Percona 伺服器需要很長時間,我寧願跳過所有這些等待,即使這意味著數據失去
最初發佈到https://www.facebook.com/groups/GNUAndLinux/permalink/10155020539805019/但未收到回复。
我在硬體 RAID0 和 Intel Xeon E5-1620 v2 3.70GHz 的 Ubuntu Server 12.04 LTS x64、64GB RAM、2x2TB SATA* 上執行 Percona Server 5.6.21-70.0-688 x64。InnoDB/XtraDB 是主要引擎(採用梭子魚格式),20GB(最近更改後為 21 個)緩衝池大小分為 20 個(最近更改後為 21 個)池。zlib 壓縮最大為 9。
數據庫伺服器及其執行緒下降到 nice -20 和 ionice -c 1 -n 1。
rautamiekka.org 上的幾乎每個伺服器都依賴於 MySQL 數據庫,尤其是 Minecraft。
我發現瞭如何將完美的 IPv4 地址列表製作成文本文件。我為每個地址部分創建了一個具有自動增量列和 1 列的表,總共最多 5 列。我製作了一個 Python 腳本來啟動事務並明確禁用自動送出並上傳這些地址。該腳本從 115GB 文件中上傳瞭如此多的地址,其中包含大約 51GB 的數據,可能已經壓縮。然後Percona Server 5.6.21-70.1就出來了。我以為我會執行例行更新過程,因為我認為沒有問題,所以我關閉了 Minecraft 伺服器和任何其他依賴於 MySQL 的伺服器並忘記了 Python 腳本。然而,在與
aptitude
和apt-get
幾分鐘後,我意識到數據庫伺服器仍在執行並且不接受任何連接,因為它處於關閉過程中。我注意到 Python 腳本已經以某種方式退出了。那是 2014 年 11 月 24 日星期一,從那時起,許多程序/執行緒一直在以 20-50KB/s(讀取)甚至 200、120-500KB/s(寫入)的速度執行。主要是 1 個執行讀取和 2 個執行寫入,其中 1 個程序的執行速度至少是第二個的兩倍,並且只有 2 個程序主要使用 CPU,但它們不是唯一的。我認為它將數據送出到表中並讀取壓縮數據以驗證它。
我的估計是,如果我們假設它以至少 120KB/s 的速度寫入 80GB,則關閉將需要 9 天,我警告人們它可能要到 2014 年 12 月 8 日星期一才能準備好,儘管它已經執行了好幾天。
我最近對配置進行了更改:
[mysqld] innodb_buffer_pool_dump_at_shutdown=1 innodb_buffer_pool_load_at_startup=1
我有過
[mysqld] innodb_fast_shutdown = 0 innodb_flush_method=O_DIRECT
很長時間來確保 InnoDB 會在宕機前寫入所有內容,這樣我們數據失去的機會就會更小,但正因為如此,我們不得不等待很長時間,並且可能至少需要等待一周,這我討厭。
作為參考,我向 MySQL 錯誤發布了一個更改請求,要求更改 MySQL 處理關閉命令的方式以防止這種停機時間:http ://bugs.mysql.com/bug.php?id=75110
我可以在這裡做什麼?我可以考慮各種方法來降低程序,如果損失不大,甚至失去數據,特別是如果我只失去一部分 IPv4 因為我將使用 MySQL 腳本繼續填充表。但是,我擔心我可能會失去其他東西,這幾乎不是一種選擇,但我會看到的。
不幸的是,您必須讓 InnoDB 清除其所有移動部分(重做日誌、撤消日誌、臟頁、索引更改、日誌緩衝區內容等)
展望未來,我推薦以下內容:設置innodb_max_dirty_pages_pct = 0
預設情況下,innodb_max_dirty_pages_pct為 75。如果將其設置為 0,它會強制 InnoDB 儲存引擎將每個臟頁及其祖母刷新出 InnoDB 緩衝池,而不會暫停。它要麼刷新每個頁面,要麼將其刷新到足夠低的位置,以便新臟頁面進入緩衝池的速度與舊臟頁面被刷新一樣快。
刷新臟頁和清理事務是關機中消耗時間最多的部分。最小化頁數可以縮短關機時間。
您可以監控以下狀態變數
看著它們減少,直到它達到零或趨於平穩。然後,您可以發出關機。
以下是您可以使用的其他設置
試一試 !!!
事後諸葛亮
不要擔心轉儲緩衝池映射和重新載入。輸出文件非常小。
SATA/RAID0 對我來說聽起來很嚇人。您應該為 InnoDB 使用 SAS/RAID10。
至少您考慮將 InnoDB 數據、日誌和系統表空間拆分到單獨的設備中。請參閱我之前的文章MySQL on SSD - 有什麼缺點?
您還應該考慮遠離梭子魚。請參閱我的舊文章innodb_file_format 梭子魚
更新 2014-12-07 18:14 EST
如果您想中斷所有內容的 InnoDB 清除並且不想保留正在修復的數據,您唯一的選擇是設置 InnoDB 恢復選項。請參閱我的文章InnoDB 日誌序列號在未來。如果你使用innodb_force_recovery選項,它可能不會讓你再寫 InnoDB。如果你的數據量適中,你可以mysqldump任何可以出來的數據,關閉mysqld,刪除所有數據文件夾(mysql模式除外),ib_logfile0,ib_logfile1和ibdata1,啟動mysql,重新載入數據。
如果您有 1TB 處於強制恢復狀態,我真的無法幫助您。