mysql日志分析_第1页
mysql日志分析_第2页
mysql日志分析_第3页
mysql日志分析_第4页
mysql日志分析_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

主要模块及数据流经过多年的发展,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: 提供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平台上进行编译时需要的工具和库。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. Tests: 测试文件所在目录。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 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 LOCK_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_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 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 int *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 *insert_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_type 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; / 指向原表的指针const 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, CAPITALIZE, 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_malloc(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_ (unused); 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; /全局系统变量三、 主要调用流程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, &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();/主要处理函数,处理新的连接并创建新的线程处理之c) 监听接收链接主要代码在sql/mysqld.cc中,精简后的代码如下:THD *thd;FD_SET(ip_sock,&clientFDs); /客户端socketwhile (!abort_loop)readFDs=clientFDs;if (select(int) max_used_connection,&readFDs,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); /初始化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-read_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: /如果是查询语句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_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) /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 indirectlyres= 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 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,用以描述客户端的所有信息,将作为参数在各个模块之间传递。一个典型的客户端查询在MySQL的主要模块之间的调用关系如下图所示:当mysql启动完毕后,调用han

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论