sql >> データベース >  >> RDS >> Mysql

方法:mysql InnoDBストレージエンジンをクリーンアップしますか?

    InnoDBに関するより完全な答えは次のとおりです。これは少し時間のかかるプロセスですが、努力する価値があります。

    / var / lib / mysql / ibdata1に注意してください InnoDBインフラストラクチャで最もビジーなファイルです。通常、6種類の情報が格納されています:

    • テーブルデータ
    • テーブルインデックス
    • MVCC(Multiversioning Concurrency Control) データ
      • ロールバックセグメント
      • スペースを元に戻す
    • テーブルメタデータ(データディクショナリ)
    • ダブル書き込みバッファ(OSキャッシングへの依存を防ぐためのバックグラウンド書き込み)
    • バッファの挿入(一意でないセカンダリインデックスへの変更の管理)
    • 画像表現を参照してくださいibdata1の

    InnoDBアーキテクチャ

    多くの人が複数のibdataを作成します より良いディスクスペース管理とパフォーマンスを望んでいるファイルですが、その信念は間違っています。

    OPTIMIZEを実行できますか表

    残念ながら、 OPTIMIZE TABLE 共有テーブルスペースファイルibdata1に格納されているInnoDBテーブルに対して 2つのことを行います:

    • テーブルのデータとインデックスをibdata1内で連続させます
    • ibdata1を作成します 隣接するデータとインデックスページが追加されるため、成長します ibdata1

    ただし、テーブルデータとテーブルインデックスを ibdata1から分離することはできます。 独立して管理します。

    OPTIMIZEを実行できますか表 innodb_file_per_table >

    innodb_file_per_table<を追加するとします。 / code> /etc/my.cnf(my.ini)へ 。次に、 OPTIMIZETABLEを実行できますか すべてのInnoDBテーブルで?

    朗報 OPTIMIZETABLE<を実行する場合/ code> innodb_file_per_table > 有効にすると、 .ibdが生成されます そのテーブルのファイル。たとえば、テーブル mydb.mytableがある場合 / var / lib / mysqlのdatadirを使用 、次のように生成されます:

    • /var/lib/mysql/mydb/mytable.frm
    • /var/lib/mysql/mydb/mytable.ibd

    .ibd そのテーブルのデータページとインデックスページが含まれます。すばらしい。

    悪いニュース mydb.mytableのデータページとインデックスページを抽出するだけです。 ibdataに住んでいることから 。 mydb.mytableを含むすべてのテーブルのデータディクショナリエントリ 、まだデータディクショナリに残っています(の画像表現を参照してください) ibdata1 )。 ibdata1を簡単に削除することはできません この時点で!!! ibdata1に注意してください まったく縮小していません。

    InnoDBインフラストラクチャのクリーンアップ

    ibdata1を縮小するには 一度限り、次のことを行う必要があります:

    1. ダンプ(例: mysqldump )すべてのデータベースを .sqlに テキストファイル( SQLData.sql 以下で使用されます)

    2. すべてのデータベースを削除します( mysql を除く) およびinformation_schema警告 :予防策として、このスクリプトを実行して、すべてのユーザー許可が設定されていることを確認してください:

      mkdir /var/lib/mysql_grants
      cp /var/lib/mysql/mysql/* /var/lib/mysql_grants/.
      chown -R mysql:mysql /var/lib/mysql_grants
      
    3. mysqlにログインし、 SET GLOBAL innodb_fast_shutdown =0;を実行します。 (これにより、残りのすべてのトランザクション変更が ib_logfile0から完全にフラッシュされます。 およびib_logfile1

    4. MySQLをシャットダウン

    5. 次の行を/etc/my.cnfに追加します (または my.ini Windowsの場合)

      [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%です 。

      また: innodb_flush_method =O_DIRECT Windowsでは使用できません)

    6. ibdata *を削除します およびib_logfile* 、オプションで、 / var / lib / mysql内のすべてのフォルダを削除できます 、 / var / lib / mysql / mysqlを除く 。

    7. MySQLを起動します(これにより、 ibdata1が再作成されます [デフォルトで10MB]およびib_logfile0 およびib_logfile1 各1Gで)。

    8. SQLData.sqlをインポートします

    さて、 ibdata1 各InnoDBテーブルはibdata1の外部に存在するため、引き続き拡張されますが、テーブルメタデータのみが含まれます。 。 ibdata1 InnoDBデータと他のテーブルのインデックスは含まれなくなります。

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

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

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

    私はMySQLDBAとしてのキャリアの中でこれを何度も行ってきました。実際、これを初めて行ったときは、 50GBを縮小しました。 ibdata1 わずか500MBまでファイルを作成してください!

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

    警告

    ステップ6で、 mysqlが原因でmysqlを再起動できない場合 スキーマの削除を開始します。手順2を振り返ります。mysqlの物理コピーを作成しました スキーマ。次のように復元できます:

    mkdir /var/lib/mysql/mysql
    cp /var/lib/mysql_grants/* /var/lib/mysql/mysql
    chown -R mysql:mysql /var/lib/mysql/mysql
    

    手順6に戻り、続行します

    UPDATE 2013-06-04 11:13 EDT

    innodb_log_file_size の設定に関して innodb_buffer_pool_size の25%まで ステップ5では、それは包括的なルールです。

    2006年7月3日に戻る 、Perconaには素晴らしい記事がありました適切なinnodb_log_file_sizeを選択する理由 。その後、2008年11月21日 、Perconaは、1時間分の変更を維持しながらピークワークロードに基づいて適切なサイズを計算する方法

    それ以来、ログサイズの計算と、これら2つのPerconaの記事を参照した場所について、DBAStackExchangeに投稿しました。

    個人的には、初期設定には25%のルールを使用します。次に、本番環境で時間の経過とともにワークロードをより正確に決定できるため、サイズを変更できますログ わずか数分でメンテナンスサイクル中に。



    1. OracleCloudPlatform上のOracleDatabase12cでのOracleJDeveloper12cの使用、パート3

    2. PLSQLで一重引用符をエスケープする

    3. execSQL:bindargsの方が優れていますか?

    4. CREATEOracleプロシージャ