mysql-python出现Lost connection错误

大雷子老师 2009-06-09 05:09:24
我做了个用python和mysql的程序。用python插入数据时没有错误。插入到现在一个表的记录已经有100W,现在插入还是没有问题,但在
update   (update songInfos set speed=100 where resultNumber=2295)

delete  (delete from songInfos where resultNumber=4903)
某一条记录时就出现:
OperationalError: (2013, 'Lost connection to MySQL server during query')

OperationalError: (2006, 'MySQL server has gone away')
程序在我本地的机器上跑没问题,拿到远程服务器上跑就“有时出现,有时不出现”这些错误。
我猜想是服务器上的表太大了的原因,毕竟在100W里面找一条记录。

不知道哪位高手有别的想法或是告知小弟个解决方法、这里先谢谢了,。
...全文
1061 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
yutiangongmiao 2012-07-27
  • 打赏
  • 举报
回复
楼主最后问题怎么解决的,求赐教
yutiangongmiao 2012-07-27
  • 打赏
  • 举报
回复
楼主最后问题如何解决的了,求赐教
ACMAIN_CHM 2009-06-11
  • 打赏
  • 举报
回复

看来是 mysql 4的,那就直接
set GLOBAL log=ON;
大雷子老师 2009-06-11
  • 打赏
  • 举报
回复
mysql> set GLOBAL general_log=ON;
ERROR 1193 (HY000): Unknown system variable 'general_log'
ACMAIN_CHM 2009-06-11
  • 打赏
  • 举报
回复

估计你的LOG没有打开,LOG会占比较多的磁盘空间并影响效率。

你可以 检查一下LOG是否激活,
mysql> show variables like 'general_log';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| general_log | ON |
+---------------+-------+
1 row in set (0.00 sec)


下面语句可以打开LOG
mysql> set GLOBAL general_log=ON;
Query OK, 0 rows affected (0.00 sec)

mysql>


只能先打开LOG,然后等出错的时候看一下其对应的内容。
ACMAIN_CHM 2009-06-11
  • 打赏
  • 举报
回复

那只能再看看普通日志文件 *.log 中有什么信息了。
大雷子老师 2009-06-11
  • 打赏
  • 举报
回复
没有这种.log的文件。
我说的这个错误它出现不定时,有时程序跑得很好,一个小时不错。有时候跑个5分钟就错了。
懒得去死 2009-06-10
  • 打赏
  • 举报
回复
你的查询语句如果不优化的话,加大net_buffer_length和connect_timeout,还是不行的话,就报BUG!
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
记录里没有什么有用的东西
090609 20:55:29 mysqld ended

090609 20:56:27 mysqld started
090609 20:56:27 InnoDB: Started; log sequence number 0 43695
090609 20:56:27 [Note] /usr/local/libexec/mysqld: ready for connections.
Version: '5.0.22-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
090609 21:04:06 [Note] /usr/local/libexec/mysqld: Normal shutdown

090609 21:04:06 InnoDB: Starting shutdown...
090609 21:04:09 InnoDB: Shutdown completed; log sequence number 0 43695
090609 21:04:09 [Note] /usr/local/libexec/mysqld: Shutdown complete

090609 21:04:09 mysqld ended

090609 21:04:10 mysqld started
090609 21:04:10 InnoDB: Started; log sequence number 0 43695
090609 21:04:10 [Note] /usr/local/libexec/mysqld: ready for connections.
Version: '5.0.22-log' socket: '/tmp/mysql.sock' port: 3306 Source distribution
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
这位朋友真是高手,一下子就说到了点子上。
我这里是多线程的,5个线程都在同时update / delete 操作。不过只在每个线程结束的时候操作,每个线程运行5-10秒。一个线程结束,另一个马上被创建,始终存在5个线程。
有没有什么好的解决方法?
ACMAIN_CHM 2009-06-10
  • 打赏
  • 举报
回复

在你的datadir 对应的目录中。*.err
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
那个select语句不是线程里面的。
在一个函数里面执行这个select语句,得到的结果用来产生线程。

还有,我这里怎么找不到mysql.log之类的文件?
ACMAIN_CHM 2009-06-10
  • 打赏
  • 举报
回复

5 个线程, 0.69 * 5 = 3.45 s 冲突的概率很大。

检查一下你mysql的错误日志中的信息。看看什么提示。
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
select resultNumber,realAddresses from songInfos where songNum="00365001012" and speed=0;
这一句拿到myslq 客户端里面执行:Empty set (0.69 sec)
ACMAIN_CHM 2009-06-10
  • 打赏
  • 举报
回复

selectCommand = 'select resultNumber,realAddresses from songInfos where songNum="%s"' % (songNumber)
selectCommand = selectCommand + " and speed=0"
rows = dbOper.ExeSelectComm(selectCommand)

看一下这句SQL直接在MySQL中的执行速度。
另外建议也查看一下MySQL的错误昌志中,看看有什么信息。
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
回9楼朋友:
是myisam 类型。
你的意思是不是:因为外部大量select操作把表锁住了,在update和delete 时等待时间过长,然后失去连接了?
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
线程里面的代码大致如下:
fd = None
try:
req = urllib2.Request(address)
fd = urllib2.urlopen(req)
except:
deleteCommand = "delete from songInfos where resultNumber=%s" % (resultNumber)
print "deleteCommand:",deleteCommand
dbOper.ExeOtherComm(deleteCommand)

         计算speed
if speed < 20:
deleteCommand = "delete from songInfos where resultNumber=%s" % (resultNumber)
dbOper.ExeOtherComm(deleteCommand)
else:
params = (speed, resultNumber)
insertCommand = 'update songInfos set speed=%s where resultNumber=%s' % (speed, resultNumber)
dbOper.ExeOtherComm(insertCommand)
线程外面很少时间会执行到这样一个select语句:
selectCommand = 'select resultNumber,realAddresses from songInfos where songNum="%s"' % (songNumber)
selectCommand = selectCommand + " and speed=0"
rows = dbOper.ExeSelectComm(selectCommand)
ACMAIN_CHM 2009-06-10
  • 打赏
  • 举报
回复

表是什么存储引擎? innodb 还是 myisam ? innodb支持到行锁,但 myisam 只支持到表锁。
大雷子老师 2009-06-10
  • 打赏
  • 举报
回复
不一定的,每个线程去尝试连接某一个地址,连接成功或不成功然后再去update或delete
某个线程结束后,另一个再产生。
ACMAIN_CHM 2009-06-10
  • 打赏
  • 举报
回复

[Quote]我这里是多线程的,5个线程都在同时update / delete 操作。不过只在每个线程结束的时候操作,每个线程运行5-10秒。一个线程结束,另一个马上被创建,始终存在5个线程。[/Quote]

线程中都做了些什么与数据库相关的?select 多吗?大根据结构是什么? update / delete 需要X锁,要等select 结束后释放了S锁后再执行。
加载更多回复(4)

57,065

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