如何安全地关闭MySQL

在关闭mysql server的时候,可能会由于关闭的方式而出现各种问题。下面的一些步骤,可以减少问题的发生。

1.停止复制

在一些特殊环境下,slave节点可能会尝试从错误的位置(position)进行启动。为了减少这种风险,要先停止io thread,从而不接收新的事件信息。

mysql> stop slave io_thread;

等sql thread应用完所有的events之后,也将sql thread停掉。

mysql> show slave status\G
mysql> stop slave sql_thread;

这样io thread和sql thread就可以处于一致性位置,这样relay log就只是包含被执行过的events,relay_log_info_repository中的位置信息也是最新的。

对于开启了多线程复制的slave,确保在关闭复制之前,已经填充了gaps

mysql> stop slave;
mysql> start slave until sql_after_mts_gaps; #应用完relay log中的gap
mysql> show slave status\G #要确保在之前已经停掉了sql_thread
mysql> stop slave ;

2.提交、回滚或kill长时间运行的事务

1分钟内可以发生很多事,在关闭时,innodb必须回滚未提交的事务。事务回滚的代价是非常昂贵的,可能会花费很长时间。任何事务回滚都可能意味着数据丢失,因此理想情况下关闭时没有打开任何事务。

如果关闭的是读写的数据库,写操作应该提前路由到其他节点。如果必须关闭还在接收事务的数据库,下面的查询会输出运行时间大于60秒的会话信息。根据这些信息再决定下一步:

mysql> SELECT trx_id, trx_started, (NOW() - trx_started) trx_duration_seconds, id processlist_id, user, IF(LEFT(HOST, (LOCATE(':', host) - 1)) = '', host, LEFT(HOST, (LOCATE(':', host) - 1))) host, command, time, REPLACE(SUBSTRING(info,1,25),'\n','') info_25 FROM information_schema.innodb_trx JOIN information_schema.processlist ON innodb_trx.trx_mysql_thread_id = processlist.id WHERE (NOW() - trx_started) > 60 ORDER BY trx_started;
+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
| trx_id | trx_started         | trx_duration_seconds | processlist_id | user | host      | command | time | info_25                   |
+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
| 511239 | 2020-04-22 16:52:23 |                 2754 |           3515 | dba  | localhost | Sleep   | 1101 | NULL                      |
| 511240 | 2020-04-22 16:53:44 |                   74 |           3553 | root | localhost | Query   |   38 | update t1 set name="test" |
+--------+---------------------+----------------------+----------------+------+-----------+---------+------+---------------------------+
2 rows in set (0.00 sec)

3.清空processlist

mysql要断开连接并关闭了。我们可以手动帮助mysql一下。

使用pt-kill查看并杀死活跃和睡眠状态的连接。这时应该不会有新的写连接进来。我们只是处理读的连接。

pt-kill --host="localhost" --victims="all" --interval=10 --ignore-user="pmm|orchestrator" --busy-time=1 --idle-time=1 --print [--kill]

这里可以选择性地排除某些用户建立的连接。

4.配置innodb完成最大刷新(flush)

SET GLOBAL innodb_fast_shutdown=0;
SET GLOBAL innodb_max_dirty_pages_pct=0;
SET GLOBAL innodb_change_buffering='none';

disable掉innodb_fast_shutdown可能会使得关闭过程花费几分钟甚至个把小时,因为需要等待undo log的purge和changebuffer的merge。

为了加速关闭,设置innodb_max_dirty_pages_pct=0并监控下面查询的结果。期望值是0,但并不总是能保证,如果mysql中还有活动的话。那么,查出的结果不再继续变小的话,就可以继续下一步了:

SHOW GLOBAL STATUS LIKE '%dirty%';

如果使用了pmm监控,可以查看“innodb change buffer”的图示。

5.转储buffer pool中的内容

SET GLOBAL innodb_buffer_pool_dump_pct=75;
SET GLOBAL innodb_buffer_pool_dump_now=ON;
mysql> SHOW STATUS LIKE 'Innodb_buffer_pool_dump_status';
+--------------------------------+--------------------------------------------------+
| Variable_name                  | Value                                            |
+--------------------------------+--------------------------------------------------+
| Innodb_buffer_pool_dump_status | Buffer pool(s) dump completed at 200429 14:04:47 |
+--------------------------------+--------------------------------------------------+
1 row in set (0.01 sec)

启动的时候,要想加载转储出的内容,要检查一下参数innodb_buffer_pool_load_at_startup的配置。

6.刷日志

FLUSH LOGS;

现在,就可以关闭mysql了。

大多时候,我们只是执行stop命令,MySQL关闭并重启都是很正常的。偶尔也会遇到一些问题。

以上就是如何安全地关闭MySQL的详细内容,更多关于安全关闭MySQL的资料请关注我们其它相关文章!

(0)

