账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    按月转移日志表中日志时,mysql总是报‘MySQL server has gone away’这样的错!
    26
    0

    我有一段清除数据库日志的脚用来按月清除数据库中的日志文件然后再把它们按月分表存储,脚本平时运行正常但是每到月初一定会报一次‘MySQL server has gone away’这样的错,不知道为什么!
    脚本代码如下:

    class PaizuTableHandler extends ScriptBase
    {
        public static $mysql = null;
        const LOG_PAIZU_TABLE = 'log_user_paiju';
        public function logic()
        {
            if(empty(self::$mysql)){
                self::$mysql = $this->mysql('logs');
            }
            set_time_limit(0);
            while (true)
            {
                $date = date("Y-m-d");
                $dataTime =  strtotime($date);
    
                $timestampStart = $dataTime - 3600*24; //昨天
                $timestampEnd = mktime(0,0,0,date("m"),1,date("Y"));//本月月初 例如:2017-07-01 00:00:00
                $timestampEnd_lastmoth = mktime(0, 0 , 0,date("m")-1,1,date("Y"));//上月月初 例如:2017-06-01 00:00:00
                $transferLastMonth = mktime(0,0,0,date("m"),5,date("Y")); //月初第5天(转移上月数据)
    
                if($timestampStart < $timestampEnd){
                    sleep(60);
                    continue;
                }
    
                $table = self::LOG_PAIZU_TABLE.'_'.date("Ym");//本月的表
                $lastMothTable = self::LOG_PAIZU_TABLE.'_'.date("Ym",mktime(0, 0 , 0,date("m")-1,1,date("Y")));//上个月的表
                $hasTable = self::$mysql->tableExists($table);  //判断是否有本月的表
                $hasTableLast = self::$mysql->tableExists($lastMothTable);  //判断是否有上个月的表
                $createFlag = $hasTable ? true : false; //本月的表是否存在
                $createFlagLast = $hasTableLast ? true : false; //上个月的表是否存在
                if( empty( $createFlag ) ){
                    try {
                        //创建表
                        $createSql = "CREATE TABLE {$table} LIKE log_user_paiju";
                        $ret = self::$mysql->query($createSql);
                        if(!$ret){
                            //抛出异常
                            $errorMessage =  self::$mysql -> error_no() . ": " . self::$mysql ->error();
                            throw new Exception($errorMessage);
                        }
    
                    } catch(Exception $ex) {
                        echo 'TIME:'.date("Y-m-d H:i:s")."\n";
                        echo 'TIME_START~TIME_END:'.date("Y-m-d H:i:s",$timestampStart)."~".date("Y-m-d H:i:s",$timestampEnd)."\n";
                        $msg = 'Error:'.$ex->getMessage()."\n";
                        $msg.= $ex->getTraceAsString()."\n";
                        $msg.= '异常行号:'.$ex->getLine()."\n";
                        $msg.= '所在文件:'.$ex->getFile()."\n";
                        //将异常信息记录到日志中PHP异常处理之
                        echo $msg;
                        echo "\n";
                        break;
                    }
                }
    
                if( $createFlag ){
    
                    try {
                        //查询本月当天应清空数据有没有清空
                        $sql = "select * from log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd} and {$timestampStart} order by `time` desc limit 100";
                        $result = self::$mysql->query($sql);
                        $rs = self::$mysql -> fetch_row($result);
                        if( !$result ){
                            //抛出异常
                            $errorMessage =  self::$mysql -> error_no() . ": " . self::$mysql ->error();
                            throw new Exception($errorMessage);
                        }
    
                        //处理上月数据(本月第5天把 上个月的数据全部放到上个月的表中(要放最少2天前))
                        $last_rs = array();
                        if($dataTime == $transferLastMonth && !empty( $createFlagLast ) && empty($rs)){
                            $last_sql = "select * from log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd_lastmoth} and {$timestampEnd} order by `time` desc limit 100";
                            $last_sql1 = "INSERT INTO {$lastMothTable}(uid,paiju_score,paizu_score,`time`,paizu_id,seq,room_id,server_id,creator,`status`,mahjongType,cid) SELECT uid,paiju_score,paizu_score,`time`,paizu_id,seq,room_id,server_id,creator,`status`,mahjongType,cid FROM log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd_lastmoth} and {$timestampEnd} order by `time` desc limit 100";
                            $last_sql2 = "delete from log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd_lastmoth} and {$timestampEnd} order by `time` desc limit 100";
                            $result1 = self::$mysql->query($last_sql);
                            //var_dump($result1);
                            if(!$result1){
                                //抛出异常
                                $errorMessage =  self::$mysql -> error_no() . ": " . self::$mysql ->error();
                                throw new Exception($errorMessage);
                            }
    
                            $last_rs = self::$mysql -> fetch_row($result1);
                            if($last_rs){
                                if($r = self::$mysql->query($last_sql1)){
                                    self::$mysql->query($last_sql2);
                                }else{
                                    //抛出异常
                                    $errorMessage =  self::$mysql -> error_no() . ": " . self::$mysql ->error();
                                    throw new Exception($errorMessage);
                                }
                            }
    
                        }
    
                        //处理本月数据
                        $sql1 = "INSERT INTO {$table}(uid,paiju_score,paizu_score,`time`,paizu_id,seq,room_id,server_id,creator,`status`,mahjongType,cid) SELECT uid,paiju_score,paizu_score,`time`,paizu_id,seq,room_id,server_id,creator,`status`,mahjongType ,cid FROM log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd} and {$timestampStart} order by `time` desc limit 100";
                        $sql2 = "delete from log_user_paiju where UNIX_TIMESTAMP(`time`) between {$timestampEnd} and {$timestampStart} order by `time` desc limit 100";
    
                        if(empty($rs) && empty($last_rs)){
                            sleep(60);
                        }
                        if($rs){
                            if($r1=self::$mysql->query($sql1)){
                                !self::$mysql->query($sql2);
                            }else{
                                //抛出异常
                                $errorMessage =  self::$mysql -> error_no() . ": " . self::$mysql ->error();
                                throw new Exception($errorMessage);
                            }
                        }
    
                    } catch(Exception $ex) {
                        echo 'TIME:'.date("Y-m-d H:i:s")."\n";
                        echo 'TIME_START~TIME_END:'.date("Y-m-d H:i:s",$timestampStart)."~".date("Y-m-d H:i:s",$timestampEnd)."\n";
                        $msg = 'Error:'.$ex->getMessage()."\n";
                        $msg.= $ex->getTraceAsString()."\n";
                        $msg.= '异常行号:'.$ex->getLine()."\n";
                        $msg.= '所在文件:'.$ex->getFile()."\n";
                        //将异常信息记录到日志中PHP异常处理之
                        echo $msg;
                        echo "\n";
                        break;
                    }
    
                }
                usleep(3000);
            }
        }
    
    }
    

    shell脚本如下:

    #!/bin/sh
    # scripts daemon, add to /etc/crontab
    # */1 *   *   *   *   root    PATH/script.sh --daemon
    
    # run on root
    if [ "$(uname -s|grep -F 'CYGWIN')" = "" ] && [ $UID -ne 0 ]; then
        echo "superuser privileges are required to run this script."
        exit 1
    fi
    
    # settings
    PHP_CLI="/usr/bin/php -c /usr/local/php/etc/php.ini"
    SCRIPTS="PaijuLogHandler PaijuTableHandler PaizuTableHandler ClubDiamondLogHandler"
    
    # paths
    BASE_PATH=$(cd $(dirname $0) && pwd)
    BASE_SCRIPT="$BASE_PATH/script.php"
    LOGS_PATH="$BASE_PATH/data/logs/bash.log"
    
    USAGE="Usage: $(basename $0) [-d|-a|-k SCRIPT]\n\
      -d, --daemon\t\tthe daemon mode, runing checking\n\
      -a, --killall\t\tkill the all scripts\n\
      -k, --kill SCRIPT\tkill the SCRIPT\n\
      -h, --help\t\tthis help text"
    
    function get_pid()
    {
        echo $(ps -ef|grep -F "$1"|grep -v "grep"|awk '{print $2}')
    }
    
    function kill_script()
    {
        PID=$(get_pid "$1")
        if [ "$PID" = "" ]; then
            echo "$1 not found"
        else
            kill -9 $PID
            echo "$1 has been killed, pid: $PID"
        fi
    }
    
    case $1 in
        -k|--kill)
            if [ "$2" = "" ]; then
                echo -e $USAGE
                exit 0
            fi
            kill_script "$BASE_SCRIPT request/$2"
            ;;
        -a|--killall)
            for SCRIPT in $SCRIPTS; do
                kill_script "$BASE_SCRIPT request/$SCRIPT"
            done
            ;;
        -d|--daemon)
            for SCRIPT in $SCRIPTS; do
                SCRIPT="$BASE_SCRIPT request/$SCRIPT"
                PID=$(get_pid "$SCRIPT")
                if [ "$PID" = "" ]; then
                    eval "$PHP_CLI $SCRIPT >>/data/logs/scriptlog/log.txt 2>&1 &"
                    PID=$(get_pid "$SCRIPT")
                    echo "[$(date +%Y-%m-%d\ %H:%M:%S)] $SCRIPT has been down, restarted: $PID" >> $LOGS_PATH
                fi
            done
            ;;
        *)
            echo -e $USAGE
            ;;
    esac
    

    报错如下:
    TIME:2018-02-02 00:00:48
    Error:2006: MySQL server has gone away

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • :+酷::b 普通会员 1楼
      502 Bad Gateway

      502 Bad Gateway


      nginx
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部