MySQL数据库的安全性,需要通过账户管理来保证
1.登录和退出MySQL服务器
MySQL-help命令可以查看MySQL命令帮助信息;MySQL,命令常用参数如下:
- -h主机名,可以使用该参数指定主机名或ip,默认localhost
- -u用户名
- -p密码,可以使用该参数来指定登录密码,如果该参数后面有一段字段,则该字符串将作为用户的密码直接登录;如果没有内容,则登录的时候会提示输入密码;注意:该参数后面的字符串和-p之前不能有空格
- -P端口号,默认3306
- 数据库名,可以在命令的最后指定数据库名
- -e执行SQL语句;如果指定了该参数,则将在登录后执行-e后面的命令或SQL语句并退出
例子:
MySQL -h localhost -u root -p123 -P 3306 db_test -e "DESC person;"
2.新建普通用户
1.CREATE USER
CREATE USER user_specification [,user_specification] ...
user_specification:
oser@host[
IDENTIFIED BY [PASSWORD] 'password'
| IDENTIFIED WITH auth_plugin [AS 'auth_string']
]
- user表示创建的用户的名称
- host表示创建登录的用户名主机名称,默认'%',即对所有的主机开放权限
- IDENTIFIED BY 表示用来设置用户的密码,如不需要密码.可省略IDENTIFIED BY [PASSWORD] 'password'部分,此时MySQL会使用内建的身份验证机制,用户登录时不能指定密码
- [PASSWORD]表示使用哈希值设置密码,该参数可选
- 'password'比啊用户登录时使用的普通明文密码;
- INDETIFIED WITH 语句为用户指定一个身份验证插件
- auth_plugin是插件名称插件的名称可以是一个带单引号的字符串,或者带引号的字符串
- suth_string是可选的字符串参数,该参数将床底给身份验证插件,由该插件解释该参数的意义
使用CREATE USER语句的用户,必须由全局的CREATE USER权限或MySQL数据库的INSERT权限
例子:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
对于使用插件认证连接的用户,服务器调用指定名称的插件,客户端需要提供验证方法所需要的凭据;如果创建用户是或者连接服务器时,服务器找不到对应的插件,将会返回一个错误,IDENTIFIED WITH语法格式如下:
CREATE USER 'jeffrey'@'localhost' IDENTIFIED WITH my_auth_plugin
- IDENTIFIED WITH 只能在MySQL5.57以及以上版本中使用;IDENTIFIED BY和IDENTIFIED WITH是互斥的,所以对于一个账户来说只能使用一个验证方法;
- CREATE USER语句的操作会被记录到服务器日志文件或者操作历史文件中,如~/.MySQL_history;这意味着对这些文件由读取权限的人,都可以读取新添加用户的明文密码
2.GRANT
- CREATE USER语句可以用来创建账户,通过该语句可以在user表中添加一个新的记录,但是CREATE USER语句创建的新用户没有任何权限,还需要使用GRANT语句赋予用户权限
- GRANT语句不仅可以创建新用户,还可以在创建的同时对用户授权
- GRANT语句还可以指定账户的其他特点,如使用安全连接,限制使用服务器资源等
- 使用GRANT语句创建新用户时必须有GRANT权限
- GRANT语句是添加新用户并授权它们访问MySQL对象的首选方法
GRANT privileges ON db.table TO user@host [IDENTIFIED BY 'password'] [, user [IDENTIFIED BY 'password']]
[WITH GRANT OPTION];
- 其中,privileges表示赋予用户权限类型
- db_table表示用户的权限所作用的数据库中的表
- IDENTIFIED BY 关键字用来设置密码
- 'password'表示用户密码
- WITH GRANT OPTION为可选参数,表示对新建的用户赋予GRANT权限,即该用户可以对其他用户赋予权限
例子:
GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testpwd';
User表中的user和host字段区分大小安歇,在查询的视乎要定制正确的用户名称或者主机名
3.直接操作MySQL用户表
通过前面的介绍,不管是CREATE USER或者GRANT,在创建新用户是,实际上都是在user表中添加一条新的记录,因此,可以使用INSERT语句向user表中直接插入一条记录来创建一个新的用户
INSERT INTO MySQL.user(Host,User,Password,[privilegelist])
VALUES('host','username',PASSWORD('password'),privilegevaluelist)
例子:
INSERT INTO user(Host,USer,Password)
VALUES('localhost','customer1',PASSWORD('customer1'));
3.删除普通用户
1.DROP
DROP USER user [, user];
- 要使用DROP USER,必须拥有MySQL数据库的全局CREATE USER权限或DELETE权限
例子:
DROP USER 'user'@'localhost'; //删除user在本地登录权限
DROP USER; //删除所有来自授权表的账户权限记录
DROP USER不能自动关闭任何打开的用户对话;如果用户有打开的u迪化,此时取消用户,命令则不会生效,知道用户对话被关闭后才能生效,一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失效
2.DELETE
DELETE FROM MySQL.user WHERE host='hostname' and user='username'
例子:
DELETE FROM MySQL.user WJERE host='localhost' and user='customer1';
4.root修改自己的密码
1.使用MySQLadmin命令在命令行指定新密码
mysqladmin -u username -h localhost -p password "newpwd";
例子:
mysqladmin -u root -p password "rootpwd";
2.修改MySQL数据库的user表
UODATE mysql.user set Password=Password("rootpwd") WHERE User="root" and Host="localhost"
3.使用SET语句修改root用户的密码
SET PASSWORD语句可以用开重新设置其他用户的登录密码或者自己使用的账户的密码;使用SET修改自身密码如下:
SET PASSWORD=PASSWORD("rootpwd");
FLUSH PRIVIKEGES;//刷新权限
- 新密码必须使用PASSWORD()函数加密
- 为了使修改生效,需要重新启动MySQL或者使用FLUSH PRIVILEGES;语句刷新权限,重新加载权限表
5.root用户修改普通用户的密码
1.SET
SET PASSWORD FOR 'user'@'host'=PASSWORD('somepasword');
只有root可以修改其他用户的密码
2.UPDATE
UPDATE MySQL.user SET password=PASSWORD("pwd")
WHERE User="username" AND HOST="hostname";
FLUSH PRIVILEGES;
3.GRANT
- 使用GRANT语句修改密码,必须拥有GRANT权限
- 一般情况下最好使用该方法来指定或修改密码
GRANT USAGE ON *.* TO 'someuser'@'%' IDENTIFIED BY 'somepassword';
例子:
GRANT USAGE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'newpwd3';
使用GRANT...IDENTIFIED BY语句或MySQLadmin password命令设置密码,它们均会自动加密,这种情况下,不需要使用PASSWORD()函数
6.普通用户修改密码
SET PASSWORD = PASSWORD("newpassword");
7.root密码丢失的解决办法
1.使用--skip-grant-tables选项启动MySQL服务
- 以skip-grant-tables选项启动时,MySQL服务器将不加载权限判断,任何用户都能访问数据库
- window系统中,可以使用MySQLd或者MySQLd-nt来启动MySQL服务进程
- 如果MySQL的目录已经调价到环境变量中,可以直接使用MySQLd,MySQLd-nt命令启动MySQL服务,否则需要在命令行先切换到MySQL的bin目录
mysqld --skip-grant-tables
mysqld-nt --skip-grant-tables
- 在linux操作系统中,使用MySQLd_safe来启动MySQL服务;也可以使用/etc/init.d/MySQL命令来启动MySQL服务
mysqld_safe --skip-grant-tables user=mysql
/etc/init.d/mysql start-mysqld --skip-grant-tables
启动MySQL服务后,就可以使用root用户登录了
2.使用root用户登录,重新设置密码
以windows7为例:
- 使用net stop MySQL命令停止MySQL服务进程
- 在命令行输入MySQLd--skip-grant-tables选项启动MySQL服务
命令运行之后每用户无法输入指令,此时如果在任务管理器中可以看到名称为MySQLd的名称,则表示可以使用root用户登录MySQL了
- 打开另外一个命令行窗口,输入不加密码的登录命令
登录成功以后们就可以使用UPDATE或MySQLadmin等命令重新设置root密码了
3.加载权限表
FLUSHPRIVILEGES
密码修改完成后麻将输入MySQLd--skip-grant-tables命令的命令行窗口关闭,接下来就可以使用新设置的密码登录MySQL了