iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >生产数据库意外重启的分析
  • 550
分享到

生产数据库意外重启的分析

2024-04-02 19:04:59 550人浏览 独家记忆
摘要

本篇内容介绍了“生产数据库意外重启的分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!排查先交代一下数据库

本篇内容介绍了“生产数据库意外重启的分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

排查

先交代一下数据库版本:

Mysql> status
--------------
mysql  Ver 14.14 Distrib 5.7.22-22, for linux (x86_64) using  6.2

Connection id:          59568
Current database:
Current user:           root@localhost
SSL:                    Not in use
Current pager:          stdout
Using outfile:          ''
Using delimiter:        ;
Server version:         5.7.22-22-log Percona Server (GPL), Release 22, Revision f62d93c
Protocol version:       10

崩溃故障排除绝不是一项有趣的任务,特别是如果Mysql没有报告崩溃的原因。例如,当MySQL内存不足时。

数据库邮件告警提醒发来的消息:

Type: mysql
Tags: 生产主库
Host: 172.16.1.66:3306
Level: critical
Item: connect
Value: down
Message: mysql server down

登录 Grafana 监控面板,数据库连接在哪个时间段曾有幅度的增长。

生产数据库意外重启的分析

顺手检查一下之前的服务器邮件监控告警记录,上一个时间点,内存占用率99%,这说明了数据库连接的幅度增长,可能是压垮服务器的最后一根稻草。

其实导致OOM的直接原因并不复杂,就是因为服务器内存不足,内核需要回收内存,回收内存就是kill掉服务器上使用内存最多的程序,而MySQL服务可能就是使用内存最多,所以就OOM了。

Type: os
Tags: 66数据库
Host: 172.16.1.66:
Level: critical
Item: memory
Value: 99%
Message: too more memory usage
查看系统日志

我们带着这个疑问来排查一下日志

# 查看日志
tail -500f  /var/log/messages
# 以下是 oom-killer
Nov 27 14:55:48 itstyledb1 kernel: mysqld invoked oom-killer: gfp_mask=0x201da, order=0, oom_score_adj=0
Nov 27 14:55:48 itstyledb1 kernel: mysqld cpuset=/ mems_allowed=0-1
Nov 27 14:55:48 itstyledb1 kernel: CPU: 2 PID: 895 Comm: mysqld Kdump: loaded Not tainted 3.10.0-862.3.2.el7.x86_64 #1
Nov 27 14:55:48 itstyledb1 kernel: Hardware name: Huawei RH1288 V3/BC11HGSC0, BiOS 3.22 05/16/2016

小伙伴们继续往下看:

0 pages HighMem/MovableOnly
Nov 27 14:55:48 itstyledb1 kernel: 291281 pages reserved
Nov 27 14:55:48 itstyledb1 kernel: [ pid ]   uid  tgid total_vm      rss nr_ptes swapents oom_score_adj name
Nov 27 14:55:48 itstyledb1 kernel: [  468]     0   468    28271     4326      62       55             0 systemd-journal
Nov 27 14:55:48 itstyledb1 kernel: [  490]     0   490    11492        2      24      553         -1000 systemd-udevd
Nov 27 14:55:48 itstyledb1 kernel: [  787]     0   787    13877       18      27       96         -1000 auditd
Nov 27 14:55:48 itstyledb1 kernel: [  810]    81   810    14552       81      34       89          -900 dbus-daemon
Nov 27 14:55:48 itstyledb1 kernel: [  815]     0   815    55956        1      60      466             0 abrtd
Nov 27 14:55:48 itstyledb1 kernel: [  816]     0   816    55327        9      64      346             0 abrt-watch-log
Nov 27 14:55:48 itstyledb1 kernel: [  818]     0   818   121607      220      90      495             0 NetworkManager
Nov 27 14:55:48 itstyledb1 kernel: [  822]     0   822     5415       49      16       33             0 irqbalance
Nov 27 14:55:48 itstyledb1 kernel: [  823]   997   823   134634       97      60     1306             0 polkitd
Nov 27 14:55:48 itstyledb1 kernel: [  825]     0   825     6594       42      20       41             0 systemd-logind
Nov 27 14:55:48 itstyledb1 kernel: [  830]     0   830    31578       28      21      139             0 crond
Nov 27 14:55:48 itstyledb1 kernel: [  839]     0   839    27522        2      10       31             0 agetty
Nov 27 14:55:48 itstyledb1 kernel: [ 1142]     0  1142   143454      114      97     2672             0 tuned
Nov 27 14:55:48 itstyledb1 kernel: [ 1144]     0  1144    28203       11      59      246         -1000 sshd
Nov 27 14:55:48 itstyledb1 kernel: [ 1145]     0  1145    97438      694     103      328             0 rsyslogd
Nov 27 14:55:48 itstyledb1 kernel: [ 1369]     0  1369    22526       20      44      256             0 master
Nov 27 14:55:48 itstyledb1 kernel: [ 1371]    89  1371    22596       32      46      251             0 qmgr
Nov 27 14:55:48 itstyledb1 kernel: [ 5140]     0  5140     5102     1617      15      239             0 mysqld_exporter
Nov 27 14:55:48 itstyledb1 kernel: [ 9430]     0  9430    55966      378      62      790             0 snmpd
Nov 27 14:55:48 itstyledb1 kernel: [30320]    27 30320 22951376 13928375   43437  8163662             0 mysqld
Nov 27 14:55:48 itstyledb1 kernel: [  688]    89   688    22552      271      46        0             0 pickup
Nov 27 14:55:48 itstyledb1 kernel: Out of memory: Kill process 30320 (mysqld) score 984 or sacrifice child
Nov 27 14:55:48 itstyledb1 kernel: Killed process 30320 (mysqld) total-vm:91805504kB, anon-rss:55713500kB, file-rss:0kB, shmem-rss:0kB
Nov 27 14:56:00 itstyledb1 systemd: mysqld.service: main process exited, code=killed, status=9/KILL
Nov 27 14:56:00 itstyledb1 systemd: Unit mysqld.service entered failed state.
Nov 27 14:56:00 itstyledb1 systemd: mysqld.service failed.
Nov 27 14:56:00 itstyledb1 systemd: mysqld.service holdoff time over, scheduling restart.
Nov 27 14:56:01 itstyledb1 systemd: Starting MySQL Server...

