Mysql教程

15.2账户管理

账户管理是MySQL用户管理的最基本的内容。账户管理包括登录和退出MySQL服务器、创建用户、删除用户、密码管理和权限管理等内容。通过账户管理,可以保证NySQL数据库的安全性。本节将向读者详细介绍这些内容。

15.2.1登录和退出MySQL服务器

用户可以通过mysql命令来登录MySQL服务器。在第2章和第3章已经简单介绍过 一些登录MySQL服务器的方法,但是有些参数还不全。在本小节中将详细地介绍mysql命令的参数和退出MySQL服务器的方法。启动MySQL服务后,可以通过mysql命令来登录MySQL服务器。命令如下:

mysql -h hostname|hostlP -P port -u usemame -p DatabaseName -e "SQL 语句"

这个命令后面有几个参数,详细介绍如下:

-h参数后面接主机名或者主机IP,hostname为主机名,hostIP为主机IP;

-p参数后面接MySQL服务的端口。通过该参数连接到指定的端口。MySQL的默认端口是3306,不使用该参数时自动连接到3306端口,port为连接的端口号;

-u参数后面接用户名。username为用户名;

-p参数会提示输入密码;

DatabaseName参数指明登录到哪一个数据库中。如果没有该参数,会直接登录到 MySQL数据库中,然后可以使用USE命令来选择数据库;

-e参数后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL服务器。

【示例15-1】下面使用root用户登录到test数据库中,主机的IP为59.65.226.15。命令如下:

mysql -h 59.65.226.15 -u root -p test

命令执行如下:

C:\>mysql -h 59.65.226.15 -u root -p test Enter password: ******
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3 to server version: 5.1.40-community
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

执行命令后,会出现Enter Password的提示信息。在这条信息之后输入密码,然后按Enter键。密码正确后就可以登录到MySQL服务器了。

说明:这个命令在Windows操作系统的DOS窗口执行,也可以在Linux操作系统和于UNIX操作系统的shell窗口执行。命令的执行方式和执行结果都是一样的。本章 =中的代码都是在Windows操作系统的DOS窗口下执行的。

【示例15-2】下面使用root用户登录到自己计算机的mysql数据库中,同时查询func表的结构。命令如下:

mysql -h localhost -u root -p mysql -e "DESC func"
命令执行结果如下:
C:\>mysql -h localhost -u root -p mysql -e "DESC func"
Enter password: ****
+---------+-----------------------------+--------+-------+-----------+---------+
|  Field  |             Type            |  Null  |  Key  |  Default  |  Extra  |
+---------+-----------------------------+--------+-------+-----------+---------+
|  name   |          char(64)           |   NO   |  PRI  |           |         |
|  ret    |         tinint(64)          |   NO   |  PRI  |           |         |
|  dl     |          char(128)          |   NO   |  PRI  |    0      |         |
|  type   |enum('function','aggregarte')|   NO   |  PRI  |   NULL    |         |
+---------+-----------------------------+--------+-------+-----------+---------+
C:\>

执行命令并输入正确的密码后,窗口中会显示化加表的基本结构。然后,系统会推出MySQL服务器,命令行显示为C:\>。 用户也可以直接在MYSQL命令的“-P”后加上登录密码。但是这个登录密码必须与“-p”参数之间没有空格。

【示例15-3】下面使用root用户登录到自己计算机的MySQL服务器中,密码直接加在mysql命令中。命令如下:

mysql -h 127.0.0.1 -u root -proot

命令执行结果如下:

C:\>mysql -h 127.0.0.1 -u root -proot
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 13to server version: 5.1.40-community
Type 'help;' or '\h' for help. Type *\c' to clear the buffer.
mysql>

执行命令后,即可直接登录MySQL服务器。这个命令执行后,后面不会提示输入密码。因为“-p”参数后面有密码,MySQL数据库系统会直接使用这个密码。 退出MySQL服务器的方式很简单,只要在命令行输入EXIT或QUIT即可。“\q”是 QUIT的缩写,也可以用来退出MySQL服务器。退出后就会显示Bye.

15.2.2新建普通用户

在MySQL数据库中,可以使用CREATE USER语句来创建新的用户,也可以直接在mysql.user表中添加用户。还可以使用GRANT语句来新建用户。本小节将为读者介绍这3种方法。

