真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

mysql怎么調(diào)試 mysql怎么調(diào)優(yōu)

使用 CLion 調(diào)試 MySQL

解決方案:

成都創(chuàng)新互聯(lián)服務(wù)項(xiàng)目包括邯山網(wǎng)站建設(shè)、邯山網(wǎng)站制作、邯山網(wǎng)頁制作以及邯山網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,邯山網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到邯山省份的部分城市,未來相信會繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

因?yàn)?MySQL 5.6 初始化數(shù)據(jù)比較麻煩,不支持 mysqld 的 --initialize-insecure 選項(xiàng)。

所以不選用這種方式了。

第(2)和第(4)步可以參考 使用 CLion 調(diào)試 redis 。

編譯成功輸出:

擊菜單欄【Build】=》【Install】進(jìn)行安裝。

安裝成功輸出:

初始化數(shù)據(jù)目錄:

選擇 mysqld configuration , 以 Debug 模式運(yùn)行。

成功運(yùn)行輸出:

在 CLion 中,對 sql_parse.cc 中的 mysql_execute_command() 方法進(jìn)行斷點(diǎn)。

執(zhí)行下面的語句連接上 mysql 服務(wù)。

在 mysql-client 中執(zhí)行如下命令:

然后在 CLion 中即可發(fā)現(xiàn)已經(jīng)被斷點(diǎn)攔截,且可以發(fā)現(xiàn) Statement class 中的 query_string 字段和 我們上面輸入的命令 show databases 是一樣。

至此,已經(jīng)完成了 CLion 調(diào)試 MySQL 環(huán)境的搭建。

對于 mysqld ,可以通過設(shè)置 debug 系統(tǒng)變量在運(yùn)行時(shí)更改 DBUG設(shè)置 。

此變量具有全局值和會話值:

該 debug_options 值是用 冒號( : )分隔 的字段的序列:

值中的每個(gè)字段都包含一個(gè)強(qiáng)制性標(biāo)志字符。

我們使用的標(biāo)志字符如下所示:

以 root 用戶連接到 mysqld。

然后,在 mysql 中執(zhí)行 select 語句,就可以在 CLion console 中觀察到如下圖所示輸出。

MySQL5.7 MVCC原理分析與調(diào)試

簡介:

大家好,我是xp,我又詐尸了

mvcc ,想必大家都不陌生,每個(gè)Java程序員都或多或少的了解過,不過不知道大家都是怎么學(xué)習(xí)的,是不是簡單的百度一下呢?下面,我來帶大家裝個(gè)13,調(diào)試 mvcc 。咳,不是源碼哈,但有那味了。

開卷開卷。

首先介紹一下 mvcc 的字面意思,全稱: Multiversion Concurrency Control,翻譯下來就是多版本并發(fā)控制技術(shù)。

臟讀、 不可重復(fù)讀 、幻讀的概念就不多啰嗦了,mvcc具體的含義也不多啰嗦了,可以自行百度。 mvcc 解決了臟讀、 不可重復(fù)讀、部分幻讀 ,包含了3個(gè)重要成分:

undo log作用:

在數(shù)據(jù)修改的時(shí)候,不僅記錄了 redo log ,還記錄了 undo log 。但是 不同于 redo log , undo log 是邏輯日志。簡單理解成, delete的時(shí)候,undo log會出現(xiàn)一條insert,update的時(shí)候,undo log會出現(xiàn)一條舊數(shù)據(jù), 用來事務(wù)失敗之后的回滾。

3個(gè)隱式字段:

Read View:

好了,理論講完了,讓我們嗨起來。

嗨之前,有一個(gè)情況單獨(dú)說一下:

可以看到,此時(shí)的trx_id非常大,這是因?yàn)榇藭r(shí)是只讀事務(wù)。對于只讀事務(wù), InnoDB 并不會分配 trx_id,只有發(fā)生dml才會分配。這樣有2個(gè)好處:

當(dāng)commit了之后,我們使用SHOW ENGINE INNODB STATUS查看:

可以看到,顯示該事務(wù)并沒有開始。

