关闭

MySQL优化之——安全地关闭MySQL实例

标签: mysql优化关闭
1228人阅读 评论(0) 收藏 举报
分类:
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/46812371

关闭过程:

  • 1、发起shutdown,发出  SIGTERM信号
  • 2、有必要的话,新建一个关闭线程(shutdown thread)

如果是客户端发起的关闭,则会新建一个专用的关闭线程

如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事

当无法创建独立的关闭线程时(例如内存不足),MySQL Server会发出类似下面的告警信息:

Error: Can’t create thread to kill server

  • 3、MySQL Server不再响应新的连接请求

关闭TCP/IP网络监听,关闭Unix Socket等渠道

  • 4、逐渐关闭当前的连接、事务

空闲连接,将立刻被终止;

当前还有事务、SQL活动的连接,会将其标识为 killed,并定期检查其状态,以便下次检查时将其关闭;(参考 KILL 语法)

当前有活跃事务的,该事物会被回滚,如果该事务中还修改了非事务表,则已经修改的数据无法回滚,可能只会完成部分变更;

如果是Master/Slave复制场景里的Master,则对复制线程的处理过程和普通线程也是一样的;

如果是Master/Slave复制场景里的Slave,则会依次关闭IO、SQL线程,如果这2个线程当前是活跃的,则也会加上 killed 标识,然后再关闭;

Slave服务器上,SQL线程是允许直接停止当前的SQL操作的(为了避免复制问题),然后再关闭该线程;

在MySQl 5.0.80及以前的版本里,如果SQL线程当时正好执行一个事务到中间,该事务会回滚;从5.0.81开始,则会等待所有的操作结束,除非用户发起KILL操作。

当Slave的SQL线程对非事务表执行操作时被强制 KILL了,可能会导致Master、Slave数据不一致;

  • 5、MySQL Server进程关闭所有线程,关闭所有存储引擎;

刷新所有表cache,关闭所有打开的表;

每个存储引擎各自负责相关的关闭操作,例如MyISAM会刷新所有等待写入的操作;InnoDB会将buffer pool刷新到磁盘中(从MySQL 5.0.5开始,如果innodb_fast_shutdown不设置为 2 的话),把当前的LSN记录到表空间中,然后关闭所有的内部线程。

  • 6、MySQL Server进程退出

关于KILL指令

从5.0开始,KILL 支持指定  CONNECTION | QUERY两种可选项:

  • KILL CONNECTION和原来的一样,停止回滚事务,关闭该线程连接,释放相关资源;
  • KILL QUERY则只停止线程当前提交执行的操作,其他的保持不变;

提交KILL操作后,该线程上会设置一个特殊的 kill标记位。通常需要一段时间后才能真正关闭线程,因为kill标记位只在特定的情况下才检查:

  • 1、执行SELECT查询时,在ORDER BY或GROUP BY循环中,每次读完一些行记录块后会检查 kill标记位,如果发现存在,该语句会终止;
  • 2、执行ALTER TABLE时,在从原始表中每读取一些行记录块后会检查 kill 标记位,如果发现存在,该语句会终止,删除临时表;
  • 3、执行UPDATE和DELETE时,每读取一些行记录块并且更新或删除后会检查 kill 标记位,如果发现存在,该语句会终止,回滚事务,若是在非事务表上的操作,则已发生变更的数据不会回滚;
  • 4、GET_LOCK() 函数返回NULL;
  • 5、INSERT DELAY线程会迅速内存中的新增记录,然后终止;
  • 6、如果当前线程持有表级锁,则会释放,并终止;
  • 7、如果线程的写操作调用在等待释放磁盘空间,则会直接抛出“磁盘空间满”错误,然后终止;
  • 8、当MyISAM表在执行REPAIR TABLE 或 OPTIMIZE TABLE 时被 KILL的话,会导致该表损坏不可用,指导再次修复完成。

安全关闭MySQL几点建议

