MySQLではibdata1とファイルを削除/軽減する方法

私は、localhostのでしょうMySQLがある「クエリツール」の統計の実施、でRとして使用する(B)新しいテーブルを作成し、私は新しいデータベース(A)を作成します、あなたはRスクリプトを実行するたびにそして次にBにデータをインポートし、AにBを削除し、削除、必要な情報を取得するために照会をサブミット

私にとっては、それがうまく動作しますが、私はibdataファイルのサイズが急速に増加して実現し、私はすべてのコンテンツは、MySQLに保存されていませんが、ibdata1とファイルは100MB以上を持っています。

私は、自動的に一定時間後に/クリアibdata1とファイルを縮小することができ、設定で多かれ少なかれデフォルト設定のMySQLを使用しましたか?


#1階

場合のInnoDB(一部)MySQLのテーブルのストレージエンジンは、デフォルトの設定の問題が発生している可能性があります。あなたは、MySQLのデータディレクトリに気づいたかもしれません(Debianの/ Ubuntuのでは-の/ var / libに / mysqlの中)の「ibdata1と」という名前のファイルがあります。それは(ないトランザクションログ)ほぼすべてのInnoDBのMySQLインスタンスデータを保持しており、非常に大きくなる可能性があります。デフォルトでは、このファイルの初期サイズは10MBですし、自動的に拡張されます。残念ながら、それは設計、InnoDBのデータファイルに応じて削減することができません。これはスペースDELETE、TRUNCATE、DROP、などがファイルを回復しないであろう理由です。

私はあなたがここで良い説明と解決策を見つけることができると思います。

http://vdachev.net/2007/02/22/mysql-reducing-ibdata1/


ハウス#2

加え、ジョン・Pの答えは

Linuxシステムの場合は、次のコマンドは、手順1-6を完了するために使用することができます。

  1. mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
  2. DROP DATABASE [database_name];
  3. sudo /etc/init.d/mysqld stop
  4. sudo rm /var/lib/mysql/ibdata1
    sudo rm /var/lib/mysql/ib_logfile(そしてほかの削除と呼ばれるib_logfile0ib_logfile1などib_logfile1...)
  5. sudo /etc/init.d/mysqld start
  6. create database [database_name];
  7. mysql -u [username]-p[root_password] [database_name] < dumpfilename.sql

警告:あなたはこのMySQLインスタンス上の他のデータベースを持っている場合は、これらの命令は、あなたが他のデータベースを失うことになります。 修正手順1、2、6および7は、あなたが残しておきたいすべてのデータベースをカバーすることを確認します。


ハウス#3

あなたはInnoDBのテーブルを削除すると、MySQLはそれが成長している理由これは、宇宙ibdataファイルを解放しません。これらのファイルはほとんど縮小されていません。

既存のibdataファイルを削減する方法:

http://dev.mysql.com/doc/refman/5.5/en/innodb-resize-system-tablespace.html

このスクリプトを書いて、一定時間後に実行するスクリプトをスケジュールしますが、上記の設定のために、複数の表スペースは、より簡単な解決策であると思われることができます。

あなたが設定オプションを使用している場合はinnodb_file_per_table、それが複数の表スペースを作成します。言い換えれば、むしろ共有ファイルよりも、各テーブルに別々のファイルを作成してMySQLの。これらのファイルは別のディレクトリデータベースに格納され、データベースを削除する場合、それを削除します。あなたのケースでは、あなたは/クリアibdataファイルを縮小する必要はありません。

複数の表スペースの詳細については:

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html


#4階

ibdata1何の減少は、MySQLの特に迷惑な機能ではありません。すべてのデータベースを削除しない限り、そうでない場合は、削除して、ダンプ・ファイルを再ロードibdata1ファイルが実際に縮小されていません。

ただし、MySQLを設定することができますので、(その索引を含む)の各テーブルには、別のファイルとして保存されます。このように、ibdata1それはあまりにも大きくなりません。よると、ビルKarwinさんのコメント、この機能はデフォルトで起動するのMySQL 5.6.6バージョンから有効になっています。

少し前、私はこれを作りました。ただし、各テーブルに別々のファイルを使用するようにサーバーを設定するには、変更する必要がありmy.cnf、この機能を有効にします:

[mysqld]
innodb_file_per_table=1

http://dev.mysql.com/doc/refman/5.5/en/innodb-multiple-tablespaces.html

あなたがしたい場合にはibdata1回収空間を、実際には、ファイルを削除する必要があります。

  1. に加えて、mysqlおよびperformance_schemaデータベースの外部のすべてのデータベース、プロシージャ、トリガ、および実行に関するので、mysqldump
  2. 削除上記の二つのデータベースに加えて、すべてのためのデータベース
  3. ストップmysqlの
  4. 削除ibdata1ib_logファイル
  5. [スタート] mysqlの
  6. ダンプからのリストア

