• 释放innodb空间


    记一次MySQL运维

    [root@b2btest ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:          125G       124G       780M        13M        28K       238M
    -/+ buffers/cache:       124G       1.0G
    Swap:          30G       7.5G        22G

    分析现象;

    首先,可以看到,free部分已经严重不足,swap被大量启用。

    而另一方面,cached部分的数据量非常低,而几乎所有的内存资源都被-/+ buffers/cache部分used,

    初步分析:

    buffer pool的设置过高,所有的数据都默认存储进了buffer pool中。在我的另一篇文章中,介绍了上面各个参数的含义,第一行的buffer指的是未被使用的量。

    这导致了两个问题;

    一个是内存资源被大量占用,free部分严重不足。

    另一个是缓存区没有得到使用,因为所有数据都优先导入了buffer pool中。

    因为缓存区没有被使用,所以即使内存的free部分已经不够用了,系统缓存也无法自动释放空间。

    当这个矛盾产生后,系统就开始启用swap分区。

    解决思路:

    将数据,从buffer pool与swap里,全部挤压出来到cached中。再将 cached中的数据释放到磁盘内。使得内存中的空间得到释放。

    先找到占用的具体进程

    top - 11:35:12 up 343 days, 14:36,  4 users,  load average: 2.67, 2.04, 1.97
    Tasks: 573 total,   1 running, 572 sleeping,   0 stopped,   0 zombie
    %Cpu(s): 10.2 us,  0.6 sy,  0.0 ni, 89.2 id,  0.0 wa,  0.0 hi,  0.1 si,  0.0 st
    KiB Mem:  13178910+total, 13094849+used,   840604 free,       28 buffers
    KiB Swap: 31743996 total,  7844364 used, 23899632 free.   244900 cached Mem
    
       PID USER      PR  NI    VIRT    RES    SHR S  %CPU %MEM     TIME+ COMMAND                                                    
    110214 mysql     20   0  0.130t 0.117t   6940 S 129.1 95.3  58010:03 mysqld  

    这是台mysql专用服务器,系统资源全部被MySQL占用,要释放内存,就业从MySQL内部解决;

    mysql> show engines;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES    

    默认存储引擎为innodb,

    mysql> show engine innodb status;
    截取以下段落
    ----------------------
    BUFFER POOL AND MEMORY
    ----------------------
    Total large memory allocated 120937512960
    Dictionary memory allocated 33079802
    Buffer pool size   7208520
    Free buffers       8193
    Database pages     7199249
    Old database pages 2657374

    找到原因。开始处理

    mysql>  show variables like "%innodb_buffer_pool%";
    
    截取以下参数
    +-------------------------------------+----------------+
    | Variable_name                       | Value          |
    +-------------------------------------+----------------+
    | innodb_buffer_pool_chunk_size       | 134217728      |
    | innodb_buffer_pool_instances        | 8              |
    | innodb_buffer_pool_size             | 118111600640   |
    +-------------------------------------+----------------+
    10 rows in set (0.00 sec)
    
    mysql> select 118111600640-134217728*8*50;
    计划释放50倍的数据块
    +-----------------------------+
    | 118111600640-134217728*8*50 |
    +-----------------------------+
    |                 64424509440 |
    +-----------------------------+
    1 row in set (0.00 sec)
    
    
    mysql>  SET GLOBAL innodb_buffer_pool_size=64424509440;
    Query OK, 0 rows affected (0.00 sec)
    将112G的内存降低至60G

    之后查看下系统内存。free -h。确认下修改是否生效

    [root@b2btest ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:          125G       124G       839M        15M        40K        47G
    -/+ buffers/cache:        77G        48G
    Swap:          30G       7.4G        22G

    从这里已经可以看到,可用缓存空间已经增加了50G左右,接下来释放SWAP文件

    [root@b2btest ~]# swapoff -a

    7.5G的swap文件,释放需要5个小时!!,从这里也可以明显体会到swap文件系统运行的缓慢。

    [root@b2btest ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:          125G       124G       742M       459M        60K        41G
    -/+ buffers/cache:        83G        41G
    Swap:           0B         0B         0B

    现在所有的数据,都已经被转移到cached中,接下来,释放缓存。

    [root@b2btest ~]# sync
    [root@b2btest ~]# echo 1 > /proc/sys/vm/drop_caches
    [root@b2btest ~]# free -h
                 total       used       free     shared    buffers     cached
    Mem:          125G        83G        42G       459M         0B        42M
    -/+ buffers/cache:        83G        42G
    Swap:           0B         0B         0B

    从缓存区释放40G数据,用时10秒左右。

    [root@b2btest ~]# swapon -a
    [root@b2btest ~]# swapon -s
    文件名                         类型            大小             已用    权限
    /dev/sda3                     partition       31743996         0       -1

    重启swap分区。

    在数据库保持正常运行的情况下,系统资源释放结束。

  • 相关阅读:
    mysql两种重要的引擎
    mysql常用代码
    ubuntu常用基本命令
    redis缓存服务器
    memcached缓存服务器
    glusterfs分布式文件服务器
    keepalived双机热备(nginx+mysql)
    nginx负载均衡mysql数据库
    heartbeat双机热备(haproxy或glbd+mysql)
    haproxy负载均衡mysql
  • 原文地址:https://www.cnblogs.com/shc336/p/10070081.html
Copyright © 2020-2023  润新知