web-dev-qa-db-ja.com

クラッシュ後のInnoDBロールバック中にMySQLをシャットダウンします

もう一度戸惑う。

昨夜、いくつかの巨大なクエリ中にサーバーがクラッシュしました。朝の再起動時に、MySQLはリカバリモードに入りました。 MySQLサービスをシャットダウンする必要があり、それが待機しています...ログに示されているように、コミットされていないトランザクションのバックグラウンドロールバックを想定していますが、HOTサーバーで9時間以上使用されており、終わりはありません。

サービスの再起動中に、プロセスを安全に中断してバックグラウンドで再開できますか?それとも、待たなければならないのですかgasp

任意の入力またはアイデア(または何が起こっているかについての情報)も非常に役立ちます。よろしくお願いします。

MySQL 5.5を実行しています。

これがログ出力です:

140930  9:04:30  InnoDB: Starting an apply batch of log records to the database...
InnoDB: Progress in percents: 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 
InnoDB: Apply batch completed
InnoDB: Last MySQL binlog file position 0 41217466, file name .\mysql-bin.001584
InnoDB: Starting in background the rollback of uncommitted transactions
140930  9:26:14  InnoDB: Rolling back trx with id B214637, 15850890 rows to undo

InnoDB: Progress in percents: 1140930  9:26:14  InnoDB: Waiting for the background threads to start
140930  9:26:15 InnoDB: 1.1.8 started; log sequence number 1661733560991
140930  9:26:15 [Note] Server hostname (bind-address): '(null)'; port: 3306
140930  9:26:16 [Note]   - '(null)' resolves to '0.0.0.0';
140930  9:26:16 [Note] Server socket created on IP: '0.0.0.0'.
140930  9:26:18 [Note] Event Scheduler: Loaded 0 events
140930  9:26:18 [Note] wampmysqld: ready for connections.
Version: '5.5.24-log'  socket: ''  port: 3306  MySQL Community Server (GPL)
140930 12:19:36 [Note] wampmysqld: Normal shutdown

140930 12:19:36 [Note] Event Scheduler: Purging the queue. 0 events
140930 12:19:38 [Warning] wampmysqld: Forcing close of thread 20  user: 'root'

140930 12:19:38 [Warning] wampmysqld: Forcing close of thread 19  user: 'root'

140930 12:19:38 [Warning] wampmysqld: Forcing close of thread 17  user: 'root'

140930 12:19:38  InnoDB: Starting shutdown...
140930 12:20:44  InnoDB: Waiting for 1 active transactions to finish
140930 12:21:47  InnoDB: Waiting for 200 pages to be flushed
140930 12:21:49  InnoDB: Waiting for 1 active transactions to finish
140930 12:22:55  InnoDB: Waiting for 1 active transactions to finish
140930 12:24:01  InnoDB: Waiting for 1 active transactions to finish
140930 12:25:07  InnoDB: Waiting for 1 active transactions to finish
140930 12:26:12  InnoDB: Waiting for 1 active transactions to finish
 ... for 9 hours
4
Dmitri Zyuzin

いいえ、ロールバックはバックグラウンドで実行できません。その接続と二重書き込みの両方のチェックは、接続を再び受け入れる前に行う必要があります(つまり、接続を強制終了した場合、再起動時に再起動する必要があります)。ただし、REDOプロセスはバックグラウンドで実行できます。

あなたができることはmysqlを殺すこと(もう一度)と そのステップをスキップして再起動

/etc/init.d/mysqld start --innodb_force_recovery = 3

次に、問題のあるテーブルを削除し、バックアップからリカバリします。これは、巨大なロールバックを実行するよりも高速な場合があります。

将来的には、実際のコミットの数倍のコストがかかる可能性のあるロールバックを回避するために、1つのトランザクションでの大きな変更を正確に回避するようにしてください。管理上の変更である場合、これを行うのに役立ついくつかのツールを提供できます。エラーが開発者によるものである場合は、オプション --i-am-a-dummy 。 :-)

4
jynus