标签归档:mysql

记MySQL的哈希加密问题导致的远程连接异常:”ERROR 2049 (HY000): Connection using old (pre-4.1.1) authentication protocol refused”

今天折腾mysql的时候,遇到一个问题。我在mac book上下载最新的mysql-5.6.15-osx10.7-x86_64,在连接一个远程的mysql服务器(5.0.77版)时报如下的异常:

看字面意思是两边的mysql版本不一致, 使用了mysql 4.1.1之前的授权协议连接时被拒绝。奇怪,本地的版本更新,远程的mysql是5.0.77版也大于4.1.1啊?后来查到在服务器上的密码加密是打开了old_passwords,用的旧的加密方式。

本质原因是:mysql变更过哈希加密的方法,早前是16位以下的,而在4.1以后是更长的hash。

可以测试下:

这是16位的hash,查看old_password选项的值:

可以在当前会话里面设置密码格式:

现在试下新密码的hash长度:

如果执行 查看mysql.user表可以发现,长密码和短密码都有。

现在,创建新用户:

通过

可以看到新建用户baoniu的密码hash值是长的。
接着可以授权用户 baoniu 远程登录权限:

格式:grant 权限 on 数据库名.表名 to 用户@登录主机 identified by “用户密码”; @ 后面是访问mysql的客户端ip地址(或是主机名) % 代表任意的客户端,如果填写 localhost 为本地访问(那此用户就不能远程访问该mysql数据库了)。
(让刚才的内容立即生效)

至此,新创建的用户 baoniu 就可以远程登录了,不会再报这个异常信息了。


如果想把老的账号都改用新的hash方式,可以执行:

参考:
1. MySQL_4.1之后的哈希加密问题
2. mysql-error-2049-hy000-connection-using-old-pre-4-1-1-authentication-protoc

mysql group_concat函数被截断的问题

1. mysql的 group_concat 函数默认返回1024个字节长度,超过长度的会被截断。最近程序中就遇到这个问题了。

通过如下命令可以查看到当前mysql系统的参数:

2. 有两个方法可以设置group_concat_max_len的值

(1) 在 /etc/my.cnf 中的[mysqld]加上 group_concat_max_len = 10240,需要重启mysql才能生效

(2) 在命令行下输入:

GLOBAL 是对全局生效的,而SESSION是对当前会话有效。

(3)如果是在c/c++代码中连接mysql来dump数据的,代码里面可以用 mysql_options 函数来设置。函数的原型(ref)是

一般是在mysql_init()之后、以及mysql_connect()或mysql_real_connect()之前调用mysql_options()。参数option是打算设置的选项,arg参量是选项的值。我们要用到的option是MYSQL_INIT_COMMAND,表示连接到MySQL服务器时将执行的命令。再次连接时将自动地再次执行。

示例代码如下:
MYSQL *conn;
conn = mysql_init(0);
if (NULL == conn)
{
cerr << "Init mysql failed: insufficient memory!" << endl; return EXIT_FAILURE; } if (0 != mysql_options(conn, MYSQL_SET_CHARSET_NAME, g_charset.c_str())) { cerr << "Set extra connect options failed!" << endl; return EXIT_FAILURE; } if (0 != mysql_options(conn, MYSQL_INIT_COMMAND, "SET SESSION group_concat_max_len=10240")) { cerr << "Set extra connect options group_concat_max_len failed!" << endl; return EXIT_FAILURE; } .... mysql_real_connect(...) mysql_query(...) ...[/code]

shell脚本更新mysql某列数据

问题:现在有一个mysql的表 promotion ,该表有若干个字段(主键keyid),有两个字段sid和pid的值需要都更新为一个新的uid。这个新uid来自于外部的文本文件uid.txt中。

1. 先取出所有的主键keyid

2. 将主键keyid和新的uid对应起来,合并为一个文件(只是为了后面脚本读起来方便)

3. shell脚本访问mysql,更新列
#!/bin/sh

while read line
do
id=`echo $line | awk ‘{print $1}’`
uid=`echo $line | awk ‘{print $2}’`
mysql -h10.1.1.1 -uuser -ppassword -P3306 -e “use db01;update promotion set pid=${uid},sid=${uid} WHERE id=${id}”
done < nuid[/code] 如果出现mysql语法错误: “ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',sid=111540261 WHERE id=12000083212' at line 1” 注意nuid文件中的分隔符问题,可能是特殊字符导致的。