9月 23

python到mysql 2006问题解决

  tornado和Django框架都是使用MySQLdb,在长时间不与数据库有交互,如采集、SQL运行数据过大而数据库等待时间过短等,这时会报“Error 2006: MySQL Server has gone away”错误。收集了网上的三个解决方案是,
  一、修改数据库的参数wait_timeout,interactive_timeout到2880000,
  二、在每次连接时做判断,如果报错将再连接一次(http://xulizhao.com/blog/python_db)。

class DB:
    conn = None
    def connect(self):
        self.conn = MySQLdb.connect(localhost,root,pass,test)
    def cursor(self):
        try:
            return self.conn.cursor()
        except (AttributeError, MySQLdb.OperationalError):
            self.connect()
            return self.conn.cursor()

  三、定时进行连接,以防断开

from tornado.ioloop import PeriodicCallback

#torndb.Connection(host, database, user=None, password=None, max_idle_time=25200, connect_timeout=0, time_zone='+0:00')
db = torndb.Connection(db_ip, db_database, db_user, db_pass, db_conn_time)
# https://github.com/felinx/poweredsites/blob/master/poweredsites/db/mysql.py
# ping db periodically to avoid mysql go away
PeriodicCallback(db.query(show variables), 3600*4*1000).start()

我的测试,第一种方法比较好用,但是在某些情况下会造成其它问题。第三种效果不理想,需要继续研究。第二种正在试验中。

5月 29

post数据到golang服务和python的pypy服务后数据入库库效率测试

  在测试go语言和pypy接收post参数后,数据入库的效率。服务器使用阿里云的基础服务器,512内存单核CentOS6.3 64位服务器。测试还有上传文件部分。此处只列出了部分代码。
  python使用tornado在pypy1.9环境,python代码没有列出。
  go语言代码如下。数据库配置部分写成可以全局调用的。

package main

import (
	"fmt"
        "database/sql"
        _ "github.com/go-sql-driver/mysql"
	"net/http"
)

func mydb()*sql.DB {
    //配置数据库连接地址
    db, e:= sql.Open("mysql", "test:1111111@tcp(192.168.1.130:3306)/test?charset=utf8")
    checkErr(e)
    fmt.Println(db)
    return db
}

func checkErr(err error) {
    if err != nil {
        panic(err)
    }
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {
        //用于获取插入数据的表id
        var get_id string
	if r.Method == "POST" {
            r.ParseForm()
	    //获取获得的参数
	    get_time:=r.FormValue("time")
            get_mac:=r.FormValue("mac")
            get_md5:=r.FormValue("md5")
	    //插入数据
            stm, e := mydb().Prepare("INSERT INTO `video` set mac=?, md5=?, createDate=?")
            checkErr(e)
            result,e:=stm.Exec(get_mac, get_md5, get_time)
            checkErr(e)
	    //获取插入后数据的id
            id,e:= result.LastInsertId()
            checkErr(e)
	    //返回给客户
            get_id = fmt.Sprint(id)
            context := "Insert id:" + get_id
	    w.Write([]byte(context))
        }
}

func main() {
     http.HandleFunc("/", IndexHandler)
     http.ListenAndServe(":8899", nil)
}

  测试结果:单进程情况下,go语言的速度比pypy的稍慢,基本持平相差不到5%。但是go使用内存量占到45%,cpu使用8%左右。pypy使用内存20%,cpu使用在5%左右。如果多进程pypy可以启动4个,go只能启动两个。这样pypy比go的处理速去应该快一倍多。java代码也有测试,使用tomcat7,因为逻辑更复杂,所以不能参加对比,粗略估计go会比java快40%。
测试代码

4月 18

监控mysql从机同步状态脚本

  mysql数据库主从运行。为了知道从机的同步情况,写了个脚本,放在crontab中,如果同步出错,则邮件报警。去年写的,放上来做个备忘。

#!/usr/local/bin/python
# -------------------------------------------------------------------------------
# Filename:    .py
# Revision:    1.0
# Date:        2012-03-20
# Author:      simonzhang
# Web:         www.simonzhang.net
# Email:       simon-zzm@163.com
# -------------------------------------------------------------------------------
import os
import pexpect
import time
import smtplib
from email.mime.text import MIMEText

#### base se
mysql_bin = '/mysql5/bin/mysql'
mysql_user = ''
mysql_pass = ''
mail_host = 'smtp.exmail.qq.com'
mail_user = 'XXX@XXX.net'
mail_pwd = 'XXXX'
mail_to = "xxxxx@xxx.com"
####

def mail_warn(error_ip):
    content = 'IP %s mysql slave is error!'%error_ip
    msg = MIMEText(content)
    msg['From'] = mail_user
    msg['Subject'] = 'mysql warnning %s'%error_ip
    msg['To'] = mail_to
    try:
        s = smtplib.SMTP()
        s.connect(mail_host)
        s.login(mail_user,mail_pwd)
        s.sendmail(mail_user,[mail_to],msg.as_string())
        s.close()
    except Exception ,e:
        print e

def main():
    status = os.popen("%s -u%s -p%s -e 'show slave status\G'"%
                      (mysql_bin,mysql_user,mysql_pass)).read() 
    io_status = status[status.find('Slave_IO_Running: ')+18]
    sql_status = status[status.find('Slave_SQL_Running: ')+19]
    if (io_status == 'Y') or (sql_status == 'Y'):
        ip = os.popen("/sbin/ifconfig|grep 'inet addr'|awk '{print $2}'").read()
        get_local_ip = ip[ip.find(':')+1:ip.find('n')]
        mail_warn("%s"%get_local_ip)

if __name__ == "__main__":
    main()
12月 09

raspberry pi安装 java mysql tomcat

  raspberry pi安装 java mysql tomcat。开始用oracle通的arm进行安装但是遇到了问题没有成功。后来还是采用apt-get安装,还是非常简单
$ sudo apt-get install openjdk-7-jdk mysql

版本如下:
Server version: 5.5.28-1 (Debian)
java version “1.7.0_07”

  tomcat也能直接安装,但是出于需要,还是直接到apache上下载。解压,默认配置启动。能看到可爱的小猫了。

rp tomcat

raspberry pi 安装tomcat

  查看配置源
$ vim /etc/apt/sources.list

  通过到源上查看haproxy、nginx、apache2、squid、tomcat7、cacti、nagios、snmp、redis、rsync、samba、python、php、lua、node.js等应有尽有,直接用工具安装非常方便。以后不再用考虑环境准备工作了。下一步开始准备做点实用的东西。

  对于要用桌面系统要还需要安装字体等
中文字体
$ sudo apt-get install ttf-wqy-microhei
输入法
$ sudo apt-get install scim scim-pinyin
音频驱动:
$ sudo apt-get install alsa-utils

9月 08

go语言连接mysql成功

  go语言取mysql数据。之前的测试并没有成功,也没有找到原因,但是今天编译了一下又成功了,具体修改了哪里我也忘了。赶紧做个记录。敏感信息已经隐藏

  获得go语言的mysql驱动
go get code.google.com/p/go-mysql-driver/mysql
也可以
驱动安装
go get github.com/go-sql-driver/mysql
go install github.com/go-sql-driver/mysql

2013-5-27修正:该mysql驱动被移到git以后使用“$ go get github.com/go-sql-driver/mysql”
项目里调用为“import _ “github.com/go-sql-driver/mysql””

源码如下:

package main

import ("database/sql"
         _ "code.google.com/p/go-mysql-driver/mysql"
        "fmt")

func main() {
    db, e := sql.Open("mysql", "simon:zhang@tcp(127.0.0.1:3306)/simonzhang?charset=utf8")
    if e != nil {
        print("ERROR")
        return
    }
    println("Conn DB OK")
    rows, e := db.Query("select user,passwd from user")
    if e != nil {
        fmt.Print("error:%v\n", e)
        return
    }
    if rows == nil {
        print("Rows is nil")   
        return
    }
    for rows.Next() {
        var u,p string
        err := rows.Scan(&u,&p)
        if err != nil {
            print("Row error!")
            return
        }
        fmt.Println(u," ",p)
    }
    println("WIN!")
}

运行结果