想要安全关闭 mysqld 服务进程,建议按照下面的步骤来进行:

  • 0、用具有SUPER、ALL等最高权限的账号连接MySQL,最好是用 unix socket 方式连接;
  • 1、在5.0及以上版本,设置innodb_fast_shutdown = 1,允许快速关闭InnoDB(不进行full purge、insert buffer merge),如果是为了升级或者降级MySQL版本,则不要设置;
  • 2、设置innodb_max_dirty_pages_pct = 0,让InnoDB把所有脏页都刷新到磁盘中去;
  • 3、设置max_connections和max_user_connections为1,也就最后除了自己当前的连接外,不允许再有新的连接创建;
  • 4、关闭所有不活跃的线程,也就是状态为Sleep  且 Time 大于 1 的线程ID;
  • 5、执行 SHOW PROCESSLIST  确认是否还有活跃的线程,尤其是会产生表锁的线程,例如有大数据集的SELECT,或者大范围的UPDATE,或者执行DDL,都是要特别谨慎的;
  • 6、执行 SHOW ENGINE INNODB STATUS 确认History list length的值较低(一般要低于500),也就是未PURGE的事务很少,并且确认Log sequence number、Log flushed up to、Last checkpoint at三个状态的值一样,也就是所有的LSN都已经做过检查点了;
  • 7、然后执行FLUSH LOCKAL TABLES 操作,刷新所有 table cache,关闭已打开的表(LOCAL的作用是该操作不记录BINLOG);
  • 8、如果是SLAVE服务器,最好是先关闭 IO_THREAD,等待所有RELAY LOG都应用完后,再关闭 SQL_THREAD,避免 SQL_THREAD 在执行大事务被终止,耐心待其全部应用完毕,如果非要强制关闭的话,最好也等待大事务结束后再关闭SQL_THREAD;
  • 9、最后再执行 mysqladmin shutdown。
  • 10、紧急情况下,可以设置innodb_fast_shutdown = 1,然后直接执行 mysqladmin shutdown 即可,甚至直接在操作系统层调用 kill 或者 kill -9 杀掉 mysqld 进程(在innodb_flush_log_at_trx_commit = 0 的时候可能会丢失部分事务),不过mysqld进程再次启动时,会进行CRASH RECOVERY工作,需要有所权衡。

以上说了那么多,其实正常情况下执行 mysqladmin shutdown 就够了,如果发生阻塞,再参考上面的内容进行分析和解决吧。

0
0
查看评论

Linux杀掉MySQL进程(关键词:Linux/MySQL/杀死进程/mysql/mysqld)

1.查看mysql程序对应的进程号使用命令: ps ps -e|grep mysql2.杀死mysql进程使用命令: sudo kill -9 mysql的进程号3.杀死mysqld进程使用命令: sudo killall mysqld4.检查是否还有mysql进程存在使用命令: ps ...
  • qq_33528613
  • qq_33528613
  • 2017-08-31 10:55
  • 2828

mysql使用kill无法杀死进程

在公司一次系统关机后,重启机器,系统启动了自带的mysql进程,想要启动自己所需配置文件的mysql,就要杀掉默认的mysql。 使用kill -9 +pid号,mysql不但没被杀掉,而且换了一个pid号仍然运行, 使用killall mysql或者pkill -9 mysql也是这样。 m...
  • wzqzhq
  • wzqzhq
  • 2017-06-26 10:51
  • 1982

Linux 命令操作开启、停止、重启Mysql数据库的方法

1、查看mysql版本 方法一:status; 方法二:select version(); 2、Mysql启动、停止、重启常用命令 a、启动方式 1、使用 service 启动: [root@localhost /]# service mysqld start (5.0版本是mysqld...
  • G_Arther
  • G_Arther
  • 2016-09-20 14:14
  • 9568

MySQL安全启动

1、停止正在运行的MySQL进程 【Linux】运行 killall -TERM mysqld 2、以安全模式启动MySQL 【Linux】运行 /usr/local/mysql/bin/mysqld_safe –skip-grant-tables & 【Windows】在命令...
  • tian_yan_jing
  • tian_yan_jing
  • 2017-05-18 13:26
  • 972