好,回到正軌,相信大家都知道, 視圖可見性判斷(不知道的先百度 mvcc ):

整體是這樣的:

第一步我們以 38488 為開始值,把 name 更新成 111 ,并且 commit

第二步以 38490 把 name 更新成 222,333 ,但是不 commit

當(dāng) 38490 第一次修改為 222 的時(shí)候,數(shù)據(jù)結(jié)構(gòu)大致是這樣的:

使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:

當(dāng) 38490 第二次修改為 333 的時(shí)候,數(shù)據(jù)結(jié)構(gòu)大致是這樣的:

使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:

第三步以 38491 去查詢,此時(shí)生成的 m_ids 應(yīng)該是 [348490,38491]

使用 SHOW ENGINE INNODB STATUS 側(cè)面驗(yàn)證:

此時(shí) ReadView 的幾個(gè)屬性值為:

接下來我們來驗(yàn)證結(jié)論:

1:不用驗(yàn)證,當(dāng)前事務(wù)修改的肯定自己可見

2: 38491查詢id=1的記錄,name為111

38488 348490,所以111可見

3:不用驗(yàn)證,38492是下個(gè)事務(wù)的id,還沒生成呢,當(dāng)前事務(wù),肯定看不見下個(gè)事務(wù)修改的值

4:我們先把38491commit,把id為20的name更新成111

然后再開一個(gè)事務(wù)38496:

此時(shí)查id為20,是可見的

m_ids:[348490,38496],因?yàn)?8491已經(jīng)commit了,所以m_ids沒有。此時(shí)的38491在m_ids之間,但是在m_ids里面找不到,所以可見。

好了,愉快的裝13結(jié)束了,兄弟們,下次見。

如何在Windows下編譯或調(diào)試MySQL

用vs code 就可以了。

Visual Studio Code

Visual Studio Code(簡稱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)建證書否則無法安裝,步驟如下:

創(chuàng)建完成后,開始安裝LLVM

brew install llvm --with-python@2?--with-lldb

安裝插件

VS Code自帶有debug功能,這里我推薦使用LLDB Debugger插件。

?接下來,為項(xiàng)目配置調(diào)試參數(shù)。

配置調(diào)試參數(shù)

使用VS Code打開MySQL源碼目錄,在側(cè)邊欄選擇debug欄目,添加配置,program輸入需要調(diào)試的程序路徑,這里選擇你編譯好的mysqld路徑,args輸入程序啟動所需的參數(shù),通常會指定mysqld的配置文件。這樣就配置好了,是不是很簡單。

啟動調(diào)試

點(diǎn)擊啟動按鈕,啟動后如果沒有設(shè)置斷點(diǎn)會mysqld會正常啟動,如果觸發(fā)了斷點(diǎn)會如下圖顯示。

整個(gè)調(diào)試窗口基本分為六部分,所有的調(diào)試操作都在這里完成:

1:?顯示變量信息

2:?設(shè)置重點(diǎn)關(guān)注的變量

3:?顯示調(diào)用棧信息

4:?設(shè)置斷點(diǎn)信息,在代碼行號前也可以設(shè)置斷點(diǎn)

5:?代碼顯示區(qū)域,上方是調(diào)試按鈕,包括 continue/stepover/step in/step out/restart/stop

6:?調(diào)試終端輸入輸出區(qū)

斷點(diǎn)設(shè)置

在代碼行號前點(diǎn)擊即可在該行為設(shè)置斷點(diǎn),也可以根據(jù)條件設(shè)置斷點(diǎn)。以設(shè)置ConditionalBreakpoint為例,當(dāng)程序啟動后會按照你設(shè)置的條件表達(dá)式判斷是否觸發(fā)斷點(diǎn)。

Conditional Breakpoint這種方式用在目標(biāo)變量達(dá)到某條件時(shí)觸發(fā)斷點(diǎn),其余則跳過繼續(xù)執(zhí)行。比如:設(shè)置變量等于目標(biāo)表名時(shí)觸發(fā)斷點(diǎn),其余表則跳過,相對函數(shù)名斷點(diǎn)省去很多手工跳過操作。

