zoukankan      html  css  js  c++  java
  • 转 zabbix debug and zabbix使用percona插件监控mysql

    ##########

    https://www.cnblogs.com/keithtt/p/8542987.html

    zabbix使用percona插件监控mysql

     

    1、添加percona仓库。

    # yum install -y https://mirrors.tuna.tsinghua.edu.cn/percona/yum/percona-release-latest.noarch.rpm

    2、安装插件。

    # yum -y install percona-zabbix-templates
    # rpm -ql percona-zabbix-templates
    /var/lib/zabbix/percona
    /var/lib/zabbix/percona/scripts
    /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
    /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
    /var/lib/zabbix/percona/templates
    /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf
    /var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml

    3、这个项目是php写的,需要安装php和php-mysql。(这个在官网有说明)

    # yum install -y php php-mysql

    4、拷贝配置文件到配置目录,并重启zabbix-agent。

    # cp -a /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
    # rm -f /etc/zabbix/zabbix_agentd.d/userparameter_mysql.conf
    # service zabbix-agent restart

    5、授权监控用户,使其能获取数据。

    # mysql -uroot -p
    > grant all privileges on *.* to zabbix@localhost identified by 'PASS';
    > flush privileges;
    > quit;

    6、修改程序里面的用户密码,使其能连接到mysql。

    # vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
    $mysql_user = 'zabbix';
    $mysql_pass = 'PASS';

    7、修改监控脚本。脚本里面是直接执行mysql命令获取数据的,但是没有指定用户名和密码,导致连不上数据库。为mysql命令加上用户名密码参数即可。

    # vim /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh
    RES=`HOME=~zabbix mysql -uzabbix -pPASS -e 'SHOW SLAVE STATUSG' 2> /dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr '
    ' ','`

    或者更简单一点,直接添加一个mysql的客户端验证配置。

    # vim ~zabbix/.my.cnf
    [client]
    user = zabbix
    password = PASS

    8、测试脚本是否能获取到数据。

    # /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg
    16
    # /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh jg
    0
    # sudo -u zabbix -H /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh running-slave
    1
    # sudo -u zabbix zabbix_get -s 10.0.1.61 -k 'proc.num[mysqld]'
    1
    # sudo -u zabbix zabbix_get -s 10.0.1.61 -k 'mysql.ping'
    1

    9、导入模板。在这里踩到坑,安装包提供的插件版本是1.1.8,导入过程中报错。经过一番查询,可以使用1.1.6。

    可以从这里下载1.1.6版本的文件:https://www.percona.com/downloads/percona-monitoring-plugins/

    按理说,导入模板之后,链接到主机就可以查看到数据了。不过,等了很久一直没数据,又是经过一番查询...

    插件创建了一个状态文件,然后从中读取数据,但是这个文件第一次启动的时候所属用户是root,而zabbix的启动用户是zabbix,没有权限读取这个文件,所以页面上一直没有数据。

    解决办法很简单,删除这个文件即可,程序会自动创建一个权限正确的新文件。

    # rm -f /tmp/localhost-mysql_cacti_stats.txt

    10、到这里就可以看到数据了。


    补充:

    如果把默认端口3306改成了别的端口,也会造成报错读取不到数据。

    在/var/lib/zabbix/percona/scripts目录下有两个脚本,经过仔细查看,发现get_mysql_stats_wrapper.sh在指定读取的状态文件时路径是写的是CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt",而在/tmp/目录下是一个带端口的文件localhost-mysql_cacti_stats.txt:3310,这样肯定就读不到了。然后去找文件是在哪里生成的,查看另一个php脚本,果然做了判断处理,端口不是3306的话就在文件名后面加上端口号。

    问题找到了,将源码中的判断部分去掉就好了。

    # vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php
    $cache_file = "$cache_dir/$sanitized_host-mysql_cacti_stats.txt" . ($port != 3306 ? ":$port" : '');
    改成:
    $cache_file = "$cache_dir/$sanitized_host-mysql_cacti_stats.txt";

    参考:
    https://www.percona.com/doc/percona-monitoring-plugins/LATEST/zabbix/index.html
    https://blog.csdn.net/liang_operations/article/details/81868668

    ######sample 3 小bug 

    http://www.manongjc.com/article/18964.html

    Percona Monitoring Plugins for Zabbix模板 用于Mysql Replication的Slave Running和Slave Stopped监控项的数据不正确

    时间:2018-11-16
    本文章向大家介绍Percona Monitoring Plugins for Zabbix模板 用于Mysql Replication的Slave Running和Slave Stopped监控项的数据不正确,需要的朋友可以参考一下

    今天小试了一把Percona Monitoring Plugins for Zabbix模板,自己辛辛苦苦写的那一大堆Python脚本,貌似用这个模板全都覆盖到了。
    但是,我也发现最新的版本percona-monitoring-plugins_1.1.8也还是存在一个问题,那就是用于Mysql Replication的Slave Running和Slave Stopped监控项的数据不正确(一般情况下,两项数据均维持在0)。
    经检查相关模板的脚本文件ss_get_mysql_stats.php,发现用于获取Slave Running和Slave Stopped监控项的脚本逻辑有问题。

    相关脚本内容为:

             $status['slave_lag']        = $row['seconds_behind_master'];
             ......
             $status['slave_running'] = ($row['slave_sql_running'] == 'Yes')
                ? $status['slave_lag'] : 0;
             $status['slave_stopped'] = ($row['slave_sql_running'] == 'Yes')
                ? 0 : $status['slave_lag'];

    可见当slave_sql_running为Yes时,slave_running的取值是seconds_behind_master,slave_stopped的取值是0。
    当slave_sql_running为No时,slave_running的取值是0,slave_stopped的取值是seconds_behind_master。
    这里我将脚本中$status['slave_lag']更改为了1:

             $status['slave_lag']        = $row['seconds_behind_master'];
             ......
             $status['slave_running'] = ($row['slave_sql_running'] == 'Yes')
                ? 1 : 0;
             $status['slave_stopped'] = ($row['slave_sql_running'] == 'Yes')
                ? 0 : 1;

    修改后监控数据正常了。

    ############

    https://blog.csdn.net/u011731378/article/details/79092259

      • Zabbix Agent Log

         
        Dear All,

        All of my Windows hosts (Windows Server 2008 R2 & Windows Server 2012) both have no zabbix_agentd.log file at all. I don't know why. Below is configuration of one host:
         
        # This is a config file for Zabbix Agent (Windows)
        # To get more information about Zabbix, go to http://www.zabbix.com

        ############ GENERAL PARAMETERS #################

        ### Option: LogFile
        # Name of log file.
        # If not set, Windows Event Log is used.
        #
        # Mandatory: no
        # Default:
        # LogFile=

        LogFile=C:Program Filesabbix Agentabbix_agentd.log

        ### Option: LogFileSize
        # Maximum size of log file in MB.
        # 0 - disable automatic log rotation.
        #
        # Mandatory: no
        # Range: 0-1024
        # Default:
        # LogFileSize=1

        ### Option: DebugLevel
        # Specifies debug level
        # 0 - no debug
        # 1 - critical information
        # 2 - error information
        # 3 - warnings
        # 4 - for debugging (produces lots of information)
        #
        # Mandatory: no
        # Range: 0-4
        # Default:
        # DebugLevel=3
        DebugLevel=0

        ### Option: SourceIP
        # Source IP address for outgoing connections.
        #
        # Mandatory: no
        # Default:
        # SourceIP=

        ### Option: EnableRemoteCommands
        # Whether remote commands from Zabbix server are allowed.
        # 0 - not allowed
        # 1 - allowed
        #
        # Mandatory: no
        # Default:
        EnableRemoteCommands=1

        ### Option: LogRemoteCommands
        # Enable logging of executed shell commands as warnings.
        # 0 - disabled
        # 1 - enabled
        #
        # Mandatory: no
        # Default:
        # LogRemoteCommands=0

        ##### Passive checks related

        ### Option: Server
        # List of comma delimited IP addresses (or hostnames) of Zabbix servers.
        # Incoming connections will be accepted only from the hosts listed here.
        # No spaces allowed.
        # If IPv6 support is enabled then '127.0.0.1', '::127.0.0.1', '::ffff:127.0.0.1' are treated equally.
        #
        # Mandatory: no
        # Default:
        # Server=

        Server=10.10.20.85

        ### Option: ListenPort
        # Agent will listen on this port for connections from the server.
        #
        # Mandatory: no
        # Range: 1024-32767
        # Default:
        ListenPort=10050

        ### Option: ListenIP
        # List of comma delimited IP addresses that the agent should listen on.
        # First IP address is sent to Zabbix server if connecting to it to retrieve list of active checks.
        #
        # Mandatory: no
        # Default:
        # ListenIP=0.0.0.0

        ### Option: StartAgents
        # Number of pre-forked instances of zabbix_agentd that process passive checks.
        # If set to 0, disables passive checks and the agent will not listen on any TCP port.
        #
        # Mandatory: no
        # Range: 0-100
        # Default:
        # StartAgents=3

        ##### Active checks related

        ### Option: ServerActive
        # List of comma delimited IPort (or hostnameort) pairs of Zabbix servers for active checks.
        # If port is not specified, default port is used.
        # IPv6 addresses must be enclosed in square brackets if port for that host is specified.
        # If port is not specified, square brackets for IPv6 addresses are optional.
        # If this parameter is not specified, active checks are disabled.
        # Example: ServerActive=127.0.0.1:20051,zabbix.domain,[::1]:30051,::1,[12fc::1]
        #
        # Mandatory: no
        # Default:
        # ServerActive=

        ServerActive=127.0.0.1

        ### Option: Hostname
        # Unique, case sensitive hostname.
        # Required for active checks and must match hostname as configured on the server.
        # Value is acquired from HostnameItem if undefined.
        #
        # Mandatory: no
        # Default:
        Hostname=NI-HOST01

        ### Option: HostnameItem
        # Item used for generating Hostname if it is undefined.
        # Ignored if Hostname is defined.
        #
        # Mandatory: no
        # Default:
        # HostnameItem=system.hostname

        ### Option: RefreshActiveChecks
        # How often list of active checks is refreshed, in seconds.
        #
        # Mandatory: no
        # Range: 60-3600
        # Default:
        # RefreshActiveChecks=120

        ### Option: BufferSend
        # Do not keep data longer than N seconds in buffer.
        #
        # Mandatory: no
        # Range: 1-3600
        # Default:
        # BufferSend=5

        ### Option: BufferSize
        # Maximum number of values in a memory buffer. The agent will send
        # all collected data to Zabbix server or Proxy if the buffer is full.
        #
        # Mandatory: no
        # Range: 2-65535
        # Default:
        # BufferSize=100

        ### Option: MaxLinesPerSecond
        # Maximum number of new lines the agent will send per second to Zabbix Server
        # or Proxy processing 'log', 'logrt' and 'eventlog' active checks.
        # The provided value will be overridden by the parameter 'maxlines',
        # provided in 'log', 'logrt' or 'eventlog' item keys.
        #
        # Mandatory: no
        # Range: 1-1000
        # Default:
        # MaxLinesPerSecond=100

        ############ ADVANCED PARAMETERS #################

        ### Option: Alias
        # Sets an alias for parameter. It can be useful to substitute long and complex parameter name with a smaller and simpler one.
        # For example, if you wish to retrieve paging file usage in percents from the server,
        # you may use parameter "perf_counter[Paging File(_Total)\% Usage]", or you may define an alias by adding the following line to configuration file
        # Alias = pg_usageerf_counter[Paging File(_Total)\% Usage]
        # After that you can use parameter name "pg_usage" to retrieve the same information.
        # You can specify as many "Alias" records as you wish.
        # Aliases cannot be used for parameters defined in "PerfCounter" configuration file records.
        #
        # Mandatory: no
        # Range:
        # Default:

        ### Option: Timeout
        # Spend no more than Timeout seconds on processing
        #
        # Mandatory: no
        # Range: 1-30
        # Default:
        # Timeout=3

        ### Option: PerfCounter
        # Syntax: <parameter_name>,"<perf_counter_path>",<period>
        # Defines new parameter <parameter_name> which is an average value for system performance counter <perf_counter_path> for the specified time period <period> (in seconds).
        # For example, if you wish to receive average number of processor interrupts per second for last minute, you can define new parameter "interrupts" as following:
        # PerfCounter = interrupts,"Processor(0)Interrupts/sec",60
        # Please note double quotes around performance counter path.
        # Samples for calculating average value will be taken every second.
        # You may run "typeperf -qx" to get list of all performance counters available in Windows.
        #
        # Mandatory: no
        # Range:
        # Default:

        ### Option: Include
        # You may include individual files in the configuration file.
        #
        # Mandatory: no
        # Default:
        # Include=

        # Include=c:zabbixzabbix_agentd.userparams.conf
        # Include=c:zabbixzabbix_agentd

        ####### USER-DEFINED MONITORED PARAMETERS #######

        ### Option: UnsafeUserParameters
        # Allow all characters to be passed in arguments to user-defined parameters.
        # 0 - do not allow
        # 1 - allow
        #
        # Mandatory: no
        # Range: 0-1
        # Default:
        # UnsafeUserParameters=0

        ### Option: UserParameter
        # User-defined parameter to monitor. There can be several user-defined parameters.
        # Format: UserParameter=<key>,<shell command>
        # Note that shell command must not return empty string or EOL only.
        # Example: UserParameter=system.test,echo 1
        #UserParameter=system.test,echo 1
         
      • tchjts1
        Banned
         
        •  May 2008
        •  1582
        Believe it or not, Zabbix is case sensitive, even on Windows. So your log directory and file name: C:Program Filesabbix Agentabbix_agentd.log need to be cased appropriately.

        I don't know if that is your issue or not, but I ran into that when I was first starting out with Zabbix.

        And you have DebugLevel=0 Put that at 3 and you will start seeing a log, I suspect.
        Last edited by tchjts118-06-2013, 07:27.
         
      • angel_of_devil
        Junior Member
         
        •  Sep 2011
        •  29
         
         
        Originally posted by tchjts1 View Post
        Believe it or not, Zabbix is case sensitive, even on Windows. So your log directory and file name: C:Program Filesabbix Agentabbix_agentd.log need to be cased appropriately.

        I don't know if that is your issue or not, but I ran into that when I was first starting out with Zabbix.

        And you have DebugLevel=0 Put that at 3 and you will start seeing a log, I suspect.
        Thanks. The problem is solved with set value for parameter DebugLevel 
         
         
         
        #########sampl 2    (主动轮询 和 被动接受 )
        https://blog.csdn.net/adparking/article/details/7825183

        怎么知道zabbix server是主动轮询收集信息还是被动接受zabbix agent的信息
        zabbix_agent [TCP 主动轮询]
        zabbix_sender [UDP 被动接受代理收集的系统信息]

        一、从网上下载相应脚本与XML定义文件。

        下载地址:http://www.zabbix.com/wiki/howto/monitor/db/mysql/extensive_mysql_monitoring_including_replication?s[]=mysql

        Template_MySQL_Server.xml

        Template_MySQL_Replication_Master.xml

        Template_MySQL_Replication_Slave.xml

        和执行脚本:mysql.php

        二、把mysql.php上传至配置文件目录/etc/zabbix/

        chmod 755 mysql.php

        三、修改mysql.php文件

        根据本机环境。

        第一行加入:#!/usr/bin/php

        在最后一行加入:?>

        关闭调试:define('DEBUG',true); 为 define('DEBUG',False);

        修改日志、数据文件路径:

        define('LOG',"/tmp/zabbix_".SYSTEM.".log");
        define('DAT',"/tmp/zabbix_".SYSTEM.".dat");
        define('UTIME',"/tmp/.zabbix_".SYSTEM.".utime");
        define('DTIME',"/tmp/.zabbix_".SYSTEM.".dtime");

        修改:define('SYSTEM','mysql'.(DEBUG ? "-debug" : "")); 为:define('SYSTEM','mysql');

        打开系统日志功能://system("zabbix_sender -z $server -i ".DAT." >> ".LOG); 为:system("zabbix_sender -z $server -i ".DAT." >> ".LOG);

        注释file_put_contents(DAT,"$server $host 10051 ".SYSTEM.".$var $val ",FILE_APPEND);且

        下面增加以下文字:
        $cmd = "zabbix_sender -c $config_path -k ".SYSTEM.".$var -o $val -vv";
        file_put_contents(DAT,"$cmd ",FILE_APPEND);
        exec($cmd);

        四、在zabbix_agentd.conf配置文件中加入

        UserParameter=mysql.daily,php /etc/zabbix/mysql.php daily 用户名 密码
        UserParameter=mysql.live,php /etc/zabbix/mysql.php live 用户名 密码

        daily:每天执行一次。【由zabbix_server轮询发起,默认86640秒即一天 zabbix agent类型 UDP协议】

        live:按指定时间执行一次。【由zabbix_server轮询发起,默认120秒 zabbix agent类型 UDP协议】

        php :执行php文件

        /etc/zabbix/mysql.php:mysql.php文件所在的文件路径

        用户名 密码:登录mysql数据库的账户与密码

        重启zabbix_agentd

        切记修改/etc/profile 或者 /home/zabbix/.bash_profile 在文件尾部添加以下文字

        /home/zabbix/.bash_profile

        PATH=$PATH:$HOME/bin:/usr/local/webserver/mysql/bin:/usr/local/webserver/php/bin:/usr/local/webserver/zabbix_agents/bin
        export PATH

        /etc/profile

        PATH=$PATH:/usr/local/webserver/mysql/bin:/usr/local/webserver/php/bin:/usr/local/webserver/zabbix_agents/bin
        export PATH

        mysql.php 监控文件里面的命令执行失败【/tmp下的日志文件属主权限、用户的.bash_profile是否导入 php zabbix_sender mys】

        问题:
        Zabbix agent (active)  走 UDP 协议  NGINX 添加的 zabbix_agentd 服务后,且通过zabbix_get可以获取数据,但是无法入库。解决方法看下面大红字

        修改防火墙设置 vi /etc/sysconfig/iptables

        【zabbix-agent    10050/tcp               # Zabbix Agent
        zabbix-agent    10050/udp               # Zabbix Agent
        zabbix-trapper  10051/tcp               # Zabbix Trapper
        zabbix-trapper  10051/udp               # Zabbix Trapper

        -A INPUT -p tcp -s 110.80.20.XXX-m multiport --dports 10050,10051 -j ACCEPT
        -A INPUT -p udp -s 110.80.20.XXXX-m multiport --dports 10050,10051 -j ACCEPT

        五、在zabbix web管理界面导入xml文件

        配置-导入/导出-浏览

        六、在主机内增加指定模板

        配置-主机-具体主机名-Link with Template-新增-刚导入的模板。

        模板分为三种:

        template MYSQL_server:监控项最全【下载文件有备注信息、且若干个tigger有重复会导致导入失败】

        由于监控的item很多所以必须修改 Timeout 系统最大值 30秒。默认3秒。范围 1-30秒 否则服务端测试时会

        Timeout while executing a shell script 当然如果项目在30秒无法发送完毕也将停止,所以导致发送不全面

        ### Option: Timeout
        #       Spend no more than Timeout seconds on processing
        #
        # Mandatory: no
        # Range: 1-30
        # Default:
        Timeout=30

        template MYSQL_Replication_Master:只监控主要参数,监控功能相对最少

        template MYSQL_Replication_Slave:主要针对性能方面的监控。

        七、测试监控是否成功

        删除 定时文件

        rm /tmp/.zabbix_mysql-debug.dtime;

        取的每天的监控数据

        php /etc/zabbix/mysql.php daily root *****

        取即时数据

        php /etc/zabbix/mysql.php live root *****

        查看日志

        cat /tmp/zabbix_mysql.log

        Info from server: "Processed 1 Failed 0 Total 1 Seconds spent 0.006261"
        sent: 1; skipped: 0; total: 1
        Info from server: "Processed 1 Failed 0 Total 1 Seconds spent 0.004047"
        sent: 1; skipped: 0; total: 1
        Info from server: "Processed 0 Failed 106 Total 106 Seconds spent 0.045790"
        sent: 106; skipped: 0; total: 106

        看到上述为成功

        查看DAT的文件。上传的数据

        cat /tmp/zabbix_mysql.dat

        八、最后查看zabbix 的最新数据

        这时会看到新增加的监控项。

        接下去就是绘制图形。

        ####sample 3

        https://www.cnblogs.com/guoyishen/p/6891953.html

        Zabbix 3.2.6-Mysql多实例监控-Percona Monitoring Plugins自动发现

         
        mysql多实例监控实录
         
        系统环境:
        cat /etc/redhat-release
        CentOS Linux release 7.3.1611 (Core)
        内核版本:
        uname -r
        3.10.0-514.el7.x86_64
        docker版本:
        docker -v
        Docker version 1.12.6, build 3a094bd/1.12.6
        docker 相关镜像版本:
        docker.io/zabbix/zabbix-web-nginx-mysql latest
        docker.io/zabbix/zabbix-server-mysql latest
        docker.io/mysql 5.7
        被监控mysql应用版本:
        mysql-5.7.17-linux-glibc2.5-x86_64
        Percona Monitoring Plugins版本:
         
        写在最前:如果zabbix server和zabbix agent已经通过其他方式安装,可以直接跳过1、2步,直接从第3步开始看。
         
        1、zabbix服务端我们运行在docker容器内
        所以服务器端先安装docker服务
        yum install -y epel-release
        yum install -y docker #centos6.x版本的命令是yum install -y docker-io
         
        然后运行docker服务
        systemctl start docker
        docker加入开机自启动
        systemctl enable docker
        查看docker是否成功启动
        systemctl status docker
        注:使用docker需要使用加速器,否则那龟速,自己体会吧。加速器daocloud和阿里云都可以,我使用的前者。
         
        2.安装相关容器
        2.1. mysql 容器
        docker run --name mysql-server -t
              -e MYSQL_DATABASE="zabbix"
              -e MYSQL_USER="zabbix"
              -e MYSQL_PASSWORD="ywwd.net"
              -e MYSQL_ROOT_PASSWORD="ywwd.net"
              -v /data/container/mysql/zabbix:/var/lib/mysql
              -v /etc/localtime:/etc/localtime:ro
              --restart=always
              -d mysql:5.7
              --character-set-server=utf8 --collation-server=utf8_general_ci --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
         
        2.2. zabbix-server 容器
        docker run --name zabbix-server-mysql -t
              -e DB_SERVER_HOST="mysql-server"
              -e MYSQL_DATABASE="zabbix"
              -e MYSQL_USER="zabbix"
              -e MYSQL_PASSWORD="ywwd.net"
              -e MYSQL_ROOT_PASSWORD="ywwd.net"
              --link mysql-server:mysql
              -p 10051:10051 --restart=always
              -v /etc/localtime:/etc/localtime:ro
              -d zabbix/zabbix-server-mysql:latest
         
        2.3. zabbix-web 容器(nginx)
        docker run --name zabbix-web-nginx-mysql -t
              -e DB_SERVER_HOST="mysql-server"
              -e MYSQL_DATABASE="zabbix"
              -e MYSQL_USER="zabbix"
              -e MYSQL_PASSWORD="ywwd.net"
              -e MYSQL_ROOT_PASSWORD="ywwd.net"
              --link mysql-server:mysql
              --link zabbix-server-mysql:zabbix-server
              -v /etc/localtime:/etc/localtime:ro
              -p 80:80
              --restart=always
              -d zabbix/zabbix-web-nginx-mysql:latest
         
        注意:这里有个小问题,zabbix-web-nginx-mysql的启动脚本/run_zabbix_component.sh中,指定了时区,不是中国的Asia/Shanghai,所以我们要进入zabbix-web-nginx-mysql进行修改
        2.4. 修改zabbix-web的时区
        docker exec -it zabbix-web-nginx-mysql /bin/bash
        TZ=${TZ:-"Asia/Shanghai"} 这里改为Asia/Shanghai,否则zabbix-web端的时间会慢5个小时
        sed -in 's#Europe/Riga#Asia/Shanghai#g' /run_zabbix_component.sh
        修改时区后,需要重启容器
        docker restart zabbix-web-nginx-mysql
        2.5. 在firewall防火墙放开zabbix-server和zabbix-agent的服务端口号
        firewall-cmd --permanent --add-port=10050-10051/tcp
        #--permanent永久生效,10050zabbix-agent服务端口,10051zabbix-server服务端口
        firewall-cmd --reload
        #更改后需要重新加载firewall防火墙
        firewall-cmd --list-all
        #最后查看配置是否生效
         
        这样zabbix-server端就已经安装完毕
        接下来客户端我们采用rpm包进行安装
        rpm -ivh zabbix-agent-3.2.6-1.el7.x86_64.rpm
        同样需要放开zabbix-agent端口
        firewall-cmd --permanent --add-port=10050/tcp
        firewall-cmd --reload
         
        然后对zabbix-agent端进行配置
        egrep -v '^$|^#' /etc/zabbix/zabbix_agentd.conf
        PidFile=/var/run/zabbix/zabbix_agentd.pid
        LogFile=/var/log/zabbix/zabbix_agentd.log
        Server=10.0.0.106 # <====zabbix-server端的IP地址
        ServerActive=10.0.0.106 #<====zabbix-server端的IP地址,主动方式
        Hostname=10.0.0.107 #<====zabbix-agent端的IP地址或者主机名
        Include=/etc/zabbix/zabbix_agentd.d/*.conf
         
        然后在zabbix-server端的web界面进行主机添加
         
        1)修改主机名称,要跟zabbix-agent的配置文件中的Hostname相对应
        2)选择你想设置的群组,如果群组不存在,可以在下面一栏新的群组中进行添加
        3)指定zabbix-agent端的IP地址或者域名(端口号一般变)
        其他保持默认,点击添加即可
         
        https://github.com/hc-dba/Mysql_Multiport_monitor_used_zabbix 
         
        3、利用Percona Monitoring Plugins插件进行MySQL多实例的监控
        1)percona监控zabbix的脚本是使用php写的,所以需要准备好php运行环境,这里直接用yum安装就可以满足要求了:
        yum install -y php php-mysql
        2)安装percona-zabbix-templates
         
        也可配置Percona yum仓库后安装,建议配置percona的yum源,因为作为一个DBA你肯定会用到percona toolkit套件。 注:我没有用这种方式,percona toolkit我是通过源码包安装的。
        yum install -y https://www.percona.com/redir/downloads/percona-release/redhat/latest/percona-release-0.1-3.noarch.rpm
        yum install -y percona-zabbix-templates
         
        4、yum安装的shell为单实例版,所以我们要进行相关修改,这里已经有小伙伴进行了修改,我们直接克隆,进行对比,需要先安装git
         
        1)对比后,我们发现在get_mysql_stats_wrapper.sh脚本中,添加了相关参数
        PORT=$2
        HOST=127.0.0.1
         
        2)CMD="/usr/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items $ITEM --port $PORT"
        CMD变量的php路径一定要指定正确,否则会报错,我们在后面添加了 --port $PORT
        CACHEFILE改为判断
        if [ $PORT == 3306 ];then
        CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"
        else
        CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt":$PORT
        fi
         
        3)running-slave进行如下修改,此处报警跟模板中的另一个Slave Stopped是重叠的,不过这个比Slave Stopped要灵敏,大概提前3分钟左右报警,不过需要在/etc/my.cnf以及脚本中添加mysql的账号和密码等信息,各有利弊吧
         
        if [ "$ITEM" = "running-slave" ]; then
        # Check for running slave
        RES=`HOME=~zabbix /usr/local/mysql/bin/mysql -P$PORT -h127.0.0.1 -uzabbix -e 'SHOW SLAVE STATUSG' | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l `
        if [ "$RES" -ne 2 ]; then
        echo 1
        else
        echo 0
        fi
        exit
        并在/etc/my.cnf中添加
        [mysql]
        password=123456 #存在安全隐患,但是如果把权限改小,可能会获取不到值,因为是通过zabbix用户去运行的脚本,里面只是密码,而且账号只能本机登录,所以问题也不大,但是要严格控制其他3个shell脚本的权限。
         
        ##sample

        RES=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuser-puseroprommo11 -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l`

        if [ "$RES" -ne 2 ]; then

        echo 1

        else

              RES1=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuser-puseroprommo11 -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr ' ' ','`

             if [ "$RES1" = " Yes, Yes," ]; then

                echo 1

            else

                echo 0

            fi

        fi

        exit

         
        4)#cat $CACHEFILE | sed 's/ / /g; s/-1/0/g'| grep $ITEM | awk -F: '{print $2}'
        这一列改为:
        cat $CACHEFILE | sed 's/ / /g'| grep $ITEM | awk -F: '{print $2}' 或者
        cat $CACHEFILE | sed 's/ / /g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
        改为第一个,在zabbix-server的web端配置报警阈值为小于0,或者等于1的时候报警,
        改为第二行,可以统一设置报警阈值为等于1,因为这个问题,困扰了我好久
         
        5、修改自动发现脚本
        cat mysql_low_discovery.sh
        #!/bin/bash
        #Fucation:mysql low-level discovery
        #Script_name mysql_low_discovery.sh
        discovery() {
        port=($(sudo ss -tpln | awk -F "[ :]+" '/[m]ysql/ {print $4}'))
        printf '{ '
        printf ' "data":[ '
        for key in ${!port[@]}
        do
        if [[ "${#port[@]}" -gt 1 && "${key}" -ne "$((${#port[@]}-1))" ]];then
        socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
        printf ' { '
        printf " "{#MYSQLPORT}":"${port[${key}]}"}, "
        else [[ "${key}" -eq "((${#port[@]}-1))" ]]
        socket=`ps aux|grep ${port[${key}]}|grep -v grep|awk -F '=' '{print $9}'|cut -d ' ' -f 1`
        printf ' { '
        printf " "{#MYSQLPORT}":"${port[${key}]}"} "
        fi
        done
        printf ' ] '
        printf '} '
        }
        discovery
         
        注意:由于此处使用了 sudo ,所以要把zabbix用户加上sudo权限,且只能执行 ss命令
        echo 'zabbix ALL=(ALL) NOPASSWD:/usr/sbin/ss'>>/etc/sudoers
         
        修改ss_get_mysql_stats.php脚本
        $mysql_user = 'zabbix'; <=====此为php登录mysql的用户
        $mysql_pass = 123456; <=====此为php登录mysql的密码
        $mysql_port = NULL; <=====端口和socket要改为NULL
        $mysql_socket = NULL;
         
        修改userparameter_percona_mysql.conf 配置文件
        把每行中的逗号',' 替换为[*],
        sed -in 's#,#[*],#g' userparameter_percona_mysql.conf
        在每行后面添加 $1
        sed -in 's#$#$1#g' userparameter_percona_mysql.conf
        最后在首行添加端口自动发现脚本
        sed -in '1i UserParameter=MySQL.discovery,/bin/bash /var/lib/zabbix/percona/scripts/mysql_low_discovery.sh' userparameter_percona_mysql.conf
         
        6、复制脚本文件并执行权限
        mkdir -p /var/lib/zabbix/percona/scripts/
        cp userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/
        cp get_mysql_stats_wrapper.sh /var/lib/zabbix/percona/scripts/
        cp mysql_low_discovery.sh /var/lib/zabbix/percona/scripts/
        cp ss_get_mysql_stats.php /var/lib/zabbix/percona/scripts/
        chmod 700 /var/lib/zabbix/percona/scripts/*
        chown -R zabbix. /var/lib/zabbix/
        7、最后一定要在所有的库上面做授权操作,否则拿不到监控数据
        GRANT SELECT, PROCESS, SUPER, REPLICATION CLIENT ON *.* TO 'zabbix'@'localhost' identified by '123456';
        flush privileges;
         
        8、最后把模板Mysql_Multiport.xml导入到zabbix-server内,所有用到的脚本文件都已经添加到附件中,大家可以下载使用。
        创建触发器原型
         
        在zabbix-server端,添加触发器
        依次点击 主机===>自动发现===>触发器类型===>点击右上角的创建触发器原型
        分配报警级别,点击表达式栏的添加,选择选择原型
        然后选择 例如:MySQL.slave-stopped[{#MYSQLPORT}]
        选择最新的T值小于N
        N为0
        注:如果在第4.4中指定的是cat $CACHEFILE | sed 's/ / /g; s/-1/1/g'| grep $ITEM | awk -F: '{print $2}'
        选择最新的T值等于N
        N为1
         
        然后我们可以手动停止主从复制,稍等片刻,就会发了报警信息
         
        博客园不允许放附件,所以我只能把附件放在百度云了
        http://pan.baidu.com/s/1slFGVoT
         
        参考文章:
        https://github.com/hc-dba/Mysql_Multiport_monitor_used_zabbix
         
        另外可以添加微信和邮件告警,这里推荐下面的博文
         
         
         
        ############sample  监控单节点多实例的mysql
         

        1.多实例

        1台server 多个实例(即这些实例都绑定到同一个机器ip和不同端口)的问题,主要体现在采集端 需要适配多个server 进程

        多个实例的监控用户和密码必须保持一致

        在这个例子里

        Ip 为10.241.94.15

        Port 为 3306 和 3307

        (以下修改是基于单实例监控的脚本进行更改的)

        1.1.-> zabbix 脚本文件 get_mysql_stats_wrapper.sh 

        12 行加入

        PORT=$2

         

        13 host 修改localhost为IP

        HOST=”10.241.94.15”

        15 行更改为 加入 --port $PORT

        CMD="/usr/bin/php -q $DIR/ss_get_mysql_stats.php --host $HOST --items gg --port $PORT"

        16修改为:

        将 CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt”

        修改为

        if [ $PORT == 3306 ];then

                 CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"

        else

               CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt":$PORT

        fi

        如下2修改为 加入-P$PORT

        RES=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuseropr -puseroprommo11 -P$PORT -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l`

         RES1=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuseropr -puseroprommo11 -P$PORT -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr ' ' ','`

        1.2 用户授权

        (如下4个授权grant 命令都需要执行,一台服务器多个实例 监控 需要允许 监控账号远程登陆)

        > GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY '123456';

        > grant all privileges on *.* to zabbix@localhost;

        > grant all privileges  on *.* to zabbix@'%' identified by "123456";

        > grant PROCESS,SUPER,REPLICATION CLIENT  on *.* to zabbix@'%' identified by "123456";

        > flush privileges;

        --查询权限:

        > select user,host from mysql.user;

        >SELECT Repl_slave_priv,Repl_client_priv,super_priv,host FROM mysql.USER WHERE USER='zabbix ';

        > quit;

        测试5.1

         

        (使用如下带IP,端口,用户名,密码的登陆方式必须成功 )

         mysql -uroot –p123456 -h10.241.94.15 –P3307

        mysql -uroot -p123456 -h10.241.94.15 -P3306

        测试5.2

        (3306 和3307 分别对应着一台主机多个mysql 对外提供服务的 端口号,具体以实际为主,如下命令应该有数字返就是正常),

        sh get_mysql_stats_wrapper.sh  gg  3306

        sh get_mysql_stats_wrapper.sh  gg  3307

        如果返回值为空的话,使用-x 进行调试:

        sh –x get_mysql_stats_wrapper.sh  gg  3306

        2. zabbix  自动发现脚本文件mysql_low_discovery.sh  

        2.1  cp mysql_low_discovery.sh   /var/lib/zabbix/percona/scripts/

        chmod 755  /var/lib/zabbix/percona/scripts/*

         

        2.2

        (Use root) 注意:由于此处使用了 sudo ,所以要把zabbix用户加上sudo权限,且只能执行 ss命令

        echo 'zabbix ALL=(ALL) NOPASSWD:/usr/sbin/ss'>>/etc/sudoers

        echo 'zabbix ALL=(ALL) NOPASSWD:/bin/netstat'>>/etc/sudoers

        3. 修改ss_get_mysql_stats.php脚本

        <=====端口和socket要改为NULL

        $mysql_port = NULL;

        $mysql_socket = NULL;

        测试5.3

        以下2条命令应该返回 数值

        php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php  --host 10.241.94.15 --items gg --port 3306

        php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php  --host 10.241.94.15 --items gg --port 3307

        4. 修改userparameter_percona_mysql.conf 配置文件

         

        4.1 把每行中的逗号',' 替换为[*],

        sed -in 's#,#[*],#g' userparameter_percona_mysql.conf

         

        4.2 在每行后面添加 $1

        sed -in 's#$# $1#g' userparameter_percona_mysql.conf

        4.3 最后在 首行添加端口自动发现脚本 (以下为一行)

        sed -in '1i UserParameter=MySQL.discovery,/bin/bash /var/lib/zabbix/percona/scripts/mysql_low_discovery.sh' userparameter_percona_mysql.conf

         

        验证结果如下:

        cat userparameter_percona_mysql.conf

        测试6zabbix 用户下执行mysql_low_discovery.sh 

         

        返回结果应该如下端口号,那就是正常:

         

         

         

        测试7

        (该测试是在zabbix  server上做,等待5分钟,进行测试,返回结果应该出现 端口号 就是正确)

        cd /usr/local/zabbix/bin/

        ->Server:

        ./zabbix_get -s 10.241.94.15 -k MySQL.discovery

        Issue

        有的时候,在 网页端 主机监控 ,自动发现里 的 percona 多实例模板 会报错 监控出现 unsupported key 报错

         

         

        解决方法:

        1.确认4.3 已经做,并且测试7 通过

         

        2.然后重启zabbix  agent

        pkill zabbix

        /usr/local/zabbix/sbin/*

        3.一般10分钟,zabbix 才会重新检测 unsupported key 的定义

        (实际情况,过了将近20分钟,unsupported key的报错才会取消)

        ->  Administration/General/通过右上角下拉框选择不同的项目完成相关配置和管理。

        ->  如下图2-36所示。

        5.导入模板

        5.1 Zabbix 管理网页 模板 导入功能  (Mysql_Multiport.xml)

        确认是否导入成功

        1.显示已成功导入

        2. 自动发现规则如下

           注意: 所有的监控项目 都在自动发现规则 下

        5.2 将主机 链接到这个新模板

        Mysql_Multiport

        注意:如果原有的主机已经添加了mysql 单机监控模板,

        需要在网页端 删除掉原来的主机。 在重新添加 新加的监控模板(template/percona multiport template) 即可

        附件:

        mysql_low_discovery.sh  

        Mysql_Multiport

        ####sample 

        监控单节点单实例

        -〉1配置agent 配置

        rpm -ivh percona-zabbix-templates-1.1.8-1.noarch.rpm

        Scripts are installed to /var/lib/zabbix/percona/scripts

        Templates are installed to /var/lib/zabbix/percona/templates

        yum install percona-zabbix-templates php php-mysql -y

        Installed:

          php.x86_64 0:5.3.3-47.el6                 php-mysql.x86_64 0:5.3.3-47.el6               

        Dependency Installed:

          php-cli.x86_64 0:5.3.3-47.el6               php-common.x86_64 0:5.3.3-47.el6             

          php-pdo.x86_64 0:5.3.3-47.el6             

        Complete!

        [root@devops-mysql-node1 ~]# rpm -ql percona-zabbix-templates

        /var/lib/zabbix/percona

        /var/lib/zabbix/percona/scripts

        /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh

        /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

        /var/lib/zabbix/percona/templates

        /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf

        /var/lib/zabbix/percona/templates/zabbix_agent_template_percona_mysql_server_ht_2.0.9-sver1.1.8.xml   为MYSQL监控模板

        -zabbix配置文件

        将配置文件拷贝到/etc/zabbix/zabbix_agentd.d/目录

        cp  /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf

        /usr/local/zabbix/etc/zabbix_agentd.conf.d/

        More /usr/local/zabbix/etc/zabbix_agentd.conf.d/userparameter_percona_mysql.conf

        (这里是支持扩展的脚本位置)

        Useparameter=Mysql.rows-updated,****/get_mysql_stats_wrapper.sh ix

        **

        (Ensure zabbix_agentd.conf contains the line: Include=/etc/zabbix_agentd.conf.d/ )

        ->2。建立本地用户

        (如下2个授权grant 命令都需要执行)

        > GRANT PROCESS,SUPER,REPLICATION CLIENT ON *.* TO zabbix@'localhost' IDENTIFIED BY '123456';

        > grant all privileges on *.* to zabbix@localhost;

        > flush privileges;

        > select user,host from mysql.user;

        > quit;

        -〉3。zabbix 脚本文件 ss_get_mysql_stats.php

        (重要,测试mysql 联通性 ,配置项目 使用用户/密码/本地socket连接)

        1).vim /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

        $mysql_user = 'root';

        $mysql_pass = '123456';

        $mysql_port = 3306;

        $mysql_socket = '/db/mysql/data/mysqltmp/mysql.sock';

        $mysql_flags = 0;

        测试环境root密码为空,如果生产环境会创建专门只读账号。

        2).同时注意:/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php

        以下参数定义缓存文件的具体位置

        (如果port变量定义一个非默认的3306 端口,就会往/tmp 写入一个文件 t-mysql_cacti_stats.txt:$port)

        $cache_file = "$cache_dir/$sanitized_host-mysql_cacti_stats.txt" . ($port != 3306 ? ":$port" : '');

         

        注意:

        测试1:(zabzabbix 用户下)

         

        如果 密码  配置错误,

        /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg

        会出现如下报错 :

        root@centos6 ~]# /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh gg

        ERROR: run the command manually to investigate the problem: /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg

        [root@centos6 ~]# /usr/bin/php -q /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php --host localhost --items gg

        ERROR: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2)[root@centos6 ~]#

        如果连接失败,可以使用如下PHP 测试下

        #######

        <?php

        $i = 10000;

        $host= 'localhost';

        $user = 'dbmonopr';

        $pass = 'dbmonoprommo11';

        $port = 3307;

        $socket = '/db/mysql/data/mysqltmp/mysql.sock';

        $flags = 0;

        while($i>=0) {

        $conn = mysqli_init();

        $link =mysqli_real_connect($conn, $host, $user, $pass, NULL, $port, $socket, $flags) or die(mysqli_connect_error());

        $info = mysqli_get_host_info($conn);

        $i--;

        mysqli_close($conn);

        unset($conn);

        }

        ?>

        ###

        4.-> zabbix 脚本文件 get_mysql_stats_wrapper.sh  

        (如果mysql 端口 不是3306,而是3503。这个也需要修改)

        修改1第15行,如果是默认端口,不需要修改这一项,如果不是默认端口

        change

        CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt"

        to

        CACHEFILE="/tmp/$HOST-mysql_cacti_stats.txt:3503"

        修改2: 第19行 到25行,变量里加入“mysql 的绝对路径”和“用户和密码” 和 “2〉/dev/null”

        change

        19 行 到 25行修改如下:

        to

        RES=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuser-pdbmonoprommo11 -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | grep -i yes|wc -l`

        if [ "$RES" -ne 2 ]; then

        echo 1

        else

              RES1=`HOME=~zabbix /db/mysql/app/mysql/bin/mysql  -uuser-pdbmonoprommo11 -e 'SHOW SLAVE STATUSG' 2>/dev/null | egrep '(Slave_IO_Running|Slave_SQL_Running):' | awk -F: '{print $2}' | tr ' ' ','`

             if [ "$RES1" = " Yes, Yes," ]; then

                echo 1

            else

                echo 0

            fi

        fi

        exit

        测试2:(root 用户下)

        sudo -u  zabbix -H /usr/local/zabbix/bin/get_mysql_stats_wrapper.sh running-slave

        0

        (正常情况下,应该返回0或者1,而不是“Access denied” 报错 )

        /usr/local/zabbix/bin/get_mysql_stats_wrapper.sh running-slave

        0

        (正常情况下,应该返回0或者1,而不是“Access denied” 报错 )

        需要改配置文件需要重启

        /etc/init.d/zabbix-agent restart

        或者

        pkill zabbix

        /usr/local/zabbix/sbin/*

        测试3:(zabzabbix 用户下)

        进行测试会返回测试结果

        cd /var/lib/zabbix/percona/scripts/

        ./get_mysql_stats_wrapper.sh gm

        0

        ./get_mysql_stats_wrapper.sh gw

        20060

        3.打开 Debug (zabbix 用户下修改ss_get_mysql_stats.php,确保/tmp/1.log  zabbix 用户有写的权限)

        ss_get_mysql_stats.php

        $debug     = true;

        $debug_log = '/tmp/1.log';

        关闭debug 

         $debug     = FALSE; # Define whether you want debugging behavior.

        $debug_log = FALSE; # If $debug_log is a filename, it'll be used.

        ss_get_mysql_stats.php 解读:

        -〉首先判断语法 是否正确

        ss_get_mysql_stats.php --host localhost --items gg

        -〉 其次 语法正确,就会在输出 runquery    SHOW /*!50000 ENGINE*/ INNODB STATUS,

        'SHOW /*!50002 GLOBAL */ STATUS'

        ->  其次判断 如果cache_file 超过300秒,就会删除,重写一遍,如果不超过300秒,就不重写一遍。

        ->最后 如果有写的权限,就会写入一个临时文件 类似 localhost-mysql_cacti_stats.txt.port


  • 相关阅读:
    poi操作excel2007(读取、生成、编辑)
    poi API大全
    iText导出pdf、word、图片
    正则表达式判断是否是中国电信的号码
    正则表达式_判断金额是否为数字(且是2位有效数字)
    POI实现Excel2003插入多张图片
    java中BufferedReader 有什么用
    poi生成word2007及以上文件
    POI 详细介绍
    GDB之常见错误
  • 原文地址:https://www.cnblogs.com/feiyun8616/p/11814292.html
Copyright © 2011-2022 走看看