Browsed by
Tag: mariadb

parseInt

parseInt

云通信系统的用户偶尔向我们反馈,分机的状态显示总是离线状态。我们从后台检查状态是正确的,检查其他用户的分机状态也都很正常,但是这位用户查询的结果确实总是离线状态。这事颇有些蹊跷,引起了我很大的兴趣去研究发生了什么。

检查之后的结果也很简单。后台返回的状态数据是字符串形式,而前端 javascript 脚本是按照整数进行判断,自然无法正常显示状态。但是为什么有些又能正确显示呢?

进一步检查后发现这与 MySQL 数据库的版本有关。我们的云系统有很多服务器,都是采用 Debian 的系统,同时也是采用 Debian 默认自带的数据库。旧 Debian 系统中的 MySQL 数据库版本比较陈旧,返回查询结果时都是采用字符串格式,哪怕字段是整数类型,返回的结果也是转换成字符串。而新的 Debian 系统已经将默认的数据库替换成 MariaDB,返回结果时严格遵循字段的类型,不会进行这类转换。

用户的虚拟通信系统部署在不同的 Debian 节点上,返回查询结果时就存在上述转换方面的差异。

解决方式自然也不复杂。可以从服务器端解决,也可以从前端解决。服务器端升级 Debian 系统就会同时将数据库升级到 MariaDB,自然就能返回整数类型的结果。当然也可以从 PHP (包括 pdo层)解决,由 PHP 对查询结果强制进行转换,将字符串又转换成整数即可。但是出于稳定性方面的考虑,我们一般不太愿意直接升级服务器系统(包括 PHP 等中间层),各节点的升级总是按年制定计划,不太可能为了这样一个小问题兴师动众地升级系统。

因此最后的解决方案就是对前端 JavaScript 脚本做一点修改。JS 提供了 parseInt 函数进行转换(如果是浮点数就是 parseFloat),无论服务器返回的是字符串还是整数,经转换后都可以按照整数进行判断。

此事反映出(1)我们对web、数据库等方面的技术技能比较欠缺,缺乏足够理解;(2)测试范围不够广泛,没有涵盖所有的用户类型;(3)系统配置不够一致,存在新旧并存的现象。我个人觉得后续工作要着力解决第(3)点的情况,尽量做到(包括开发、测试、线上)只有一个版本、只有一种系统。

MariaDB初步

MariaDB初步

基本上与mysql数据库是完全兼容的,各项命令以及库的名字都与mysql相同。当然目前还没有深度应用,不知道在库、api等方面是否完全兼容。

启动数据库:

service mysql start

修改root用户密码:

mysqladmin -u root password "xxxx"

将数据库加入自动启动列表:

chkconfig --add mysql            <-- Redhat/CentOS/openSUSe
或者 update-rc.d mysql defaults   <-- Debian/Ubuntu

访问数据库:

mysql -u root -p
远程访问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数据库了。

2018-09-29 更新, Debian 9之后又有了很多变化:

最大的变化莫过于MariaDB正式替换了MySQL,当然mariadb的各项操作、库(尤其是基本的操作和基本库)与MySQL还是保持兼容。同时,配置文件变更为 /etc/mysql/mariadb.conf.d/50-server.cnf。

在完成上述那些操作后,在其他用户的shell里,使用root账号登录MariaDB,会提示以下信息:

ERROR 1698 (28000): Access denied for user ‘root’@’localhost’

而直接在root用户的shell里登录是没有问题的。这种情况下,root要登录进MariaDB后,选择“mysql”数据库,然后

update user set password=password('1234') where user='root' and host='localhost';

此时设置从本机登录时,root用户的密码。

update user set plugin='' where user='root';
flush privileges;

清除root用户的plugin字段,允许root用户从其他shell里登录。

另外要注意的是,重新启动MariaDB,命令也有变换,采用 systemctl 进行操作:

systemctl stop mariadb.service
systemctl start mariadb.service