遠(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

安裝完成后,啟動lldb-server

remote$ /opt/rh/llvm-toolset-7/root/usr/bin/lldb-serverplatform --listen?"*:9191"?--server

接下來,在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ī)代碼庫路徑的映射,這樣調(diào)試時(shí)代碼才可以和程序關(guān)聯(lián)在一起看

注意:記得調(diào)試前將代碼切換到與目標(biāo)程序版本一致的branch

新手如何調(diào)試 MySQL?看這一篇就夠了

前幾天看到姜老師的舊文 用 VSCode 編譯和調(diào)試 MySQL,每個(gè) DBA 都應(yīng) get 的小技能[1] , 文末留了一個(gè)思考題,如何修改源碼,自定義版本,使得 select version() 輸出自定義內(nèi)容

調(diào)試過程參考 macOS VSCode 編譯調(diào)試 MySQL 5.7[2]

內(nèi)部 Item 對象參考 從SQL語句到MySQL內(nèi)部對象[3]

源碼面前沒有秘密,建義對 DB 感興趣的嘗試 debug 調(diào)試。本文環(huán)境為 mac + vscode + lldb

vscode 插件:

mysql 源碼:

補(bǔ)丁: MySQL = 8.0.21 需要對 cmake/mysql_version.cmake 文件打補(bǔ)丁 (沒有嚴(yán)格測試所有版本)

創(chuàng)建 cmake-build-debug 目錄,后續(xù) mysql 編譯結(jié)果,以及啟動后生成的文件都在這里

在 mysql 工程目錄下面創(chuàng)建 .vscode/settings.json 文件

內(nèi)容沒啥好說的,都是指定目錄及 boost 配置,其中 WITH_DEBUG 打開 debug 模式,會在 /tmp/debug.trace 生成 debug 信息

View - Command Palette - CMake: Configure 執(zhí)行后生成 cmake 配置

View - Command Palette - CMake: Build 編譯生成最終 mysql 相關(guān)命令

發(fā)現(xiàn)老版本編譯很麻煩,各種報(bào)錯,mysql 5.7 代碼量遠(yuǎn)超過 5.5, 只能硬著頭皮看 5.7

首先初始化 my.cnf 配置,簡單的就可以,共它均默認(rèn)

初始化數(shù)據(jù)文件,非安全模式,調(diào)試用

由于用 vscode 接管 mysql, 所以需要配置 .vscode/launch.json

然后點(diǎn)擊 run and debug mysqld

mysql 啟動,看到輸出日志無異常,此時(shí)可以用 mysql-client 連接

首先在 sql_parser.cc:5435 處打斷點(diǎn)

mysql_parse 是 sql 處理的入口,至于 tcp connection 連接先可以忽略

執(zhí)行上述 sql 自動跳轉(zhuǎn)到斷點(diǎn)處, Step Into , Step Over , Step Out 這些調(diào)試熟悉下即可

接下來分別調(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

啟動 mysql 時(shí) init_common_variables 會初始化一堆變量,其中會調(diào)用 set_server_version 生成版本信息,修改這個(gè)就可以

看好條件編譯的是哪塊,修改即可, 重新 CMake: Build 編譯再運(yùn)行

這里不做過深分析,簡單講

sql_yacc.cc 函數(shù) PTI_function_call_generic_ident_sys 解析 sql, 識別出 version() 是一個(gè)函數(shù)調(diào)用

find_native_function_builder 查找 hash 表,找到對應(yīng) version 函數(shù)注冊的單例工廠函數(shù)

mysql 啟動時(shí)調(diào)用 item_create_init 將這些函數(shù) builder 注冊到 hash 表 native_functions_hash

MySQL 代碼太龐大,5.1 大約 100w 行,5.5 130w 行,5.7 以后 330w 行,只能挑重點(diǎn)讀源碼。最近很多群里的人在背八股,沒必要,有那時(shí)間學(xué)著調(diào)試下源碼,讀讀多好

原文出處:


當(dāng)前文章:mysql怎么調(diào)試 mysql怎么調(diào)優(yōu)
文章路徑:http://weahome.cn/article/doighgg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部