回答:
InnoDBインフラストラクチャで最も忙しいファイルは/ var / lib / mysql / ibdata1であることに注意してください
通常、このファイルには多くのクラスの情報が含まれます(innodb_file_per_tableが0の場合)
多くの人々は、より良いディスクスペース管理とパフォーマンスを期待して、複数のibdataファイルを作成します。助けにはなりません。
残念ながら、ibdata1に保存されているInnoDBテーブルに対するOPTIMIZE TABLEは2つのことを行います。
テーブルデータとテーブルインデックスをibdata1から分離し、innodb_file_per_tableを使用して個別に管理できます。ibdata1を1回だけ縮小するには、次を実行する必要があります
ステップ01) MySQLDumpすべてのデータベースをSQLテキストファイル(SQLData.sqlと呼びます)(詳細はこちら)
ステップ02) (を除くすべてのデータベースをドロップしmysql
、performance_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つのファイルが表示されます
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;