`

关闭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

    后盾网MYSQL系列视频教程

    教程名称:后盾网MYSQL系列视频教程课程目录:【】1__什么是MYSQL及MYSQL的启动与关闭几种方式【】2 创建数据库与表_操作外部SQL文件【】3_后盾网MYSQL视频教程_数据类型定义与选择一(1)【】4_MYSQL视频教程_SELECT...

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

    MySQL的启动方法有很多种,下面对比、总结这几种方法的一些差异和特性,下面实验的版本为MySQL 5.6。如有疏漏或不足,敬请指点一二。  1:使用mysqld启动、关闭MySQL服务  mysqld是MySQL的守护进程,我们可以用...

    mysql数据库my.cnf配置文件

    #MySQL的查询缓冲大小(从4.0.1开始,MySQL提供了查询缓冲机制)使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中, # 今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户...

    MySQL管理之道 性能调优、高可用与监控.part2.rar

    以最新的mysql版本为基础,以构建高性能mysql服务器为核心,从故障诊断、表设计、sql优化、性能参数调优、mydumper逻辑、xtrabackup热备份与恢复、mysql高可用集群搭建与管理、mysql服务器性能和服务监控等方面多...

    MySQL命令大全

    SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录。 Drop: 删除数据表或数据库。 INDEX: ...

    MYSQL常用命令大全

    SHUTDOWN: 关闭MySQL服务。 数据库/数据表/数据列权限: Alter: 修改已存在的数据表(例如增加/删除列)和索引。 Create: 建立新的数据库或数据表。 Delete: 删除表的记录。 Drop: 删除数据表或数据库。 INDEX: 建立或...

    mysql数据库的基本操作语法

    但是MySQL可以通过多个modify的方式完成: alter table user modify tel varchar(15) default '02087654321' first, modify name varchar(20) after tel; 11、 删除指定字段 alter table user drop photo; 12、 ...

    MySQLDBA运维笔记.pdf

    属主和用户组为 mysql 或 root......................................................................................21 1.3.4 删除默认存在的 test 库 .........................................................

    Mysql忘记密码的几种解决方案

    卸载完全,删除所有数据,先关闭跟MySql所有有关的进程,进入命令行(cmd)中输入taskkill /f /im mysqld-nt.exe 然后找到MySql的根目录删除即可 解决办法2 在命令行里面输出密码或者更更改密码 .在命令行运行:...

    MySQL备份原理详解

    这篇文章主要讨论MySQL的备份方案,重点介绍几种备份方式的原理,包括文件系统快照(LVM),逻辑备份工具Mysqldump,Mydumper,以及物理备份工具Xtrabackup,同时会详细讲解几种方案的优缺点,以及可能遇到的问题。...

    MySQL日志设置及查看方法

    MySQL有以下几种日志: 错误日志: -log-err 查询日志: -log 慢查询日志: -log-slow-queries 更新日志: -log-update 二进制日志: -log-bin 默认情况下,所有日志创建于mysqld数据目录中。通过刷新日志,你可以强制...

    基于Java-Web平台的科研管理系统设计.doc

    4 Java Web实现方式的研究和选择 使用Java Web进行网站开发,可以有几种难度的框架层次可供选择。 (1)简单的JSP网页设计实现。 在开发动态部分时,直接使用简单的JSP方式开发,所有内容直接写到.jsp文件中,输 入输出...

    PHP程序员玩转Linux系列 备份还原MySQL

    前几天有个新闻,说是gitlab的工程师把数据文件给误删了,搞了个大事件,很多人都去围观了.备份工作应该在最开始的时候就要做,否则就会失去...首先第一件事是打开binlog日志,编辑mysql配置文件开启一下,默认是关闭的.编

    集群好书《高性能Linux服务器构建实战》 试读章节下载

    10.5 几种典型应用对系统资源使用的特点 10.5.1 以静态内容为主的Web应用 10.5.2 以动态内容为主的Web应用 10.5.3 数据库应用 10.5.4 软件下载应用 10.5.5 流媒体服务应用 10.6 Linux下常见的性能分析...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    系统设置项分成几大类:[基本设置]、[网站信息]、[安全设置]、[用户选项设置]、[邮件选项设置]、[注册选项设置]、[系统选项设置]、[上传选项设置]、[验证码设置]、[官方通讯设置]、[服务升级设置]、[支持接口设置] ...

    php网络开发完全手册

    1.5 几种综合网络服务器系统的安装 14 1.5.1 XAMPP 14 1.5.2 WAMP 16 1.5.3 Appserv 17 1.5.4 EasyPHP 18 1.5.5 VertrigoServ 19 1.6 几种开发工具的介绍 20 1.6.1 Vi及Vim 20 1.6.2 Eclipse+PHPEclipse插件 21 ...

    400个DreamWeaver插件

    mxp/打开一个Web对话框窗口,也是很特别的一种,没有最大和最小化按钮 mxp/使一个多行的表格行和行之间颜色交替,像斑马线一样。2.0版本 mxp/可以倒出-倒入站点信息,方便其他开发者 mxp/插入e-Vue MPEG-4格式的文件...

    weenBizz闻名在线客服系统 v2.2.0 简体中英文UTF-8.rar

    5. GB2312和UTF8两种版本, 方便用户在不同编码格式的网页中调用; 6. 客服人员分组管理, 无限制添加客服人员; 7. 新信息窗口闪动, 信息提示声音, 颜色, 表情符号等; 8. 使用简单, 操作方便, 占用系统资源少, 交互...

    weenBizz闻名在线客服系统 v2.2.0 简体中英文GBK.rar

    5. GB2312和UTF8两种版本, 方便用户在不同编码格式的网页中调用; 6. 客服人员分组管理, 无限制添加客服人员; 7. 新信息窗口闪动, 信息提示声音, 颜色, 表情符号等; 8. 使用简单, 操作方便, 占用系统资源少, 交互...

Global site tag (gtag.js) - Google Analytics