前幾天看到姜老師的舊文 用 VSCode 編譯和調(diào)試 MySQL,每個(gè) DBA 都應(yīng) get 的小技能[1] , 文末留了一個(gè)思考題,如何修改源碼,自定義版本,使得 select version() 輸出自定義內(nèi)容
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、融安ssl等。為數(shù)千家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的融安網(wǎng)站制作公司
調(diào)試過(guò)程參考 macOS VSCode 編譯調(diào)試 MySQL 5.7[2]
內(nèi)部 Item 對(duì)象參考 從SQL語(yǔ)句到MySQL內(nèi)部對(duì)象[3]
源碼面前沒(méi)有秘密,建義對(duì) DB 感興趣的嘗試 debug 調(diào)試。本文環(huán)境為 mac + vscode + lldb
vscode 插件:
mysql 源碼:
補(bǔ)丁: MySQL = 8.0.21 需要對(duì) cmake/mysql_version.cmake 文件打補(bǔ)丁 (沒(méi)有嚴(yán)格測(cè)試所有版本)
創(chuàng)建 cmake-build-debug 目錄,后續(xù) mysql 編譯結(jié)果,以及啟動(dòng)后生成的文件都在這里
在 mysql 工程目錄下面創(chuàng)建 .vscode/settings.json 文件
內(nèi)容沒(méi)啥好說(shuō)的,都是指定目錄及 boost 配置,其中 WITH_DEBUG 打開(kāi) debug 模式,會(huì)在 /tmp/debug.trace 生成 debug 信息
View - Command Palette - CMake: Configure 執(zhí)行后生成 cmake 配置
View - Command Palette - CMake: Build 編譯生成最終 mysql 相關(guān)命令
發(fā)現(xiàn)老版本編譯很麻煩,各種報(bào)錯(cuò),mysql 5.7 代碼量遠(yuǎn)超過(guò) 5.5, 只能硬著頭皮看 5.7
首先初始化 my.cnf 配置,簡(jiǎn)單的就可以,共它均默認(rèn)
初始化數(shù)據(jù)文件,非安全模式,調(diào)試用
由于用 vscode 接管 mysql, 所以需要配置 .vscode/launch.json
然后點(diǎn)擊 run and debug mysqld
mysql 啟動(dòng),看到輸出日志無(wú)異常,此時(shí)可以用 mysql-client 連接
首先在 sql_parser.cc:5435 處打斷點(diǎn)
mysql_parse 是 sql 處理的入口,至于 tcp connection 連接先可以忽略
執(zhí)行上述 sql 自動(dòng)跳轉(zhuǎn)到斷點(diǎn)處, Step Into , Step Over , Step Out 這些調(diào)試熟悉下即可
接下來(lái)分別調(diào)用主要函數(shù): mysql_execute_command , execute_sqlcom_select , handle_query , select-join-exec() , Query_result_send::send_data , Item::send , Item_string:val_str , Protocol_text::store , net_send_ok
啟動(dòng) mysql 時(shí) init_common_variables 會(huì)初始化一堆變量,其中會(huì)調(diào)用 set_server_version 生成版本信息,修改這個(gè)就可以
看好條件編譯的是哪塊,修改即可, 重新 CMake: Build 編譯再運(yùn)行
這里不做過(guò)深分析,簡(jiǎn)單講
sql_yacc.cc 函數(shù) PTI_function_call_generic_ident_sys 解析 sql, 識(shí)別出 version() 是一個(gè)函數(shù)調(diào)用
find_native_function_builder 查找 hash 表,找到對(duì)應(yīng) version 函數(shù)注冊(cè)的單例工廠函數(shù)
mysql 啟動(dòng)時(shí)調(diào)用 item_create_init 將這些函數(shù) builder 注冊(cè)到 hash 表 native_functions_hash
MySQL 代碼太龐大,5.1 大約 100w 行,5.5 130w 行,5.7 以后 330w 行,只能挑重點(diǎn)讀源碼。最近很多群里的人在背八股,沒(méi)必要,有那時(shí)間學(xué)著調(diào)試下源碼,讀讀多好
原文出處:
背景
在上一篇推文中,我們介紹了 MySQL Group Replication 8.0.16 支持信息碎片化功能來(lái)增強(qiáng)大型事務(wù)處理能力。
如果您想在組復(fù)制中使用該功能,則任何組成員的版本都不能低于 8.0.16!
簡(jiǎn)單地說(shuō)就是由于低版本協(xié)議上不支持。MySQL 8.0.16 的組通訊開(kāi)始支持新協(xié)議,簡(jiǎn)稱“分段協(xié)議”,之前的版本中只有一種“壓縮協(xié)議”。
如果多個(gè)成員想加入復(fù)制組,那么在協(xié)議匹配上遵循以下原則:
現(xiàn)有復(fù)制組成員和新加入成員版本相同,加入成功。
低版本成員想加入高版本的組會(huì)被驅(qū)逐,加入失敗。
高版本的成員想加入低版本的組,單獨(dú)加入成功,多個(gè)加入失敗。
例如:
一個(gè) MySQL Server 8.0.16 實(shí)例可以成功加入使用通信協(xié)議版本 5.7.24 的組。
一個(gè) MySQL Server 5.7.24 實(shí)例無(wú)法成功加入使用通信協(xié)議版本 8.0.16 的組。
兩個(gè) MySQL Server 8.0.16 實(shí)例無(wú)法同時(shí)加入使用通信協(xié)議版本 5.7.24 的組。
兩個(gè) MySQL Server 8.0.16 實(shí)例可以同時(shí)加入使用通信協(xié)議版本 8.0.16 的組。
新增 UDF
為了能讓高版本的復(fù)制組更便于加入低版本的成員,MySQL 8.0.16 新增兩個(gè) UDF。
您可以使用兩個(gè)新的 UDF 命令去管理組通信協(xié)議:
1. group_replication_set_communication_protocol(new_protocol)
設(shè)置組復(fù)制通訊協(xié)議版本
SELECT group_replication_set_communication_protocol("8.0.15");
填入一個(gè)所有成員都支持的版本號(hào),即:new_protocol ≤ 所有成員的 MySQL版本。
new_protocol 格式:major.minor.patch (主版本號(hào).次版本號(hào).發(fā)布版本號(hào))例如:8.0.15。
2. group_replication_get_communication_protocol()
獲取復(fù)制中最舊成員的 MySQL 版本號(hào)
SELECT group_replication_get_communication_protocol(); ? ?+------------------------------------------------+ ? ?| group_replication_get_communication_protocol() | ? ?+------------------------------------------------+ ? ?| 5.7.14 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? | ? ?+------------------------------------------------+
獲取的版本號(hào)可能與設(shè)置的值不一致,但不一致的版本之間組復(fù)制協(xié)議是一樣的。
返回結(jié)果格式:major.minor.patch (主版本號(hào).次版本號(hào).發(fā)布版本號(hào))例如:8.0.15。
以上兩個(gè) UDF 對(duì)全部組成員有效,主機(jī)或從機(jī)上均可執(zhí)行。
結(jié)論
若想使用信息碎片功能。建議將組復(fù)制成員全部升級(jí)為 8.0.16。
若組內(nèi)成員版本僅有部分為 8.0.16,可以用兩個(gè)新的函數(shù)來(lái)讓高版本的成員保持與其它成員組協(xié)議一致。
請(qǐng)點(diǎn)擊輸入圖片描述
php調(diào)用mysql步驟:1、連接MySQL數(shù)據(jù)庫(kù);2、選擇MySQL數(shù)據(jù)庫(kù);3、執(zhí)行SQL語(yǔ)句;4、關(guān)閉結(jié)果集;5、關(guān)閉MySQL服務(wù)器。
本文操作環(huán)境:windows7系統(tǒng)、PHP7.1版,DELL G3電腦
PHP訪問(wèn)MYSQL數(shù)據(jù)庫(kù)的五個(gè)步驟詳解(圖)
數(shù)據(jù)庫(kù)在我們PHP日常開(kāi)發(fā)中是必須需要的,那么MYSQL數(shù)據(jù)庫(kù) 是一款很多程序員都喜愛(ài)的數(shù)據(jù)庫(kù),由于呢 MYSQL 是一個(gè)開(kāi)源的,帶一點(diǎn)半商業(yè)的,市場(chǎng)的占有率比較高,所以一直以來(lái)都被認(rèn)為是 PHP 的最佳搭檔,同時(shí) PHP 也具有很強(qiáng)大的數(shù)據(jù)庫(kù)支持能力,本篇主要講解 PHP訪問(wèn)MySQL數(shù)據(jù)庫(kù)的基本步驟。
PHP訪問(wèn)MySQL數(shù)據(jù)庫(kù)的基本步驟如圖所示:
.連接MySQL數(shù)據(jù)庫(kù)
使用 mysql_connect()函數(shù)建立與MySQL服務(wù)器的連接。有關(guān) mysql_connect()函數(shù)的使用,我們后面會(huì)有詳細(xì)的介紹。
2.選擇MySQL數(shù)據(jù)庫(kù)
使用 mysql_select_db()函數(shù)選擇MySQL數(shù)據(jù)庫(kù)服務(wù)器的數(shù)據(jù)庫(kù)。并與數(shù)據(jù)庫(kù)建立連接,有關(guān)mysql_select_db()函數(shù)的使用,后面我們會(huì)有具體詳解。
3.執(zhí)行 SQL 語(yǔ)句
在選擇數(shù)據(jù)庫(kù)中使用 mysql_query()函數(shù)執(zhí)行 SQL語(yǔ)句,對(duì)數(shù)據(jù)的操作方式主要包括 5種方式,下面我們分別進(jìn)行介紹。查詢數(shù)據(jù):使用select 語(yǔ)句實(shí)現(xiàn)數(shù)據(jù)的查詢功能。
顯示數(shù)據(jù):使用select 語(yǔ)句顯示數(shù)據(jù)的查詢結(jié)果。
插入數(shù)據(jù):使用insert into 語(yǔ)句向數(shù)據(jù)庫(kù)中插入數(shù)據(jù)。
更新數(shù)據(jù):使用update 語(yǔ)句更新數(shù)據(jù)庫(kù)中的記錄。
刪除數(shù)據(jù):使用 delete語(yǔ)句刪除數(shù)據(jù)庫(kù)中的記錄!
mysql_query()函數(shù)的具體使用后面有具體介紹~
4.關(guān)閉結(jié)果集
數(shù)據(jù)庫(kù)操作完成后,需要關(guān)閉結(jié)果集,以釋放系統(tǒng)資源,語(yǔ)法格式如下:mysql_free_result($result);
技巧:
如果在多個(gè)網(wǎng)頁(yè)中都要頻繁進(jìn)行數(shù)據(jù)庫(kù)訪問(wèn),那么可以建立與數(shù)據(jù)庫(kù)服務(wù)器的持續(xù)連接來(lái)提高效率,因?yàn)槊看闻c數(shù)據(jù)庫(kù)服務(wù)器的連接需要較長(zhǎng)的時(shí)間和交大的資源開(kāi)銷,持續(xù)的連接相對(duì)來(lái)說(shuō)會(huì)更有效率,建立持續(xù)連接的方法就是在數(shù)據(jù)庫(kù)間接時(shí),調(diào)用函數(shù) mysql_pconnect()代替mysql_connect函數(shù)。建立的持續(xù)連接在本程序結(jié)束時(shí),不需要調(diào)用 mysql_colse()來(lái)關(guān)閉與數(shù)據(jù)庫(kù)服務(wù)器的連接。下次程序在此執(zhí)行 mysql_pconnect()函數(shù)時(shí),系統(tǒng)自動(dòng)直接返回已經(jīng)建立的持續(xù)連接ID號(hào),而不再去真的連接數(shù)據(jù)庫(kù)。
5.關(guān)閉MySQL服務(wù)器
沒(méi)使用一次 mysql_connect()或者mysql_query()函數(shù),都會(huì)消耗系統(tǒng)資源,再少量用戶放完 web 網(wǎng)站時(shí)問(wèn)題還不大,但如果用戶連接超過(guò)一定數(shù)量時(shí),就會(huì)造成系統(tǒng)性能下降,甚至是死機(jī),為了避免這種現(xiàn)象的發(fā)生,在完成數(shù)據(jù)庫(kù)的操作后,應(yīng)該使用 mysql_close()函數(shù)關(guān)閉與MYSQL服務(wù)器的連接,以節(jié)省系統(tǒng)資源。
語(yǔ)法格式如下:mysql_close($link);
說(shuō)明:
PHP 中與數(shù)據(jù)庫(kù)的連接是非持久連接,系統(tǒng)會(huì)自動(dòng)回收,一般不用設(shè)置關(guān)閉,但是如果一次性范湖的結(jié)果集比較大,或者網(wǎng)站訪問(wèn)量比價(jià)多,那么最好使用 mysql_close()函數(shù)手動(dòng)進(jìn)行釋放。
PHP訪問(wèn)MySQL數(shù)據(jù)庫(kù)的步驟就結(jié)束了,是不是很簡(jiǎn)單。
推薦學(xué)習(xí):《PHP視頻教程》
以上就是php調(diào)用mysql步驟的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!