MySQL 初始配置

用户管理

设定root密码和删除匿名账户

某些 MySQL 安装包执行后包含一个空密码的root帐户和一个匿名帐户,这是很大的系统隐患

mysql -u root mysql

set password for root@localhost = password('db_passwd'); 

Or:
use mysql;
update user set password = password('new_db_passwd') where user='root';
flush privileges;

delete from user where user="";

--直接登陆库 mysql
mysql mysql -uroot -p

-- 显示当前用户
select user();

-- 修改当前用户密码
set password = password('new_db_passwd');

使用 mysqladmin

Notice:

不建议使用,因为密码明文的显示于命令历史中

-- 为空密码的 root 用户设定密码,省略 -p 参数 
mysqladmin -uroot -password db_passwd

-- 普通用户需要相应权限才可执行此命令
mysqladmin -u db_user -p password new_db_passwd
****** 
-- 输入旧口令后即更新了密码

创建用户

我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。

MySQL的用户管理是通过User表来实现的,添加新用户常用的方法有两个,一是在User表插入相应的数据行,同时设置相应的权限;二是通过GRANT命令创建具有某种权限的用户。

GRANT 方法

grant all on mydb.* to UserName@HostName identified by "password" ;
grant usage on *.* to UserName@HostName identified by "password";
grant select,insert,update on mydb.* to UserName@HostName identified by "password";
grant update,delete on mydb.TestTable to UserName@HostName identified by "password";

若要给此用户赋予他在相应对象上的权限的管理能力,可在GRANT后面添加WITH GRANT OPTION选项。而对于用插入User表添加的用户,Password字段应用PASSWORD 函数进行更新加密,以防不轨之人窃看密码。对于那些已经不用的用户应给予清除,权限过界的用户应及时回收权限,回收权限可以通过更新User表相应字段,也可以使用REVOKE操作。

GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO monty@"%" IDENTIFIED BY 'something' WITH GRANT OPTION;
GRANT RELOAD,PROCESS ON *.* TO admin@localhost;
GRANT USAGE ON *.* TO dummy@localhost;

这些GRANT语句安装3个新用户:

monty

可以从任何地方连接服务器的一个完全的超级用户,但是必须使用一个口令'something'做这个。注意,我们必须对monty@localhost和monty@"%"发出GRANT语句。如果我们增加localhost条目,对localhost的匿名用户条目在我们从本地主机连接接时由mysql_install_db 创建的条目将优先考虑,因为它有更特定的Host字段值,所以以user表排列顺序看更早到来。

admin

可以从localhost没有一个口令进行连接并且被授予reload和process管理权限的用户。这允许用户执行 mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,还有mysqladmin processlist。没有授予数据库有关的权限。他们能在以后通过发出另一个GRANT语句授权。

dummy

可以不用一个口令连接的一个用户,但是只能从本地主机。全局权限被设置为'N'--USAGE权限类型允许你无需权限就可设置一个用户。它假定你将在以后授予数据库相关的权限。

直接修改授权表设置用户权限

运行这些命令时,注意在结束时FLUSH PRIVILEGES

use mysql;

INSERT INTO user (Host,User,Password) VALUES('localhost','custom',PASSWORD('stupid'));
INSERT INTO user (Host,User,Password) VALUES('server.domain','custom',PASSWORD('stupid'));
INSERT INTO user (Host,User,Password) VALUES('whitehouse.gov','custom',PASSWORD('stupid'));

INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv,  Create_priv,Drop_priv)
	VALUES  ('localhost','bankaccount','custom','Y','Y','Y','Y','Y','Y');

INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv)
    VALUES ('whitehouse.gov','expenses','custom','Y','Y','Y','Y','Y','Y');

INSERT INTO db (Host,Db,User,Select_priv,Insert_priv,Update_priv,Delete_priv, Create_priv,Drop_priv)
    VALUES('%','customer','custom','Y','Y','Y','Y','Y','Y');

FLUSH PRIVILEGES;

忘记密码的操作

修改你的my.ini 配置文件,

在里面的 [mysqld]节中某处加入下面的一行

skip-grant-tables

然后保存,重启 mysqld 服务,这样你可以使用任何用户名以超级管理员的身体登录 MySQL 服务了。

然后转到mysql数据库中修改user表:

update user set password=PASSword('1234') where user='root';

一定记住要用password函数,否则将来将要输入的密码是'1234'的密文。

最后删除上面所添中的内容,重启服务。

另外,如果可以从本机或其它机器上找到可以正常使用的MySQL数据库,那么也可拷贝其mysql库中的文件名为user的相关文件,覆盖忘记密码的数据库中的同名文件,这样也能以被拷贝者的账户密码登录。

MySQL远程访问

在5.0版本中,其实有一个图形界面的配置向导工具,在设置 root账户密码时,可以选择是否允许其从远程访问。默认情况下是不允许的。

在命令行下,可以有两种方法来作此设置:

GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;
--增加了一个root用户授权通过本地机(localhost)访问,密码"something"。

GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY 'something' WITH GRANT OPTION;
--使用通配符,授与root用户从任何其它主机发起的访问。

mysql -h host -u user -p

亦可直接使用update语句修改user表:使用root用户或其他用户登录mysql,转到mysql数据库

update user set host='localhost' where user='root';
flush privileges;
--只允许root在本机登录

update user set host='%' where user='root';
flush privileges;
--允许root远程访问

注意,以上一定要加flush语句。

另外,如果要建新用户,则用grant语句比较方便,记住语句grant总是创建新用户。

全局管理权限

数据库/数据表/数据列权限

特别的权限: