星期五, 一月 19, 2007

更改 MSN 联系人列表字体大小

默认安装的 MSN Live Messenger 的联系人列表里中文字体很小,都挤到一起去了,很难看。而且在 MSN 的选项中没有更改的设置,这需要修改系统字体:
桌面 -> "属性" -> "外观" -> "高级" -> "图标"
将字体增大一号。这样整个系统的字体都会增大,而 MSN 里的字体就可以了。

工欲善其事,必先利其器。虽然 Windows 用的很少(在 Linux 下用 Gaim 就好了),但既然工作环境不得不使用 Windows,那还是把它设置的舒心一点吧 :-)

星期四, 一月 18, 2007

bash debugging

使用 set -x 设置 debug 模式,set +x 关闭调试模式。也可以用 bash -x。

find -empty

找到所有的空文件和空目录。

所以找空目录可以:
$ find -type d -empty

文件和目录的最后修改时间

如果更改了一个文件,它自己的最后修改时间会变化,但它的父目录的最后修改时间不变,到它的符号链接的最后修改时间也不会变。

而如果在目录中新增一个文件,则该目录的最后修改时间就会变化!那么如果子目录的最后修改时间发生变化,父目录呢?结果是父目录的最后修改时间仍然不变!

这些特性对增量和差分备份可能会产生影响。故特此记录。

星期三, 一月 17, 2007

diff patch

使用 diff 生成 patch 文件的命令可以这样:
$ diff -Naur old-dir new-dir >dir.patch

如果只是一个文件,这样就可以了:
$ diff -u old-file new-file >file.patch

-N: 在目录的比较中,如果一个文件只存在与一个目录,则另一个目录中视为空文件
-a: 只作为文本
-u: "Use the unified output format", 生成 patch 的主要参数
-r: 递归

"mysqld_multi stop N" truble shooting

前面使用 mysqld_multi 来启停多实例的 mysqld 服务器。现在却发现当用 mysqld_multi --mysqld=mysqld_safe start 01 启动服务以后,却无法用 mysqld_multi stop 01 来停止。

从 --help 所提供的参数来看,有 --mysqladmin 和 --password 参数,所以应该是密码问题,通过增加参数:
$ mysqld_multi --password='********' stop 01
即可正常的停止编号为 01 的 mysqld。

星期一, 一月 15, 2007

DNS 对 MySQL 连接速度的影响

将原来的 LAMP 的 MySQL 和 Apache 分离,数据库迁移到另一台主机后,发现连接和查询速度很慢。仅仅使用数据库连接:
$ mysql -u root -h 192.168.0.2 -p
也是需要很长时间才能通过认证。

可以初步推断可能是 DNS 解析的问题,假设 Apache 所在主机为 192.168.0.1,则编辑 MySQL 主机的 /etc/hosts:
192.168.0.1 192.168.0.1

再次连接,速度就比较快了。页面刷新速度也可以接受了。究其原因,还是 MySQL 在认证时在查询 DNS,将 IP 地址作为一个域名来查询。

MySQL 本身应该有一个变量可以进行控制的。mysqld 的启动参数中有 --skip-name-resolve,"然而,在这种情况下,你只可以使用 MySQL 中的授权表中的 IP" -- 这可能意味着使用主机名授权的表项将不起作用。

http://dev.mysql.com/doc/refman/5.1/zh/optimization.html#dns
http://hackmysql.com/dns

mysqld_multi 运行多实例数据库

之所以使用多实例,一方面是因为资源有限,没有更多的主机资源,而同时为了保证以后迁移和扩展的需要,最好将所有的数据从文件系统层面上分开,并使用不同的端口(port)来进行连接。

