web-dev-qa-db-ja.com

mysql ibdata1ファイルから古いレコードを削除する

アタッチされているデータベースを停止せずに、ibdata1ファイルから古いレコードを削除することはできますか?

データベースから削除されたレコードは、ibdata1で文字列をスキャンしてもまだ存在します。

私はibdata1ファイルがどのように機能するかをある程度知っており、ファイルのこれらの部分がおそらく時間内に上書きされることに気づきますが、古いデータをゼロにするか、または削除する必要があるため、どのような形式でもサーバーに保存されなくなります。

データベースを停止せずにこれを行う方法はありますか?

3
Andrew Clinton

あなたが求めていることは、文書化も試みもされていません。

ただし、私は過去にこのような2つの投稿に回答しました。

今後削除するデータについて、追加の提案があります。あなたはこれにいくつかの良い開発者の努力を入れなければならないでしょう:

テーブルを削除する前に、

  • すべてのINTおよびFLOAT値に移動し、それらを0にします
  • すべてのCHAR、VARCHAR、TEXTフィールドに移動します
    • フィールドの長さを取得する
    • すべてのXまたはすべて0の同じバイト数で列を更新する

すべての列のINFORMATION_SCHEMA.COLUMNSのエントリを調べて、数値と文字のどちらであるかを判別する必要があります。古いテーブルのすべてのデータを手動で上書きしたら、事前にデータをマスクしたことを知っているので、自由に削除できます。

警告

すべてのInnoDBテーブルに制約/外部キーがない場合、これはダウンタイム中に実行できるものです。

  • すべてのInnoDBテーブルをMyISAMに変換します
  • Mysqlをシャットダウンする
  • ibdata1を削除する
  • スタートアップMySQL
  • それらのMyISAMテーブルを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

試してみる !!!

2
RolandoMySQLDBA

最善の策は、ibdata1ファイルにレガシーデータがない新しいinnodbサブシステムでレプリカを作成することです。これは取るに足らないことであり、mydumperやmysqldumpなどの論理バックアップツールを使用して実行する必要があります。 Xtrabackupはibdata1ファイルのバイナリコピーを作成するため、ファントム文字列はそのファイルにも存在します。レプリカが構築、復元され、最新の状態になったら、新しいインスタンスを使用するようにアプリケーションを再ポイントできます。古いものを排除し、新しい最小限のダウンタイムを導入します。

0
eroomydna

あなたはこの方法を試すことができます:

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オプションを使用する利点

  1. テーブルをトランケートまたはドロップするときに、オペレーティングシステムのディスク領域を再利用できます

  2. TRUNCATE TABLE操作は、個々の.ibdファイルで実行するとより高速になります。

  3. I/O最適化、スペース管理、またはバックアップの目的で、特定のテーブルを別々のストレージデバイスに保存できます。以前のリリースでは、データベースディレクトリ全体を他のドライブに移動し、MySQLデータディレクトリにシンボリックリンクを作成する必要がありました

  4. データベース全体ではなく、個々のInnoDBテーブルを移動できます。

  5. Innodb_file_per_tableを使用すると、破損が発生した場合、サーバーを再起動できない場合、またはバックアップとバイナリログが利用できない場合に、回復が成功する可能性が高まり、時間を節約できます。

リファレンス: http://dev.mysql.com/doc/refman/5.6/en/innodb-multiple-tablespaces.html

0
Mahesh Patil