2017-09-23 10 views
-2

最近、5.5から5.7.19へのアップグレード後、実動MySQLサーバが時々クラッシュしました。以下は、エラーログのスタックトレースと問題のあるクエリに関連するテーブルです。私は一般的なログをオンにし、MySQLがクラッシュするたびにそのログを有効にしました。最後のいくつかのログエントリには非常に大きなinsert on duplicate keyというクエリがありました。重複したキーのクエリで更新されたmysqlクラッシュ

0xf4bd75 my_print_stacktrace + 53 
0x7d0144 handle_fatal_signal + 1188 
0x34d8a0f710 _end + -693094128 
0x800b23 Field_blob::copy_blob_value(st_mem_root*) + 51 
0xe9af6e mysql_prepare_blob_values(THD*, List<Item>&, st_mem_root*) + 686 
0xe9b575 write_record(THD*, TABLE*, COPY_INFO*, COPY_INFO*) + 565 
0xe9c952 Sql_cmd_insert::mysql_insert(THD*, TABLE_LIST*) + 2146 
0xe9d16e Sql_cmd_insert::execute(THD*) + 222 
0xd10279 mysql_execute_command(THD*, bool) + 4025 
0xd1481d mysql_parse(THD*, Parser_state*) + 1005 
0xd160ac dispatch_command(THD*, COM_DATA const*, enum_server_command) + 6188 
0xd16a74 do_command(THD*) + 404 
0xdea70c handle_connection + 668 
0xf69d64 pfs_spawn_thread + 372 
0x34d8a079d1 _end + -693126191 
0x311e4e8b6d _end + 475909485 


CREATE TABLE `t` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `col2` varchar(128) DEFAULT NULL, 
    `col3` int(11) DEFAULT NULL , 
    `col4` int(11) DEFAULT NULL , 
    `col5` int(11) DEFAULT NULL , 
    `col6` int(11) DEFAULT NULL , 
    `col7` varchar(128) DEFAULT NULL , 
    `col8` varchar(1024) DEFAULT NULL , 
    `report` longtext , 
    `create_date` datetime DEFAULT NULL , 
    `start_date` datetime DEFAULT NULL , 
    `finish_date` datetime DEFAULT NULL , 
    `state` varchar(128) DEFAULT NULL , 
    `col9` text , 
    `col10` int(11) DEFAULT NULL , 
    `col11` int(11) DEFAULT NULL , 
    `col12` text , 
    `count_post` int(11) DEFAULT NULL , 
    `count_reply` int(11) DEFAULT NULL , 
    `count_link` int(11) DEFAULT NULL , 
    `remark` text , 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `col2` (`col2`), 
    KEY `col4` (`col4`), 
    KEY `col5` (`col5`), 
    KEY `col6` (`col6`), 
    KEY `col7` (`col7`), 
    KEY `create_date` (`create_date`), 
    KEY `finish_date` (`finish_date`) 
) ENGINE=InnoDB AUTO_INCREMENT=405597973 DEFAULT CHARSET=utf8' 

これは5.7.19のバグですか?私は関連する問題Crash on UPDATE ON DUPLICATE KEYを見つけましたが、私はそれを繰り返すことはできません。これを避けるにはどうしたらいいですか?

ウィルソンハウクが指摘したように、次はthreads_%

mysql> SHOW GLOBAL STATUS LIKE 'threads_%'; 
+-------------------+-------+ 
| Variable_name  | Value | 
+-------------------+-------+ 
| Threads_cached | 1  | 
| Threads_connected | 2530 | 
| Threads_created | 5920 | 
| Threads_running | 2  | 
+-------------------+-------+ 

mysql> SHOW GLOBAL VARIABLES LIKE 'thread_%'; 
+-------------------+---------------------------+ 
| Variable_name  | Value      | 
+-------------------+---------------------------+ 
| thread_cache_size | 8       | 
| thread_handling | one-thread-per-connection | 
| thread_stack  | 262144     | 
+-------------------+---------------------------+ 
+0

THREADの作成/生成が問題に関連しているようです。 の結果を私たちと共有できますか?SHOW GLOBAL STATUS LIKE 'threads_%'; とSHOW GLOBAL VARIABLESのように 'thread_%' –

+0

@WilsonHauck私の質問の最後に 'thread'に関連するものを追加しました。 – zczhuohuo

+0

あなたのシステムは現在安定していますか?もしそうなら、「答えられていない」リストから降りるために最善の答えを受け入れてください。 –

答えて

0

に関連するものですのMySQL 5.7.19のchangelogが、これは修正されたバグの下に書かれています:

不正な動作を実行するINSERT文に発生する可能性がありますON DUPLICATE KEY UPDATE句のVALUES部分がINSERT列リストのBLOB値を参照していた場合は、ストアド・プログラムまたはプリペアド・ステートメント・コンテキスト内にあります。 (Bug#24538207、Bug#25361251、Bug#25530880、Bug#25684790)

明らかに、5.7.19で完全に修正されていませんでした。 :-(

しかし、それは私には回避策を示唆

あなたはこのような文がある場合:。

INSERT INTO t (id, report) VALUES (1234, 'report report report') 
ON DUPLICATE KEY UPDATE report='report report report'; 

をあなたはUPDATE句でBLOB値を使用しないように、それを書き換えることができます。

INSERT INTO t (id, report) VALUES (1234, 'report report report') 
ON DUPLICATE KEY UPDATE report=VALUES(report); 

この構文は、あなたが最初の行に挿入しようとしたのと同じ値にレポート列を設定することを意味する。それはちょうど速記ですので、あなたはリテラル値を繰り返す必要はありません。各列につき2回。

ストアドプロシージャまたはプリペアドステートメントでこれを行うと、クラッシュが発生するというバグの説明があるようです。 VALUES()トリックは便利なので使いたいですが、5.7.19のストアドプロシージャでBLOBを使って試してみることはできません。

「BLOB値を参照するON DUPLICATE KEY UPDATE句のVALUES部分が...」の場合、BLOB値全体を明示的に繰り返すと問題を回避できる可能性がありますVALUES()の略語を使用する代わりに。

これが問題の場合は、ストアドプロシージャでこれを実行しないでください。

+0

残念ながら、元のステートメントで示唆しているように、すべての更新フィールドに 'VALUES'がラップされていました。 :-( – zczhuohuo

+0

INSERT文を変更した後にクラッシュする問題を修正しましたか? –

+0

いいえまだ時々クラッシュしています – zczhuohuo

0

threads_connected〜2500 +は、クライアントのシステム使用が終了したときにログアウト/ログオフの切断が処理されないことを示します。

スレッドの作成/終了チャーンを避けるために、私はmy.iniファイル/ CNF に変化するであろうthread_cache_size = 100 #8からCAPのために、このインスタンスに作成5,000+スレッドをサポートするために、8.0 で提案されています。

より詳細な分析については、

RAM on your server 
SHOW GLOBAL STATUS; 
SHOW GLOBAL VARIABLES; 
SHOW ENGINE INNODB STATUS; 

し、あなたの一般的なログの1分を投稿してください。

+0

現在の状況をお知らせください。 。 –

関連する問題