使用以前提到的包管理器,其安装 profile 如下:
pkgname = "mysql";
version = "4.1.22";
user = "mysql";
groups = "";
group = "mysql";
archive = "mysql-4.1.22.tar.gz";
command = "tar xfz mysql-4.1.22.tar.gz";
command = "cd mysql-4.1.22";
command = "./configure --without-debug --with-extra-charsets=gb2312 --enable-assembler --without-isam --without-innodb --with-pthread --enable-thread-safe-client --with-client-ldflags=-all-static --with-mysqld-ldflags=-all-static --localstatedir=/data/mysql";
command = "make";
command = "make install";
command = "scripts/mysql_install_db --user=mysql";
command = "cd ..";
command = "rm -rf mysql-4.1.22";
command = "cd /usr/local/libexec";
command = "cp mysqld mysqld.backup";
command = "strip mysqld";
time = "20061231 16:34:51 Sun";
注意需要指定 --localstatedir=/data/mysql,因为这里 /data 是专门用来存放数据的数据盘,在我们的应用中需要分开已方便管理。

然后需要修改配置文件 /etc/my.cnf:
......
# [mysqld]
[mysqld01]
datadir=/data/mysql01
socket=/data/mysql01/mysql.sock
port=3306

skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

log-bin

[mysqld02]
datadir=/data/mysql02
socket=/data/mysql02/mysql.sock
port=3307

skip-locking
key_buffer = 16M
max_allowed_packet = 1M
table_cache = 64
sort_buffer_size = 512K
net_buffer_length = 8K
read_buffer_size = 256K
read_rnd_buffer_size = 512K
myisam_sort_buffer_size = 8M

log-bin
......
要注释 [mysqld],否则不行;[mysqldX] X 必须为数字。有一些配置重复,但目前来看没有其它办法,不知道怎样让 [mysqld01] 和 [mysqld02] 共享一部分配置?

然后进入 /data,将 mysql 拷贝为 mysql01 和 mysql02
# cd /data
# cp -Rp mysql mysql01
# cp -Rp mysql mysql02

再启动两个实例的数据库:
# mysqld_multi --mysqld=mysqld_safe start 01,02

因为是多实例运行,所以原来的 sysv init 启动脚本 /etc/rc.d/init.d/mysqld(从 mysql.server 拷贝)不能使用,因为它只启动 mysqld_safe 而不会运行 mysqld_multi。可以考虑更改这个脚本,也可以将 mysqld_multi 命令加入 /etc/rc.d/rc.local,以后要关闭数据库时使用 kill 命令或:
# mysqld_multi stop 01
关闭编号为 01 的数据库,并使用
# mysqld_multi start 01
再启动它。

mysql_fix_privilege_tables

将 MySQL 表文件从一台主机拷贝到另一台主机(通常做数据库迁移时需要这样)。源主机的 MySQL 为 3.23.58,目标主机为 4.1.13(3.23.58 不支持 replication,所以无法使用镜像同步来进行迁移)。

数据库表文件拷贝过来之后,原来的 mysql.user 表比 4.1.13 默认的 mysql.user 包要少一下字段,因此少一些对权限的设定,比如 REPLICATION SLAVE 来进行镜像的权限。所以需要对数据库系统表进行升级。可以使用这个脚本:mysql_fix_privilege_tables。
$ mysql_fix_privilege_tables --host=127.0.0.1 --password='******'
$ mysqld_multi stop 01
$ mysqld_multi --mysqld=mysqld_safe start 01
5.5.1. mysql_fix_privilege_tables — Upgrade MySQL System Tables

星期日, 一月 14, 2007

Apache MPM prefork vs. work

MPM: Multi-Processing Module。

主要的区别是是否使用线程。prefork 使用线程而 work 模式不使用。

python MySQLdb simple usage

import MySQLdb
import _mysql_exceptions

......
goaldb = MySQLdb.connect(user=dbuser, passwd=dbpass, host=dbhost, port=dbport, db=dbname)
SQL = "select ..."
goaldb.query(SQL)
rows = goaldb.store_result().fetch_row(maxrows=0)
if rows:
for r in rows:
......
SQL = "update ..."
goaldb.query(SQL)
else:
SQL = "insert ..."
goaldb.query(SQL)

except _mysql_exceptions.ProgrammingError, (errno, errstr):
strerr = "SQL Error: %d, %s" % (errno, errstr)
print strerr >> sys.stderr
except _mysql_exceptions.MySQLError, (errno, errstr):
strerr = "MySQL DB Error: %d, %s" % (errno, errstr)
print strerr >> sys.stderr