1.用CREATE USER语句来新建普通用户

使用CREATE USER语句来创建新用户时,必须拥有CREATE USER权限。CREATE USER语句的基本语法形式如下:

CREATE USER user [ IDENTIFIED BY [PASSWORD] 'password'][,user [ IDENTIFIED BY [PASSWORD] 'password']]...

其中,user参数表示新建用户的账户,user是由用户名(User)和主机名(Host)构成; IDENTIFIED BY关键字用来设置用户的密码;password参数表示用户的密码。如果密码是一个普通的字符串,就不需要使用PASSWORD关键字。CREATE USER语句可以同时创建多个用户。新用户可以没有初始密码。

【示例15-4】下面使用CREATE USER语句来创建名为testl的用户,密码也是testl, 其主机名为localhost。命令如下:

CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';

命令执行结果如下:

mysql> CREATE USER 'test1'@'localhost' IDENTIFIED BY 'test1';
Query OK, 0 rows affected (0.00 sec)

结果显示,用户testl创建成功。

2.用INSERT语句来新建普通用户<>/p

可以使用INSERT语句直接将用户的信息添加到mysql.user表中。但必须拥有对mysql.user表的INSERT权限。通常INSERT语句只有添加Host、User和Password这3个字段的值。INSERT语句的基本语法形式如下:

INSERT INTO mysql.user(Host, User, Password) VALUES ('hostname', 'username',PASSWORD('password'));

其中,PASSWORD()函数是用来给密码加密的。因为只设置了这3个字段的值,那么其他字段的取值为其默认值。如果这3个字段以外的某个字段没有默认值,这个语句将不能执行。需要将没有默认值的字段也设置值。通常ssl_cipher、x509_issue和x509_subject这3个字段没有默认值。因此必须为这3个字段设置初始值。RNSERT语句的代码如下:

INSERT INTO mysql.user(Host, User, Password, ssl_cipher, x509_issuer, x509_subject)
VALUES ('hostname','username',PASSWORD('password'), '','','');

注意:mysql 数据库下的user表中,ssl cipher、x509_issuer 和 x509_subject 这 3 个字段没有默认值。向user表中插入新纪录时,一定要设置这3个字段的值,否则INSERT语句将不能执行。而且,Password字段一定要使用PASSWORD()函数将密码加密。

【示例15-5】下面使用INSERT语句创建名为test2的用户,主机名是localhost,密码也是test2。INSERT语句如下:

