0

MySQL を使用しており、テーブル全体を 1 日 2 回 CSV からのデータに置き換える必要がある ~110 万レコードの InnoDB テーブルがあります。

私がこれまで行ってきたことは、テーブルを切り捨ててから、mysqlimport を使用して 1 日に 2 回、新鮮な CSV からテーブルを再作成することでした。これにより、約 160 秒のダウンタイムが発生します。最初は問題ないと言われていたのですが、そうではなくなりました。

これを行う唯一の方法は、ステージング テーブルとプロダクション テーブルを用意することです。ライブクエリは本番環境に移行し、データベースを再作成する必要がある場合は、ステージングを切り捨て、mysqlimport で CSV をそこにインポートします。その後、ステージングに古いデータベースが含まれ、本番環境がデータベースになるように名前を交換します。新しくインポートされた CSV が含まれています。production が production2 になり、ステージングが production になり、さらに production2 が staging になるような中間名が必要になると思います。

誰かが別の解決策を持っていますか? テーブルはできるだけ早くインポートする必要があるため、mysqlimport を使用しています。ダウンタイムは最小限に抑える必要があります。

4

2 に答える 2

3

あなたはすでに最適なソリューションを持っていると思います。アトミックな名前変更、つまり「テーブルの名前を production を production2 に変更し、ステージングを production に変更する」ことを確認してください。このようにして、アプリケーション/ユーザーに対して透過的になります。注意すべきことの 1 つは、このテーブルを参照する外部キーがあるかどうかです。キーは名前が変更された古いテーブルを引き続き参照するためです。しかし、以前は問題なく切り捨てることができたので、適切に配置されていないと思います。

編集: 私は StackOverflow にコメントするのはかなり新しいので、これがそうするのに最適な場所であるかどうかはわかりませんが、eggyal によって投稿された回答にコメントしたいだけです - TRUNCATE は暗黙のコミットを引き起こし、提案された解決策が勝ちました説明どおりに動作しません (つまり、新しいデータがロードされる前であっても、変更がユーザー/アプリケーションに表示されます)。

于 2012-05-02T07:01:40.627 に答える
0

DELETEトランザクションでand LOAD DATA(これですべてですmysqlimport) 操作を実行します。MySQL は、手間をかけずにステージング プロセスをアトミックに実行します。

START TRANSACTION;
DELETE FROM foo;
LOAD DATA INFILE '/path/to/bar' INTO TABLE foo;
COMMIT;

NB: @JohannTagle で指摘されているTRUNCATEように、暗黙的なコミットが発生するため、DELETE代わりに使用する必要があります。

于 2012-05-02T07:23:19.767 に答える