`

关闭mysql的几种方式和区别

 
阅读更多

      关闭mysql的方式大致有下面几种:

      kill `pidof mysqld`

      kill -9 `pidof mysqld`

      mysqladmin -uroot shutdown

      其中kill `pidof mysqld`是通过信号量SIGTERM(15),结束进程,这个同mysqladmin -uroot shutdown的方式一样 -- mysqladmin关闭mysqld也是通过SIGTERM信号量结束mysqld的。通过这2种方式关闭mysql,mysql的error日志显示的都是normal shutdown;而kill -9则是OS层强制关闭mysqld,error日志则不会有日志(异常crash),重启后则会显示Crash recovery。因此从mysql的错误日志中可以简单地判断mysql是crash还是正常关闭。正常情况下推荐通过mysqladmin 关闭mysql,如果出现异常再考虑使用kill -9的方式关闭。

正常mysqld关闭的过程如下:

1、初始化shutdown process。

2、server端创建一个shutdown thread(非必须)。

3、server拒绝新的连接进来。

4、server停止当前的活动。

5、server shutdown,关闭存储引擎。

6、server退出。

 

下面是具体的一些实现逻辑:

//mysqladmin的调用逻辑:(mysqladmin.cc)
int main(int argc,char *argv[])
{
...
if ((error= execute_commands(&mysql,argc,commands)))
...
}
static int execute_commands(MYSQL *mysql,int argc, char **argv)
{
  for (; argc > 0 ; argv++,argc--)
  {
    switch (find_type(argv[0],&command_typelib,2)) {
...
    case ADMIN_SHUTDOWN:
    {
..
        if (mysql_shutdown(mysql, SHUTDOWN_DEFAULT))
...
    }
   }
}
...

int STDCALL
mysql_shutdown(MYSQL *mysql, enum mysql_enum_shutdown_level shutdown_level)
{
  uchar level[1];
  DBUG_ENTER("mysql_shutdown");
  level[0]= (uchar) shutdown_level;
  DBUG_RETURN(simple_command(mysql, COM_SHUTDOWN, level, 1, 0));
}

 

//COM_SHUTDOWN的调用逻辑:
    general_log_print(thd, command, NullS);
    my_eof(thd);
    close_thread_tables(thd);			// Free before kill
    kill_mysql();
...
void kill_mysql(void)
{
  DBUG_ENTER("kill_mysql");

#if defined(SIGNALS_DONT_BREAK_READ) && !defined(EMBEDDED_LIBRARY)
  abort_loop=1;					// Break connection loops
  close_server_sock();				// Force accept to wake up
#endif

#if defined(__WIN__)
#if !defined(EMBEDDED_LIBRARY)
  {
    if (!SetEvent(hEventShutdown))
    {
      DBUG_PRINT("error",("Got error: %ld from SetEvent",GetLastError()));
    }
    /*
      or:
      HANDLE hEvent=OpenEvent(0, FALSE, "MySqlShutdown");
      SetEvent(hEventShutdown);
      CloseHandle(hEvent);
    */
  }
#endif
#elif defined(HAVE_PTHREAD_KILL)
  if (pthread_kill(signal_thread, MYSQL_KILL_SIGNAL))
  {
    DBUG_PRINT("error",("Got error %d from pthread_kill",errno)); /* purecov: inspected */
  }
#elif !defined(SIGNALS_DONT_BREAK_READ)
  kill(current_pid, MYSQL_KILL_SIGNAL);//调用kill函数,发送SIG_TERM信号给mysqld
#endif
  DBUG_PRINT("quit",("After pthread_kill"));
  shutdown_in_progress=1;			// Safety if kill didn't work
#ifdef SIGNALS_DONT_BREAK_READ
  if (!kill_in_progress)
  {
    pthread_t tmp;
    abort_loop=1;
    if (pthread_create(&tmp,&connection_attrib, kill_server_thread,
			   (void*) 0))
      sql_print_error("Can't create thread to kill server");
  }
#endif
  DBUG_VOID_RETURN;
}
 

 

//如果在kill的时候创建一个kill线程,逻辑如下
pthread_handler_t kill_server_thread(void *arg __attribute__((unused)))
{
  my_thread_init();				// Initialize new thread
  kill_server(0);
...
}
static void *kill_server(void *sig_ptr)
{
...
  if (sig == MYSQL_KILL_SIGNAL || sig == 0)
    sql_print_information(ER(ER_NORMAL_SHUTDOWN),my_progname);
  else
    sql_print_error(ER(ER_GOT_SIGNAL),my_progname,sig); /* purecov: inspected */
...
  close_connections();
  if (sig != MYSQL_KILL_SIGNAL &&
      sig != 0)
    unireg_abort(1);				/* purecov: inspected */
  else
    unireg_end();
...
}
/**
  cleanup all memory and end program nicely.

    If SIGNALS_DONT_BREAK_READ is defined, this function is called
    by the main thread. To get MySQL to shut down nicely in this case
    (Mac OS X) we have to call exit() instead if pthread_exit().

  @note
    This function never returns.
*/
void unireg_end(void)
{
  clean_up(1);
...
}

 

//mysqld启动的时候,创建kill线程
  start_signal_handler();
...
static void start_signal_handler(void)
{
...
  if ((error=pthread_create(&signal_thread,&thr_attr,signal_hand,0)))
...
}
...
/** This threads handles all signals and alarms. */
/* ARGSUSED */
pthread_handler_t signal_hand(void *arg __attribute__((unused)))
{
...
    switch (sig) {
    case SIGTERM:
    case SIGQUIT:
    case SIGKILL:
...
	kill_server((void*) sig);	// MIT THREAD has a alarm thread
...
}

 

 

 

 

链接:

http://dev.mysql.com/doc/refman/5.5/en/server-shutdown.html

http://ebergen.net/wordpress/2012/09/29/shutting-down-with-mysqld-mysqladmin-sigterm-or-sigkill/

http://www.xaprb.com/blog/2012/04/24/the-mysql-init-script-mess/

http://www.dbafree.net/?p=870

分享到:
评论

相关推荐

    1 MYSQL视频教程_什么是MYSQL及MYSQL的启动与关闭几种方式,通过命令行客户端操作MYSQL

    1 MYSQL视频教程_什么是MYSQL及MYSQL的启动与关闭几种方式,通过命令行客户端操作MYSQL

    javaee mysql空闲关闭

    为了解决这个问题,有几种策略可以采用: 1. **调整MySQL的`wait_timeout`设置**:增加`wait_timeout`的值,使得连接在更长的时间内保持活跃。但是,这可能导致服务器资源的浪费,因此需要权衡资源利用和稳定性。 ...

    linux下mysql数据库的安装方法

    本文将详细介绍几种在Linux操作系统上安装MySQL的具体操作方法,并提供相关的注意事项和配置建议。无论您是初学者还是有一定经验的系统管理员,都能从中获得有价值的信息。 #### 二、安装MySQL的方法 在Linux环境...

    phh链接mysql数据库的比较常用的几种方法

    PDO是一种数据库访问层,提供了一种统一的方式来连接和操作多种数据库,包括MySQL。使用PDO,我们可以通过DSN(数据源名称)来指定数据库类型和连接信息,然后创建一个`PDO`对象。例如,连接MySQL的DSN是`'mysql:...

    无法远程访问Mysql的解决方案

    Mysql 是一种关系型数据库管理系统,广泛应用于各种 web 应用程序中。然而,在实际应用中,我们常常会遇到无法远程访问 Mysql 的问题,这是由于 Mysql 的安全机制所致。下面我们将详细介绍无法远程访问 Mysql 的解决...

    mysql8.0审计插件Mcafee安装详解

    由于 MySQL 社区版本没有官方的审计插件,因此只能选择 MariaDB 的审计插件和 Mcafee。鉴于 MariaDB 的审计插件不支持 MySQL 8,故选择 Mcafee。 在安装 Mcafee 之前,需要先关闭 SELinux( docker 中不需要关闭 ...

    几种常用数据库的连接 mysql sql server oracle

    本文将详细介绍如何连接到几种常见的数据库系统:SQL Server 2000、Oracle、Sybase 和 MySQL。 1. **连接 SQL Server 2000**: SQL Server 2000的连接通常使用`com.microsoft.jdbc.sqlserver.SQLServerDriver`驱动...

    用PHP3访问MySQL数据库的几种方法.pdf

    PHP3访问MySQL数据库主要有以下几种方法: 1. **MySQL Connect函数**: `mysql_connect(host, username, password)` 这个函数用于建立与MySQL服务器的连接。`host`是MySQL服务器的地址,`username`是登录用户名,...

    mysql驱动jar 文件适用MySQL5.7

    MySQL JDBC驱动主要有以下几部分组成: 1. **com.mysql.jdbc.Driver**: 这是实际的JDBC驱动类,需要在程序中注册到Java的DriverManager中,以便创建到MySQL服务器的连接。 2. **Connection**: 表示到MySQL服务器的...

    Linux平台MySQL启动关闭方式总结

    本文将总结几种常用的方法,并重点讨论使用`mysqld`守护进程启动和关闭MySQL服务的方式。以下是对这些方法的详细说明: 1. 使用`mysqld`启动和关闭MySQL服务: `mysqld`是MySQL服务器的主要组件,负责处理大部分...

    MySQL中常见的几种日志

    6. **一般查询日志(General Log)**:记录所有客户端发出的查询,包括成功和失败的,对于监控和调试很有帮助,但在生产环境中通常关闭,因为它会产生大量日志,影响性能。 关于binlog的管理,可以使用以下命令: -...

    mysql-connector-java Linux下MySQL的JDBC驱动Jar包

    这可以通过以下几种方式实现: - 将jar文件复制到JRE的lib/ext目录下。 - 在运行Java应用时使用-cp或-classpath选项指定jar文件的位置。 - 如果是在IDE如Eclipse或IntelliJ IDEA中,可以在项目设置中添加外部JAR...

    MySQL DBA架构师学习笔记

    此外,关闭MySQL时推荐使用mysqladmin shutdown命令,这是一个专门用于管理MySQL数据库服务器的工具。 3. MySQL配置文件:MySQL的配置文件通常位于/etc/***f或/etc/mysql/***f(不同的Linux发行版可能有所不同)。...

    连接mysql5.5的jar包和连接java文件.zip

    这可以通过以下几种方式实现: 1. 将jar文件放在项目的`lib`目录下,并在IDE(如Eclipse或IntelliJ IDEA)中将其加入到构建路径。 2. 在`pom.xml`(如果你使用的是Maven项目)中添加依赖: ```xml <groupId>...

    mysql8的驱动jar包

    将这个jar文件添加到Java项目的类路径(classpath)中,有几种常见的方式: 1. **IDE集成**:如果你使用的是Eclipse、IntelliJ IDEA等集成开发环境,可以通过"构建路径"或"库"设置将其添加到项目中。 2. **命令行...

    linux下启动mysql服务

    可以尝试以下几种命令: - 使用 `mysql` 命令登录数据库: ```bash /usr/local/mysql/bin/mysql -u root -p ``` - 使用 `mysqld` 后台运行: ```bash /usr/local/mysql/bin/mysqld --user=mysql & /usr/...

    mysql绿色版3306

    执行这些文件可以启动或关闭MySQL服务。 3. **安全设置**:尽管绿色版MySQL简化了安装流程,但安全性同样重要。默认情况下,MySQL可能没有设置强密码,建议在首次启动后立即更改root用户的默认密码。 4. **端口...

    mysql-connector-java-8.0.13.jar mysql数据库驱动下载

    这可以通过以下几种方式实现: 1. **Eclipse/IntelliJ IDEA等IDE**: 在项目构建路径设置中,将该jar文件添加到"库"或"构建路径"。 2. **命令行编译**: 使用`javac`编译时,通过`-cp`或`-classpath`参数指定包含此...

Global site tag (gtag.js) - Google Analytics