MySQL Bug insert into on duplicate key update 语法更新 text blob 大字段导致 MySQL crash

MySQL 做的时间长了,就有可能多次遇到相同的 Bug,这里记录一下,以便下次再遇到,能够参考。

1. 背景

业务执行 SQL 导致 MySQL 进程 Crash,做故障切换后,新的主库又 Crash 了。查看 MySQL 错误日志,发现多次 Crash 时的堆栈相同,如下:

Thread pointer: 0x7fb49b866000 Attempting backtrace. You can use the following information to find out where mysqld died. If you see no messages after this, something went terribly wrong... stack_bottom = 7fb4bf979be8 thread_stack 0x80000 /usr/local/mysql/bin/mysqld(my_print_stacktrace+0x2c)[0xed36bc] /usr/local/mysql/bin/mysqld(handle_fatal_signal+0x461)[0x7a26e1] /lib64/libpthread.so.0[0x369ea0f7e0] /usr/local/mysql/bin/mysqld(_ZN10Field_blob15copy_blob_valueEP11st_mem_root+0x28)[0x7e6298] /usr/local/mysql/bin/mysqld(_Z25mysql_prepare_blob_valuesP3THDR4ListI4ItemEP11st_mem_root+0x2b8)[0xe1c748] /usr/local/mysql/bin/mysqld(_Z12write_recordP3THDP5TABLEP9COPY_INFOS4_+0x9c0)[0xe1d450] /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert12mysql_insertEP3THDP10TABLE_LIST+0x825)[0xe1dec5] /usr/local/mysql/bin/mysqld(_ZN14Sql_cmd_insert7executeEP3THD+0xc2)[0xe1e702] /usr/local/mysql/bin/mysqld(_Z21mysql_execute_commandP3THDb+0x18d7)[0xcad217] /usr/local/mysql/bin/mysqld(_Z11mysql_parseP3THDP12Parser_state+0x5d5)[0xcb3385] /usr/local/mysql/bin/mysqld(_Z16dispatch_commandP3THDPK8COM_DATA19enum_server_command+0xaba)[0xcb3eca] /usr/local/mysql/bin/mysqld(_Z10do_commandP3THD+0x1b7)[0xcb5917] /usr/local/mysql/bin/mysqld(_Z26threadpool_process_requestP3THD+0xc7)[0xd5a267] /usr/local/mysql/bin/mysqld[0xd6979e] /usr/local/mysql/bin/mysqld(pfs_spawn_thread+0x1b4)[0x123cf24] /lib64/libpthread.so.0[0x369ea07aa1] /lib64/libc.so.6(clone+0x6d)[0x369e2e893d]