mysqlでibdataのサイズを縮小する最良の方法は何ですか?


63

私は、ibdataファイルのサイズが日々増加する運用サーバーをいくつか持っています。

すでに290GBのスペースを消費しています。

サーバー内のテーブルの大部分はInnoDBであり、高い読み取りおよび書き込み要求があります。

ログファイルのサイズも増加します。テーブルには大量のデータがあります。

両方のサイズの増加をどのように制御できますか?

私は使用していませんinnodb_file_per_table

回答:


104

InnoDBインフラストラクチャで最も忙しいファイルは/ var / lib / mysql / ibdata1であることに注意してください

通常、このファイルには多くのクラスの情報が含まれます(innodb_file_per_tableが0の場合)

  • テーブルデータ
  • テーブルインデックス
  • MVCC(マルチバージョン同時実行制御)データ
    • ロールバックセグメント
    • 表領域を元に戻す
  • テーブルのメタデータ
  • 画像表現を参照してください

多くの人々は、より良いディスクスペース管理とパフォーマンスを期待して、複数のibdataファイルを作成します。助けにはなりません。

残念ながら、ibdata1に保存されているInnoDBテーブルに対するOPTIMIZE TABLEは2つのことを行います。

  • ibdata1内でテーブルのデータとインデックスを連続させます
  • 連続したデータがibdata1に追加されるため、ibdata1が大きくなります

テーブルデータとテーブルインデックスをibdata1から分離し、innodb_file_per_tableを使用して個別に管理できます。ibdata1を1回だけ縮小するには、次を実行する必要があります

ステップ01) MySQLDumpすべてのデータベースをSQLテキストファイル(SQLData.sqlと呼びます)(詳細はこちら

ステップ02) (を除くすべてのデータベースをドロップしmysqlperformance_schemaそして、information_schema

ステップ03) mysqlのシャットダウン

ステップ04) /etc/my.cnfに次の行を追加します

[mysqld]
innodb_file_per_table
innodb_flush_method=O_DIRECT
innodb_log_file_size=1G
innodb_buffer_pool_size=4G

補足:innodb_buffer_pool_sizeの設定が何であれ、innodb_log_file_sizeがinnodb_buffer_pool_sizeの25%であることを確認してください。

ステップ05) ibdata1、ib_logfile0およびib_logfile1を削除します

この時点で、/ var / lib / mysqlにはmysqlスキーマのみが存在するはずです。

ステップ06) mysqlを再起動します

これにより、10MBでibdata1、それぞれ1Gでib_logfile0およびib_logfile1が再作成されます

ステップ07) SQLData.sqlをmysqlにリロードします

ibdata1は成長しますが、テーブルメタデータのみが含まれます

各InnoDBテーブルはibdata1の外部に存在します

mydb.mytableという名前のInnoDBテーブルがあるとします。/ var / lib / mysql / mydbに移動すると、テーブルを表す2つのファイルが表示されます

  • mytable.frm(ストレージエンジンヘッダー)
  • mytable.ibd(mydb.mytableのテーブルデータとテーブルインデックスのホーム)

ibdata1にはInnoDBデータとインデックスが含まれなくなります。

/etc/my.cnfのinnodb_file_per_tableオプションを使用するOPTIMIZE TABLE mydb.mytableと、実行でき、ファイル/var/lib/mysql/mydb/mytable.ibdは実際に縮小します。

私はMySQL DBAとしてのキャリアの中でこれを何度もやりました。

実際、これを初めて行ったとき、50GBのibdata1ファイルを500MBに縮小しました。

試してみる。これについてさらに質問がある場合は、私にメールしてください。私を信じて。これは短期的にも長期的にも機能します。!!!

MyISAMおよびInnoDBに保存されている実際のデータの量を確認するには、次のクエリを実行してください。

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size"
FROM (SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM information_schema.tables
WHERE table_schema NOT IN ('mysql','information_schema','performance_schema')
AND engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;

my.cnf(既に持っている)の推奨設定、ib_logfile0と1を削除してからmysqlを開始しても、新しいファイルが作成され、数秒以内に上記のクエリで表示されるデータベースのサイズに等しくなります。mysqlがすべてのテーブルとインデックスをこれらのファイルにコピーし、各テーブルを個別のファイルに保持しているかどうかはわかりません。
アレンキング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.