标签 MySQL 下的文章

DigitalOcean 512MB小内存主机MySQL服务经常崩溃的原因

这段时间在DigitalOcean上面的Web服务器架设好了。但是过几天发现网站频繁的出现WordPress报错:“数据库连接失败”。SSH登录上服务器发现MySQL服务已经停了。重启MySQL service mysql restart 之后过几天又出现了同样的问题,网站服务访问,显示“数据库连接失败”。看来每次手动重启MySQL不是个办法,必须找到出错的原因。

首先考虑既然是MySQL出的问题,我就修改配置文件,把MySQL错误日志打开,一般出错,日志里面应该有我需要的报错详细信息。修改 /etc/mysql/my.cnf

[mysqld_safe]
log-error=/var/log/mysql/tunps.com.err
[mysqld]
log-error=/var/log/mysql/tunps.com.err

加入log-error指定错误日志文件路径。过了几天网站又打不开了,赶紧的查看 /var/log/mysql/tunps.com.err 文件

141222 20:08:50 [Note] Plugin 'FEDERATED' is disabled.
141222 20:08:50 InnoDB: The InnoDB memory heap is disabled
141222 20:08:50 InnoDB: Mutexes and rw_locks use GCC atomic builtins
141222 20:08:50 InnoDB: Compressed tables use zlib 1.2.7
141222 20:08:50 InnoDB: Using Linux native AIO
141222 20:08:50 InnoDB: Initializing buffer pool, size = 128.0M
InnoDB: mmap(137363456 bytes) failed; errno 12
141222 20:08:50 InnoDB: Completed initialization of buffer pool
141222 20:08:50 InnoDB: Fatal error: cannot allocate memory for the buffer pool
141222 20:08:50 [ERROR] Plugin 'InnoDB' init function returned error.
141222 20:08:50 [ERROR] Plugin 'InnoDB' registration as a STORAGE ENGINE failed.
141222 20:08:50 [ERROR] Unknown/unsupported storage engine: InnoDB
141222 20:08:50 [ERROR] Aborting

发现如上内容。Fatal error: cannot allocate memory for the buffer pool。看来是申请内存失败。网上搜索发现很多人都出现过这个问题。一般会出现在内存较小的VPS主机上。比如我这台主机只有512MB的内存。解决方法是利用Linux的swap交换分区虚拟部分硬盘当内存来使用。具体操作步骤如下

  1. dd if=/dev/zero of=/swapfile bs=1M count=1024

  2. mkswap /swapfile

  3. swapon /swapfile

  4. /etc/fstab 文件新建一行写入 /swapfile swap swap defaults 0 0

这样一个1GB的swap分区就建立成功了,重启MySQL,以后MySQL服务运行得很稳定,再也没有无故停止过。

MySQL查询某字段有相同内容的记录

SELECT DATE, COUNT( DATE ) 
FROM tunps.com
GROUP BY DATE
HAVING (
COUNT( DATE ) >1
)

以上SQL语句查询tunps.com表里面DATE字段有相同内容(记录数>1)的记录。

MySQL delete from select

mysql 中delete from select * from tbl后面不能有where条件,如果必须删除有where条件的select出来的结果,可以在外面再包裹一层select。

delete from `jq_posts` where ID in (select ID from 
(
SELECT p.* FROM `jq_posts` p    
inner join `jq_term_relationships` r on p.ID = r.object_id
inner join `jq_term_taxonomy` t  on r.term_taxonomy_id = t.term_taxonomy_id 
and t.taxonomy = 'post_format' 
) t  )

mysql去掉隐藏的换行符号

update tb1 set test1= replace(test1 ,"\n\r","")
update tb1 set test1= replace(test1 ,"\n","")
update tb1 set test1= replace(test1 ,"\r","")

\n也可以是用char(10)代替,\n可以用char(13)代替。winhex下0A0D就是换行。

0A是LF(NL line fee, new line)

0D是CR(carriage return)

如果说有换行,输入被调用到js代码中,js是不会忽略换行的,所以js报错:

mysql source命令导入乱码

环境:winxp/mysql 5.5.8

mysql -uroot -pxxxxxx
use testdb;
source d:/www/testdb.sql

导入很慢,每个row,都有6个warnings。

所有中文全部是问号(乱码)

查看了testdb.sql,发现create table语句后面没有设置default charset,

create table `tb1` (
`col1` varchar (45),
)ENGINE=MyISAM DEFAULT CHARSET=utf8; 

成功导入!且速度很快。