由于工作需要,需要了解数据库中权限管理模块的工作机制,因此开始看 MySQL 的代码。在网上找到一本电子书“Understanding MySQL Internals”,以下的内容主要来自该电子书。
MySQL 代码中的主要模块包括:
Server Initialization Module
sql/mysqld.cc
init_common_variables()
init_thread_environment()
init_server_components()
grant_init() in sql/sql_acl.cc
init_slave() in sql/slave.cc
get_options()
connection manager
connection manager 监听 client 发起的连接,并将请求发送给 Thread Manager. 这个模块只是 sql/mysqld.cc 中的一个函数:handle_connections_sockets().
Thread Manager
The Thread Manager 负责跟踪线程,并保证为每一从 client 发起的连接分配一个线程。这个模块很小,大部分的代码都在 sql/mysqld.cc 中。入口是create_new_thread()。另外一个函数是 start_cached_thread()。
Connection Thread
Connection Thread 是处理一 client 请求的核心。在 sql/sql_parse.cc 中有 一个函数 handle_one_connection() in sql/sql_parse.cc
User Authentication Module
User Authentication Module 负责验证连接用户,并初始化和这个用户相对应 的权限的结构和变量。模块的入口是 sql/sql_parse.cc 中的 check_connection()。其他的部分在 sql/sql-acl.cc 和 sql/password.cc 中 。其他的一些函数还包括:
acl_check_host() in sql/sql_acl.cc
create_random_string() in sql/password.cc
check_user() in sql/sql_parse.cc
acl_getroot() in sql/sql_acl.cc
Access Control Module
Access Control Module 验证客户端用户是否拥有足够的权限去进行某项操作。 大部分的代码在 sql/sql_acl.cc 中。但是,一个最常用的函数, check_access() 在 sql/sql_parse.cc 中。和该模块相关的函数还包括 sql/sql_acl.cc 中的:
check_grant()
check_table_access() in sql/sql_parse.cc
check_grant_column()
acl_get()
Parser
Parser 负责解析请求并生成解析树。入口为 sql/sql_parse.cc 中的 mysql_parse()。
Command Dispatcher
Command Dispatcher 负责将请求定向至底层的模块。它包含 sql/sql_parse.cc 中的两个函数 do_command() and dispatch_command().
Query Cache Module
Query Cache Module 负责缓存查询结果,并尽可能的使用到缓存结果以加速查 询到执行过程。它在 sql/sql_cache.cc 中实现。
Query_cache::store_query()
Query_cache::send_result_to_client()
Optimizer
负责为查询制定最好的策略并执行查询。它可能是 mysql 中最复杂的模块,入 口是 mysql_select() in sql/sql_select.cc(这个文件有 14324行)。其他的一 些函数和方法包括:
JOIN::prepare()
JOIN::optimize()
JOIN::exec()
make_join_statistics()
find_best_combination()
optimize_cond()
Table Manager
Table Manager 负责创建、读取以及修改 table 定义文件(扩展名为 .frm),维 护一个 table descriptor 的缓存,称为 table cache,并维护 table 级的锁 。 大部分的代码在 sql/sql_base.cc,sql/table.cc,sql/unireg.cc 和 sql/lock.cc 中。一些函数包括:
openfrm() in sql/table.cc
mysql_create_frm() in sql/unireg.cc
open_table() in sql/sql_base.cc
open_tables() in sql/sql_base.cc
open_ltable() in sql/sql_base.cc
mysql_lock_table() in sql/lock.cc
Table Modification Modules
这个模块集负责 creating, deleting, renaming, dropping, updating, or inserting into a table。 入口包括:
mysql_update() and mysql_multi_update() in sql/sql_update.cc
mysql_insert() in sql/sql_insert.cc
mysql_create_table() in sql/sql_table.cc
mysql_alter_table() in sql/sql_table.cc
mysql_rm_table() in sql/sql_table.cc
mysql_delete() in sql/sql_delete.cc
Table Maintenance Module
负责 table 的维护操作,比如检查、修复、备份、恢复、优化和分析。代码在 sql/sql_table.cc 中。核心函数是 mysql_admin_table(),还包括:
mysql_check_table()
mysql_repair_table()
mysql_backup_table()
mysql_optimize_table()
mysql_analyze_table()
Status Reporting Module
负责回答一些关于服务器配置、性能变量、table 结构信息、复制进度、table cache 的状态等查询。它处理以 SHOW 开头等查询。大部分的代码在 sql/sql_show.cc 中,还包括:
mysqld_list_processes()
mysqld_show()
mysqld_show_create()
mysqld_show_fields()
mysqld_show_open_tables()
mysqld_show_warning()
show_master_info() in sql/slave.cc
show_binlog_info() in sql/sql_repl.cc
Abstracted Storage Engine Interface(Table Handler)
这个模块是一个抽象类,名为 handler,包含一个名为 handlerton 的数据结构 。这个数据结构是在 5.1 版中为了 plug-in 集成而加入的。
这个模块是为了集成 Berkeley DB 中的 tables 而加入的。这个改变带来了长 远的影响:现在很多底层存储引擎都可以方便的集成在 MySQL 中。
Storage Engine Implementations(MyISAM, InnoDB, Memory, BerkeleyDB)
每一个存储引擎实现了标准的接口。
Logging Module
The Logging Module 负责维护高层(逻辑层)的日志。存储引擎有可能维护它自己的底层(物理或者逻辑层)的日志。
Replication Master Module
负责 master 上的复制功能。
Replication Slave Module
负责 slave 上的复制功能。
Client/server Protocol API
MySQL client/server 通讯协议建立在操作系统的协议之上(TCP/IP)。代码在 sql/protocol.cc, sql/protocol.h 和 sql/net_serv.cc,函数包括:
my_net_read in sql/net_serv.cc
my_net_write() in sql/net_serv.cc
net_store_data() in sql/protocol.cc
send_ok() in sql/protocol.cc
send_error() in sql/protocol.cc
Core API
是 MySQL 中的瑞士军刀。
THD class
THD 定义了一个线程描述符,它包含了和正在处理特定请求的线程相关的信息。 每一个客户连接都被一个线程处理。每个线程有一个描述符对象。处理客户请求 的时候并不是创建线程的唯一时刻。MySQL 有一组系统线程,例如 replication slave 线程和 delayed insert 线程。并且,存在一些特殊的情况,只创建线程 描述符而没有线程--在安装的过程,server 运行在 bootstrap 模式下来创建必需的系统 tables。