标签归档:MySQL

MySQL Errno 28解决方案

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

即提示错误码为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已满。

MySQL的简单使用笔记:增加实例以及启动

MySQL的简单使用笔记:增加实例以及启动

增加实例

增加实例这里指的的在源码编译安装完MySQL之后建立一个初始的数据库实例,占用某一端口,或者是使用新端口启动新的mysqld进程。

MySQL需要一些基础的数据库以及表来完成基本的设定,比如控制连接的mysql.user表:

在编译完成MySQL之后这些表是不存在的,需要通过安装目录下的script/mysql_install_db完成基础表的安装工作。

在这个脚本中完成安装工作所需要的参数至少需要如下几个:

  • basedir MySQL的安装目录
  • datadir MySQL实例的数据文件目录,比如数据库文件、socket文件等
  • user 安装MySQL时的设定的用户名

通过执行这一脚本,例如:

即完成了对MySQL的初始化操作,即完成了一个数据文件位于/usr/local/mysql/mysql_data/ 的数据库实例,通过使用不同的端口和目录,完成新增一个数据实例的工作。

启动

启动MySQL可以通过MySQL安装完成的mysqld_safe工具完成。

mysqld_safe脚本是推荐的启动MySQL的方式,其中特点是增加了一些安全保证的机制比如遇到错误重启并且写入日志(参数中的log-error指定位置)。

比较重要的个人认为是:

  • default-file 默认配置文件位置,如果使用这个参数,会通过默认文件获取配置,需要注意的是,如果需要使用,这个参数必须要放在第一个参数才能生效
  • basedir MySQL安装目录
  • datadir MySQL数据库的数据目录
  • user MySQL安装时配置的用户
  • pid-file pid文件位置
  • port 监听端口
  • socket 响应本地MySQL连接请求的socket文件位置

所有的参数事实上都会传送给mysqld,如果在配置文件(假设是/usr/local/mysql/my.cnf)中指明了MySQL的一切,则只需要使用简单的一句:

即可启动,同时也可以在参数中补齐缺失的项目。

后期计划整出一份MySQL启动所需最小配置参数列表。

其他

新增的数据库实例以及忘记密码的情况下需要通过mysqladmin工具完成密码的设定,需要指定数据库的数据socket连接文件位置以及用户名以及新的密码,例如:

还可以带上主机名:

以上。