十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
1、 mysql安裝好后,在mysql的安裝目錄中有個(gè)bin目錄,里面有很多客戶端軟件,如果是mysql的客戶端,找到mysql.exe,這個(gè)是用于操作數(shù)據(jù)庫(kù)的系統(tǒng)客戶端軟件。

創(chuàng)新互聯(lián)堅(jiān)持“要么做到,要么別承諾”的工作理念,服務(wù)領(lǐng)域包括:成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、外貿(mào)營(yíng)銷網(wǎng)站建設(shè)、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣等服務(wù),滿足客戶于互聯(lián)網(wǎng)時(shí)代的鳳山網(wǎng)站設(shè)計(jì)、移動(dòng)媒體設(shè)計(jì)的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡(luò)建設(shè)合作伙伴!
2、 客戶端選擇:一般情況下,我們?cè)趯W(xué)習(xí)的時(shí)候會(huì)通過(guò)使用Windows下的控制臺(tái)進(jìn)行訪問(wèn),即win + R 同時(shí)按住打開運(yùn)行,輸入cmd命令進(jìn)入控制臺(tái),然后進(jìn)入到mysql的bin目錄(具體可以看一下Windows下控制器切換路徑(百度經(jīng)驗(yàn)));或者在開發(fā)的時(shí)候通常會(huì)使用一些集成工具,如Navicat之類。
3、 數(shù)據(jù)庫(kù)操作步驟:學(xué)習(xí)的時(shí)候客戶端和服務(wù)端是同時(shí)安裝的,都在一臺(tái)電腦上,但是要理解,mysql的客戶端和服務(wù)端通常不會(huì)在一臺(tái)機(jī)器上的(服務(wù)器在機(jī)房,客戶端就在個(gè)人電腦上),因此是需要進(jìn)行一些步驟操作的。(下面以windows下的控制臺(tái)為例)
① 連接認(rèn)證:mysql/mysql.exe -h主機(jī)地址 -P端口 -u用戶名 -p密碼,其中h可以是ip地址也可以是主機(jī)名如-hlocalhost/-h127.0.0.1,本地可以省略;-P(大寫P)是端口,一般mysql是3306,默認(rèn)可以省略;-u是用戶名,如果沒(méi)有匿名賬號(hào),必填;-p(小寫p)是密碼,一般必填,最好是輸入-p后先回車,后輸入密碼(密文輸入密碼,更安全)
② 發(fā)送SQL指令,SQL(【百科】結(jié)構(gòu)化查詢語(yǔ)言Structured Query Language結(jié)構(gòu)化查詢語(yǔ)言)是mysql能識(shí)別的操作指令,這塊如果想深入學(xué)習(xí)理解可以參照MySQL的API文檔或者參考黑馬程序員下的6天玩轉(zhuǎn)MySQL,一般情況下分為幾大類:
DDL:Data Definition Language,數(shù)據(jù)定義語(yǔ)言,定義結(jié)構(gòu)。如創(chuàng)建數(shù)據(jù)庫(kù):create database `test` charset utf8;
DML:Data Manipulation Language,數(shù)據(jù)操作語(yǔ)言,進(jìn)行數(shù)據(jù)操作。如增刪改查指令:insert into table values()/delete from table where condition/update table set key = value/select * from table
DCL:Data Controller Language,數(shù)據(jù)控制語(yǔ)言,進(jìn)行權(quán)限管理。如給用戶授權(quán):grant seletet on *.* to 'root'@localhost
③ 解析:一般情況下客戶端會(huì)自動(dòng)解析MySQL服務(wù)器執(zhí)行返回的結(jié)果不需要我們進(jìn)行額外操作,但是如果是其他編程語(yǔ)言需要使用MySQL執(zhí)行的結(jié)果,那么還需要額外的解析(參照黑馬程序員6天玩轉(zhuǎn)MySQL中的PHP操作mysql)
④ 斷開連接:數(shù)據(jù)庫(kù)用完之后,要養(yǎng)成主動(dòng)斷開的習(xí)慣(被動(dòng)也可以,但是如果被動(dòng)沒(méi)有斷開,那么就會(huì)“占線”),mysql的客戶端可以使用\q | quit | exit,任意一個(gè)退出
“新建數(shù)據(jù)庫(kù)”選項(xiàng)中設(shè)定。
電腦:聯(lián)想威6
系統(tǒng):win1020H2
軟件:Navicat for MySQL15.0.26.0
1、配置好連接之后,我們點(diǎn)擊“確定”按鈕來(lái)應(yīng)用這個(gè)連接。
2、如圖,這就是新建好的連接,我們雙擊這個(gè)連接選項(xiàng)。
3、數(shù)據(jù)庫(kù)連接創(chuàng)建好之后默認(rèn)就會(huì)有一些數(shù)據(jù)庫(kù)。
4、如果我們想要新建一個(gè)數(shù)據(jù)庫(kù),可以在之前創(chuàng)建好的連接上面單擊鼠標(biāo)右鍵,然后點(diǎn)擊“新建數(shù)據(jù)庫(kù)”選項(xiàng)。
5、然后命名數(shù)據(jù)庫(kù),字符集設(shè)置為“utf-8”,表示是中文字符集,然后點(diǎn)擊確定就OK了。
6、最后,一個(gè)新的數(shù)據(jù)庫(kù)就建立好了哦,快去親自動(dòng)手試試吧!
用vs code 就可以了。
Visual Studio Code
Visual Studio Code(簡(jiǎn)稱VS Code)是由微軟開發(fā)的,同時(shí)支持Windows、Linux和macOS操作系統(tǒng)的開源文本編輯器。它支持調(diào)試,內(nèi)置了Git 版本控制功能,同時(shí)也具有開發(fā)環(huán)境功能,例如代碼補(bǔ)全(類似于IntelliSense)、代碼片段、代碼重構(gòu)等。該編輯器支持用戶自定義配置,例如改變主題顏色、鍵盤快捷方式、編輯器屬性和其他參數(shù),還支持?jǐn)U展程序并在編輯器中內(nèi)置了擴(kuò)展程序管理的功能。
安裝LLDB
LLDB是LLVM編譯器的一部分,推薦使用Homebrew安裝LLVM工具集,不建議使用系統(tǒng)自帶的LLDB,安裝前必須先創(chuàng)建證書否則無(wú)法安裝,步驟如下:
創(chuàng)建完成后,開始安裝LLVM
brew install llvm --with-python@2?--with-lldb
安裝插件
VS Code自帶有debug功能,這里我推薦使用LLDB Debugger插件。
?接下來(lái),為項(xiàng)目配置調(diào)試參數(shù)。
配置調(diào)試參數(shù)
使用VS Code打開MySQL源碼目錄,在側(cè)邊欄選擇debug欄目,添加配置,program輸入需要調(diào)試的程序路徑,這里選擇你編譯好的mysqld路徑,args輸入程序啟動(dòng)所需的參數(shù),通常會(huì)指定mysqld的配置文件。這樣就配置好了,是不是很簡(jiǎn)單。
啟動(dòng)調(diào)試
點(diǎn)擊啟動(dòng)按鈕,啟動(dòng)后如果沒(méi)有設(shè)置斷點(diǎn)會(huì)mysqld會(huì)正常啟動(dòng),如果觸發(fā)了斷點(diǎn)會(huì)如下圖顯示。
整個(gè)調(diào)試窗口基本分為六部分,所有的調(diào)試操作都在這里完成:
1:?顯示變量信息
2:?設(shè)置重點(diǎn)關(guān)注的變量
3:?顯示調(diào)用棧信息
4:?設(shè)置斷點(diǎn)信息,在代碼行號(hào)前也可以設(shè)置斷點(diǎn)
5:?代碼顯示區(qū)域,上方是調(diào)試按鈕,包括 continue/stepover/step in/step out/restart/stop
6:?調(diào)試終端輸入輸出區(qū)
斷點(diǎn)設(shè)置
在代碼行號(hào)前點(diǎn)擊即可在該行為設(shè)置斷點(diǎn),也可以根據(jù)條件設(shè)置斷點(diǎn)。以設(shè)置ConditionalBreakpoint為例,當(dāng)程序啟動(dòng)后會(huì)按照你設(shè)置的條件表達(dá)式判斷是否觸發(fā)斷點(diǎn)。
Conditional Breakpoint這種方式用在目標(biāo)變量達(dá)到某條件時(shí)觸發(fā)斷點(diǎn),其余則跳過(guò)繼續(xù)執(zhí)行。比如:設(shè)置變量等于目標(biāo)表名時(shí)觸發(fā)斷點(diǎn),其余表則跳過(guò),相對(duì)函數(shù)名斷點(diǎn)省去很多手工跳過(guò)操作。
遠(yuǎn)程調(diào)試
假如你想調(diào)試遠(yuǎn)程Linux服務(wù)器上的MySQL上面的方法就不合適了,這時(shí)需要遠(yuǎn)程調(diào)試。lldb和gdb都支持遠(yuǎn)程調(diào)試,這里以lldb為例。
需要先在遠(yuǎn)程主機(jī)上安裝lldb,使用yum安裝,源地址在這里
remote$ yum install -y llvm-toolset-7
安裝完成后,啟動(dòng)lldb-server
remote$ /opt/rh/llvm-toolset-7/root/usr/bin/lldb-serverplatform --listen?"*:9191"?--server
接下來(lái),在VS Code調(diào)試界面中新增配置項(xiàng)。
{
"type":?"lldb",
"request":?"attach",
"name":?"Remote attach",
"program":?"~/mysql5626/usr/local/mysql/bin/mysqld",
"pid":"target_pid",
"initCommands": [
"platform select remote-linux",
"platform connect connect://remote_host:9191"
],
"sourceMap": {
"/export/home/pb2/build/sb_0-15908961-1436910670.17/mysql-5.6.26":?"/Users/hongbin/workbench/mysql-server"
}
},
program:?本機(jī)也要拷貝一份目標(biāo)程序,加載
pid:?填寫遠(yuǎn)程主機(jī)的mysqld進(jìn)程id
sourceMap:?填寫mysqld編譯的代碼路徑與本機(jī)代碼庫(kù)路徑的映射,這樣調(diào)試時(shí)代碼才可以和程序關(guān)聯(lián)在一起看
注意:記得調(diào)試前將代碼切換到與目標(biāo)程序版本一致的branch
前幾天看到姜老師的舊文 用 VSCode 編譯和調(diào)試 MySQL,每個(gè) DBA 都應(yīng) get 的小技能[1] , 文末留了一個(gè)思考題,如何修改源碼,自定義版本,使得 select version() 輸出自定義內(nèi)容
調(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 打開 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)試下源碼,讀讀多好
原文出處: