MySQL服务器连接过程是怎么样的

mysqld是MySQL服务器端主进程,可以说mysqld是MySQL的真正核心,一切工作都是围绕mysqld进程进行的。所以要解剖mysql这个庞然大物,mysqld的代码是最好的突破口。

  一切都是从熟悉的main()函数开始的,其实是从mysqld_main()函数开始的。这些代码都在mysqld.cc。mysqld_main()随后调用了win_main)()。win_main()函数主要是做了一些初始化的工作。

  初始化工作完成之后,MySQL已经做好准备接受连接了。然后我们的主角Handle_connections_methods()函数登场了。这个函数的主要工作是新建3个子进程,他们分别接受TCP/IP、命名管道以及共享内存这三种方式的连接。一般情况下客户都是用TCP/IP(socket)来连接MySQL服务器的,这是最有弹性的通信方式。但是在嵌入式软件的应用环境中,需要采用后两种通信方式。

    简化后的handle_connections_methods()函数:

static void handle_connections_methods()
{
  mysql_mutex_lock(&LOCK_thread_count);
  mysql_cond_init(key_COND_handler_count, &COND_handler_count, NULL);
  handler_count=0;
  handler_count++;
  mysql_thread_create(key_thread_handle_con_namedpipes, &hThread, &connection_attrib, handle_connections_namedpipes, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sockets, &hThread, &connection_attrib, handle_connections_sockets_thread, 0));
  handler_count++;
  mysql_thread_create(key_thread_handle_con_sharedmem, &hThread, &connection_attrib, handle_connections_shared_memory, 0))
  while (handler_count > 0)
    mysql_cond_wait(&COND_handler_count, &LOCK_thread_count);
  mysql_mutex_unlock(&LOCK_thread_count);
}

  新建了3个线程之后,handle_connectins_methods()函数进入一个长时间循环,直到3个连接线程全部退出后才退出。这里我主要看看socket的连接线程,我们的研究对象就是这个handle_connections_sockets_thread。这个线程把自己初始化之后,就直接调用了handle_connections_sockets();

  handle_connections_sockets()函数使用select()调用监听mysqld的端口,然后等待客户端的连接。等到一个客户端连接后,这个函数中会新建一个THD类型的变量,这个变量是一个“交际花”,从连接建立开始,到SQL语法分析、查询执行、结果返回等等。这个变量一直都在,总之这是一个非常重要的变量。

  还有struct st_vio这个结构体,这个结构体是一个命令的中转站。在“交际花”THD中也定义了一个vio类型的结构体。这个结构体的功能就是从储存从套接字中读取通信内容,然后又把自己的值赋给THD的vio变量。VIO类型中详细的描述了一次请求,包括请求的内容、时间、请求的套接字地址等等。之后发生的事情就是把这个“交际花”传递到服务线程,create_thread_to_handle_connection()实现这个功能。

    以下是删减后的代码

void create_thread_to_handle_connection(THD *thd)
{
  if (cached_thread_count > wake_thread)
  {
    mysql_cond_signal(&COND_thread_cache);
  }
  else
  {
    mysql_thread_create(key_thread_one_connection, &thd->real_id, &connection_attrib, handle_one_connection, (void*) thd)));    
  }
}

  这个函数会查看有没有闲置的缓存线程(MySQL不会把断开连接后的服务线程立即销毁掉,而是缓存了起来),如果有就是用缓存线程,如果没有就新建一个线程来服务连接。至此,一个连接就进入了服务线程,连接线程返回继续等待连接。

  后边的内容就都是在服务线程中实现的,《深入理解MySQL》中有很详细的代码跟踪,感兴趣的同学可以看看。我把函数调用顺序附上,供参考。

handle_one_connection()
mysql_thread_create()
handle_one_connection()
do_handle_one_connection()
init_new_connection_thread()
init_new_connection_handler_thread()
do_command()
dispatch_command()
mysql_parse()
mysql_execuate_command()

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql
, 线程
, 结构
, 函数
, 变量
代码
不能连接mysql服务器、mysql 连接服务器、服务器mysql 远程连接、mysql怎么连接服务器、无法连接mysql服务器,以便于您获取更多的相关知识。

时间: 2024-10-26 07:03:42

MySQL服务器连接过程是怎么样的的相关文章

mysql-不能上到MySQL服务器连接“localhost”!

问题描述 不能上到MySQL服务器连接"localhost"! 安装MySQL-Front后打开就出现这种情况:"不能上到MySQL服务器连接"localhost"!" 服务器名称为:localhost 端口号为3306 连接类型为:Direct 用户名为:root 密码:123456 (注册信息是打开mysql后设置的,密码按照网上试了一遍:"123" .为空,都不行) 安装在C盘program Files(x86)下,里面

MySQL服务器的启动与停止

mysql|服务器 MySQL服务器的启动与停止[晏子] 一.以非特权用户运行MySQL服务器 在讨论如何启动MySQL服务器之前,让我们考虑一下应该以什么用户身份运行MySQL服务器.服务器可以手动或自动启动.如果你手动启动它,服务器以你登录Unix(Linux)的用户身份启动,即如果你用paul登录Unix并启动服务器,它用paul运行:如果你用su命令切换到root,然后运启动服务器,则它以root运行.然而,大多数情况下你可能不想手动启动服务器,最有可能是你安排MySQL服务器在系统引导

Mysql服务器的启动与停止(一)

mysql|服务器 在讨论如何启动MySQL服务器之前,让我们考虑一下应该以什么用户身份运行MySQL服务器.服务器可以手动或自动启动.如果你手动启动它,服务器以你登录Unix(Linux)的用户身份启动,即如果你用paul登录Unix并启动服务器,它用paul运行:如果你用su命令切换到root,然后运启动服务器,则它以root运行.然而,大多数情况下你可能不想手动启动服务器,最有可能是你安排MySQL服务器在系统引导时自动启动,作为标准引导过程的一部分,在Unix下,该引导过程由系统的Uni

MySQL服务器的启动和关闭

mysql|服务器 作为MySQL管理员,一个普通的目标就是确保服务器尽可能地处于运行状态,使得客户机能够随时访问它.但是,有时最好关闭服务器(例如,如果正在进行数据库的重定位,不希望服务器在该数据库中更新表).保持服务器运行和偶尔关闭它的需求关系不是本书所解 决的.但是我们至少可以讨论如何使服务器启动和停止,以便您具备进行这两个操作的能力.     本章的说明只用于UNIX 系统.如果正在运行Windows 系统,可以跳过本章,因为附录A"获得和安装软件"一节中包含了所有需要的启动和

MySQL服务器的启动和关闭_Mysql

    本章的说明只用于UNIX 系统.如果正在运行Windows 系统,可以跳过本章,因为附录A"获得和安装软件"一节中包含了所有需要的启动和关闭命令.      调用本章给出的命令      为了简洁,在大多数情况中,诸如mysqla d m i n.mysqldump 等程序在本章中没有给出任何- h.- u或- p选项.笔者假定您将会用连接服务器所需的任何选项调用这些程序.  用无特权的用户账号运行MySQL服务器      在讨论如何启动服务器之前,考虑一下在服务器启动时应该

MySQL服务器最大连接数怎么设置才合理

MySQL服务器的连接数并不是要达到最大的100%为好,还是要具体问题具体分析,下面就对MySQL服务器最大连接数的合理设置进行了详尽的分析,供您参考. 我们经常会遇见"MySQL: ERROR 1040: Too many connections"的情况,通常,mysql的最大连接数默认是100, 最大可以达到16384. 一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小: m

MySQL服务器设置max_user_connections防止连接耗尽,以提高可用性

问题简述/现象及原因 一台MySQL服务器上,有多个数据库,由不同用户使用,相互之间没有或很少关联性.典型的实例是虚拟主机,或者有N多个小网站的某些低频企业应用. 这种环境下,难免有部分应用的质量不高: 出现效率极低的慢查询 -> 后续请求大量被locked排队 -> MySQL服务实时连接数达到最大连接数限制  ->  无法建立新连接 so, 所有相关应用全部挂掉 应对方案 为防止上述情况发生,要为MySQL配置max_user_connections参数.该参数作用是设置单个用户最大

win7下使用Navicat for Mysql连接Ubuntu虚拟机上的mysql服务器步骤

问题描述 win7下使用Navicat for Mysql连接Ubuntu虚拟机上的mysql服务器步骤 虚拟机ubuntu,需要操作什么命令,虚拟机上可以进入mysql创建的数据库,但是在win7中Navicat for Mysql没有显示 Navicat for Mysql中主机名或IP地址是localhost,是否应该连接虚拟机的IP地址? 解决方案 设置虚拟机ip地址. 解决方案二: 使用Navicat for Mysql连接Ubuntu虚拟机上的mysql服务器失败 - Segment

源代码-tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口

问题描述 tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口 5C 求救1.tomcat部署的web端服务器连接mysql,应用程序连接服务器给出的http接口,然后应用程序就可以通过和服务器交互来使用mysql里面的数据,这样理解是对的吗?2.如果这是对的,那服务器是不是就要封装好数据库连接类.数据增删查改类?这样,应用程序就可以只需要传参数就可以使用数据了?3.在服务器端封装好数据库连接类的话:那不是每次应用程序使用数据的时候,服务器都要连接又断开数据库了吗