Browsed by
标签:mysql

DigitalOcean小坑

DigitalOcean小坑

DigitalOcean是我个人非常喜欢的云计算服务商,我们在部署自己的网站、云通信系统、向客户推荐等各种情况都会采用DO(以及Linode,另一个非常优秀的云计算服务商)。

绝大多数情况下,DO节点运行非常快速、稳定,然而有时候也有意想不到的情况发生。最近我们发现一个节点的服务突然中断了,经检查后发现是MySQL数据库异常退出,错误原因是内存分配不足。以前从未发生过这种情况,简单对比后发现这个节点是个小内存节点,只有512M内存(通常我们都为生产环境节点配置2G内存)。我们认为这个节点的MySQL数据库不应该占用太多内存,即便512M内存不够,加上SWAP的支持也应该足够了。

然而分析该节点信息,惊讶地发现DO默认居然没有分配SWAP区(与之对比的是,Linode可以在创建节点时指定SWAP分区)!

检索了DO的文档,对这种情况的解释是建议采用更多内存的节点,SWAP做缓存会拖慢系统,并可能影响其他用户。原则上这点没错,如果频繁发生内存不够的情况,的确应优先升级节点,采用更多内存。然而,如果仅仅是在尖峰时刻偶尔少量内存不足,采用SWAP过渡一下完全合理。

更重要的是,即使SWAP相对而言慢一些,但相比程序crash而言,一个慢点但是稳定的系统显得更合理。同时考虑到DO采用SSD硬盘,速度可以接受,因此我们手工增加了2G的SWAP设置。事实证明,内存在忙时实际只少了1M,用SWAP来应对这1M内存的需求,相当合理。

在DO节点增加SWAP很容易,请点击这里了解细节。文档是基于Ubuntu 14.04,我们的节点是Debian 8,按照这篇文档的介绍,也能设置成功。

定时自动备份MySQL数据库

定时自动备份MySQL数据库

网上搜索的一些文章或者脚本, 在Ubuntu/Kubuntu中似乎都有这样或者那样的问题, 经过一番摸索后, 以下方式是可行的.

step1: 创建定时任务, 例如在早上1:30备份数据库. 编辑/etc/crontab文件, 添加内容:

30 1    * * *   root    sh  /home/yxh/cronDayBackupMySQL.sh

step2: 创建shell脚本cronDayBackupMySQL.sh. 要非常注意脚本中的标点符号(不得不说, shell脚本是怪折磨人的)

#!/bin/bash
currDateStr=`date +%Y%m%d`
mysqlBackFileName=mysql${currDateStr}
mysqldump -u root -p db_yxh --password=1234 | gzip > /var/backups/$mysqlBackFileName.sql.gz

其中, 数据库是db_yxh, 数据库root用户密码是1234, 备份的sql文件压缩存放在/var/backups目录下.

解压缩gz文件也很简单, 直接试用gzip即可:

gzip -d xxx.gz

 

MySQL诡异的问题

MySQL诡异的问题

一直在本机(kubuntu)上调试和运行MySQL数据库,工作状况良好。某次重启后,再用mysql客户端连接server时,居然出现以下信息:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

检查了一下/var/run/mysqld目录,没有发现任何文件。使用命令ps -A | grep mysql,居然没有发现mysqld进程! mysql居然没有启动!

重新启动mysql服务器(sudo service mysql start)失败,检查/var/log/mysql/error.log,发现mysql启动时crash,不明所以。

后来google了N个帖子后,按照某个帖子的建议,修改/etc/mysql/my.cnf文件,注释掉其中的bind_address行,重启mysql居然就成功了。

可是以前一直工作得很好,没有做过任何改动,诡异啊。

修改MySQL表中字段的缺省值

修改MySQL表中字段的缺省值

网上搜了一下,居然有推荐“先删除字段,再重新添加字段”的做法。如果该字段原来有一些非缺省值的记录,岂不是就丢失了吗? 这真是一点都没有爱啊。

比较有爱的做法是:使用MySQL提供的alter table语句对字段直接进行修改。

例如对tbl_local_users表中的moMaxCalls字段修改缺省值为1,可以采用以下语句:

alter table tbl_local_users modify moMaxCalls int default 1;
MySQL与幻象读

MySQL与幻象读

最近在部署系统的过程中,发现MySQL的一点问题,进行简单总结。

实际上就是关于事务隔离级别以及幻象读的问题。

我们的程序分成两个部分:UI层以及Service处理层。UI层使用MySQL的C库接口创建连接;Service层采用Python的MySQLdb您(底层仍然是MySQL的C接口)创建连接。

因此,实际上会与MySQL创建两个连接。

在windows环境中,如果我们通过UI修改了MySQL的数据,我们发现在service层查询时,还是以前的数据,而不是commit之后的数据。

