早在2005年6月提交的被評(píng)級(jí)為“S2(嚴(yán)重)” 的一個(gè)MySQL 缺陷懸置20年仍未被修復(fù),引發(fā)社區(qū)對(duì)該開(kāi)源數(shù)據(jù)庫(kù)管理器的無(wú)奈和絕望。
該漏洞的編號(hào)是 “bug 11472”,被描述為“外鍵更新/刪除后不會(huì)執(zhí)行觸發(fā)器”。觸發(fā)器即響應(yīng)事件如在特定表中插入、更新、刪除時(shí)自動(dòng)運(yùn)行的代碼,一般用于執(zhí)行數(shù)據(jù)完整性。該漏洞表明,如果間接更新某個(gè)表,由于它與另外一張表之間存在的關(guān)系,該觸發(fā)器不執(zhí)行。
該漏洞被披露后,MySQL 團(tuán)隊(duì)曾表示它是“已知問(wèn)題”而且“我們會(huì)在5.1版本中修復(fù)”,但實(shí)際并非如此,盡管該漏洞已在手冊(cè)中被記錄為“級(jí)聯(lián)外鍵操作不會(huì)激活觸發(fā)器”。
開(kāi)發(fā)人員在評(píng)論該漏洞報(bào)告時(shí)提到,該漏洞“正在嚴(yán)重威脅威脅ACID原則/數(shù)據(jù)完整性”,之后在2015年提到“我們因嘗試在級(jí)聯(lián)刪除上執(zhí)行觸發(fā)器而遭遇此問(wèn)題,亟需修復(fù)方案,萬(wàn)分感謝!” ACID 指的是“原子性、一致性、隔離性和持久性”。
2020年,一名年輕的開(kāi)發(fā)人員提到,“這個(gè)漏洞比我的年齡還大。”
該漏洞影響深遠(yuǎn)。2023年另外一名開(kāi)發(fā)人員表示,“我們多年前就棄用了 MySQL——這個(gè)漏洞是壓垮駱駝的最后一根稻草。我們當(dāng)時(shí)需要未定制賬戶平臺(tái)確保數(shù)據(jù)完整性。”
MySQL 在2010年作為 Sun Microsystem 的一部分被Oracle收購(gòu),而盡管該漏洞比收購(gòu)的時(shí)間還要早,但仍可被視作Oracle忽視社區(qū)需求的證據(jù)。不過(guò)另一種說(shuō)法認(rèn)為,此類長(zhǎng)期存在的已知缺陷不修復(fù)反而更安全,以防一些應(yīng)用與其存在依賴關(guān)系,但在本案例中該論點(diǎn)站不住腳。
在Oracle 收購(gòu)之時(shí) MySQL 的一個(gè)分叉 MariaDB 也將此漏洞標(biāo)記為“未解決”。
Reddit 論壇上出現(xiàn)了關(guān)于使用觸發(fā)器實(shí)現(xiàn)數(shù)據(jù)庫(kù)完整性是否是最佳實(shí)踐的辯論,有人回應(yīng)稱,“應(yīng)變措施是不使用 MySQL,應(yīng)選個(gè)合理的關(guān)系數(shù)據(jù)庫(kù)。”而最常見(jiàn)的替代選項(xiàng)是 PostgreSQL。另外有人戲謔稱“事到如今,它算是個(gè)‘功能’了”。
DB-Engines 排行榜顯示,MySQL 仍然是位列 Oracle 之后、微軟 SQL Server 之前的全球第二大使用最廣泛的數(shù)據(jù)庫(kù)管理器。不過(guò) MySQL 的熱度在減退,而 PostgreSQL 的熱度在攀升。該排行榜基于社區(qū)的提及頻率和崗位招聘需求而非實(shí)際的使用數(shù)據(jù),雖不能作為絕對(duì)參考,但仍表明 MySQL 存在衰退跡象。
去年,Percona 公司的專家Peter Zaitsev在MySQL領(lǐng)域深耕多年,他表示,“多年來(lái)MySQL 似乎在性能工程部門遭受了多年的忽視”并提到Oracle將重要新功能設(shè)為云端 Heatwave 的專屬服務(wù),刻意邊緣化開(kāi)源版 MySQL。
原文鏈接
https://devclass.com/2025/06/24/serious-mysql-bug-celebrates-20-years-unfixed-another-reason-to-switch-to-postgresql/