アタッチされているデータベースを停止せずに、ibdata1ファイルから古いレコードを削除することはできますか?
データベースから削除されたレコードは、ibdata1で文字列をスキャンしてもまだ存在します。
私はibdata1ファイルがどのように機能するかをある程度知っており、ファイルのこれらの部分がおそらく時間内に上書きされることに気づきますが、古いデータをゼロにするか、または削除する必要があるため、どのような形式でもサーバーに保存されなくなります。
データベースを停止せずにこれを行う方法はありますか?
あなたが求めていることは、文書化も試みもされていません。
ただし、私は過去にこのような2つの投稿に回答しました。
Aug 29, 2012
: ibdataファイルですでに削除されたレコードにある機密データの削除/上書きDec 17, 2012
: ibdata1をゼロ/ヌル/その他で埋めるか、テーブルのテーブルスペースを変更する今後削除するデータについて、追加の提案があります。あなたはこれにいくつかの良い開発者の努力を入れなければならないでしょう:
テーブルを削除する前に、
すべての列のINFORMATION_SCHEMA.COLUMNSのエントリを調べて、数値と文字のどちらであるかを判別する必要があります。古いテーブルのすべてのデータを手動で上書きしたら、事前にデータをマスクしたことを知っているので、自由に削除できます。
すべてのInnoDBテーブルに制約/外部キーがない場合、これはダウンタイム中に実行できるものです。
そのアイデアは信用できません。ShlomiNoachが2013年9月19日に提案しました 。
DBが大きすぎない場合は、次の方法でスクリプトを作成できます。
MYSQL_USER=root
MYSQL_PASS=password
MYSL_CONN="-u${MYSQL_CONN} -p${MYSQL_PASS}"
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_MyISAM.sql
SQL="SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;')"
SQL="${SQL} FROM information_schema.tables WHERE engine='InnoDB'"
mysql ${MYSQL_CONN} -ANe"${SQL}" > Convert_To_InnoDB.sql
mysql ${MYSQL_CONN} -ANe"SET GLOBAL innodb_fast_shutdown = 0"
この時点で、vi
またはless
の2つのスクリプトを確認します。
コードに満足したら、これを行うことができます:
mysql ${MYSQL_CONN} < Convert_To_MyISAM.sql
service mysql stop
rm -f /var/lib/mysql/ibdata1
service mysql start
mysql ${MYSQL_CONN} < Convert_To_InnoDB.sql
最善の策は、ibdata1ファイルにレガシーデータがない新しいinnodbサブシステムでレプリカを作成することです。これは取るに足らないことであり、mydumperやmysqldumpなどの論理バックアップツールを使用して実行する必要があります。 Xtrabackupはibdata1ファイルのバイナリコピーを作成するため、ファントム文字列はそのファイルにも存在します。レプリカが構築、復元され、最新の状態になったら、新しいインスタンスを使用するようにアプリケーションを再ポイントできます。古いものを排除し、新しい最小限のダウンタイムを導入します。
あなたはこの方法を試すことができます:
1)MySQLDumpまたはその他のバックアップツールを使用して、すべてのInnoDBテーブルのダンプを取得します
2)次にmy.cnf
を編集して指定します
innodb_file_per_table = 1
3)MySQLサーバーを再起動します
4)InnoDBテーブルを含むダンプをインポートします
5)古いIbdata1ファイルを削除します
* Innodb_file_per_table *は、MySQLサーバーv5.6.6以降でのみサポートされています
従来、すべてのInnoDBテーブルとインデックスはシステムテーブルスペースに格納されていました。このモノリシックなアプローチは、データベースの処理に完全に専念するマシンを対象としており、MySQLに割り当てられたディスクストレージが他の目的で必要になることはありません。 InnoDBのfile-per-tableモードは、より柔軟な代替手段であり、各InnoDBテーブルとそのインデックスを個別のファイルに保存します
Innodb_file_per_tableオプションを使用する利点
テーブルをトランケートまたはドロップするときに、オペレーティングシステムのディスク領域を再利用できます
TRUNCATE TABLE操作は、個々の.ibdファイルで実行するとより高速になります。
I/O最適化、スペース管理、またはバックアップの目的で、特定のテーブルを別々のストレージデバイスに保存できます。以前のリリースでは、データベースディレクトリ全体を他のドライブに移動し、MySQLデータディレクトリにシンボリックリンクを作成する必要がありました
データベース全体ではなく、個々のInnoDBテーブルを移動できます。
Innodb_file_per_tableを使用すると、破損が発生した場合、サーバーを再起動できない場合、またはバックアップとバイナリログが利用できない場合に、回復が成功する可能性が高まり、時間を節約できます。
リファレンス: http://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-tablespaces.html