




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、主要模塊及數據流經過多年的發展,mysql的主要模塊已經穩定,基本不會有大的修改。本文將對MySQL的整體架構及重要目錄進行講述。一、 源碼結構(MySQL-5.5.0-m2)1. BUILD: 內含在各個平臺、各種編譯器下進行編譯的腳本。如compile-pentium-debug表示在pentium架構上進行編譯的腳本。2. Client: 客戶端工具,如mysql, mysqladmin之類。3. Cmd-line-utils: readline, libedit工具。4. Config: 給aclocal使用的配置文件。5. Dbug: 提供一些調試用的宏定義。6. Extra: 提供
2、innochecksum,resolveip等額外的小工具。7. Include: 包含的頭文件8. Libmysql: 庫文件,生產libmysqlclient.so。9. Libmysql_r: 線程安全的庫文件,生成libmysqlclient_r.so。10. Libservices: 5.5.0中新加的目錄,實現了打印功能。11. Man: 手冊頁。12. Mysql-test: mysqld的測試工具一套。13. Mysys: 為跨平臺計,MySQL自己實現了一套常用的數據結構和算法,如string, hash等。14. Netware: 在netware平臺上進行編譯時需要的工具
3、和庫。15. Plugin: mysql以插件形式實現的部分功能。16. Pstack: 異步棧追蹤工具。17. Regex: 正則表達式工具。18. Scripts: 提供腳本工具,如mysql_install_db等19. Sql: mysql主要代碼,將會生成mysqld文件。20. Sql-bench: 一些評測代碼。21. Sql-common: 存放部分服務器端和客戶端都會用到的代碼。22. Storage: 存儲引擎所在目錄,如myisam, innodb, ndb等。23. Strings: string庫。24. Support-files: f示例配置文件。25. Test
4、s: 測試文件所在目錄。26. Unittest: 單元測試。27. Vio: virtual io系統,是對network io的封裝。28. Win: 給windows平臺提供的編譯環境。29. Zip: zip庫工具二 主要數據結構1. THD 線程描述符(sql/sql_class.h)包含處理用戶請求時需要的相關數據,每個連接會有一個線程來處理,在一些高層函數中,此數據結構常被當作第一個參數傳遞。NET net; / 客戶連接描述符Protocol *protocol; / 當前的協議Protocol_text protocol_text; / 普通協議Protocol_binary
5、 protocol_binary; / 二進制協議HASH user_vars; /用戶變量的hash值String packet; / 網絡IO時所用的緩存String convert_buffer; / 字符集轉換所用的緩存struct sockaddr_in remote; /客戶端socket地址THR_LOCK_INFO lock_info; / 當前線程的鎖信息THR_LOCK_OWNER main_lock_id; / 在舊版的查詢中使用THR_LOCK_OWNER *lock_id; /若非main_lock_id, 指向游標的lock_idpthread_mutex_t LO
6、CK_thd_data; /thd的mutex鎖,保護THD數據(thd->query, thd->query_length)不會被其余線程訪問到。Statement_map stmt_map; /prepared statements和stored routines 會被重復利用int insert(THD *thd, Statement *statement); / statement的hash容器class Statement:LEX_STRING name;LEX *lex; /語法樹描述符bool set_db(const char *new_db, size_t new
7、_db_len)void set_query(char *query_arg, uint32 query_length_arg);pthread_mutex_lock(&LOCK_thd_data);set_query_inner(query_arg, query_length_arg);pthread_mutex_unlock(&LOCK_thd_data);2. NET 網絡連接描述符(sql/mysql_com.h)網絡連接描述符,對內部數據包進行了封裝,是client和server之間的通信協議。Vio *vio; /底層的網絡I/O socket描述符unsigned
8、 char *buff,*buff_end,*write_pos,*read_pos; /緩存相關unsigned long remain_in_buf,length, buf_length, where_b;unsigned long max_packet,max_packet_size; /當前值;最大值unsigned int pkt_nr,compress_pkt_nr; /當前(未)壓縮包的順序值my_bool compress; /是否壓縮unsigned int write_timeout, read_timeout, retry_count; /最大等待時間unsigned i
9、nt *return_status; /thd中的服務器狀態unsigned char reading_or_writing;unsigned int last_errno; /返回給客戶端的錯誤號unsigned char error;3. TABLE 數據庫表描述符(sql/table.h)數據庫表描述符,分成TABLE和TABLE_SHARE兩部分。handler *file; /指向這張表在storage engine中的handler的指針THD *in_use;Field *field;uchar *record2;uchar *write_row_record;uchar *in
10、sert_values;key_map covering_keys;key_map quick_keys, merge_keys;key_map keys_in_use_for_query;key_map keys_in_use_for_group_by;key_map keys_in_use_for_order_by;KEY *key_info;HASH name_hash; /數據域名字的hash值MEM_ROOT mem_root; /內存塊LEX_STRING db;LEX_STRING table_name;LEX_STRING table_cache_key;enum db_typ
11、e db_type /當前表的storage engine類型enum row_type row_type /當前記錄是定長還是變長uint primary_key;uint next_number_index; /自動增長key的值bool is_view ;bool crashed;4. FIELD 字段描述符(sql/field.h)域描述符,是各種字段的抽象基類。uchar *ptr; / 記錄中數據域的位置uchar *null_ptr; / 記錄 null_bit 位置的byteTABLE *table; / 指向表的指針TABLE *orig_table; / 指向原表的指針co
12、nst char *table_name, *field_name;LEX_STRING comment;key_map key_start, part_of_key, part_of_key_not_clustered;key_map part_of_sortkey;enum utype NONE,DATE,SHIELD,NOEMPTY,CASEUP,PNR,BGNR,PGNR,YES,NO,REL,CHECK,EMPTY,UNKNOWN_FIELD,CASEDN,NEXT_NUMBER,INTERVAL_FIELD,BIT_FIELD, TIMESTAMP_OLD_FIELD, CAPIT
13、ALIZE, BLOB_FIELD,TIMESTAMP_DN_FIELD, TIMESTAMP_UN_FIELD, TIMESTAMP_DNUN_FIELD;.virtual int store(const char *to, uint length,CHARSET_INFO *cs)=0;inline String *val_str(String *str) return val_str(str, str); 5. Utility API Calls 各種API各種核心的工具,例如內存分配,字符串操作或文件管理。標準C庫中的函數只使用了很少一部分,C+中的函數基本沒用。void *my_ma
14、lloc(size_t size, myf my_flags) /對malloc的封裝size_t my_write(File Filedes, const uchar *Buffer, size_t Count, myf MyFlags) /對write的封裝6. Preprocessor Macros 處理器宏Mysql中使用了大量的C預編譯,隨編譯參數的不同最終代碼也不同。#define max(a, b) (a) > (b) ? (a) : (b) /得出兩數中的大者do char compile_time_assert(X) ? 1 : -1 _attribute_ (unus
15、ed); while(0)使用gcc的attribute屬性指導編譯器行為 Global variables 全局變量 configuration settings server status information various data structures shared among threads主要包括一些全局的設置,服務器信息和部分線程間共享的數據結構。struct system_status_var global_status_var; /全局的狀態信息struct system_variables global_system_variables; /全局系統變量三、 主要調用流
16、程a) MySQL啟動b) 主要代碼在sql/mysqld.cc中,精簡后的代碼如下:int main(int argc, char *argv) /標準入口函數MY_INIT(argv0); /調用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, &am
17、p;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并初始化數據庫級別的權限。
18、init_status_vars(); / 初始化mysql中的status變量start_handle_manager();/創建manager線程handle_connections_sockets();/主要處理函數,處理新的連接并創建新的線程處理之c) 監聽接收鏈接主要代碼在sql/mysqld.cc中,精簡后的代碼如下:THD *thd;FD_SET(ip_sock,&clientFDs); /客戶端socketwhile (!abort_loop)readFDs=clientFDs;if (select(int) max_used_connection,&readF
19、Ds,0,0,0) error && net->vio != 0 &&!(thd->killed = THD:KILL_CONNECTION)if(do_command(thd) /處理客戶端發出的命令break;end_connection(thd);d) 預處理連接thread_count+;/增加當前連接的線程thread_scheduler.add_connection(thd);for (;) lex_start(thd);login_connection(thd); / 認證prepare_new_connection_state(thd
20、); /初始化thd描述符while(!net->error && net->vio != 0 &&!(thd->killed = THD:KILL_CONNECTION)if(do_command(thd) /處理客戶端發出的命令break;end_connection(thd);e) 處理do_command在sql/sql_parse.cc中:讀取客戶端傳遞的命令并分發。NET *net= &thd->net;packet_length= my_net_read(net);packet= (char*) net->re
21、ad_pos;command= (enum enum_server_command) (uchar) packet0; /從net結構中獲取命令dispatch_command(command, thd, packet+1, (uint) (packet_length-1);/分發命令在dispatch_command函數中,根據命令的類型進行分發。thd->command=command;switch( command ) case COM_INIT_DB: .;case COM_TABLE_DUMP: .;case COM_CHANGE_USER: .;.case COM_QUERY
22、: /如果是查詢語句alloc_query(thd, packet, packet_length)/thd->set_query(query, packet_length);mysql_parse(thd, thd->query(), thd->query_length(), &end_of_stmt);/ 解析查詢語句.在mysql_parse函數中,lex_start(thd);if (query_cache_send_result_to_client(thd, (char*) inBuf, length) sql_command在mysql_execute_co
23、mmand中,根據命令類型,轉到相應的執行函數。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 SQLCO
24、M_INSERT: res= insert_precheck(thd, all_tables) /rightsmysql_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 and indirectlyr
25、es= 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)mysq
26、l_prepare_insert(); /prepare item in INSERT statmentwhile (values= its+)write_record(thd, table ,&info);/寫入新的數據在write_record函數中,table->file->ha_write_row(table->record0)ha_write_row在Handler.cc中,只是一個接口write_row(buf); /調用表存儲所用的引擎二、 當客戶端鏈接上mysql服務端時,系統為其分配一個鏈接描述符thd,用以描述客戶端的所有信息,將作為參數在各個模塊
27、之間傳遞。一個典型的客戶端查詢在MySQL的主要模塊之間的調用關系如下圖所示:當mysql啟動完畢后,調用handle_connection_sockets等待客戶端連接。當客戶端連接上服務器時,服務處理函數將接受連接,會為其創建鏈接線程,并進行認證。如認證通過,每個連接線程將會被分配到一個線程描述符thd,可能是新創建的,也可能是從cached_thread線程池中復用的。該描述符包含了客戶端輸入的所有信息,如查詢語句等。服務器端會層層解析命令,根據命令類型的不同,轉到相應的sql執行函數,進而給傳遞給下層的存儲引擎模塊,處理磁盤上的數據庫文件,最后將結果返回。執行完畢后thd將被加入cached_thread中。 Mysql日志分析Musql為何要引入日志? 當數據庫遭到意外的損壞時,可以通過日志文件來查詢出錯原因,并且可以通過日志文件進行數據恢復。作用:記錄mysql數據庫的客戶端連接情況 sql語句的執行情況和錯誤信息分
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 一件感人事件作文8篇范文
- 虛擬代言人品牌原生性對品牌態度的影響研究
- 改性電解質膜在電解水中的應用研究
- 我國能源消費碳排放的影響因素分析與碳排放趨勢預測
- 兒童血液系統疾病
- 2025至2030中國室內游樂園行業產業運行態勢及投資規劃深度研究報告
- 2025至2030中國學生校服行業發展分析及投資前景與戰略規劃報告
- 2025至2030中國頭顯設備行業市場發展分析及競爭格局與投資機會報告
- 2025至2030中國多功能電話機行業市場現狀分析及競爭格局與投資發展報告
- 口腔醫院感染管理基礎知識
- 《絕緣子知識全集》課件
- 2025年甘肅省國際物流集團有限公司招聘筆試參考題庫含答案解析
- LY/T 2071-2024人造板類產品生產綜合能耗
- 裂隙燈顯微鏡檢查
- 2024年中考物理試題及答案
- 中國Linux軟件行業市場發展現狀及前景趨勢與投資分析研究報告(2024-2030版)
- 探究大象耳朵秘密:2025年課堂新視角
- 《新能源乘用車二手車鑒定評估技術規范 第1部分:純電動》
- 下沉式廣場結構施工方案
- 《加坡的教育制度》課件
- Windows操作系統及應用期末測試試題及答案
評論
0/150
提交評論