MySQL用户名和操作系统用户名完全不相关,甚至最大长度可能不同。例如, Unix用户名限制为8个字符。 MySQL用户名最大可达16字符长。
MySQL 的加密密码使用自己的算法。该加密算法不同于Unix登录过程使用的算法。MySQL密码加密与PASSWORD()SQL函数的方法相同。Unix密码 加密与ENCRYPT()SQL函数的方法相同。从版本4.1 起,MySQL使用更强的鉴定方法,同以前的版本相比可以在连接过程中提供更好的密码保护。即使TCP/IP包被截取或mysql数据库被捕获也很安全 (在前面的版本中,即使密码以加密形式保存到user表中,仍可以通过加密密码值来连接MySQL服务器)。
查看用户账号信息:SELECT * FROM mysql.user;
使初始mysql账号安全
MySQL安装过程包括设置含有授权表的MySQL数据库(这里只讲在unix中的情况): 在Unix中,用mysql_install_db程序来安装 授权表。可以通过一些安装方法来运行该程序。否则你需要手动执行。授权表定义了初始MySQL用户账户和访问权限。
创建了两个root 账户。这些账户为超用户账户,可以执行任何操作。初始root账户的密码为空,因此任何人可以用root账户不用任何密码来连接MySQL服务器,并具有所有权限。在Unix中,两个root账户均用于从本机连接。必须从本机进行连接,一个账户主机名应指定为localhost,另一个账户为实际的主机名或IP号。
创建了两个匿名用户账户,每个账户的用户名均为空。匿名账户没有密码,因此任何人可以使用匿名账户来连接MySQL服务器。在Unix中,两个匿名账户均用于从本机连接。必须从本机进行连接,一个账户主机名应指定为localhost,另一个账户为实际的主机名或IP号。两个账户具有test数据库或其它以test开始的数据库的所有权限。
以上可以看出,如果我们对这些初始账号不做任何动作的话,那我们的mysql数据库是很危险的。我们可以做的就是,修改root密码,删除匿名账号或修改匿名账号密码。
为root账户指定密码:
方法一:使用SET PASSWORD语句
shell> mysql -u root
mysql> SET PASSWORD FOR ‘root‘@‘localhost‘ = PASSWORD(‘newpwd‘);
mysql> SET PASSWORD FOR ‘root‘@‘host_name‘ = PASSWORD(‘newpwd‘);
方法二:使用mysqladmin为root账户指定密码
shell> mysqladmin -u root password "newpwd"
shell> mysqladmin -u root -h host_name password "newpwd"
我使用的该方法,在修改h为hostname时报一下错误信息:‘Host ‘*.*.corp‘ is not allowed to connect to this MySQL server‘,查看了网上的解决方法,执行以下授权语句,然后再登出mysql服务器,执行以上语句,成功。
GRANT ALL PRIVILEGES ON *.* TO ‘root‘@‘%‘;
FLUSH PRIVILEGES;
方法三:使用UPDATE直接修改user表
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD(‘newpwd‘) WHERE User = ‘root‘;
mysql> FLUSH PRIVILEGES;
修改匿名账号密码:
方法一:
shell> mysql -u root
mysql> SET PASSWORD FOR ‘‘@‘localhost‘ = PASSWORD(‘newpwd‘);
mysql> SET PASSWORD FOR ‘ ‘@‘host_name‘ = PASSWORD(‘newpwd‘);
查看是否生效,可以查看select host,user,password from mysql.user;
方法二:
shell> mysql -u root
mysql> UPDATE mysql.user SET Password = PASSWORD(‘newpwd‘) WHERE User = ‘‘;
mysql> FLUSH PRIVILEGES;
在user表中直接使用UPDATE更新密码后,必须让服务器用FLUSH PRIVILEGES重新读授权表。否则,重新启动服务器前,不会使用更改。
删除匿名账号:
shell> mysql -u root
mysql> DELETE FROM mysql.user WHERE User = ‘‘;
mysql> FLUSH PRIVILEGES;
添加账号
- 使用GRANT语句
- 直接操作MySQL授权表
- 使用MySQL账户管理功能的第三方程序。phpMyAdmin即是一个程序
shell> mysql --user=root -p
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘monty‘@‘localhost‘
-> IDENTIFIED BY ‘some_pass‘ WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *.* TO ‘monty‘@‘%‘
-> IDENTIFIED BY ‘some_pass‘ WITH GRANT OPTION;
mysql> GRANT RELOAD,PROCESS ON *.* TO ‘admin‘@‘localhost‘;
mysql> GRANT USAGE ON *.* TO ‘dummy‘@‘localhost‘;
其中两个账户有相同的用户名monty和密码some_pass。两个账户均为超级用户账户,
具有完全的权限可以做任何事情。一个账户 (‘monty‘@‘localhost‘)只用于从本机连接时。另一个账户(‘monty‘@‘%‘)可用于从其它主机连接。
请注意monty的两个账户必须能从任何主机以monty连接。没有localhost账户,当monty从本机连接时,mysql_install_db创建的localhost的匿名用户账户将占先。结果是,monty将被视为匿名用户。
原因是匿名用户账户的Host列值比‘monty‘@‘%‘账户更具体,这样在user表排序顺序中排在前面。
一个账户有用户名admin,没有密码。该账户只用于从本机连接。授予了RELOAD和PROCESS管理权限。这些权限允许admin用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-xxx命令,
以及mysqladmin processlist。未授予访问数据库的权限。你可以通过GRANT语句添加此类权限。
一个账户有用户名dummy,没有密码。该账户只用于从本机连接。未授予权限。通过GRANT语句中的USAGE权限,你可以创建账户而不授予任何权限。它可以将所有全局权限设为‘N‘。假定你将在以后将具体权限授予该账户。
方法二:直接用INSERT语句创建相同的账户,然后使用FLUSH PRIVILEGES告诉服务器重载授权表
shell> mysql --user=root mysql
mysql> INSERT INTO user
-> VALUES(‘localhost‘,‘monty‘,PASSWORD(‘some_pass‘),
-> ‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘);
mysql> INSERT INTO user
-> VALUES(‘%‘,‘monty‘,PASSWORD(‘some_pass‘),
-> ‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘,‘Y‘);
mysql> INSERT INTO user SET Host=‘localhost‘,User=‘admin‘,
-> Reload_priv=‘Y‘, Process_priv=‘Y‘;
mysql> INSERT INTO user (Host,User,Password)
-> VALUES(‘localhost‘,‘dummy‘,‘‘);
mysql> FLUSH PRIVILEGES;
当你用INSERT创建账户时使用FLUSH PRIVILEGES的原因是告诉服务器重读授权表。否则,只有重启服务器后更改方会被注意到。使用 GRANT,则不需要使用FLUSH PRIVILEGES。
用INSERT使用PASSWORD()函数是为了加密密码。GRANT语句为你加密密码,因此不需要PASSWORD()。
‘Y‘值启用账户权限。对于admin账户,还可以使用更加可读的INSERT扩充的语法(使用SET)。INSERT user表时,没有指定的列默认值为‘N‘。
请注意要设置超级用户账户,只需要创建一个权限列设置为‘Y‘的user表条目。user表权限为全局权限,因此其它 授权表不再需要条目。(这句话其实我没怎么懂,理解的童鞋是否能分享下?)
举例:
例子创建3个账户,允许它们访问专用数据库。每个账户的用户名为custom,密码为obscure。
shell> mysql --user=root mysql
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON bankaccount.* TO ‘custom‘@‘localhost‘ IDENTIFIED BY ‘obscure‘;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON expenses.* TO ‘custom‘@‘whitehouse.gov‘ IDENTIFIED BY ‘obscure‘;
mysql> GRANT SELECT,INSERT,UPDATE,DELETE,CREATE,DROP ON customer.* TO ‘custom‘@‘server.domain‘ IDENTIFIED BY ‘obscure‘;
这3个账户可以用于:第1个账户可以访问bankaccount数据库,但只能从本机访问。第2个账户可以访问expenses数据库,但只能从主机whitehouse.gov访问。 第3个账户可以访问customer数据库,但只能从主机server.domain访问。
如果你想要让某个用户从给定域的所有机器访问(例如,mydomain.com),你可以在账户名的主机部分使用含‘%’通配符的GRANT语句:
mysql> GRANT ... ON *.* TO ‘myname‘@‘%.mydomain.com‘ IDENTIFIED BY ‘mypass‘;
删除用户账号
1.drop user mysql1 --删除mysql1用户账号
2.drop user mysql1@localhost
删除用于从其他主机连接的账号mysql1,其实也可以这样写drop user ‘mysql1‘@‘%‘。
删除用于从本地连接mysql服务器的账号mysql1.
3.revoke all privileges on *.* from mysql1@localhost
取消从本地连接mysql服务器账号mysql1的除登录外的所有权限,注意grant在给一个新用户授权的同时可以创建用户表登录项(在mysql.user表中添加一条记录),但revoke只能是取消相应权限,
而不会从用户登录表中删除该用户。
4.delete from mysql.user where host=‘localhost‘ and user=‘mysql1‘;
flush privileges;
直接从mysql.user表中删除。