MySQL開啟額外管理監(jiān)聽線程造成coredump問題

author:sufei

版本:mysql 8.0.18蜈项,mysql 8.0.20


現(xiàn)象:

Mysql 啟動(dòng)時(shí)出現(xiàn)coredump

錯(cuò)誤日志如下:

2020-07-01T14:46:04.895732+08:00 0 [Note] [MY-010251] [Server] Server socket created on IP: '::'. 
2020-07-01T14:46:04.895732+08:00 0 [Note] [MY-010251] [Server] Server socket created on IP: '::'.
06:46:04 UTC - mysqld got signal 11 ;
Most likely, you have hit a bug, but this error can also be caused by malfunctioning hardware.
Thread pointer: 0x6224e90
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 = 2ba1bff42c80 thread_stack 0x40000
/mysql-install/bin/mysqld(my_print_stacktrace(unsigned char const*, unsigned long)+0x2e) [0x1e825be]
/mysql-install/bin/mysqld(handle_fatal_signal+0x341) [0xf8b031]
/lib64/libpthread.so.0(+0xf630) [0x2ba0ceb75630]
/mysql-install/bin/mysqld(Cached_authentication_plugins::get_cached_plugin_ref(MYSQL_LEX_CSTRING const*)+0xd) [0xfd6e6d]
/mysql-install/bin/mysqld() [0xfd6f2c]
/mysql-install/bin/mysqld(acl_authenticate(THD*, enum_server_command)+0x1f7) [0xfe03f7]
/mysql-install/bin/mysqld() [0xdf1635]
/mysql-install/bin/mysqld(thd_prepare_connection(THD*)+0x46) [0xdf27e6]
/mysql-install/bin/mysqld() [0xf78e41]
/mysql-install/bin/mysqld() [0x23c08a5]
/lib64/libpthread.so.0(+0x7ea5) [0x2ba0ceb6dea5]
/lib64/libc.so.6(clone+0x6d) [0x2ba0d087e8dd]
 
Trying to get some variables.
Some pointers may be invalid and cause the dump to abort.
Query (0): Connection ID (thread ID): 4
Status: NOT_KILLED
 
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
information that should help you find out what is causing the crash.
Writing a core file

Core文件調(diào)用棧如下:

(gdb) bt
#0  0x00002ba0ceb72aa1 in pthread_kill () from /lib64/libpthread.so.0
#1  0x0000000001e81c47 in my_write_core (sig=<optimized out>) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/mysys/stacktrace.cc:305
#2  0x0000000000f8afdd in handle_fatal_signal (sig=11) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/signal_handler.cc:169
#3  <signal handler called>
#4  0x0000000000fd6e6d in Cached_authentication_plugins::get_cached_plugin_ref (this=0x0, plugin=plugin@entry=0x2ba1bff41ff0)
    at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/auth/sql_authentication.cc:881
#5  0x0000000000fd6f2c in do_auth_once (thd=thd@entry=0x6224e90, auth_plugin_name=..., mpvio=mpvio@entry=0x2ba1bff423c0)
    at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/auth/sql_authentication.cc:2971
#6  0x0000000000fe03f7 in acl_authenticate (thd=thd@entry=0x6224e90, command=command@entry=COM_CONNECT)
    at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/auth/sql_authentication.cc:3268
#7  0x0000000000df1635 in check_connection (thd=thd@entry=0x6224e90, this=<optimized out>) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/sql_connect.cc:649
#8  0x0000000000df27e6 in login_connection (thd=0x6224e90) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/sql_connect.cc:704
#9  thd_prepare_connection (thd=thd@entry=0x6224e90) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/sql_connect.cc:877
#10 0x0000000000f78e41 in handle_connection (arg=arg@entry=0x2ba0e42e6970) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/sql/conn_handler/connection_handler_per_thread.cc:298
#11 0x00000000023c08a5 in pfs_spawn_thread (arg=0x2ba0e4752210) at /data2/sf/mysql8/mysql/8.0.18/mysql-8.0.18/storage/perfschema/pfs.cc:2854
#12 0x00002ba0ceb6dea5 in start_thread () from /lib64/libpthread.so.0
#13 0x00002ba0d087e8dd in clone () from /lib64/libc.so.6

從core文件中可以看出:
1伯铣、發(fā)送coredump的位置是在等入時(shí)玉凯,進(jìn)行權(quán)限認(rèn)證构韵;
2尝丐、然而權(quán)限認(rèn)證的全局變量g_cached_authentication_plugins為空指針蔚约,從而造成段錯(cuò)誤

分析:

?通過上面的分析可以知道坑赡,也就是在使能監(jiān)聽用戶連接時(shí)烙如,acl權(quán)限變量還沒有初始化,這在通常是不可能的毅否,因?yàn)椋?/p>

  1. 全局變量g_cached_authentication_plugins的初始化是在acl_init函數(shù)中進(jìn)行的亚铁,而該函數(shù)的調(diào)用位置為6738行,如下:
if (abort || acl_init(opt_noacl)) {
  if (!abort) LogErr(ERROR_LEVEL, ER_PRIVILEGE_SYSTEM_INIT_FAILED);
  abort = true;
  opt_noacl = true;
}
  1. 傳統(tǒng)的監(jiān)聽是在主函數(shù)的7050行
