Xupeng's blog

MySQL “replace into” 的坑

MySQL 对 SQL 有很多扩展,有些用起来很方便,但有一些被误用之后会有性能问题,还会有一些意料之外的副作用,比如 REPLACE INTO。

MySQLdb 参数处理的坑

前几天又有同事掉进了给 SQL 的 IN 条件传参的坑,就像 SELECT col1, col2 FROM table1 WHERE id IN (1, 2, 3) 这类 SQL,如果是一个可变的列表作为 IN 的参数,那这个参数应该怎么传呢?

在 Linux 下追溯进程的发起者

在 Linux 下要确认一个进程的发起者身份,比如用户 tom 登录系统,sudo su - 到 root,然后执行了脚本 hey.sh,要想在 hey.sh 中追溯到发起进程的是 tom 这个用户,并不是很容易做到准确无误,花了点时间,找到了一个相对靠谱的方式。

这几年犯的错

得知下厨房数据被误删了,正在紧张恢复中。作为犯过很多次严重错误的人,我最想说的是,善待当事人吧,此刻他在承受着巨大的压力,比其他任何人都要心焦,他会很感激你的善言和善意。

这几年犯过很多次严重影响线上服务的错误,像重启了错误的节点这样的事情应该算作能够对线上造成影响的最微不足道的错误,就只简单说几件现在都还让我心有余悸的事吧。

使用 hosts 解析一个名字到多个 IP

之前一直以为 hosts 不支持把一个名字解析到多个 IP,因此凡是有解析到多个 IP 需求的场景,全部都使用了 DNS,偶然看 host.conf 的 man page,发现并不是这样,有些场景下仍然是可以使用 hosts 的。

如何同步 GRANT/REVOKE 操作

发现在 MySQL master 上用 GRANT 语句授予用户权限和用 REVOKE 语句收回权限的操作没有被同步到 slave 上,有两个 bug 报告的行为和我遇到的一致:#25482 #50460,但从文档看,#25482 描述的是 bug,而 #50460 描述的内容则是 MySQL 的预期行为。

KILL 和 SIGPIPE

有朋友用 PHP 写了一个工具(limit.php),用来限制另一个进程的执行时间,代码如下:

MySQL-python: Commands out of sync

在给 MySQL 数据库访问层增加新功能时遇到了这样的错误:

1
ProgrammingError: (2014, "Commands out of sync; you can't run this command now")

之前零星地见到过几次,因为发生频度很低,就没有太在意,这次找了一下原因,MySQL 文档对 Commands out of sync 错误的描述是这样的:

类型转换对 MySQL 选择索引的影响

遇到了几例 MySQL 没用使用预期索引的问题,读了些文档之后,发现 MySQL 的类型转换对索引选择的影响还真是一个不大不小的坑。

比如有这样一张 MySQL 表:

1
2
3
4
5
6
7
8
9
10
CREATE TABLE `indextest` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `idx_name` (`name`),
  KEY `idx_age` (`age`),
  KEY `idx_create` (`create_time`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1