相关推荐

  • lnmp关闭mysql日志保护硬盘空间的方法

    下面先来分享一下,关闭mysql日志的方法 LNMP一键包安装的Mysql默认开启Mysql日志,如果网站对数据库读写较为频繁的话可能会产生大量日志,并占用磁盘空间,还有可能导致VPS的硬盘闲置空间消耗满导致数据库无法开启. 本教程的路径适用于LNMP一键安装包环境,其它环境请根据实际情况操作. 若需要关闭,请执行以下操作: 一.修改文件配置 修改/etc/my.cnf,找到以下字符 log-bin=mysql-bin binlog_format=mixedbash 注释这两行,如下: #log

  • MySQL数据库开启、关闭、查看函数功能的方法

    应用 MySQL 时,会遇到不能创建函数的情况.出现如下错误信息: 复制代码 代码如下: ERROR 1418 : This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators varia

  • 如何解决mysql无法关闭的问题

    mysql关闭不了的解决办法: 右键点击电脑的任务栏,打开任务管理器 点击服务,找到mysql服务 右键点击该服务,选择停止就可以了 内容扩展: mac系统mysqld进程无法kill掉的问题 mac安装比linux恶心的太多,权限太受限制 kill -9根本无法杀死mysqld进程,查了好久原来是因为 LaunchDeamons定时任务守护mysqld进程 解决方法: sudo launchctl unload -w /Library/LaunchDaemons/com.oracle.oss.

  • MySQL服务器的启动和关闭

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

  • 怎样安全地关闭MySQL实例

    本文分析了mysqld进程关闭的过程,以及如何安全.缓和地关闭MySQL实例,对这个过程不甚清楚的同学可以参考下. 关闭过程: 1.发起shutdown,发出  SIGTERM信号 2.有必要的话,新建一个关闭线程(shutdown thread) 如果是客户端发起的关闭,则会新建一个专用的关闭线程 如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事 当无法创建独立的关闭线程时(例如内存不足),MySQL Server会发出

  • 如何优雅、安全的关闭MySQL进程

    前言 本文分析了 mysqld 进程关闭的过程,以及如何安全.缓和地关闭 MySQL 实例,对这个过程不甚清楚的同学可以参考下. 关闭过程 1.发起 shutdown,发出 SIGTERM 信号 2.有必要的话,新建一个关闭线程(shutdown thread) 如果是客户端发起的关闭,则会新建一个专用的关闭线程 如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事 当无法创建独立的关闭线程时(例如内存不足),MySQL Se

  • Windows下使用批处理实现启动关闭mysql

    将绿色版的mysql注册成Windows下的服务,或者安装版的mysql的Windows服务均可使用 MySQL.bat cls @echo off :设置窗口字体颜色 color 0a :设置窗口标题 TITLE MySQL管理程序 call :checkAdmin goto menu :菜单 :menu cls echo. echo.=-=-=-=-请选择您要对MySQL的操作-=-=-=-=- echo. echo.1: 启动MySQL echo. echo.2: 关闭MySQL echo

  • MySQL关闭过程详解和安全关闭MySQL的方法

    本文分析了mysqld进程关闭的过程,以及如何安全.缓和地关闭MySQL实例,对这个过程不甚清楚的同学可以参考下. 关闭过程: 1.发起shutdown,发出SIGTERM信号 2.有必要的话,新建一个关闭线程(shutdown thread) 如果是客户端发起的关闭,则会新建一个专用的关闭线程 如果是直接收到 SIGTERM 信号进行关闭的话,专门负责信号处理的线程就会负责关闭工作,或者新建一个独立的线程负责这个事 当无法创建独立的关闭线程时(例如内存不足),MySQL Server会发出类似

  • Mysql的游标的定义使用及关闭深入分析

    Mysql从5.0开始支持存储过程和trigger,给我们喜欢用mysql的朋友们更喜欢mysql的理由了,语法上和PL/SQL有差别,不过搞过编程的人都知道,语法不是问题,关键是思想,大致了解语法后,就从变量定义,循环,判断,游标,异常处理这个几个方面详细学习了.关于游标的用法Mysql现在提供的还很特别,虽然使用起来没有PL/SQL那么顺手,不过使用上大致上还是一样, 定义游标 declare fetchSeqCursor cursor for select seqname, value f

  • 安全地关闭MySQL服务的教程

    普通关闭 我的mysql是自己下载的tar包,自己设定安装目录来安装的. 停止mysql服务,说来简单,但不知道的话,还真是挠头.在这和mysql入门的同学们共享:) 正确方法是,进入mysql的bin目录下,然后执行 ./mysqladmin -uroot -p shutdown 然后输入你的密码就可以了. ps:当然,如果你的root没有密码,就不需要-p选项喽. ps:有人问启动的方法,正确的启动方法是:进入mysql的bin目录,然后nohup ./mysqld_safe &就可以了.

随机推荐