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用户的密码就已经设置成功了。