mysql安装并不费劲,但是配置到网站环境就比较费劲了。mysql的缺省设置是本地的任何用户都可以连接到mysql服务器,连用户名都可以不要,这一点让俺很不爽。按照mysql中文手册的指点,俺把它配置成必须经过用户名和口令验证才能连接。可是,配置之后一点反应都没有。俺又试了N种方法,还是无效,这才想起来也许应该重启mysql服务。重启之后,终于实现了只有用户名+口令才能连接,可是唯一的root用户的口令被俺改坏了,不能通过验证,晕!倒腾了半天,差点要卸载重装,最后终于解决了这个问题。现在就把整个安装和调试过程整理一下。
mysql俺用的是从官方网站下载的mysql-3.23.58-win.zip。解压缩之后用命令行方式进入bin子目录,运行mysqld-nt --install开始安装,这样就会将mysql注册为windows服务,可以通过windows的控制面板启动和停止mysql。一路next安装完成,之后重启电脑。</P> <P>现在开始配置mysql。mysql在windows系统下的配置比较方便,不像UNIX,第一次安装的时候还要运行scripts子目录下的mysql_db_install脚本。实际上,俺装出来的mysql压根就没有scripts这个目录,害得俺白找了老半天。mysql安装好之后会建立两个名为mysql和test的数据库,其中mysql存放着mysql的访问权限表,名为user。为了控制本地用户访问mysql,需要在字符界面进行以下操作:mysql mysql(进入mysql字符界面,提示符变为mysql>)mysql>delete from user where host='localhost' and user='';mysql>quit注意mysql的SQL语句最后面加上“;”就开始执行了。只要不输入“;”,SQL语句换行也没问题。
使用mysqladmin reload读入新的设置。由于进入mysql时并没有输入用户名,此时mysqladmin会报错。不理,报错就说明配置生效了。操作完毕之后重启mysql,可以在字符界面用mysqld-nt,也可以在控制面板直接重启服务。重启之后,本地用户只能通过用户名+口令访问mysql。举个例子,访问mysql中的mysql数据库,所用的语句是:mysql -u user_id -p mysql之后会提示输入口令。注意-p后面跟的是数据库名而不是口令。如果要在同一行输入口令的话,可以紧跟在-p后面输入口令,不留空格。不推荐这种方式,因为此时口令将以明文方式显示在屏幕上。另外,数据库名不一定要在此时输入,进入mysql字符界面之后,可以用use mysql(注意没有“;”)切换到mysql数据库。
接下来修改root口令。mysql缺省设置的root口令为空,无语……在windows环境下的mysql共享版,可以用以下方法修改root口令:mysql -u root mysql(以root登录到mysql)mysql>UPDATE user SET password=PASSWORD('your password') WHERE user='root';mysql>QUIT注意'your password'才是真正的口令,外面的password()是调用的加密函数,一定不能省,不然就跟俺一样差点死定了。使用mysqladmin -u root -p reload输入root口令之后读入新的设置。
假如修改口令的时候忘了加上password()这个加密函数,root口令就会失效而无法登录。如果实现已经设置mysql本地登录必须使用用户名+口令,那就……可以用mysqld-nt --skip-grant-tables重新启动mysql。此时mysql不读取权限表,因此所有用户都拥有超级用户权限,危险~~~~重新设置root口令,然后重启mysql,这件事就结束了。
接下来在mysql中添加用户和设定权限。mysql中文参考手册给了这样一些例子:mysql>GRANT ALL PRIVILEGES ON *.* TO monty@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;mysql>GRANT ALL PRIVILEGES ON *.* TOmonty@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;mysql>GRANT RELOAD,PROCESS ON *.* TO admin@localhost;mysql>GRANT USAGE ON *.* TO dummy@localhost;(注意,以上操作最好以root身份登录到mysql后进行;mysql中文参考手册貌似有两处印刷错误,已经订正。)这些GRANT语句安装3个新用户: monty是可以从任何地方连接服务器的一个完全的超级用户,但是必须使用口令(口令就是'something'。注意,应当同时对monty@localhost和monty@'%发出GRANT语句。如果我们增加localhost条目,对localhost的匿名用户条目在我们从本地主机连接接时由mysql_install_db创建的条目(缺省条目)将优先考虑,因为它有更特定的Host字段值,所以在user表的顺序更靠前。 admin可以从localhost进行没有口令的连接,并且具有eload和process管理权限。这允许用户执行mysqladmin reload、mysqladmin refresh和mysqladmin flush-*命令,以及mysqladmin processlist。没有授予数据库有关的权限。可以可以用grant语句追加权限。dummy只能从本地主机连接,不使用口令。全局权限被设置为'N'-USAGE权限类型,就是没有权限的意思。(其中的'%'是通配符,表示任意地址)实际上,可以事先为新用户分配好数据库,然后更细致地给用户分配对应数据库上的权限。例如俺给自己的HTTP服务器分配了一个数据库,名为website,对应的用户名为web。相应的授权语句是:mysql>GRANT insert,update,delete,create,index,drop ON website.* TO web@localhost IDENTIFIED BY 'something' WITH GRANT OPTION;mysql> GRANT insert,update,delete,create,index,drop ON test.* TO web@'%' IDENTIFIED BY 'something' WITH GRANT OPTION;
在数据库中建好要用的表,就可以用PHP来试试看能不能连接mysql了。(多说一句,使用show tables;可以看已经存在的表的名称,使用describe 表名可以看数据表的结构。)PHP的测试代码如下:
<?$db_user="web";$db_host="localhost";$db_pwd="*******";$db_name="website";$db_table="user_info";$mysql_link=mysql_connect($db_host,$db_user,$db_pwd);$column=mysql_list_fields($db_name,$db_table,$mysql_link);for($i = 0;$i < mysql_num_fields($column);$i++){ print mysql_field_name($column,$i)."<br>";}mysql_close($mysql_link);?>
最后那句mysql_close($mysql_link);不要也可以,但是为了美观还是写了。在浏览器地址栏输入http://localhost/testdb.php,看到数据表的各项名称。连接成功!之后又尝试了在PHP中向数据表添加数据项,同样成功!至此,俺的网站环境就基本搭建成功了。
P.S.:貌似俺的blog访问量暴涨,出了什么事?