2 つのインデックス エントリ間の行?
-
21-09-2019 - |
質問
mysqldump によって作成されたデータベース ダンプを再インポートするときに問題が発生します。order-by-primary オプションを指定して mysqldump を実行し、一意のキーを持つテーブルで実行しました (明示的な主キーがないため、その一意のキーでソートされました)。この場合の目的は、一意のキーを主キーにしてテーブルを再作成することでした。
このダンプには非常に長い時間がかかり (約 10 日)、再度実行するのは非常に面倒です。ダンプを (適切なスキーマ変更を加えて) 再インポートしようとしましたが、mysql が途中で停止しました。ダンプファイルの中で詰まっている箇所を調べてみると、誰かがダンプファイルのテキストにスパムメールを直接挿入したようです。
幸いなことに、被害は孤立していたようで、ゴミの直前と直後に鍵を見ることができました。
先生:ゴミをつなぎ合わせただけだと、前のキーと後のキーの間でいくつのキーが失われるかわかりません。ダンプはその一意のキーによってソートされるので、その点では作業が楽になります。mysql には、インデックス内の 2 つのエントリ間のすべての行を取得する方法はありますか?
キーは 32 文字の 16 進文字列で、CHAR(32) 型の列に格納されます。文字列に対して < または > 演算子を使用できないことは確かです...それで何か提案はありますか?
解決
主キー(または一意キー)でのmysqldumpを並べ替え、それはとても時間がかかるの作ったものです。十日はしかし、かなり信じられないです。
このような並べ替えを行うと、バックアップにMyISAMテーブルが必要なときにのみ有用であり、InnoDBのテーブルにそれを復元します。これは何をやっているのですか?
MySQLは確かにテーブルのサブセットをダンプする方法を持っています。 mysqldumpをの --where
のオプションをチェックしてください。これは、あなたが破損した行をバックアップできるようにする必要があります。
そして、はい、あなたは、SQL内の文字列に<
と>
を使用することができます。またBETWEEN
述語を使用することができます。
他のヒント
私の最初の質問は、スパムメールは、データベース・ダンプにそれを作成し、それを破壊することができるか、でしょうか?
私はそれが正しい、あなたのデータ列の1のうちから来る推測していますか?あなたは、このE-Mailとどのようにそれはあなたのダンプの構造を乱すために管理方法を示しすることはできますか?
多分それは持つべきではない、私は知らないされて改行を挿入するためにダンプを引き起こしたヘッダインジェクションのいくつかの並べ替えをしました。とにかく、私の意見では最優先されることを片付けます。