我的要求是创建一个用户远程登录,但没有密码。在我的远程空间中,我使用bash脚本执行插入,如下所示:
for i in {1..5000}; do
mysql -h 11.40.3.169 -uUser -pPass -DDatabaseName <<<
"insert into DatabaseTableName values('$i','dummy_$i');" &
echo -n "$i "
sleep 1
date
done
问题是,每次插入几乎需要4秒,我不能确定问题的任何东西,但每次插入的身份验证。所以,如果我可以在MySQL中创建一个用户,涉及最少的身份验证…比如:
# I'm trying to remove this password
GRANT ALL PRIVILEGES TO 'user'@'%' IDENTIFIED BY 'password';
…你有什么建议吗
直接删除IDENTIFIED BY
部分:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'%'
注意,从任何地方远程登录没有密码是非常不安全的事情。您最好限制此用户允许的IP
范围:
GRANT ALL PRIVILEGES ON *.* TO 'user'@'allowed_remote_machine'
您可以创建一个带有密码的用户,然后在运行bash脚本的帐户的主目录中放置一个.my.cnf文件,该文件包含以下内容:
[mysql]
user=user
password=pass
[mysqladmin]
user=user
password=pass
这可能比创建没有密码的用户要好。
我认为您的问题在于您正在为每次插入启动mysql客户端。您应该从php、java等程序中进行插入,而不是从shell脚本中。
客户端的启动时间(以及与主机的连接)正在杀死您。我通常每分钟从一个php或java程序到一个小型(CPU/内存)机器上有数百万条记录的MySQL数据库进行1000次插入。
让一个用户没有密码和所有特权不是一个好主意。我建议您创建一个没有密码的用户,但只有一些特权(插入到特定的表或特定的数据库)。
首先,在运行脚本的远程机器上使用客户端cnf文件不会加快速度。MySQL客户端仍然发送登录信息并为每次插入进行登录,它只是读取。uid/pw的文件,而不是使用CMD行参数。AFAIK网络和身份验证开销是相同的。甚至网络数据包的内容也会相同。
你仍然应该使用cnf文件..
的方式。提高性能是做多行linserts:
MySQL --defaults-file=/some/uid/pw/etc/.client.cnf -e
"Insert into
tbl_name
('fld1','fld2')
values
('r1-fld1','r1-fld2'),
('r2-fld2','r2-fld2'),
...and so on (up to max_allowed_packet_size)
('r500-fld2','r500-fld2');"
或在传送数据文件后在服务器端读取DATA INFILE