INSERT INTO mysql.user(Host, User, Password, ssl_cipher, x509_issuer, x509_subject)
VALUES ('localhost','test2\PASSWORD('test2'),",'','');

命令执行结果如下:

mysql> INSERT INTO mysql.user(Host, User, Password, ssl_cipher, x509Jssuer, x509_subject)
-> VALUES ('localhost','test2',PASSWORD('test2'), '','','');
Query OK, 1 row affected (0.00 sec)

结果显示操作成功。执行完INSERT命令后要使用FLUSH命令来使用户生效。命令如下:

FLUSH PRIVILEGES;

使用这个命令可以从mysql数据库中的user表中重新装载权限。但是执行FLUSH命令需要RELOAD权限。

3.用GRANT语句来新建普通用户

可以使用GRANT语句来创建新的用户。在创建用户时可以为用户授权。但必须拥有对GRANT权限。这里只使用GRANT语句来创建新的用户,对于很多权限的问题留到 15.3节来详细讨论。GRANT语句的基本语法形式如下:

GRANT priv_type ON database.table TO user [ IDENTIFIED BY [PASSWORD] 'password'][,user [ IDENTIFIED BY [PASSWORD] 'password']]...

其中,priv_type参数表示新用户的权限;database.table参数表示新用户的权限范围,即只能在指定数据库和表上使用自己的权限;user参数新用户的账户,由用户名和主机名构成;IDENTIFIED BY关键字用来设置密码;password参数表示新用户的密码。GRANT语句可以同时创建多个用户。这里的GRANT语句只是其中创建新用户的部分的参数,将在15.3.2小节中介绍更详细的GRANT语句。

【示例15-6】下面使用GRANT语句创建名为test3的用户,主机名为localhost,密码为test3。该用户对所有数据库的所有表都有SELECT权限。GRANT语句如下:

GRANT SELECT ON *.* TO 'test3'@'localhost' IDENTIFIED BY 'test3';

其中,“*.*”表示所有数据库下的所有表。命令执行结果如下:

mysql> GRANT SELECT ON «.* TO 'test3'@'localhost' IDENTIFIED BY 'test3';
Query OK, 0 rows affected (0.00 sec)

结果显示操作成功。test3用户对所有表都查询权限。

技巧:GRANT语句不仅可以创建用户,也可以修改用户密码。而且,还可以设置用户的权限。因此,GRANT语句是MySQL中一个非常重要的语句,读者一定要将 这个语句灵活运用。本章的后面会介绍使用GRANT语句修改密码、更改权限的内容。

15.2.3删除普通用户

在MySQL数据库中,可以使用DROP USER语句来删除普通用户,也可以直接在mysql.usr表中删除用户。本小节将为读者介绍这两种方法。

1.用DROP语句来删除普通用户

使用DROP USER语句来删除用户时,必须拥有DROP USER权限。DROP USER语句的基本语法形式如下:

DROP USER user [,user]...;

其中,user参数是需要删除的用户,由用户的用户名(User)和主机名(Host)组成。 DROP USER语句可以同时删除多个用户,各用户之间用逗号隔开。

【示例15-7】下面使用DROP USER语句来删除用户test2,其Host值为localhost。 DROP USER语句如下:

DROP USER 'test2'@'localhost';

代码执行如下:

mysql> DROP USER 'test2'@'localhost';
Query OK, 0 rows affected (0.00 sec)

结果显示用户删除成功。

2.用DELETE语句来删除普通用户

可以使用DELETE语句直接将用户的信息从mysql.user表中删除。但必须拥有对mysql.user表的DELETE权限。DELETE语句的基本语法形式如下:

DELETE FROM mysql.user WHERE Host='hostname' AND User= 'username';

Host和User这两个字段都是mysql.user表的主键。因此,两个字段的值才能唯一的确定一条记录。

【示例15-8】下面使用DELETE语句删除名为test3的用户,该用户的主机名是 localhost。DELETE 语句如下:

DELETE FROM mysql.user WHERE Host= 'localhost' AND User= 'test3';

命令执行结果如下:

mysql> DELETE FROM mysql.user WHERE Host= 'localhost' AND User= 'test3';
Query OK, 1 row affected (0.00 sec)

结果显示操作成功。可以使用SELECT语句查询mysql.user表,以确定该用户是否经成功删除。执行完DELETE命令后要使用FLUSH命令来使用户生效,命令如下:

FLUSH PRIVILEGES;

执行该命令后,MySQL数据库系统可以从mysql数据库中的user表中重新装载权限。

15.2.4 用户修改自己的密码

root用户拥有很高的权限,因此必须保证root用户的密码的安全。root用户叮以通过多种方式来修改密码。本小节将介绍几种root用户修改自己的密码的方法。

1.使用mysqladmin命令来修改root用户的密码

root用户可以使用mysqladmin命令来修改密码。mysqladmin命令的基本语法如下:

mysqladmin -u usemame -p password "new_password";

注意:上面语法中的password为关键字,而不是指旧密码。而且新密码(new_password ) 必须用双引号括起来。使用单引号会出现错误。这一点要特别注意。如果使用单引号,可能会造成修改后的密码不是你想要修改的。

【示例15_9】下面使用mysqladmin命令来修改root用户的密码,将密码改为"myroort1"。mysqladmin命令执行结果如下:

C:\mysql\bin>mysqladmin -u root -p password "myroot1";
Enter password: ****

输入正确的旧密码后,就可以修改密码了。修改完成后,只能使用myroot1才能登录root用户。

2. 修改mysql数据库下的user表

使用root用户登录到MySQL服务器后,可以使用UPDATE语句来更新mysql数据库下的user表。在user表中修改Password字段的值,这就达到了修改密码的目的。UPDATE 语句的代码如下:

UPDATE mysql.user SET Password=PASSWORD("new_password")
WHERE User="root" AND Host=Hlocalhost";

新密码必须使用PASSWORD()函数来加密。执行UPDATE语句以后,需要执行FLUSH PRIVILEGES语句来加载权限。

【示例15-10】下面使用UPDATE语句来修改root用户的密码,将密码改为myroot2。 UPDATE语句执行结果如下:

mysql> UPDATE mysql.user SET Password=PASSWORD("myroot2")
mysql> WHERE User="root" AND Host="localhost";
Query OK, 0 rows affected (0.02 sec)
Rows matched: 1 Changed: 0 Warnings: 0 mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。而且使用了 FLUSH PRiViILEGES语句加载权限。退出后就必须使用新密码来登录了。

3. 使用SET语句来修改root用户的密码

使用root用户登录到MySQL服务器后,可以使用SET语句来修改密码。SET语句的代码如下:

SET PASSWORD=PASSWORD("new_password");

新密码必须使用PASSWORD()函数来加密。

【示例15-11】下面使用SET语句来修改root用户的密码,将密码改为myroot3。SET语句执行结果如下:

mysql> SET PASSWORD=PASSWORD("myroot3");
Query OK, 0 rows affected (0.00 sec)
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。通过本小节的学习,希望读者能够熟练掌握修改root用户密码的方法。

15.2.5 用户修改普通用户密码

root用户不仅可以修改自己的密码,还可以修改普通用户的密码。root用户登录MySQL服务器后,可以通过SET语句、修改user表和GRANT语句来修改普通用户的密码。本小节将向读者介绍root用户修改普通用户密码的方法。

1.使用SET语句来修改普通用户的密码

使用root用户登录到MySQL服务器后,可以使用SET语句来修改普通用户的密码。SET语句的代码如下:

SET PASSWORD FOR 'username'@'hostname'=PASSWORD("new_password");

其中,username参数是普通用户的用户名;hostname参数是普通用户的主机名;新密码必须使用PASSWORD()函数来加密。

【示例15-12】下面使用SET语句来修改test3用户的密码,将密码改为mytestl。SET语句执行结果如下:

mysql> SET PASSWORD FOR 'test3'@'localhost'=PASSWORD("mytest1");
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。

2.修改mysql数据库下的user表

使用root用户登录到MySQL服务器后,可以使用UPDATE语句来修改mysql数据库下的user表。UPDATE语句的代码如下:

UPDATE mysql.user SET Password=PASSWORD("new_password")
WHERE User="username" AND Host="hostname";

其中,username参数是普通用户的用户名;hostname参数是普通用户的主机名;新密码必须使用PASSWORD()函数来加密。执行UPDATE语句以后,需要执行FLUSH PRIVILEGES语句来加载权限。

【示例15-13】下面使用UPDATE语句来修改test3用户的密码,将密码改为mytest2。 UPDATE语句执行结果如下:

mysql> UPDATE mysql.userSET Password=PASSWORD("mytest2")
-> WHERE User="test3" AND Host="localhost";
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。

3. 用GRANT语句来修改普通用户的密码

可以使用GRANT语句来修改普通用户的密码,但必须拥有对GRANT权限。这里只使用GRANT语句来修改普通用户的密码。对于使用GRANT语句创建用户的内容,请读者参照15.2.2小节。对于很多权限的问题留到15.3节来详细讨论。GRANT语句的基本语法形式如下:

GRANT priv_type ON database.table
TO user [ IDENTIFIED BY [PASSWORD] 'password'];

其中,priv_type参数表示普通用户的权限;database.table参数表示用户的权限范围, 即只能在指定的数据库和表上使用自己的权限;user参数表示新用户的账户,由用户名和主机名构成;"IDENTIFIED BY"关键字用来设置密码;password参数表示新用户的密码。

【示例15-14】下面使用GRANT语句来修改test3用户的密码,将密码改为mytest3。 GRANT语句执行结果如下:

mysql> GRANT SELECT ON *.* TO 'test3'@'localhost' IDENTIFIED BY 'mytest3';
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。在这里,读者可以再复习15.2.2小节中使用GRANT语句来创建用户的内容。使用GRANT命令修改密码和创建用户的语句是一样的。

15.2.6普通用户修改密码

普通用户也可以修改自己的密码。这样普通用户就不需要每次需要修改密码时都通知管理员。普通用户登录到MySQL服务器后,可以通过SET语句来设置自己的密码。SET 语句的基本形式如下:

SET PASSWORD=PASSWORD('new_password');

这里必须使用PASSWORD()函数来为新密码加密。如果不使用PASSWORD()函数加密,那么用户将无法登录。

【示例15-15】卜面将test3用户的密码改为'test'。SET语句如下:

SET PASSWORD=PASSWORD('test');

命令执行结果如下:

mysql> SET PASSWORD=PASSWORD('test');
Query OK, 0 rows affected (0.00 sec)

结果显示,密码修改成功。现在用EXIT命令退出MySQL数据库,然后分别用原密码test3和新密码test进行登录。执行结果显示如下:

C:\mysql\bin>mysql -u test3 -ptest3
ERROR 1045 (28000): Access denied for user 'test3'@'localhost' (using password: YES)
C:\mysql\bin>mysql -u test3 -ptest
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 27
Server version: 5.1.40-community MySQL Community Server (GPL)
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement, mysql>

结果显示,使用密码"test"成功登录到数据库。而原密码则显Access denied。这说明使用SET命令成功的修改了密码。 root用户可以使用mysqladmin命令修改密码,但是普通用户通常不能使用这个命令。 因为普通用户通常没有执行mysqladmin命令的权限。

【示例15-16】下面使用mysqladmin命令来修改test3用户的密码,将密码修改为 mytest.mysqladmin命令执行如下:

C:\mysql\bin>mysqladmin -u test3 -ptest password 'mytest';
mysqladmin: Can*t turn off logging; error: 'Access denied; you need the SUPER privilege for this operation.

结果显示,修改密码不成功。提示没有超级用户(SUPER)权限。这个例子说明mysqladmin命令不能用来修改普通用户的密码。

15.2.7用户密码丢失的解决办法

如果root用户密码丢失了,会给用户造成很大的麻烦。但是,可以通过某种特殊方法 登录到root用户下。然后,在rppt用户下设置新的密码。下面是解决root用户密码丢失的方法,执行步骤如下:

(1)使用--skip_grant-tables选项启动MySQL服务

skip-grant-tables选项将使MySQL服务器停止权限判断,任何用户都有访问数据库的权力。这个选项是跟在MySQL服务的命令后面的。windows操作系统中,使用mysqld或者mysqld_nt来启动MySQL服务。也可以使用net srart mysql命令,来启动MySQL服务。 mysqld命令如下:

mysqld -skip-grant-tables

mysqld-nt 命令如下:

mysqld-nt -skip-grant-tables

net start mysql 0命令如下:

net start mysql -skip-grant-tables

Linux操作系统中,使用mysqld_safe来启动MySQL服务,也可以使用/etc/init.d/mysql 来启动MySQL服务。mysqld_safe命令如下:

mysqld_safe -skip-grant-tables user=mysql

使用/etc/init.d/mysql的执行语句如下:

/etc/init.d/mysql start -mysqld -skip-grant-tables

启动MySQL服务后,就可以使用root用户登录了。

2.登录root用户,并且设置新的密码

通过上述方式启动MySQL服务以后,可以不输入密码就登录root用户。登录以后,可以使用UPDATE语句来修改密码。

C:\mysql\bin>mysql -u root
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 3
Server version: 5.1.40-community MySQL Community Server (GPL)
Type 'help;' or 'h' for help.
Type 'c' to clear the current input statement.
mysql> UPDATE mysql.user SET Password=PASSWORD('root')
WHERE User='root' AND Host=,localhost.;
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

上面的程序没有输入root用户的密码,而是直接使用用户名root登录到MySQL数据库中的。而且使用update语句修改密码后,结果显示user表已经更新。

注意:这里必须使用UPDATE语句来更新mysql数据库下的user表,而不能使用SET语句。如果使用SET语句,就会出现 ERROR 1290 (HY000): The MySQL server is running with the -skip-grant-tables option so it cannot execute this statement。

3.加载权限表

修改完密码以后,必须用FLUSH PRIVILEGES语句来加权限表。加载权限表后,新密码开始有效。而且,MySQL服务器开始进行权限认证。用户必须输入用户名和密码才能登录MySQL数据库。加载权限表的代码执行结果如下:

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

这样root用户的密码就已经设置成功了。



关注微信获取最新动态