当out of memory发生时,outofmemory函数会选择一个内核认为犯有分配过多内存 “罪行”的进程,并杀死该进程。显然 Mysql 就是哪个“罪人”。

随后 MySql 会自动重启。重启以后,内存是下来了,但是临近下班的时候,差不多又又又占满了。

[root@itstyledb1 ~]# free -m
              total        used        free      shared  buff/cache   available
Mem:          55803       54976         241          10         585         349
Swap:         32064       25036        7028

找到MySql进程,执行以下top -p pid,内存使用52.4g

PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND
935 mysql     20   0   79.7g  52.4g   7336 S   0.3 96.1 255:44.76 mysqld
计算内存使用

1)查看MySQL全局占用多少内存

SELECT (@@innodb_buffer_pool_size
+@@innodb_log_buffer_size
+@@key_buffer_size) / 1024 /1024 AS MEMORY_MB;

查询结果为:

+----------------+
| MEMORY_MB      |
+----------------+
| 20512.00000000 |
+----------------+

2)查看perfORMance_schema占用多少内存

SELECT SUBSTRING_INDEX(event_name,'/',2) AS
       code_area, sys.format_bytes(SUM(current_alloc))
       AS current_alloc
       FROM sys.x$memory_global_by_current_bytes
       GROUP BY SUBSTRING_INDEX(event_name,'/',2)
       ORDER BY SUM(current_alloc) DESC;

查询结果为:

+---------------------------+---------------+
| code_area                 | current_alloc |
+---------------------------+---------------+
| memory/performance_schema | 349.80 MiB    |
+---------------------------+---------------+

3)查看每个线程占用多少内存

SELECT ( ( @@read_buffer_size
+ @@read_rnd_buffer_size
+ @@sort_buffer_size
+ @@join_buffer_size
+ @@binlog_cache_size
+ @@thread_stack
+ @@max_allowed_packet
+ @@net_buffer_length )
) / (1024*1024) AS MEMORY_MB;

查询结果为:

+-----------+
| MEMORY_MB |
+-----------+
|   87.5156 |
+-----------+

查看当前线程

show full processlist

最终结果为:

+-----------+
| MEMORY_MB |
+-----------+
| 87.5156*37|
+-----------+

4)查看 memory 存储引擎占用多少内存

SELECT SUM(max_data_length)/1024/1024 AS MEMORY_MB FROM information_schema.tables WHERE ENGINE='memory';

查询结果为:

+---------------+
| MEMORY_MB     |
+---------------+
| 3857.37713909 |
+---------------+

以上四项加起来差不多也就27975MB,差不错28G的样子,但是 MySql 进程显示占用了52.4G,那么剩下24.4G去哪了?

线程池

线程池非彼连接池,其实两者是有很大区别的,连接池一般在客户端设置,而线程池是在DB服务器上配置;另外连接池可以取到避免了连接频繁创建和销毁,但是无法取到控制MySQL活动线程数的目标,在高并发场景下,无法取到保护DB的作用。比较好的方式是将连接池和线程池结合起来使用。

