MySQL5 5原始碼分析以及目錄結構

2021-06-06 07:30:01 字數 3889 閱讀 4621

主要模組及資料流

經過多年的發展,mysql的主要模組已經穩定,基本不會有大的修改。本文將對mysql的整體架構及重要目錄進行講述。

原始碼結構(mysql-5.5.0-m2)

主要資料結構

主要呼叫流程

mysql啟動

主要**在sql/mysqld.cc中,精簡後的**如下:

int main(int argc, char **argv) //標準入口函式

my_init(argv[0]);//呼叫mysys/my_init.c->my_init(),初始化mysql內部的系統庫

logger.init_base(); //初始化日誌功能

init_common_variables(mysql_config_name,argc, argv,load_default_groups) //呼叫load_defaults(conf_file_name, groups,&argc, &argv),讀取配置資訊

user_info= check_user(mysqld_user);//檢測啟動時的使用者選項

set_user(mysqld_user, user_info);//設定以該使用者執行

init_server_components();//初始化內部的一些元件,如table_cache,query_cache等。

network_init();//初始化網路模組,建立socket監聽

start_signal_handler();// 建立pid檔案

mysql_rm_tmp_tables() ||acl_init(opt_noacl)//刪除tmp_table並初始化資料庫級別的許可權。

init_status_vars(); // 初始化mysql中的status變數

start_handle_manager();//建立manager執行緒

handle_connections_sockets();//主要處理函式,處理新的連線並建立新的執行緒處理之

監聽接收鏈結

主要**在sql/mysqld.cc中,精簡後的**如下:

thd *thd;

fd_set(ip_sock,&clientfds); //客戶端socket

while (!abort_loop)

readfds=clientfds;

if (select((int)max_used_connection,&readfds,0,0,0) error&& net->vio != 0&&

!(thd->killed == thd::kill_connection))

end_connection(thd);

}預處理連線

thread_count++;//增加當前連線的執行緒

thread_scheduler.add_connection(thd);

for (;;)

end_connection(thd);

} 處理

do_command在sql/sql_parse.cc中:讀取客戶端傳遞的命令並分發。

net *net= &thd->net;

packet_length= my_net_read(net);

packet= (char*) net->read_pos;

command= (enum enum_server_command) (uchar) packet[0];//從net結構中獲取命令

dispatch_command(command, thd, packet+1, (uint)(packet_length-1));//分發命令

在dispatch_command函式中,根據命令的型別進行分發。

thd->command=command;

switch( command )

在mysql_parse函式中,

lex_start(thd);

if (query_cache_send_result_to_client(thd, (char*) inbuf, length)sql_command

在mysql_execute_command中,根據命令型別,轉到相應的執行函式。

switch (lex->sql_command) {

lex *lex= thd->lex;

table_list *all_tables;

case sqlcom_select:

check_table_access(thd, lex->exchange ? select_acl |file_acl : select_acl, all_tables, uint_max, false); //檢查使用者許可權

execute_sqlcom_select(thd, all_tables); //執行select命令

break;

case sqlcom_insert:

{ res= insert_precheck(thd, all_tables) //rights

mysql_insert(thd, all_tables, lex->field_list,lex->many_values,

lex->update_list,lex->value_list,

lex->duplicates, lex->ignore);

break;

在execute_sqlcom_select函式中,

res= open_and_lock_tables(thd, all_tables)//directly andindirectly

res= handle_select(thd, lex, result, 0);

handle_select在sql_select.cc中,呼叫mysql_select ,在mysql_select中,

join->prepare();//prepare of whole select(including sub queries in future).

join->optimize();//global select optimisation.

join->exec();//

在mysql_insert函式中,

open_and_lock_tables(thd, table_list)

mysql_prepare_insert(); //prepare item in insert statment

while ((values= its++))

write_record(thd, table,&info);//寫入新的資料

在write_record函式中,

table->file->ha_write_row(table->record[0])

ha_write_row在handler.cc中,只是乙個介面

write_row(buf); //呼叫表儲存所用的引擎

當客戶端鏈結上mysql服務端時,系統為其分配乙個鏈結描述符thd,用以描述客戶端的所有資訊,將作為引數在各個模組之間傳遞。乙個典型的客戶端查詢在mysql的主要模組之間的呼叫關係如下圖所示:

當mysql啟動完畢後,呼叫handle_connection_sockets等待客戶端連線。當客戶端連線上伺服器時,服務處理函式將接受連線,會為其建立鏈結執行緒,並進行認證。如認證通過,每個連線線程將會被分配到乙個執行緒描述符thd,可能是新建立的,也可能是從cached_thread執行緒池中復用的。該描述符包含了客戶端輸入的所有資訊,如查詢語句等。伺服器端會層層解析命令,根據命令型別的不同,轉到相應的sql執行函式,進而給傳遞給下層的儲存引擎模組,處理磁碟上的資料庫檔案,最後將結果返回。執行完畢後thd將被加入cached_thread中。

mysql5 5 原始碼分析( )

做個備份,好記性不如爛筆頭。sloccount算了一下,整個工程的 是百萬行級的,c 和ascic為主。從規模來看,絲毫不遜色於wps文字。時隔一年半,再把c 撿起來。cpp 631203 49.60 ansic 543818 42.74 507268 storage cpp 352539,ansi...

原始碼安裝mysql5 5

原始碼編譯安裝 mysql 5.5.13 實踐 1.安裝cmake mysql從5.5版本開始,通過.configure進行編譯配置方式已經被取消,取而代之的是cmake工具。因此,我們首先要在系統中原始碼編譯安裝cmake工具。wget tar zxvf cmake 2.8.7.tar.gz cd...

Linux 原始碼安裝Mysql5 5

公司的伺服器是centos 5.4 final 版的,今天在上面安裝了一回mysql5.5,記錄如下 2 tar zxvf mysql 5.5.2 m2.tar.gz 解壓到 usr local src mysql 5.5.2 m2下 cd mysql 5.5.2 m2 configure pref...