天天看點

[Linux MySQL] MySQL 不停服務來啟用 innodb_file_per_table

轉載本站文章請注明,轉載自:扶凱[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

service mysqld start

mysqldump

-uroot

-p

--quick

--default

-character-set=utf8 bbsee >dump_data.sql

service mysqld stop

建立新的資料庫

在新的機器上.安裝新的資料庫檔案.隻保留 dump_data.sql.然後使用 mysql_install_db 來建權限資料,MySQL 的資料庫

mysql_install_db

--user

=mysql

建立新的配置檔案

vim /etc/mysql/my.cnf
      

添加以下行到新的檔案:

innodb_file_per_table = 1
server-id = 2
bin-log = 1
      

我在次聲明,這是成功的關鍵,innodb_file_per_table 會讓過一會導入的資料按表來存, binlog 是為了以後切主的時候使用.

啟動 MySQL的并配置 Slave 的同步

先要啟動資料庫

server mysqld start

恢複導出的資料庫

mysql

-uroot

-p

--default

-character-set=utf8  < dump_data.sql

配置複制

因為剛導入資料庫,是以要從現在開始複制,需要在主資料庫上根據我以前的文章,給這個設定好權限,然後我們在 Slave 配置一下 slave 的設定

4

5

6

7

change master

to

master_host=

'127.0.0.1'

,

master_user=

'repl'

,

master_password=

'passwd'

,

master_port=3306,

master_log_file=

'mysql-bin.000001'

,

master_log_pos=3874;

start slave;

這個中的 master_log_file 和 master_log_pos 是根據我以前文章剛開始使用 innobackupex 做主資料備份時 xtrabackup_binlog_info 中的資訊

mysql

-uroot

-p

-e

"show slave status\G"|grep Seconds

當MySQL顯示 Seconds_Behind_Master: 0 時,這就 Slave 就同步的和主資料庫一樣了.

主從切換

現在備份完 Salve 也同步成和主一樣,這時因為使用了  innodb_file_per_table 的參數,是以可以切成主了.直接在主資料庫中鎖一下資料庫

SET

global

read_only=1;

然後檢視主資料庫的狀态,寫 binlog 到那個檔案,什麼位置了.

SHOW master STATUS;

接着到 Slavle 的資料庫上看看是不同步到一樣的狀态了.

SHOW slave STATUS \G;

確定主從同步的一樣後,先到 Slave 上停止 Slave 的複制變成新的 master,這時才友善切成主,是以要在新的 master上執行

stop slave

change master

to

master_host=”

reset slave

reset maters

繼續閱讀