采用Ubuntu系统下的MySQL时,没有这个问题。UI修改了MySQL数据后,Service能立刻查询到最新的结果。

我们发现,Ubuntu下的MySQL(5.1.49-1ubuntu8.1 (Ubuntu))版本较旧,采用MyISAM引擎。而Windows环境下的MySQL(5.1.53-community MySQL Community Server (GPL))较新,采用InnoDB引擎。将Windows环境下的MySQL强制指定为MyISAM时,问题也能解决,不再出现幻象读。

使用下述命令查询了Ubuntu和Windows的配置,都是REPEATABLE-READ:

SELECT @@tx_isolation;

SELECT @@global.tx_isolation;

判断,InnoDB的事务处理级别REPEATABLE-READ还是会出现幻象读。在程序中强行将session级的处理修改为READ-COMMITTED后,问题也解决,不再出现幻象读。

set session transaction isolation level read committed;

这个似乎与网上的资料有些不一致,据说REPEATABLE-READ不会出现幻象读,而READ-COMMITTED级别才会出现。实际结果是相反的。

另外,就我们的应用来说,select操作多于insert/update操作,而且数据量不大,因此MyISAM比InnoDB更适合我们的应用,可惜高版本的MySQL将缺省引擎给换成InnoDB了。

MySQL 5.5.8安装过程中的小问题

MySQL 5.5.8安装过程中的小问题

德国的一个客户反馈callingCard业务有点问题,查了半天,没找到原因。在我们的环境上一切都很正常,而在他的环境上,很容易就失败了。我们推测是不是MySQL数据库不匹配?因此决定也安装最新的MySQL 5.5.8版本测试一下。

按照以往的惯例,我们在安装时指定允许root从远端接入数据库。可是在最后的配置过程中,总是提示失败,是某个field没有default value。

这确实很奇怪啊,以往从来没有遇到这样的问题。我们重新卸载、安装,此时不再允许root从远端接入数据库,则配置过程一切正常。

5.5.8版本和以前有另外一个不一样的地方,在windows的程序启动菜单中,没有了命令行窗口的快捷方式了。需要手工打开dos窗口,然后进入MySQL安装目录下的bin子目录,运行mysql -u root -p来登录MySQL数据库。

号称5.5.8比前任版本在各方面有极大的飞跃,这个我们不得而知。不过,在我们的环境中,切换到5.5.8环境后,结果仍然是正常,开起来客户的问题可能是其他方面的啊。

远程访问MySQL数据库

远程访问MySQL数据库

Linux版本的MySQL数据库缺省不允许从远程访问(Windows版本在安装时可以进行选择),因此我们需要简单修改一下来放开这个限制。

通过软件中心安装MySQL,这没有什么好介绍的。网上有些这方面的介绍,不过中文版本的基本上都有些错误,估计大部分都只是转载,作者并没有真正尝试。

以下步骤基于Ubuntu版本。

step1:mysql> grant all privileges on *.* to 'root'@'%' identified by '1234';

其中,‘1234’是指密码,‘root‘是指远程访问的账户名。’%’是指允许从任何一个远程计算机访问。’*.*’是指所有数据库、所有表。

step2:mysql> flush privileges;

step3:修改/etc/mysql/my.cnf文件,注释掉以下行:

bind-address     = 127.0.0.1

step4: 重启MySQL服务

sudo service mysql restart

完成上述步骤后,就可以用root账户,以‘1234’为password,从任何一个远端计算机上登录并访问MySQL数据库了。

MySQL查询结果中去掉重复的值

MySQL查询结果中去掉重复的值

一个简单的应用,查询数据库中的用户名,同时去掉其他重名的用户。测试数据库如下:

mysql> select name from demo;
+———+
| name    |
+———+
| yxh     |
| yxh     |
| default |
+———+

查询时,只要限定关键词‘distinct’即可,例如:

mysql> select distinct name from demo where name != ‘default’;
+——+
| name |
+——+
| yxh  |
+——+
1 row in set (0.02 sec)

MySQL一二三

MySQL一二三

开始使用MySQL

以下操作基于Fedora系统:

检查系统中是否已经安装了mysql相关的包:
rpm -qa |grep mysql -i

初始化数据库
/usr/bin/mysql_install_db

启动数据库
service mysqld restart

修改用户密码(需要先启动数据库):
mysqladmin -u root password ‘12344321’

登陆数据库
mysql -u root -p
系统提示会提示输入密码。

数据库目录:/var/lib/mysql
配置文件: /usr/share/mysql

在Ubuntu系统中,安装和使用MySQL也非常简单:

(1)安装MySQL

sudo apt-get install mysql-server

安装完成后,Ubuntu会弹出简单的对话框配置root的口令。

(2)启动(重启动)MySQL

sudo service mysql restart