mysqld_socket_acceptor->connection_event_loop();

?也就是在監(jiān)聽之前已經(jīng)初始化了g_cached_authentication_plugins

?這不應(yīng)該出問題呀螟加,可是在mysql8.0.18開啟了admin_IP的獨(dú)立線程徘溢,即設(shè)置create_admin_listener_thread =ON時(shí),我們可以看到其監(jiān)聽的開啟在network_init中(位置為主函數(shù)的6671捆探,在acl_init之前)然爆,其調(diào)用棧如下:

network_init
|->mysqld_socket_acceptor->init_connection_acceptor()
|--->Mysqld_socket_listener->setup_listener
|------>spawn_admin_thread(m_admin_interface_listen_socket,
                             m_admin_bind_address.network_namespace) // 開啟監(jiān)聽線程

所以在設(shè)置create_admin_listener_thread = ON時(shí),存在監(jiān)聽線程先于acl_init初始化黍图,此時(shí)(network_init調(diào)用與acl_init調(diào)用之間)如果有admin用戶使用admin_port端口連接進(jìn)來就會(huì)造成cordump曾雕。

復(fù)現(xiàn):

開啟一個(gè)循環(huán)連接數(shù)據(jù)庫的腳本,模擬客戶端連接(注意用戶名隨便助被,無需登錄)

#!/bin/bash
for a in {1..10000}
do
        /mysql-install/bin/mysql -h admin_ip -Padmin_port -uroot -pxxxxx
done

同時(shí)剖张,配置文件中開啟create_admin_listener_thread ,啟動(dòng)數(shù)據(jù)庫恰起。

在不斷的重復(fù)可能還出現(xiàn)如下問題修械,即任意用戶登入成功,跳過了權(quán)限檢測(cè)检盼。

image.png

出現(xiàn)這個(gè)問題的原因主要是由于在acl_init中初始化g_cached_authentication_plugins與initialized之間

g_cached_authentication_plugins = new Cached_authentication_plugins();  // 初始化g_cached_authentication_plugins
unknown_accounts = new Map_with_rw_lock<Auth_id, uint>(0);
if (!g_cached_authentication_plugins->is_valid()) return 1;

if (dont_read_acl_tables) {
  return 0; /* purecov: tested */
}
if (!(thd = new THD)) return 1; /* purecov: inspected */
thd->thread_stack = (char *)&thd;
thd->store_globals();
return_val = check_engine_type_for_acl_table(thd, false);

check_acl_tables_intact(thd, false);

return_val |= acl_reload(thd, false);  // 設(shè)置initialized為true

如果啟動(dòng)時(shí)主線程在兩個(gè)變量初始化之間箫章,而管理的監(jiān)控線程可以通過權(quán)限認(rèn)證铐料,邏輯如下

// 在acl_authenticate函數(shù)中
do_auth_once(thd, auth_plugin_name, &mpvio); // 由于g_cached_authentication_plugins設(shè)置了拾并,所以可以通過而不發(fā)生coredump
……
if (initialized)  // 由于此時(shí)initialized依然為false
{
    ……
}else{
     sctx->skip_grants(); //跳過了權(quán)限表誓酒,從而造成用戶跳過權(quán)限表登入 
}

修復(fù):

之前團(tuán)隊(duì)已經(jīng)向官方提bug,可以通過關(guān)閉create_admin_listener_thread 來規(guī)避貌亭。后續(xù)在mysql 8.0.22進(jìn)行了修復(fù)柬唯。

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市圃庭,隨后出現(xiàn)的幾起案子锄奢,更是在濱河造成了極大的恐慌,老刑警劉巖剧腻,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拘央,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡书在,警方通過查閱死者的電腦和手機(jī)灰伟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儒旬,“玉大人栏账,你說我怎么就攤上這事≌辉矗” “怎么了挡爵?”我有些...
    開封第一講書人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長甚垦。 經(jīng)常有香客問我茶鹃,道長,這世上最難降的妖魔是什么制轰? 我笑而不...
    開封第一講書人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任前计,我火速辦了婚禮,結(jié)果婚禮上垃杖,老公的妹妹穿的比我還像新娘男杈。我一直安慰自己,他們只是感情好调俘,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開白布伶棒。 她就那樣靜靜地躺著,像睡著了一般彩库。 火紅的嫁衣襯著肌膚如雪肤无。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,190評(píng)論 1 299
  • 那天骇钦,我揣著相機(jī)與錄音宛渐,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窥翩,可吹牛的內(nèi)容都是我干的业岁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼寇蚊,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼笔时!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起仗岸,我...
    開封第一講書人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤允耿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后扒怖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體较锡,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年姚垃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了念链。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡积糯,死狀恐怖掂墓,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情看成,我是刑警寧澤君编,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站川慌,受9級(jí)特大地震影響吃嘿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜梦重,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一兑燥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧琴拧,春花似錦降瞳、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沛膳,卻和暖如春扔枫,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背锹安。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來泰國打工短荐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留倚舀,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓搓侄,卻偏偏與公主長得像瞄桨,于是被迫代替她去往敵國和親话速。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讶踪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容