关于线程池的一些参数:

mysql> show variables like 'thread%';
+-------------------------------+---------------------------+
| Variable_name                 | Value                     |
+-------------------------------+---------------------------+
| thread_handling               | one-thread-per-connection |
| thread_pool_high_prio_mode    | transactions              |
| thread_pool_high_prio_tickets | 4294967295                |
| thread_pool_idle_timeout      | 60                        |
| thread_pool_max_threads       | 100000                    |
| thread_pool_oversubscribe     | 3                         |
| thread_pool_size              | 12                        |
| thread_pool_stall_limit       | 500                       |
+-------------------------------+---------------------------+
thread_handling:

该参数是配置线程模型,默认情况是one-thread-per-connection,也就是不启用线程池。将该参数设置为pool-of-threads即启用了线程池。

threadpoolsize:

该参数是设置线程池的Group的数量,默认为系统CPU的个数,充分利用CPU资源。

threadpooloversubscribe:

该参数设置group中的最大线程数,每个group的最大线程数为threadpooloversubscribe+1,注意listener线程不包含在内。

threadpoolhighpriomode:

高优先级队列的控制参数,有三个值(transactions/statements/none),默认是transactions,三个值的含义如下:

  • transactions:对于已经启动事务的语句放到高优先级队列中,不过还取决于后面的threadpoolhighpriotickets参数

  • statements:这个模式所有的语句都会放到高优先级队列中,不会使用到低优先级队列

  • none:这个模式不使用高优先级队列

threadpoolhighpriotickets:

该参数控制每个连接最多语序多少次被放入高优先级队列中,默认为4294967295,注意这个参数只有在threadpoolhighpriomode为transactions的时候才有效果。

threadpoolidle_timeout:

worker线程最大空闲时间,默认为60秒,超过限制后会退出。

threadpoolmax_threads:

该参数用来限制线程池最大的线程数,超过该限制后将无法再创建更多的线程,默认为100000。

threadpoolstall_limit:

该参数设置timer线程的检测group是否异常的时间间隔,默认为500ms。

最终配置如下:

#thread pool
thread_handling=pool-of-threads
#Group的数量,默认为系统CPU的个数,充分利用CPU资源
thread_pool_size=24
#每个group的最大线程数为thread_pool_oversubscribe+1
thread_pool_oversubscribe=3
performance_schema=off
#extra connection,防止线程池满的情况下无法登录MySQL
extra_max_connections = 8
extra_port = 33333

备注:线程池在Percona,MariaDB,oracle MySQL企业版中提供,Oracle MySQL社区版并不提供。

线程池貌似并不会直接导致内存不回收,网上有说同时开启Thread pool和PS会出现内存泄露,但是 目前Percona server 5.7.21-20+版本已经修复了这个问题,显然是不存在的。

慢查询

由于是生产环境,这个问题拖得时间有点长,那么慢查询会不会影响内存使用问题呢?带着这个问题,查看了慢查询后台列表,在数据库奔溃的前一个时间段,的确有不少慢查询语句。但是这并不能在一定程度上说明问题,由于服务器的 MySql 服务在杀死之前,内存已经见底,此时连接数并不多,也就三四十来个左右,大多处于休眠状态,并且此时已经占用了大部分的Swap空间。也就是说,在资源有限的情况下必定会出现不少慢查询语句。

“生产数据库意外重启的分析”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 生产数据库意外重启的分析

