问题背景

看过CI框架用法应该会看到,在配置CI框架连接数据库时,默认会开启持久连接,即类似这样的配置$db['test']['pconnect'] = TRUE;,使用MySQL时会调用mysql_pconnect方法实现这一个功能,而oci8扩展恰巧也有类似的方法oci_pconnect:

oci_pconnect

方法的用处文档上说的很清楚:

oci_pconnect() 创建一个到 Oracle 服务器的持久连接并登录。持久连接会被缓冲并在请求之间重复使用,可以降低每个页面加载的消耗。

那么按道理来说这样的功能应该是会提升处理能力的,但是问题在于,持久连接会增加Oracle的进程数,一旦进程数耗尽,那么新的连接请求可能会被拒绝,反而会使得处理能力下降。

今天遇到了这样的一个问题,当双机各自开启1024个php-fpm进程时,使用sqlplus连接数据库被拒绝,同时各种操作都被拒绝执行。

阅读全文 »

昨天下午组里的同学跟我说数据库不能更改字段了,原本这台CentOS的机器工作很久都还还算正常,于是过去看了一下,发现MySQL在执行SQL之后报错,类似:

1
Cant't create table #xxxxxx, Errno 28

即提示错误码为28,告知用户无法创建表格。

错误码28第一反应就是磁盘空间不足,之后查看了df -hl查看了磁盘空间,发现MySQL所在的分区挂载的磁盘空间余量还有70%之多,之后查看是否是因为/tmp目录已满(即my.cnf中配置的tempdir)导致的,结果发现/tmp挂载的分区也有不少剩余空间,最后一想是不是有可能是inode已满导致的无法创建新文件的问题,使用df -i查看inode使用情况,发现inode使用已经达到了100%。

既然如此,那么整个事情也就明了了,磁盘空间已满不仅仅是物理空间上的已经使用完毕,也包括inode的使用情况,inode个数使用完毕之后,就不会有空间留给新文件用于记录文件信息了,自然也就不能创建文件了。关于inode,可以阅读阮一峰老师的《理解inode》这篇博文,清晰易懂。

解决问题的话,自然是要找到用尽inode的元凶,一般来说,小文件过多都是引起这个问题的主要原因。检查了这台数据库机器的进程,发现居然有有一套PHP在运行,查看了下php.ini之后,发现session的配置上,目录层级很深,运行了这么长的时间,session文件已经多到让人无语的程度,那么剩下的事情就好解决了,因为这台机器当前的服务不需要session的支持,直接干掉全部session文件即可。

小结一下,当MySQL出现28的错误码的时候,可以考虑:

  1. 检查磁盘空间
  2. 磁盘空间足够,检查临时目录空间大小
  3. 检查inode是否还有剩余

不得不说,这个事情并不是第一次看到,那么下次再出现磁盘无剩余空间,可以再看看是不是inode已满。

最近想要做一些实验,无奈自己手头上没有富余的机器,看到好几个同事都自带电脑,没有用公司发的台式机,于是打算用这些台式机来做做实验。

阅读全文 »

CI框架算是个人最喜欢的PHP框架之一,易用性上没的说,还有完备的中文文档,不过大多数时候是搭配MySQL一起使用。

不过最近接触的一个项目使用的是Oracle 11G数据库,开发前给大家搭环境的时候发现连接有一些问题,主要来说是安装配置上的一些问题。

阅读全文 »