January 11, 2007

先后安装Python,Mysql5,MySQLdb,import MySQLdb的时候提示找不到libmysqlclient_r.so.15。

原因是默认lib路径为/usr/lib,而mysql的安装在/usr/lib/mysql.

简单解决方法:创建一个符号连接

ln -s /usr/lib/libmysqlclient_r.so.15 /usr/lib/mysql/libmysqlclient_r.so.15

另外,由此引起的pure-ftpd安装失败也解决。都是这个lib找不到的问题。

January 5, 2007

1开启主机变更日志

my.ini or my.cnf
[mysqld]
log-bin=path/to/name
server-id=1

重启主机服务

2在主机上创建镜像通信用户

GRANT REPLICATION SLAVE ON *.* TO replicuser@从机地址 IDENTIFIED BY ‘zzz’;

3刷新并记录日志位置

FLUSH TABLES WITH READ LOCK;
SHOW MASTER STATUS;

记录下输出结果中File和Position两列的内容
关闭主机服务

4创建主机快照

压缩mysql/data文件夹,不要压缩log文件
启动主机服务

5复制快照到从机

停止从机服务
备份并删除/var/lib/mysql
将4中的文件复制并解压到/var/lib/mysql
赋予mysql访问权限chown mysql:mysql -R /var/lib/mysql/

6修改从机配置文件

[mysqld]
server-id=2
read-only=1

启动从机服务

7登录从机创建镜像关系(此时应该使用主机帐户名和密码)

CHANGE MASTER TO
MASTER_HOST = ‘主机地址’,
MASTER_USER = ‘replicuser’,
MASTER_PASSWORD = ‘zzz’,
MASTER_LOG_FILE = ‘上面3中记录下来的File’,
MASTER_LOG_POS = 上面3中记录下来的Position;

START SLAVE;

8确认成功,查看日志

/var/log/mysql/mysqld.err中出现
[Note] Slave I/O thread: ….in log ‘xxx’ at position xxxx;
表示成功

December 31, 2006

mysqldump出来的数据导入到另外一个数据库的时候出现

Error 1153 Got a packet bigger than max_allowed_packet’…

原因是数据表中有一些行的数据大小大于了目标机的max_allowed_packet值,这个值默认是1M,原则上都够用了,但是如果把一些大的二进制数据放到数据库中,比如图片等,就很容易超过了。

解决方法:可以在mysqld启动的时候加入启动参数,其中2M可以变成任何值,最大1G

mysqld –max_allowed_packet=2M

如果觉得麻烦,就修改mysql的config文件,加入以下字段

[mysqld]
max_allowed_packet=2M

dump出来的数据导入到新服务器的时候,会出现一些存储过程与视图访问的异常,有一个原因是这些routines(view + proc + func)都指定了创建者,也就是definer,definer对该routine权限有特殊含义,所以,解决方法就是记得将mysql.user表也同步过来。当然,最好是重新grant而不是操作该表。

关于存储过程的权限管理,一种是SQL SECURITY INVOKER,一种是SQL SECURITY DEFINER,也就是一种是调用者权限,一种是定义者权限,如果使用第一种,那么执行的时候是以执行者本身的权限来操作存储过程中包含的表。如果是第二种,那么执行的时候,是以该存储过程的定义者权限来操作。

November 15, 2006

alter table tablename auto_increment = 1;

user表的主键是Host和User,因此可以为来自不同主机的同一个用户设置不同的访问权限。

如:

Host User Privs
host1 user1 xxx
host2 user1 zzz