手順5でMySQLを起動すると、再作成されますibdata1ib_logファイル。

あなたは今開始することができます。あなたは、分析のための新しいデータベースを作成すると、これらのテーブルは、別に配置されますibd*代わりに、ファイルibdata1通常は、近い将来にデータベースを削除するので、そのibd*ファイルが削除されます。

http://dev.mysql.com/doc/refman/5.1/zh-CN/drop-database.html

あなたは見たことがあります
http://bugs.mysql.com/bug.php?id=1341

コマンドを使用してALTER TABLE <tablename> ENGINE=innodbか、OPTIMIZE TABLE <tablename>データを別のファイルにibdata1とからページを抽出してインデックスを作成することができます。しかし、上記の手順がない限り、そうでない場合はibdata1とは、縮小することはありません。

information_schemaこれは必須ではなく、削除することはできません。実際には、それだけで読み取り専用ビューの束ではなく、テーブルです。そして、何の関連するファイルではなく、さらにデータベース・ディレクトリが存在しません。informations_schemaメモリは、DB-エンジンを使用している、と停止のmysqld /削除され、再起動を再構築します。参照してくださいhttps://dev.mysql.com/doc/refman/5.7/en/information-schema.htmlを


ハウス#5

式以上のMySQLサーバの新バージョンでは、「mysqlの」データベースを破砕します。古いバージョンでは、それが動作することができます。新しいテーブルでは、テーブルはいくつかのInnoDBテーブルタイプに切り替えられ、これはそれらを損傷します。最も簡単な方法は次のとおりです。

  • すべてのデータベースをダンプ
  • アンインストールMySQLサーバ、
  • my.cnfのまだ追加:
    [mysqld]
    innodb_file_per_table=1
  • すべてのコンテンツを/ var / libに/ MySQLでの消去
  • MySQLサーバをインストールします。
  • そして、ユーザーデータベースを復元

ハウス#6

スクリプト素早く書き込みにはbashとの答えを受け入れるために:

#!/usr/bin/env bash
DATABASES="$(mysql -e 'show databases \G' | grep "^Database" | grep -v '^Database: mysql$\|^Database: binlog$\|^Database: performance_schema\|^Database: information_schema' | sed 's/^Database: //g')"
mysqldump --databases $DATABASES -r alldatabases.sql && echo "$DATABASES" | while read -r DB; do
    mysql -e "drop database \`$DB\`"
done && \
    /etc/init.d/mysql stop && \
    find /var/lib/mysql -maxdepth 1 -type f \( -name 'ibdata1' -or -name 'ib_logfile*' \) -delete && \
    /etc/init.d/mysql start && \
    mysql < alldatabases.sql && \
    rm -f alldatabases.sql

名前を付けて保存purge_binlogs.shとするroot purge_binlogs.sh実行します。

それは含まれていませんmysqlinformation_schemaperformance_schema(およびbinlogカタログ)。

あなたがたと/root/.my.cnf管理者の資格情報を持っており、データベースがデフォルトに位置している/var/lib/mysqlディレクトリ。

このスクリプトを実行した後、あなたはまた、より多くのディスクスペースを取り戻すために、以下の方法により、バイナリログをクリアすることができます。

PURGE BINARY LOGS BEFORE CURRENT_TIMESTAMP;

#7の構築

前述したように、あなたは(こうそうダンプと再構築が必要です)ibdata1とを縮小することはできませんが、通常は、実際の必要はありません。

自動拡張(おそらく最も一般的なサイズの設定)を使用する場合、ibdata1とは、事前に割り当てられたストレージスペースもあり、収納スペースでそれを拡張するほぼいっぱいです。スペースが割り当てられ、そのために高速書き込みをされたので。

あなたはデータを削除すると、それが縮小することはありませんが、ファイル内のスペースは未使用としてマークされています。さて、あなたは新しいデータファイルを挿入すると、さらなる成長のためのファイルの前に空白スペースに再利用されます。

あなたが本当にこれらのデータを必要とするのであれば、それだけで成長していきます。あなたが実際に他のアプリケーションのためのスペースを必要としない限り、またはそれを減らすために理由がないことがあります。


#8の構築

あなたの目標は、可能なMySQLのスペースを監視することで、あなたはMySQLがibdataファイルを縮小止めることができない場合は、テーブルのstatusコマンドを通してそれを取得します。例:

MySQLの> 5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $20}'

MySQLの<5.1.24:

mysqlshow --status myInnodbDatabase myTable | awk '{print $35}'

この値は、あなたのibdataファイルと比較されます。

du -b ibdata1

出典:HTTP//dev.mysql.com/doc/refman/5.1/en/show-table-status.html

オリジナルの記事は、0公表 ウォンの賞賛0 ビュー2212

おすすめ

転載: blog.csdn.net/p15097962069/article/details/103923395