Building the Coming Soon

关于

HFLS aka the Akademia 12′, then NUST 16′, HKU 18′, now a Blue.

2015

非调试模式下查看MySQL过程代码

10/20/2015

添加MySQL过程时间长了,难免会有需要查看过程代码的情况。比如Kaijia有一个过程自动清理数据库中大于指定时间的分区,这次Kaijia把这个指定的时间忘了,于是想通过查看过程的代码找回这个设定的时间。

根据MySQL文档,可以使用“SHOW PROCEDURE CODE”语法查看过程和自定义函数的代码,但Kaijia在执行此语法时却遇到了以下错误:

mysql> SHOW PROCEDURE CODE Kaijia的过程;
ERROR 1289 (HY000): The ‘SHOW PROCEDURE|FUNCTION CODE’ feature is disabled; you need MySQL built with ‘–with-debug’ to have it working

阅读此语法的文档Kaijia找到了相关提示:此扩展仅在编译时开启了调试模式的服务器中可用(This statement is a MySQL extension that is available only for servers that have been built with debugging support.)。而考虑到除了MySQL开发外,一般情况下使用的由软件包管理器(YUMAPT-GET)提供的MySQL预编译版均没有开启编译模式,这条命令对广大开发者和系统管理员来说基本上是没法用的……

阅读更多

重新生成SSH服务器端密钥方法

09/20/2015

理论上来说,每次安装服务器时SSH密钥(SSH Host Key)都是自动生成的,而生成出相同密钥的概率接近于0,这样避免了中间攻击等情况。但是,就是存在以下情况使得两台SSH密钥相同:

  • 在虚拟化技术中克隆了一台虚拟机;
  • 将原来的虚拟硬盘复制后新建虚拟机运行。

当然还有其他更加坑爹的情况,比如Kaijia碰到的VPS云服务器重装系统复制完模板数据后不重新生成SSH密钥的(某国内主流云提供商……),于是整个云平台所有的VPS都跑着相同的SSH密钥,如果要实现中间攻击只需要新建一台云就能获得私钥了。正是因为碰到了这种云主机,Kaijia研究了一下如何重新生成SSH服务器端密钥。

阅读更多

无法初始化前端界面Dialog工具问题解决

09/18/2015

其实这个问题Kaijia还碰到很久了,而且搜了一下网上并没有相关的中文资料,所以还是记录一下,希望可以帮之后遇到相同问题的朋友节省时间。

Kaijia之前在一些安装有精简版Ubuntu 14.04模板(例如ubuntu-14.04-x86_64-minimal)的OpenVZ VPS上使用apt-get安装软件时经常碰到以下提示:

