私は、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を完了するために使用することができます。
-
mysqldump -u [username] -p[root_password] [database_name] > dumpfilename.sql
-
DROP DATABASE [database_name];
-
sudo /etc/init.d/mysqld stop
-
sudo rm /var/lib/mysql/ibdata1
sudo rm /var/lib/mysql/ib_logfile
(そしてほかの削除と呼ばれるib_logfile0
、ib_logfile1
などib_logfile1
...) -
sudo /etc/init.d/mysqld start
-
create database [database_name];
-
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
回収空間を、実際には、ファイルを削除する必要があります。
- 用に加えて、
mysql
およびperformance_schema
データベースの外部のすべてのデータベース、プロシージャ、トリガ、および実行に関するので、mysqldump
- 削除上記の二つのデータベースに加えて、すべてのためのデータベース
- ストップmysqlの
- 削除
ibdata1
とib_log
ファイル - [スタート] mysqlの
- ダンプからのリストア
手順5でMySQLを起動すると、再作成されますibdata1
とib_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
実行します。
それは含まれていませんmysql
、information_schema
、performance_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