4

私の質問は実際にはこれと非常によく似ており、InnoDBエンジンテーブルの場合の良い答えも含まれています。

https://dba.stackexchange.com/questions/8982/is-there-any-best-way-to-reduce-the-size-of-ibdata-in-mysql/8983#8983

ドロップスキーマはibdataファイルを縮小しないことに気付いたので、スキーマを削除した後にサイズが縮小されるようにDBを構成する方法を探しました。

InnoDBと、ファイルごとにテーブルを保存する方法について説明しているリンクをたくさん見つけました。これにより、.frmファイル自体にテーブルデータが含まれ、縮小されます。

しかし、MyISAMテーブル(5Gを超えるテーブルサイズ)ではどうなりますか。

4

2 に答える 2

4

ibdata1とMyISAMは相互に排他的です。

最初にすべきことは、両方のストレージエンジンを使用するテーブルの数を数えることです。

SELECT COUNT(1) EngineCount,engine
FROM information_schema.tables
WHERE table_schema NOT IN ('information_schema','performance_schema','mysql')
GROUP BY engine;

一部のテーブルがInnoDBの場合:

InnoDBのクリーンアップを実行します

MyISAMテーブルのみがあり、InnoDBテーブルがない場合:

まず、InnoDBの痕跡をすべて削除します。次の手順を実行します。

STEP01)これをmy.cnfに追加します

[mysqld]
skip-innodb

STEP02)service mysql restart

STEP03)rm -f /var/lib/mysql/ibdata1 /var/lib/mysql/ib_logfile*

これらの手順の後、次のように各MyISAMテーブルの圧縮を実行できます。

MyISAMであるテーブルmydb.mytableに対して、次のいずれかを実行します。

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

すべてのMyISAMテーブルをデフラグしたい場合は、これを行うためのシェルスクリプトを次に示します...

MYSQL_USER=root
MYSQL_PASS=rootpassword
MYSQL_CONN="-u${MYSQL_USER} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('OPTIMIZE TABLE ',table_schema,'.',table_name,';') "
SQL="${SQL} FROM information_schema.tables "
SQL="${SQL} WHERE engine='MyISAM' AND table_schema NOT IN "
SQL="${SQL} ('information_schema','performance_schema','mysql')"
mysql ${MYSQL_CONN} -ANe"${SQL}" > GlobalMyISAMOptmizeTable.sql
less GlobalMyISAMOptmizeTable.sql

スクリプトを視覚的に信頼したら、実行するだけです

mysql ${MYSQL_CONN} < GlobalMyISAMOptmizeTable.sql

試してみる !!!

更新2012-07-2509:52EDT

MyISAMの圧縮に関する私の提案の1つを明確にしたいと思います

さっき言った

  • OPTIMIZE TABLE mydb.mytable;
  • ALTER TABLE mydb.mytable ENGINE=MyISAM; ANALYZE TABLE mydb.mytable;

これらのコマンドは機械的に同じです。OPTIMIZE TABLEMyISAMテーブルの最適化を実行してから、実行ANALYZE TABLEして新しいインデックス統計を計算します。

機械的に言えば、これは何をするのかALTER TABLE mydb.mytable ENGINE=MyISAM;です:

CREATE TABLE mydb.mytabletmp LIKE mydb.mytable;
INSERT INTO mydb.mytabletmp SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable RENAME mydb.mytablezap;
ALTER TABLE mydb.mytabletmp RENAME mydb.mytable;
DROP TABLE mydb.mytablezap;
于 2012-07-24T17:41:34.010 に答える
2

前述のように、MyISAMはibdataを使用するべきではありません。my.cnfまたはMySQLシェルタイプのinnodb設定は何ですか?

    SHOW VARIABLES LIKE "%innodb%";

これらの変数は設定されていますか?

    innodb_data_home_dir
    innodb_data_file_path

INNODBをまったく使用していない場合は、ibdataとib_logfileを安全に削除して、MySQLを再起動できるはずです。通常、最初にテーブルを削除せずにこれらを削除すると、問題が発生します。MySQLでibdata1ファイルを縮小/パージする方法を参照してください

5Gigを超えるMyISAMテーブルがある場合は、とにかくINNODBを使用することをお勧めします。(4ギガ以上のもの)。トラブルシューティングするには、追加してみてください

    skip-innodb 

INNODBをまったく使用していない場合は、my.cnfにあります。

于 2012-07-24T17:16:25.233 に答える