debconf: unable to initialize frontend: Dialog
debconf: (No usable dialog-like program is installed, so the dialog based frontend cannot be used. at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: falling back to frontend: Readline

或者在中文Locale下面:

debconf: 无法初始化前端界面:Dialog
debconf: (没有安装任何可用的对话框类程序,所以无法使用基于此种形式的界面。 at /usr/share/perl5/Debconf/FrontEnd/Dialog.pm line 76.)
debconf: 返回前端界面:Readline

由于这个错误提示并不会影响安装,于是Kaijia一开始也没有在意。

阅读更多

Intellij IDEA系列软件保留空行缩进避免自动删除方法

09/17/2015

自从Kaijia申请到JetBrains的学生优惠开始用Intellij IDEA系列的软件就感觉再也回不去Netbeans了,这一系列在整体性能,尤其是在代码自动完成这个功能上要比Netbeans领先起码一两年。现在Kaijia已经将几乎全部的代码迁移到了Intellij IDEA系列中。不过随之而来的一些小问题也出现了。

在Netbeans中,默认所有的空行都是保留缩进的,缩进的量根据上下文的缩进量确定。而在Intellij中,默认所有的空行都是没有缩进的,所有增加的缩进Tab都会在文件保存时被自动删除。这样设置确也有好处,比如统计行数时不需要考虑Tab和空格、在nano中显示时可以避免绿色条柱等等,但是对于以往在Netbeans中编辑的项目,迁移到Intellij后,这些使用习惯的改变势必会对原有的开发规范造成影响。

Kaijia就经常需要用其他软件手动去增加缩进。在Intellij的设置里面搜索了一下发现控制此行为的选项粗看只有“Keep indents at empty lines”(空行保留缩进)一项,激活这一项后实际上并没有效果,缩进只会在光标所在的行被保留;光标移开到其他行后,只要按下强制保存键(Ctrl+S),原来空行的缩进立马就被删除了。

阅读更多

WordPress管理员权限“提请审批”无法发布文章问题解决方法

09/07/2015

之前Kaijia一个WordPress站点安装了一个神一般的插件(具体造成错误的代码怎是没空找就不点名了……)后突然之间所有的帐号均无法发布文章了,并且自动保存等功能也不可用。即使Kaijia使用管理员帐号登录发布文章仍然显示“提请审批”,并且无法显示状态、公开度信息,点击“提请审批”之后会弹出错误提示页面不存在。其他的功能,例如下载等,也无法添加。

正常情况编辑文章右栏(左侧)和Kaijia遇到的异常情况(右侧)比较

正常情况编辑文章右栏(左侧)和Kaijia遇到的异常情况(右侧)比较

Kaijia很快排除了权限系统出错的可能性,因为Kaijia登录的是管理员帐号,管理员权限与权限系统平行,始终获得所有权限,使用诸如User Role Editor等插件调整权限系统均不会管理员权限造成影响。

阅读更多

SSH Channel“open failed: connect failed: Connection timed out”问题解决

09/07/2015

在Hyper-V的虚拟机里面运行Linux网络性能果真要比KVM差一些,当然此间原因很多:驱动、NAT转换效率等等。这次Kaijia遇到的大量“open failed: connect failed: Connection timed out”问题,最后看来也是连接性能原因。

Kaijia用SSH转Socket连接到不同地区的IP,然后进行检测和数据采集,同时所有连接同时有流量传输,一开始一切正常,但是Socket运行时间久后就会慢慢出现“open failed: connect failed: Connection timed out”错误提示。于是Kaijia开启调试模式分析了一下错误信息,看到了很多类似以下的信息:

debugx: channel x: open confirm rwindow ?? rmax ??
channel x: open failed: connect failed: Connection timed out
debugx: channel x: free: direct-tcpip: listening port xxxxx for xxx.xxx.xxx.xxx port 80, connect from 172.16.1.xxx port xxxxx to 172.16.1.xxx port xxxxx, nchannels x
debugx: channel x: zombie
debugx: channel x: garbage collecting
debugx: channel x: read failed
debugx: channel x: close_read
debugx: channel x: input open -> drain
debugx: channel x: ibuf empty
debugx: channel x: send eof
debugx: channel x: input drain -> closed

结合错误提示,网上搜了一些,很好理解即连接在允许的时间内没有收到任何信息,于是发送了EOF结束,返回了连接超时错误,因此可以说是连接的性能问题。根本上解决问题是比较困难的,涉及到很多方面因素,比较现实的解决方法便是延长等待时间,避免连接超时(Timeout)以增加收到数据包的概率。

阅读更多

MySQL命令行操作限定单个数据库方法

09/06/2015

写这篇文章的原因出自Kaijia一次被Stack Overflow坑的经历,回头看来虽然Stack Exchange的Peer Review机制很好,但是错误照样还是很多的,以及Kaijia提交了Edit被Peer Review拒绝了……

之前某个插件神不知鬼不觉地删除了所有WordPress数据表的主键和自增,导致系统出现异常,如果手动恢复的话要处理近30余张主键规则不同的表非常麻烦,于是Kaijia决定采用数据恢复的方式,即先将现有数据导出并删除表,再导入数据库备份重建表结构,再将现有数据导入。这样一来数据是现有的数据,表结构是损坏前的正确结构完成修复。

按照这个步骤下去,第二步是导入备份,但是Kaijia的数据库备份是全数据库整盘备份,单个SQL文件里面包含了所有数据库的数据,而本次恢复涉及单个数据库,不能影响其他数据库。之前没有类似经验无从下手,于是Kaijia搜索了下找到了此篇Stack Overflow问题《Can I restore a single table from a full mysql mysqldump file?》,高票回答是使用sed命令(完全正确),但是显然没有后面的正面回答(后来证实是坑)方便。后面回答的要旨非常简单:

mysql命令最后加上指定的数据库名便可以了!这不科学!但鉴于此答案有还有人点赞,还有人评论“This is what most people need.”于是Kaijia就尝试了……结果果真其他的数据库都被还原了,当然幸亏操作前Kaijia给服务器快照了一下,直接恢复了。

阅读更多

文件句柄限制造成“accept: Too many open files”问题解决

09/04/2015

由于数据采集需要,而且流量并不大,不需要使用分布式爬虫,Kaijia使用使用一台服务器同时连接近百个SSH并生成Socket处理采集需求,一开始运行的相当流畅,但是大约数小时后终端便开始不停地弹出“accept: Too many open files”报错。

于是便简单地使用lsof命令查看了单个SSH进程使用的文件句柄数量:

结果发现单个SSH比预想中的文件句柄使用率要多很多,连接繁忙(例如并发)的时候可以达到两三百,一般情况下只要Socket有数据传输就可能打开一百个文件句柄。考虑到同时运行的Socket数量较多,同时存在的文件句柄数量可能会超过Linux系统设置的上限,造成“accept: Too many open files”问题。

阅读更多

... 载入更多文章 ...

- 已经载入全部文章 -