MySQL数据库基础(一)(启动-停止、登录-退出、语法规范及最基础操作)(持续更新中)

1.启动/停止MySQL服务 启动:net start mysql    停止:net stop mysql 2.MySQL登录/退出 登录:mysql 参数;如果连接的是本地服务器,一般用命令:mysql -uroot-p******(******代表密码) 退...
  • swywkc2i
  • swywkc2i
  • 2017-02-22 12:11
  • 355

MySQL优化之——安全地关闭MySQL实例

关闭过程: 1、发起shutdown,发出  SIGTERM信号2、有必要的话,新建一个关闭线程(shutdown thread) 如果是客户端发起的关闭,则会新建一个专用的关闭线程 如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独...
  • l1028386804
  • l1028386804
  • 2015-07-09 09:26
  • 1228

Mysql性能优化之几个实际优化示例

数据库性能优化的文章铺天盖地,但最重要的是把这些恰当的应用到实际生产环境中,本文以真实的优化案例来详细的介绍Mysql数据库方面的先化技巧,主要的优化技术为:(1)把逐个循环的子查询变为一个查询统计语句,(2)采用异步加载,(3)尽可能减少查询时使用的表数量,本文分别详细描述。
  • cpaqyx
  • cpaqyx
  • 2014-12-06 17:37
  • 2689

mysql优化之参数调优

在MYSQL的优化过程中,我们至少有三种办法,可以达到优化的目的,效率从低到高依次是 替换有问题的硬件。对MYSQL进程的设置进行调优。对查询进行优化。 前面我们讨论过通过索引等技术对查询进行优化,本博文是通过对MYSQL进程的参数设置进行优化,在对参数进行设置的时候,我们主...
  • zmxiangde_88
  • zmxiangde_88
  • 2012-09-08 11:17
  • 972

MySQL

Windows上MySQL是以服务方式启动的。 服务启动方法:计算机->右键->属性->管理->服务和应用程序->服务,在右侧的服务列表中找到MySQL[xx]的服务,右键->属性->启动。
  • I_Surrender
  • I_Surrender
  • 2018-01-13 11:05
  • 68

mysql的多实例multi启动停止

mysql的多实例配置安装  一,什么情况下我们会考虑一台物理服务器上部署多个实例,大致有以下几种情况: 1,采用了数据伪分布式架构的原因,而项目启动初期又不一定有那多的用户量,为此先一组物理数据库服务器,但部署多个实例,方便后续迁移; 2,为规避mysql对SMP架...
  • xiegh2014
  • xiegh2014
  • 2015-08-27 23:45
  • 2345
    个人资料
    • 访问:2131610次
    • 积分:27194
    • 等级:
    • 排名:第246名
    • 原创:819篇
    • 转载:12篇
    • 译文:0篇
    • 评论:316条
    博客专栏
    算法

    文章:1篇

    阅读:239
    Android

    文章:80篇

    阅读:240702
    Python

    文章:50篇

    阅读:37857
    搜索优化

    文章:21篇

    阅读:26723
    Nginx

    文章:17篇

    阅读:57228
    Dubbo

    文章:20篇

    阅读:46150
    JMS

    文章:13篇

    阅读:12252
    Netty

    文章:1篇

    阅读:1933
    Redis

    文章:18篇

    阅读:95761
    Memcached

    文章:9篇

    阅读:47353
    设计模式

    文章:22篇

    阅读:49704
    Mycat

    文章:20篇

    阅读:27601
    Web前端

    文章:22篇

    阅读:85793
    Linux

    文章:77篇

    阅读:232661
    JVM

    文章:15篇

    阅读:52193
    J2EE

    文章:74篇

    阅读:285896
    Java

    文章:153篇

    阅读:528328
    Hadoop生态

    文章:135篇

    阅读:208958
    MySQL

    文章:130篇

    阅读:276328
    最新评论