轉載本站文章請注明,轉載自:扶凱[http://www.php-oa.com]
本文連結: http://www.php-oa.com/2012/04/20/mysql-innodb_file_per_table.html
InnoDB 是一個非常不錯的 MySQL 的存儲引擎,目前使用非常廣泛基本所有的網站和項目,我想都會優先選擇這個,這個也有很好的診斷和微調的工具.我發現其中一個缺點,就是磁盤空間管理時設計非常低效.這個設計成給所有資料都存到 ibdata1 檔案,是以這個檔案的存儲空間會不斷的擴充.InnoDB 并不會收縮這些空間,就算你删除表和資料庫.
是以我們需要注意我們的配置.最好一開始就使用 innodb_file_per_table 的選項.這樣可以使得更加靈活性的給資料存到每個單表的資料庫. 我非常不幸地, 最開始我的資料并沒有考慮這個是以沒有打開這個參數.後來我測試過,在之後打開這個參數根本不能生效.是以隻能 dump 整個資料庫,然後在啟動這個參數後重新恢複資料庫才行.這時我們在想有沒有法子,不用關掉資料庫的服務時就能完成這個工作.
目前看來隻能使用 mysqldump 輸出,然後才能恢複.是以我們隻能使用 MySQL 的主從模式來切換,才能最大限度地減少停機時間.
是以,我使用的基本步驟是:
- 配置為目前的原始資料庫為 Master 資料庫.
- 使用 Xtrabackup 來備份你的原始資料庫.
- 恢複你的備份和到第二個 MySQL 的執行個體上.
- 恢複,但不同步,然後運作 mysqldump 在第二個做為 Slave 的資料庫上然後導出.
- 停止第二個資料庫執行個體,并删除資料庫.
- 建立一個新的資料庫,使用前面導出的資料來恢複 MySQL 的執行個體,記得先要打開 innodb_file_per_table 的選項恢複.
- 配置這個資料庫為 slave 然後運作複制.
- 當複制完成時,給這個 slave 切換成主,然後重新配置你的用戶端使用這個執行個體
- 現在可以停止主資料庫和删除它.
下面是詳細的步驟
準備,配置資料庫主從
這個看以前的 Blog 有講怎麼線上做 MySQL 的主從.接下來在 Slave 上做轉換的操作
Dump 出 Slave 上的資料
假設你根據我以前的文章都做好了.現在配置好 slave 了.記得使用 innobackupex-1.5.1 –apply-log 恢複後,然後複制到資料庫的目錄.并修改權限.
這時記得先不要設定同步.直接啟動資料後.直接使用 MySQL 的 mysqldump 來導出整個資料庫.
?
1 2 3 | |
建立新的資料庫
在新的機器上.安裝新的資料庫檔案.隻保留 dump_data.sql.然後使用 mysql_install_db 來建權限資料,MySQL 的資料庫
|
建立新的配置檔案
vim /etc/mysql/my.cnf
添加以下行到新的檔案:
innodb_file_per_table = 1
server-id = 2
bin-log = 1
我在次聲明,這是成功的關鍵,innodb_file_per_table 會讓過一會導入的資料按表來存, binlog 是為了以後切主的時候使用.
啟動 MySQL的并配置 Slave 的同步
先要啟動資料庫
|
恢複導出的資料庫
|
配置複制
因為剛導入資料庫,是以要從現在開始複制,需要在主資料庫上根據我以前的文章,給這個設定好權限,然後我們在 Slave 配置一下 slave 的設定
4 5 6 7 | |
這個中的 master_log_file 和 master_log_pos 是根據我以前文章剛開始使用 innobackupex 做主資料備份時 xtrabackup_binlog_info 中的資訊
|
當MySQL顯示 Seconds_Behind_Master: 0 時,這就 Slave 就同步的和主資料庫一樣了.
主從切換
現在備份完 Salve 也同步成和主一樣,這時因為使用了 innodb_file_per_table 的參數,是以可以切成主了.直接在主資料庫中鎖一下資料庫
|
然後檢視主資料庫的狀态,寫 binlog 到那個檔案,什麼位置了.
|
接着到 Slavle 的資料庫上看看是不同步到一樣的狀态了.
|
確定主從同步的一樣後,先到 Slave 上停止 Slave 的複制變成新的 master,這時才友善切成主,是以要在新的 master上執行
|