本文链接: https://www.lsjlt.com/news/64473.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 生产数据库意外重启的分析
    本篇内容介绍了“生产数据库意外重启的分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!排查先交代一下数据库...
    99+
    2024-04-02
  • RAC数据库重启的示例分析
    这篇文章将为大家详细讲解有关RAC数据库重启的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1)su - grid --进入用户2)lsnrctl stop --...
    99+
    2024-04-02
  • 如何进行生产数据库性能优化的分析
    这期内容当中小编将会给大家带来有关如何进行生产数据库性能优化的分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。需求:在钉钉群个人简介页面需要显示钉钉群名称和简介,每个群...
    99+
    2024-04-02
  • oracle 数据库启动阶段分析
    Oracle Server主要由两部分组成:Instance 和Database 。Instance 是指一组后台进程/线程和一块共享内存区域,而 Database是指存储在磁盘上的一组物理文件。本文由数据...
    99+
    2024-04-02
  • 数据库死锁是如何产生的
    这篇文章主要介绍了数据库死锁是如何产生的,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。死锁(Deadlock)所谓死锁:是指两个或两个以上的进程...
    99+
    2024-04-02
  • 阿里云的云原生数据库分析
    简介 阿里云的云原生数据库是一种基于云计算技术的数据库服务,它提供了高性能、高可用性和可扩展性的数据库解决方案。本文将对阿里云的云原生数据库进行分析,探讨其特点、优势以及应用场景。云原生数据库的特点1. 高性能阿里云的云原生数据库采用了分布...
    99+
    2024-01-31
    阿里 数据库
  • 数据库中ORACLE的启动验证分析
    本篇内容介绍了“数据库中ORACLE的启动验证分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!orade...
    99+
    2024-04-02
  • 生产库MySQL配置文件my.cnf的示例分析
    这篇文章主要介绍了生产库MySQL配置文件my.cnf的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。 ...
    99+
    2024-04-02
  • oracle数据库是哪个国家生产的
    oracle 数据库是由美国公司 oracle corporation 生产的,它是一款用于存储、管理和访问数据的关系型数据库管理系统(rdbms)。 Oracle 数据库的生产国 O...
    99+
    2024-04-19
    oracle
  • 外键在MySQL数据库中的重要性和实践意义
    外键在MySQL数据库中的重要性和实践意义 在MySQL数据库中,外键(Foreign Key)是一种用来建立不同表之间关联关系的重要约束。外键约束确保了表与表之间的数据一致性和完整性...
    99+
    2024-03-15
    数据 mysql 外键 sql优化
  • Uber用Go重写Schemaless数据库的分片层分析
    本篇内容介绍了“Uber用Go重写Schemaless数据库的分片层分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能...
    99+
    2024-04-02
  • Oracle数据库产重启服务和监听程序怎么实现
    这篇文章主要介绍“Oracle数据库产重启服务和监听程序怎么实现”,在日常操作中,相信很多人在Oracle数据库产重启服务和监听程序怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Oracle数据库产重...
    99+
    2023-06-22
  • Oracle数据库产重启服务和监听程序命令介绍
    目录前言一、重启Oracle数据库总结前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、重启Oracle数据库 如果数据库服务启着呢,停掉。!!!! root 用户登录服务器...
    99+
    2024-04-02
  • 阿里云数据库市场排名及产品分析
    阿里云数据库市场排名一直是云计算领域的关注焦点。本文将对阿里云数据库市场排名进行详细分析,同时介绍其主要产品特点和优势。 一、阿里云数据库市场排名根据最新的市场研究报告,阿里云数据库市场排名稳居全球前列。在全球数据库市场份额中,阿里云数据库...
    99+
    2023-11-01
    阿里 数据库 市场
  • 阿里云数据库形态分析从传统数据库到云原生数据库的演进
    阿里云数据库形态分析是一篇深入研究阿里云数据库发展历程的文章。本文将从传统数据库到云原生数据库的演变历程进行分析,旨在帮助读者理解阿里云数据库的发展趋势和未来可能的发展方向。 阿里云数据库形态分析:从传统数据库到云原生数据库的演进随着云计算...
    99+
    2023-10-31
    数据库 阿里 形态
  • 数据库重生:数据清洗的奇迹疗法
    数据是现代企业不可或缺的资产,但数据质量问题却成为阻碍其价值释放的主要障碍之一。数据清洗,作为一种修复和恢复数据完整性、一致性和准确性的过程,正逐渐成为企业提升数据质量的必备良药。 数据清洗的必要性 数据清洗之所以如此重要,是因为低质量数...
    99+
    2024-04-02
  • 数据库根据指定字段去重的案例分析
    这篇文章主要介绍了数据库根据指定字段去重的案例分析,具有一定借鉴价值,需要的朋友可以参考下。希望大家阅读完这篇文章后大有收获。下面让小编带着大家一起了解一下。需求:对一张用户表根据name/email/ca...
    99+
    2024-04-02
  • 配置操作系统重启后Oracle数据库和监听自动启动的示例分析
    小编给大家分享一下配置操作系统重启后Oracle数据库和监听自动启动的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧! --配置操作系统重启后,实例自动启...
    99+
    2024-04-02
  • Oracle数据库中索引重复情况分析
    Oracle数据库中索引重复情况分析 索引在数据库中起着至关重要的作用,它可以提高查询的效率,加快数据检索的速度。然而,在实际应用中,有时候会出现索引重复的情况,这会影响到数据库的性能...
    99+
    2024-03-07
    oracle 重复检测 索引分析
  • rowcount函数在数据操作中的意义与重要性分析
    解析rowcount函数在数据操作中的重要性在进行数据库操作时,rowcount函数是一个非常重要的函数之一。它用于返回最近一次执行的SQL语句所影响的行数。无论是插入、更新还是删除数据,rowcount函数可以提供关键的信息,帮助我们确认...
    99+
    2023-12-29
    更新(update) 比如插入
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作