文章标签 ‘MySQL’
一、自动备份脚本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #!/bin/bash MYSQL_USERNAME="mysql_username" MYSQL_PASSWORD="mysql_password" BACKUP_FILENAME="/home/wwwroot" # 需要备份的目录 BACKUP_DBNAME="www_db" # 需要备份的数据库名称,多个用空格间隔。 BACKUP_PREFIX="backup_" # 备份文件的前缀 # 下面一些命令路径可以通过whereis获取 MYSQLDUMP_PATH="/usr/bin" # mysqldump 命令所在的路径 TARCOMPRESSOR_PATH="/bin" # tar 命令所在的路径 RM_PATH="/bin" # rm 命令所在的路径 TEMP_PATH="/root/backup" # 备份文件存放目录 # 产生临时名称形如 backup_20120221 名称 make_backup_name() { TEMPNAME=${BACKUP_PREFIX}$(date +"%Y%m%d") } # 产生临时备份目录 make_backup_dir() { make_backup_name TEMPDIR=${TEMP_PATH}/${TEMPNAME} mkdir -m 700 -p $TEMPDIR } backup_files() { cd ${BACKUP_FILENAME} ${TARCOMPRESSOR_PATH}/tar -zcvf ${TEMPDIR}/www_${TEMPNAME}.tar.gz ${BACKUP_FILENAME} } backup_databases() { local EXPORTDIR=$1 ${MYSQLDUMP_PATH}/mysqldump -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} --databases ${BACKUP_DBNAME} > ${EXPORTDIR}/mysql_${TEMPNAME}.sql cd ${EXPORTDIR} ${TARCOMPRESSOR_PATH}/tar -zcvf mysql_${TEMPNAME}.tar.gz mysql_${TEMPNAME}.sql } # 清除产生的临时文件 cleanup() { $RM_PATH/rm -f ${TEMPDIR}/mysql_${TEMPNAME}.sql chmod -R 700 ${TEMP_PATH} } main() { make_backup_dir backup_databases $TEMPDIR backup_files cleanup } main exit 0 |
保存脚本上传至服务器(如:/root/backup.sh)并给脚本加上可执行属性:
chmod 755 /root/backup.sh
在Win下可以修改my.ini:
4.0及以下版本在[mysqld]所属下插入
set-variable=max_connections=1000(或更多) 即可。
4.1以上修改max_connections的属性
max_connections=1000(或更多) 即可。
在Unix/Linux下:
mysql的最大连接数默认是100, 这个数值对于并发连接很多的数据库应用是远远不够的,可以把它适当调大
whereis safe_mysqld
找到safe_mysqld的位置,然后编辑它,找到mysqld启动的那两行,在后面加上参数
-O max_connections=1000
例如
--- safe_mysqld.orig Mon Sep 25 09:34:01 2000
+++ safe_mysqld Sun Sep 24 16:56:46 2000
@@ -109,10 +109,10 @@
if test "$#" -eq 0
then
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR
- --skip-locking >> $err_log 2>&1
+ --skip-locking -O max_connections=1000 >> $err_log 2>&1
else
nohup $ledir/mysqld --basedir=$MY_BASEDIR_VERSION --datadir=$DATADIR
- --skip-locking "$@" >> $err_log 2>&1
+ --skip-locking "$@" -O max_connections=1000 >> $err_log 2>&1
fi
if test ! -f $pid_file # This is removed if normal shutdown
then
然后关闭mysql重启它,用
/mysqladmin所在路径/mysqladmin -uroot -p variables
输入root数据库账号的密码后可看到
| max_connections | 1000 |
即新改动已经生效。
mysql出错了,以前往往靠猜.有了这张表,一查就出来了.方便不少.特共享于众
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能
MySQL性能设置
网站访问量越来越大,MySQL自然成为瓶颈,因此最近我一直在研究 MySQL 的优化,第一步自然想到的是 MySQL 系统参数的优化,作为一个访问量很大的网站(日20万人次以上)的数据库系统,不可能指望 MySQL 默认的系统参数能够让 MySQL运行得非常顺畅。
通过在网络上查找资料和自己的尝试,我认为以下系统参数是比较关键的:
(1)、back_log:
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。
(2)、interactive_timeout:
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。
(3)、key_buffer_size:
索引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为402649088(400MB)。
(4)、max_connections:
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。
(5)、record_buffer:
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M)
(6)、sort_buffer:
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。
(7)、table_cache:
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。
(8)、thread_cache_size:
可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。
(10)、wait_timeout:
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。
注:参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作,上面的结果也仅仅是我的一些看法,你可以根据你自己主机的硬件情况(特别是内存大小)进一步修改。
1、前言
MySQL 是完全网络化的跨平台关系型数据库系统,同时是具有客户机/服务器体系结构的分布式数据库管理系统。它具有功能强、使用简便、管理方便、运行速度快、安全可靠性强等优点,用户可利用许多语言编写访问MySQL 数据库的程序,特别是与PHP更是黄金组合,运用十分广泛。
由于MySQL是多平台的数据库,它的默认配置要考虑各种情况下都能适用,所以在我们自己的使用环境下应该进行进一步的安全加固。作为一个MySQL的系统管理员,我们有责任维护MySQL数据库系统的数据安全性和完整性。
MySQL数据库的安全配置必须从两个方面入手,系统内部安全和外部网络安全,另外我们还将简单介绍编程时要注意的一些问题以及一些小窍门。
2、系统内部安全
首先简单介绍一下MySQL数据库目录结构。MySQL安装好,运行了mysql_db_install脚本以后就会建立数据目录和初始化数据库。如果我们用MySQL源码包安装,而且安装目录是/usr/local/mysql,那么数据目录一般会是/usr/local/mysql/var。数据库系统由一系列数据库组成,每个数据库包含一系列数据库表。MySQL是用数据库名在数据目录建立建立一个数据库目录,各数据库表分别以数据库表名作为文件名,扩展名分别为MYD、MYI、frm的三个文件放到数据库目录中。
MySQL的授权表给数据库的访问提供了灵活的权限控制,但是如果本地用户拥有对库文件的读权限的话,攻击者只需把数据库目录打包拷走,然后拷到自己本机的数据目录下就能访问窃取的数据库。所以MySQL所在的主机的安全性是最首要的问题,如果主机不安全,被攻击者控制,那么MySQL的安全性也无从谈起。其次就是数据目录和数据文件的安全性,也就是权限设置问题。
从MySQL主站一些老的binary发行版来看,3.21.xx版本中数据目录的属性是775,这样非常危险,任何本地用户都可以读数据目录,所以数据库文件很不安全。3.22.xx版本中数据目录的属性是770,这种属性也有些危险,本地的同组用户既能读也能写,所以数据文件也不安全。3.23.xx版本数据目录的属性是700,这样就比较好,只有启动数据库的用户可以读写数据库文件,保证了本地数据文件的安全。
如果启动MySQL数据库的用户是mysql,那么象如下的目录和文件的是安全的,请注意数据目录及下面的属性:
shell>ls -l /usr/local/mysql
total 40
drwxrwxr-x 2 root root 4096 Feb 27 20:07 bin
drwxrwxr-x 3 root root 4096 Feb 27 20:07 include
drwxrwxr-x 2 root root 4096 Feb 27 20:07 info
drwxrwxr-x 3 root root 4096 Feb 27 20:07 lib
drwxrwxr-x 2 root root 4096 Feb 27 20:07 libexec
drwxrwxr-x 3 root root 4096 Feb 27 20:07 man
drwxrwxr-x 6 root root 4096 Feb 27 20:07 mysql-test
drwxrwxr-x 3 root root 4096 Feb 27 20:07 share
drwxrwxr-x 7 root root 4096 Feb 27 20:07 sql-bench
drwx------ 4 mysql mysql 4096 Feb 27 20:07 var
shell>ls -l /usr/local/mysql/var
total 8
drwx------ 2 mysql mysql 4096 Feb 27 20:08 mysql
drwx------ 2 mysql mysql 4096 Feb 27 20:08 test
shell>ls -l /usr/local/mysql/var/mysql
total 104
-rw------- 1 mysql mysql 0 Feb 27 20:08 columns_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 columns_priv.MYI
-rw------- 1 mysql mysql 8778 Feb 27 20:08 columns_priv.frm
-rw------- 1 mysql mysql 302 Feb 27 20:08 db.MYD
-rw------- 1 mysql mysql 3072 Feb 27 20:08 db.MYI
-rw------- 1 mysql mysql 8982 Feb 27 20:08 db.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 func.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 func.MYI
-rw------- 1 mysql mysql 8641 Feb 27 20:08 func.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 host.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 host.MYI
-rw------- 1 mysql mysql 8958 Feb 27 20:08 host.frm
-rw------- 1 mysql mysql 0 Feb 27 20:08 tables_priv.MYD
-rw------- 1 mysql mysql 1024 Feb 27 20:08 tables_priv.MYI
-rw------- 1 mysql mysql 8877 Feb 27 20:08 tables_priv.frm
-rw------- 1 mysql mysql 428 Feb 27 20:08 user.MYD
-rw------- 1 mysql mysql 2048 Feb 27 20:08 user.MYI
-rw------- 1 mysql mysql 9148 Feb 27 20:08 user.frm
如果这些文件的属主及属性不是这样,请用以下两个命令修正之:
shell>chown -R mysql.mysql /usr/local/mysql/var
shell>chmod -R go-rwx /usr/local/mysql/var
用root用户启动远程服务一直是安全大忌,因为如果服务程序出现问题,远程攻击者极有可能获得主机的完全控制权。MySQL从3.23.15版本开始时作了小小的改动,默认安装后服务要用mysql用户来启动,不允许root用户启动。如果非要用root用户来启动,必须加上--user=root的参数(./safe_mysqld --user=root &)。因为MySQL中有LOAD DATA INFILE和Select ... INTO OUTFILE的SQL语句,如果是root用户启动了MySQL服务器,那么,数据库用户就拥有了root用户的写权限。不过MySQL还是做了一些限制的,比如LOAD DATA INFILE只能读全局可读的文件,Select ... INTO OUTFILE不能覆盖已经存在的文件。
本地的日志文件也不能忽视,包括shell的日志和MySQL自己的日志。有些用户在本地登陆或备份数据库的时候为了图方便,有时会在命令行参数里直接带了数据库的密码,如:
shell>/usr/local/mysql/bin/mysqldump -uroot -ptest test>test.sql
shell>/usr/local/mysql/bin/mysql -uroot -ptest
这些命令会被shell记录在历史文件里,比如bash会写入用户目录的.bash_history文件,如果这些文件不慎被读,那么数据库的密码就会泄漏。用户登陆数据库后执行的SQL命令也会被MySQL记录在用户目录的.mysql_history文件里。如果数据库用户用SQL语句修改了数据库密码,也会因.mysql_history文件而泄漏。所以我们在shell登陆及备份的时候不要在-p后直接加密码,而是在提示后再输入数据库密码。
另外这两个文件我们也应该不让它记录我们的操作,以防万一。
shell>rm .bash_history .mysql_history
shell>ln -s /dev/null .bash_history
shell>ln -s /dev/null .mysql_history
上门这两条命令把这两个文件链接到/dev/null,那么我们的操作就不会被记录到这两个文件里了。
3、外部网络安全
MySQL数据库安装好以后,Unix平台的user表是这样的:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| redhat | root | | Y | Y |
| localhost | | | N | N |
| redhat | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in set (0.00 sec)
Windows平台的user表是这样的:
mysql> use mysql;
Database changed
mysql> select Host,User,Password,Select_priv,Grant_priv from user;
+-----------+------+----------+-------------+------------+
| Host | User | Password | Select_priv | Grant_priv |
+-----------+------+----------+-------------+------------+
| localhost | root | | Y | Y |
| % | root | | Y | Y |
| localhost | | | Y | Y |
| % | | | N | N |
+-----------+------+----------+-------------+------------+
4 rows in set (0.00 sec)
我们先来看Unix平台的user表。其中redhat只是我试验机的机器名,所以实际上Unix平台的MySQL默认只允许本机才能连接数据库。但是缺省root用户口令是空,所以当务之急是给root用户加上口令。给数据库用户加口令有三种方法:
1)在shell提示符下用mysqladmin命令来改root用户口令:
shell>mysqladmin -uroot password test
这样,MySQL数据库root用户的口令就被改成test了。(test只是举例,我们实际使用的口令一定不能使用这种易猜的弱口令)
2)用set password修改口令:
mysql> set password for root@localhost=password('test');
这时root用户的口令就被改成test了。
3)直接修改user表的root用户口令:
mysql> use mysql;
mysql> update user set password=password('test') where user='root';
mysql> flush privileges;
这样,MySQL数据库root用户的口令也被改成test了。其中最后一句命令flush privileges的意思是强制刷新内存授权表,否则用的还是缓冲中的口令,这时非法用户还可以用root用户及空口令登陆,直到重启MySQL服务器。
我们还看到user为空的匿名用户,虽然它在Unix平台下没什么权限,但为了安全起见我们应该删除它:
mysql> delete from user where user='';
Windows版本MySQL的user表有很大不同,我们看到Host字段除了localhost还有是%。这里%的意思是允许任意的主机连接MySQL服务器,这是非常不安全的,给攻击者造成可乘之机,我们必须删除Host字段为%的记录:
mysql>delete from user where host='%';
默认root用户的空密码也是必须修改,三种修改方法和Unix平台一样。
我们注意到Host字段为localhost的匿名用户拥有所有的权限!就是说本地用户用空的用户名和空的口令登陆MySQL数据库服务器可以得到最高的权限!所以匿名用户必须删除!
mysql> delete from user where user='';
对user表操作以后不要忘了用flush privileges来强制刷新内存授权表,这样才能生效。
默认安装的Windows版MySQL存在的不安全因素太多,我们在安装后一定要进一步配置!
MySQL的5个授权表:user, db, host, tables_priv和columns_priv提供非常灵活的安全机制,从MySQL 3.22.11开始引入了两条语句GRANT和REVOKE来创建和删除用户权限,可以方便的限制哪个用户可以连接服务器,从哪里连接以及连接后可以做什么操作。作为MySQL管理员,我们必须了解授权表的意义以及如何用GRANT和REVOKE来创建用户、授权和撤权、删除用户。
在3.22.11版本以前的MySQL授权机制不完善,和新版本也有较大的不同,建议升级到最新版本的MySQL。(本书的操作例子是以MySQL 3.23.49
为样本)我们先来了解授权表的结构。
1)MySQL授权表的结构与内容:
mysql> desc user;
+-----------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Password | char(16) binary | | | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
| Reload_priv | enum('N','Y') | | | N | |
| Shutdown_priv | enum('N','Y') | | | N | |
| Process_priv | enum('N','Y') | | | N | |
| File_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
17 rows in set (0.01 sec)
user表是5个授权表中最重要的一个,列出可以连接服务器的用户及其加密口令,并且它指定他们有哪种全局(超级用户)权限。在user表启用的任何权限均是全局权限,并适用于所有数据库。所以我们不能给任何用户访问mysql.user表的权限!
权限说明:
+-----------+-------------+-----------------------------------------------------------------------+
| 权限指定符| 列名 |权限操作 |
+-----------+-------------+-----------------------------------------------------------------------+
| Select | Select_priv | 允许对表的访问,不对数据表进行访问的select语句不受影响,比如select 1+1|
+-----------+-------------+-----------------------------------------------------------------------+
| Insert | Insert_priv | 允许对表用insert语句进行写入操作。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Update | Update_priv | 允许用update语句修改表中现有记录。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Delete | Delete_priv | 允许用delete语句删除表中现有记录。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Create | Create_priv | 允许建立新的数据库和表。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Drop | Drop_priv | 允许删除现有的数据库和表。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Index | Index_priv | 允许创建、修改或删除索引。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Alter | Alter_priv | 允许用alter语句修改表结构。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Grant | Grant_priv | 允许将自己拥有的权限授予其它用户,包括grant。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Reload | Reload | 允许重载授权表,刷新服务器等命令。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Shutdown | Shudown_priv| 允许用mysqladmin shutdown命令关闭MySQL服务器。该权限比较危险, |
| | | 不应该随便授予。 |
+-----------+-------------+-----------------------------------------------------------------------+
| Process | Process_priv| 允许查看和终止MySQL服务器正在运行的线程(进程)以及正在执行的查询语句 |
| | | ,包括执行修改密码的查询语句。该权限比较危险,不应该随便授予。 |
+-----------+-------------+-----------------------------------------------------------------------+
| File | File_priv | 允许从服务器上读全局可读文件和写文件。该权限比较危险,不应该随便授予。|
+-----------+-------------+-----------------------------------------------------------------------+
mysql> desc db;
+-----------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
13 rows in set (0.01 sec)
db表列出数据库,而用户有权限访问它们。在这里指定的权限适用于一个数据库中的所有表。
mysql> desc host;
+-----------------+-----------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-----------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| Select_priv | enum('N','Y') | | | N | |
| Insert_priv | enum('N','Y') | | | N | |
| Update_priv | enum('N','Y') | | | N | |
| Delete_priv | enum('N','Y') | | | N | |
| Create_priv | enum('N','Y') | | | N | |
| Drop_priv | enum('N','Y') | | | N | |
| Grant_priv | enum('N','Y') | | | N | |
| References_priv | enum('N','Y') | | | N | |
| Index_priv | enum('N','Y') | | | N | |
| Alter_priv | enum('N','Y') | | | N | |
+-----------------+-----------------+------+-----+---------+-------+
12 rows in set (0.01 sec)
host表与db表结合使用在一个较好层次上控制特定主机对数据库的访问权限,这可能比单独使用db好些。这个表不受GRANT和REVOKE语句的影响
,所以,你可能发觉你根本不是用它。
mysql> desc tables_priv;
+-------------+-----------------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------+-----------------------------+------+-----+---------+-------+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Table_name | char(60) binary | | PRI | | |
| Grantor | char(77) | | MUL | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Table_priv | set('Select','Insert', | | | | |
| | 'Update','Delete','Create', | | | | |
| | 'Drop','Grant','References',| | | | |
| | 'Index','Alter') | | | | |
| Column_priv | set('Select','Insert', | | | | |
| | 'Update','References') | | | | |
+-------------+-----------------------------+------+-----+---------+-------+
8 rows in set (0.01 sec)
tables_priv表指定表级权限。在这里指定的一个权限适用于一个表的所有列。
mysql> desc columns_priv;
+-------------+------------------------+------+-----+---------+----+
| Field | Type | Null | Key | Default | Extra |
+-------------+------------------------+------+-----+---------+----+
| Host | char(60) binary | | PRI | | |
| Db | char(64) binary | | PRI | | |
| User | char(16) binary | | PRI | | |
| Table_name | char(64) binary | | PRI | | |
| Column_name | char(64) binary | | PRI | | |
| Timestamp | timestamp(14) | YES | | NULL | |
| Column_priv | set('Select','Insert', | | | | |
| | 'Update','References') | | | | |
+-------------+------------------------+------+-----+---------+-------+
7 rows in set (0.00 sec)
columns_priv表指定列级权限。在这里指定的权限适用于一个表的特定列。
2)MySQL授权表运行机制
MySQL的访问控制分两个步骤:
a)服务器检查是否允许该用户连接。
b)如果该用户有权连接,那么服务器还会检查它的每一个请求是否有足够的权限。比如:用户检索数据库中的一个表需要有这个数据库的select权限,用户删除数据库中的一个表需要有这个数据库的drop权限。
授权表的user, db, host表使用这两个步骤,tables_priv和columns_priv表只使用第二步(检查请求)。每个授权表包含决定一个权限何时运用的范围列和决定授予哪种权限的权限列。
范围列指定表中的权限何时运用。每个授权表条目包含User和Host列来指定权限何时运用于一个给定用户从给定主机的连接。其他表包含附加的范围列,如db表包含一个Db列指出权限运用于哪个数据库。类似地,tables_priv和columns_priv表包含范围字段,缩小范围到一个数据库中的特定表或一个表的特定列。
下面是user表的Host字段和User字段组合的一些例子:
+-----------------------------+--------+------------------------------------------------+
| Host值 | User值 | 匹配的连接 |
+-----------------------------+--------+-----------------------------------------------+
| 'x.y.z' | 'test' | test用户只能从x.y.z连接数据库 |
+-----------------------------+--------+-----------------------------------------------+
| 'x.y.z' | '' | 任何用户可以从x.y.z连接数据库 |
+-----------------------------+--------+-----------------------------------------------+
| '%' | 'test' | test用户可以从任意主机连接数据库 |
+-----------------------------+--------+----------------------------------------------+
| '' | '' | 任何用户可以从任意主机连接数据库 |
+-----------------------------+--------+-----------------------------------------------+
| '%.y.z' | 'test' | test用户可以从y.z域的任意主机连接数据库 |
+-----------------------------+--------+----------------------------------------------+
| 'x.y.% ' | 'test' | test用户可以从x.y.net, x.y.com, x.y.edu等主机连接数据库|
+-----------------------------+--------+----------------------------------------------+
| '192.168.1.1' | 'test' | test用户可以从IP地址为192.168.1.1的主机连接数据库 |
+-----------------------------+--------+---------------------------------------------+
| '192.168.1.% ' | 'test' | test用户可以从C类子网192.168.1中的任意主机连接数据库 |
+-----------------------------+--------+---------------------------------------------+
| '192.168.1.0/255.255.255.0' | 'test' | 同上 |
+-----------------------------+--------+--------------------------------------------+
SQL的字符串通配符%表示匹配任意字符,可以是0个字符,通配符_表示匹配一个字符。
权限列指出在范围列中指定的用户拥有何种权限。该表使用GRANT语句的权限名称。对于绝大多数在user、db和host表中的权限列的名称与GRANT语句中有明显的联系。如Select_priv对应于Select权限。
3)授权表使用举例
grant用于给增加用户和创建权限,revoke用于删除用户权限。
下面是一些用grant增加用户和创建权限的例子:
mysql> grant all privileges on *.* to test@localhost identified by 'test' with grant option;
这句增加一个本地具有所有权限的test用户(超级用户),密码是test。ON子句中的*.*意味着"所有数据库、所有表"。with grant option表示它具有grant权限。
mysql> grant select,insert,update,delete,create,drop privileges on test.* to test1@'192.168.1.0/255.255.255.0' identified by 'test';
这句是增加了一个test1用户,口令是test,但是它只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限。
用grant语句创建权限是不需要再手工刷新授权表的,因为它已经自动刷新了。
给用户创建权限还可以通过直接修改授权表:
mysql> insert into user values("localhost","test",password("test"),"Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y","Y");
mysql> flush privileges;
这两句和上面第一句grant的效果是一样的,也是增加了一个本地的test超级用户。我们看到用grant方便多了,而且还不需flush privileges
。
mysql> insert into user (host,user,password) values("192.168.1.0/255.255.255.0","test1",PASSWORD("test"));
mysql> insert into db values("192.168.1.0/255.255.255.0","test","test1","Y","Y","Y","Y","Y","Y","N","N","N","N")
mysql> flush privileges;
这三句和上面第二句grant的效果也是一样的,也是增加了一个只能从C类子网192.168.1连接,对test库有select,insert,update,delete,create,drop操作权限的test1用户,口令是test。要取消一个用户的权限,使用revoke语句。revoke的语法非常类似于grant语句,除了to用from取代并且没有identified by和with grant
option子句,下面是用revoke删除用户权限的例子:
mysql> revoke all on test.* from test1@'192.168.1.0/255.255.255.0';
这句revoke就撤消了上面第二句grant创建的权限,但是test1用户并没有被删除,必须手工从user表删除:
mysql> delete from user where user='test1';
mysql> flush privileges;
这样,test1用户就彻底删除了。
这些只是MySQL授权表的简单使用,更多详细的资料请见MySQL提供的手册。
3、编程需要注意的一些问题
不管是用哪种程序语言写连接MySQL数据库的程序,有一条准则是永远不要相信用户提交的数据!
对于数字字段,我们要使用查询语句:Select * FROM table Where ID='234',不要使用Select * FROM table Where ID=234这样的查询语句。MySQL会自动把字串转换为数字字符并且去除非数字字符。如果用户提交的数据经过了mysql_escape_string处理,这样我们就可以完全杜绝了sql inject攻击,关于sql inject攻击请参考下面链接的文章:
http://www.spidynamics.com/papers/SQLInjectionWhitePaper.pdf
http://www.ngssoftware.com/papers/advanced_sql_injection.pdf
各种编程语言该注意的问题:
1)所有Web程序:
a)尝试在Web表单输入单引号和双引号来测试可能出现的错误,并找出原因所在。
b)修改URL参数带的%22 ('"'), %23 ('#'), 和 %27 (''')。
c)对于数字字段的变量,我们的应用程序必须进行严格的检查,否则是非常危险的。
d)检查用户提交的数据是否超过字段的长度。
e)不要给自己程序连接数据库的用户过多的访问权限。
2)PHP:
a)检查用户提交的数据在查询之前是否经过addslashes处理,在PHP 4.0.3以后提供了基于MySQL C API的函数mysql_escape_string()。
3)MySQL C API:
a)检查查询字串是否用了mysql_escape_string() API调用。
4)MySQL++:
a)检查查询字串是否用了escape和quote处理。
5)Perl DBI:
a)检查查询字串是否用了quote()方法。
6)Java JDBC:
a)检查查询字串是否用了PreparedStatement对象。
4、一些小窍门
1)如果不慎忘记了MySQL的root密码,我们可以在启动MySQL服务器时加上参数--skip-grant-tables来跳过授权表的验证 (./safe_mysqld --skip-grant-tables &),这样我们就可以直接登陆MySQL服务器,然后再修改root用户的口令,重启MySQL就可以用新口令登陆了。
2)启动MySQL服务器时加上--skip-show-database使一般数据库用户不能浏览其它数据库。
3)启动MySQL服务器时加上--chroot=path参数,让mysqld守护进程运行在chroot环境中。这样SQL语句LOAD DATA INFILE和Select ... INTO OUTFILE就限定在chroot_path下读写文件了。这里有一点要注意,MySQL启动后会建立一个mysql.sock文件,默认是在/tmp目录下。使用了chroot后,MySQL会在chroot_path/tmp去建立mysql.sock文件,如果没有chroot_path/tmp目录或启动MySQL的用户没有这个目录写权限就不能建立mysql.sock文件,MySQL会启动失败。比如我们加了--chroot=/usr/local/mysql/启动参数,那么最好建立一个启动MySQL的用户能写的
/usr/local/mysql/tmp目录,当然我们也可以用--socket=path来指定mysql.sock文件的路径,但这个path一定要在chroot_path里面。
4)启动MySQL服务器时加上--log-slow-queries[=file]参数,这样mysqld会把SQL命令执行时间超过long_query_time的写入file文件。如果没有指定=file,mysqld默认会写到数据目录下的hostname-slow.log。如果只指定了filename,没有指定路径,那么mysqld也会把filename写到数据目录下。我们通过这个日志文件可以找出执行时间超长的查询语句,然后尽可能的优化它减轻MySQL服务器的负担。
5)如果我们只需本机使用MySQL服务,那么我们还可以加上--skip-networking启动参数使MySQL不监听任何TCP/IP连接,增加安全性。(非常推荐)
6)MySQL的更多mysqld启动选项请见MySQL手册4.16.4 mysqld Command-line Options
5、References
MySQL Manual(http://www.mysql.com/documentation/index.html)
晏子的MySQL管理员指南(http://clyan.hongnet.com/index.html)
Access Granted(http://www.devshed.com/Server_Side/MySQL/Access)
一、前言
发现本版中很多用户的问题都是关于空间搭建的,所以写了这篇作文希望对大家有所帮助,这也是版主职责嘛,呵呵。这篇文章所描述的整合过程是针对Discuz!而写的,旨在让Discuz!更好的运行。原则就是用不到的东西就不装、不编、不配,最大程度让系统干净快速。
二、准备程序
以下所有程序的版本都是推荐使用的,并且是截止到本文发布时最新的版本。
Apache 2.0.55
下载地址:http://apache.justdn.org/httpd/httpd-2.0.55.tar.gz
PHP 4.4.1
下载地址:http://cn.php.net/get/php-4.4.1.tar.gz/from/cn2.php.net/mirror
MySQL 4.0.26
下载地址:
http://downloads.mysql.com/archi ... t-4.0.26-0.i386.rpm
http://downloads.mysql.com/archi ... r-4.0.26-0.i386.rpm
Zend Optimizer 2.6.0
下载地址:http://prdownloads.sourceforge.n ... pl1.tar.gz?download
PHPMyAdmin 2.7.0-pl1
下载地址:https://www.phpmyadmin.net
三、安装整合环境
1、准备工作:
由于Discuz!4.0的水印功能需要调用GD库实现,所以请先确定你的系统中已经安装了GD环境:
# rpm -qa | grep zlib
# rpm -qa | grep libpng
# rpm -qa | grep freetype
# rpm -qa | grep jpeg
# rpm -qa | grep gd
如果没有安装的话,可以按照下面的步骤手动安装:
(1) 安装zlib
# tar zxvf zlib-1.2.2.tar.gz
# cd zlib-1.2.2
# ./configure
# make
# make install(2) 安装libpng
# tar zxvf libpng-1.2.7.tar.tar
# cd libpng-1.2.7
# cd scripts/
# mv makefile.linux ../makefile
# cd ..
# make
# make install
注意,这里的makefile不是用./configure生成,而是直接从scripts/里复制一个。(3) 安装freetype
# tar zxvf freetype-2.1.9.tar.gz
# cd freetype-2.1.9
# ./configure
# make
# make install(4) 安装Jpeg
# tar zxvf jpegsrc.v6b.tar.gz
# cd jpeg-6b/
# ./configure --enable-shared
# make
# make test
# make install
注意:这里configure一定要带--enable-shared参数,不然,不会生成共享库(5)安装GD
# tar zxvf gd-2.0.33.tar.gz
# cd gd-2.0.33
# ./configure --with-png --with-freetype --with-jpeg
# make install
2、安装配置MySQL
在安装MySQL之前,首先检查系统中是否安装了随Linux安装光盘自带的MySQL RPM:
# rpm -qa | grep mysql
如果没有返回任何结果则说明系统中没有安装过MySQL RPM,如果返回有MySQL RPM信息,
则需要先卸载它:
# rpm -e MySQL-xxxxxx
卸载过程中可能会提示有包依赖性问题而无法完成卸载,可以使用--nodeps或--force进行
强制卸载。
当系统中的MySQL卸载完毕后我们开始安装新的版本:
安装客户端:
# rpm -ivh MySQL-client-4.0.26-0.i386.rpm
安装服务端:
# rpm -ivh MySQL-server-4.0.26-0.i386.rpm
启动MySQL Server:
# /etc/rc.d/init.d/mysql start
设置root密码:
# mysqladmin -u root password new_password_for_root
3、安装配置Apache
# tar xzvf httpd-2.0.55.tar.gz
# cd httpd-2.0.55
# ./configure --prefix=/usr/local/apache --enable-so (这里为了节省内存提高Apache性能只允许了加载动态模块参数,而没有加载其他的模块。
如果需要什么模块,今后手动挂载上去就可以了。)
# make
# make install
配置Apache:
# vi /usr/local/apache/conf/httpd.conf
以下只列出httpd.conf需要改动和配置的地方,其他地方暂时不用改动,略过。
ServerAdmin 将此处改为服务器管理员的E-Mail地址(例如:webmaster@yourdomain.com)
ServerName 将此处改为服务器的域名(例如:www.yourdomain.com:80)
DocumentRoot 将此处改为你的网站根目录(例如:"/var/www")
3、安装配置PHP
# tar xzvf php-4.4.1.tar.gz
# cd php-4.4.1
# ./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache/bin/apxs --with-mysql --with-config-file-path=/usr/local/php/etc --with-gd --enable-gd-native-ttf --enable-gd-jis-conv --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --enable-xml --enable-mbstring
# make
# make install
# cp php.ini-recommend /usr/local/php/etc/php.ini
与Apache整合:
编辑httpd.conf文件:
# vi /usr/local/apache/conf/httpd.conf
找到:
DirectoryIndex
在后面的默认文件中增加index.php
找到:
AddType application/x-gzip .gz .tgz
在下面添加一行:
AddType application/x-httpd-php .php
保存退出
4、安装Zend Optimizer
# tar xzvf Zend*.gz
# rm -f Zend*.gz
# cd Zend*
# ./install.sh
安装过程非常友好,很简单,但在输入php.ini文件路径的时候必须输入正确:/usr/local/php/etc
安装完成后Zend Optimizer会自动重新启动Apache。
5、安装配置PHPMyAdmin
# tar xzvf phpMyAdmin-2.7.0-pl1.tar.gz
将解压后的目录移动到服务器网站的根目录中(架设网站根目录为/var/www)
# mv phpMyAdmin-2.7.0-pl1 /var/www/phpMyAdmin
配置PHPMyAdmin:
# cd /var/www/phpMyAdmin
# vi config.inc.php
修改:
$cfg['PmaAbsoluteUri'] = 'http://www.yourdomain.com/phpMyAdmin'; (写出访问phpMyAdmin的绝对URL)
$cfg['blowfish_secret'] = 'cookie'; (使用cookie加密)
$cfg['Servers'][$i]['connect_type'] = 'socket'; (以socket方式连接MySQL)
$cfg['Servers'][$i]['compress'] = TRUE; (启用压缩以提高速度,如果访问不正常请改回FALSE)
$cfg['Servers'][$i]['auth_type'] = 'cookie'; (使用cookie进行身份验证)
保存退出。
至此,环境构建完毕。
[color=Red]对于环境的优化由于因环境而异,所以请各位自己找一些优化文档看看,一定要根据自己的硬件配置和
服务器负载有进行针对性的优化,不要生搬硬套,否则可能适得其反的。[/color]
一、软件准备:以下均为网上推荐的稳定版本
PHP(4.3.10):http://cn2.php.net/get/php-4.3.10-Win32.zip/from/cn.php.net/mirror
http://cn.php.net/get/php-4.3.10-Win32.zip/from/a/mirror
MySQL(4.0.26):http://downloads.mysql.com/archives/mysql-4.0/mysql-noinstall-4.0.26-win32.zip
http://downloads.mysql.com/archives.php?p=mysql-4.0
Zend Optimizer(2.5.7):http://downloads.zend.com/optimizer/
phpMyAdmin(2.6.2):http://www.skycn.com/soft/10687.html
http://www.crsky.com/SoftView/SoftView_4190.html
假设 C:\ 为你现在所使用操作系统的系统盘,如果你目前操作系统不是安装在 C:\ ,请自行修改。
二、安装 PHP :
(1)、下载后得到 php-4.3.10-Win32.zip ,解压至C:\Inetpub\php(这个路径可以随意,不过下面要是用到这个路径,请相应修改);
(2)、再将C:\Inetpub\php\dlls目录下和C:\Inetpub\php\extensions目录下的所有dll文件拷到c:\Windows\system32下,覆盖已有的dll文件;
(3)、将C:\PHP目录下的php.exe、php.ini-dist和php4ts.dll三个文件拷到C:\Windows ( Windows 2000 下为 C:\WINNT)下; 将C:\Windows\php.ini-dist改名为php.ini,然后用记事本打开,利用记事本的查找功能搜索
register_globals = Off
,将 Off 改成 On ;
再搜索
extension_dir =
,并将其路径指到你的 PHP 目录下的 extensions 目录,比如:extension_dir = "C:\Inetpub\php\extensions" ;
搜索找到
;Windows Extensions
将下面列举的
;extension=php_dbase.dll
可选
;extension=php_gd2.dll
这个是用来支持GD库的,一般需要,必选
;extension=php_ldap.dll
可选
;extension=php_mbstring.dll
这不选一般用PHPMYADMIN会出红色提示,故必选
;extension=php_mssql.dll
这个是用来支持MSSQL的,可选
;extension=php_mysql.dll
这个是用来支持MYSQL的,要支持MYSQL必选
将这些前的";"去掉,其他的你需要的也可以去掉前面的;然后关闭保存该文件。
一些朋友经常反映无法上传较大的文件或者运行某些程序经常超时,那么可以找到C:\Windows ( Windows 2000 下为 C:\WINNT)目录下的PHP.INI以下内容修改:
1 2 3 4 | max_execution_time = 30 ; 这个是每个脚本运行的最长时间,可以自己修改加长,单位秒 max_input_time = 60 ; 这是每个脚本可以消耗的时间,单位也是秒 memory_limit = 8M ; 这个是脚本运行最大消耗的内存,也可以自己加大 upload_max_filesize = 2M ; 上载文件的最大许可大小 ,自己改吧,一些图片论坛需要这个更大的值 |
(4)、配置 IIS 使其支持 PHP :
首先必须确定系统中已经正确安装 IIS ,如果没有安装,需要先安装 IIS ,安装步骤如下:
打开浏览器,输入:http://localhost/,看到成功页面后进行下面的操作:
PHP 支持 CGI 和 ISAPI 两种安装模式,推荐使用 ISAPI 模式。这里只解介绍 ISAPI 模式安装方法:ISAPI 模式安装步骤:
在“控制面板”的“管理工具”中选择“Internet 服务管理器”,打开 IIS 后停止服务,然后在左侧“你需要支持PHP的Web站点”比如“默认Web站点”上单击右键选择“属性”,在打开的“ Web 站点属性”窗口的“ISAPI 筛选器”标签里找到并点击“添加”按钮,在弹出的“筛选器属性”窗口中的“筛选器名称”栏中输入:PHP ,再将可执行文件指向 php4isapi.dll 所在路径,如:C:\Inetpub\php\sapi\php4isapi.dll。
打开“Web 站点属性”窗口的“主目录”标签,找到并点击“配置”按钮,在弹出的“应用程序配置”窗口中找到并点击“添加”按钮,在弹出的窗口中新增一个扩展名映射,扩展名为 .php ,单击“浏览”将可执行文件指向 php4isapi.dll 所在路径,如:C:\Inetpub\php\sapi\php4isapi.dll,然后一路确定即可。如果还想支持诸如 .php3 ,.phtml 等扩展名的 PHP 文件,可以重复“添加”步骤。
再打开“Web 站点属性”窗口的“文档”标签,找到并点击“添加”按钮,向默认的 Web 站点启动文档列表中添加 index.php 项。您可以将 index.php 升到最高优先级,这样,访问站点时就会首先自动寻找并打开 index.php 文档。
确定 Web 目录的应用程序设置和执行许可中选择为纯脚本,然后关闭 Internet 信息服务管理器,在命令提示符中执行如下命令:
net stop w3svc
net stop iisadmin
net start w3svc
然后在“Internet 服务管理器”左边的“WEB服务扩展”中设置ISAPI 扩展允许,Active Server Pages 允许
打开浏览器,输入:http://localhost/,看到成功页面后,在 IIS 根目录下新建一个 phpinfo.php ,内容如下:
1 2 3 | <?php phpinfo(); ?> |
打开浏览器,输入:http://localhost/phpinfo.php,将显示当前服务器所支持 PHP 的全部信息,可以看到 Server API的模式为:ISAPI 。
三、配置eaccelerator :
让论坛速度更快 PHP加速设置 PHP加速:eaccelerator(用Turck MMcache会出现一些莫名其妙的错误,所以大家还是用eaccelerator吧)
点击下载eAccelerator_4.3.10.rar
解压缩,把他放到C:\Inetpub\php\extensions\里
然后打开c:\windows\php.ini
搜索
;extension=php_zip.dll
在下面添加
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [eaccelerator] zend_extension_ts="C:\Inetpub\php\extensions\eaccelerator_win_4.3.10.dll" zend_extension="C:\Inetpub\php\extensions\eaccelerator_win_4.3.10.dll" eaccelerator.cache_dir = "F:\tem\" eaccelerator.shm_size="64" eaccelerator.enable = "1" eaccelerator.optimizer = "1" eaccelerator.debug = "0" eaccelerator.check_mtime = "1" eaccelerator.filter = "" eaccelerator.shm_max = "0" eaccelerator.shm_ttl = "0" eaccelerator.shm_prune_period = "0" eaccelerator.shm_only="0" eaccelerator.compress="1" eaccelerator.compress_level = "9" eaccelerator.keys = "shm" eaccelerator.sessions = "shm" eaccelerator.content = "shm" zend_extension="C:\Inetpub\php\extensions\eloader_win_4.3.10.dll" |
注意上面的F:\tem\是用来放缓存的地方~不推荐大家把tem放在系统盘,这个大家可以自己定义.
四、安装 MySQL :
如果你下载的是 Windows Essentials (x86) ,将得到 mysql-4.0.26-essential-win.exe ,直接双击安装即可。这里本人安装到C:\Inetpub\MySQL,安装过程中会提示你是不是立即进行配置,选择否即可完成安装。安装完毕后,在“开始”菜单的“运行”中输入:C:\Inetpub\MySQL\bin\mysqld-nt -install ,运行成功之后再输入:net start mysql,将会启动 MySQL 服务;如果你还想较详细的配置 MySQL ,就请进入 C:\Inetpub\MySQL\bin 目录,运行 MySQLInstanceConfig.exe ,按提示操作即可。
如果你下载的是 Windows (x86) ,解压后双击执行 Setup.exe 即可,步骤同上。
如果你下载的是 Without installer (unzip in C:\) ,直接解压到C:\Inetpub\MySQL,在“开始”菜单的“运行”中输入: C:\Inetpub\MySQL\bin\mysqld-nt.exe ,运行成功之后再输入:net start mysql,即可启动 MySQL 服务。
为MYSQL设置密码,确保安全:
一般菜单里面有配置向导MySQL Server Instance Config Wizar,运行后按下面步骤配置设置ROOT密码即可
ROOT密码,建议社设置复杂点,确保服务器安全!
也可以在MySQL Command Line Client里面用命令配置:
首先在打开DOS窗口,然后进入目录 mysqlbin,再键入命令mysql -uroot -p,回车后提示你输密码,如果刚安装好MYSQL,超级用户root是没有密码的,故直接回车即可进入到MYSQL中了,MYSQL的提示符是:mysql>
修改密码。
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例:给root加个密码xqin.com首先在DOS下进入目录mysqlbin,然后键入以下命令
mysqladmin -uroot -password clang.cn
注:因为开始时root没有密码,所以-p旧密码一项就可以省略了。
这样ROOT密码就设置为clang.cn了
MY.INI文件配置:
mysql安装好需要优化配置一下,打开c:\windows\my.ini文件
仔细对比下面我优化过的my.ini看看哪里没有的就加进去
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #This File was made using the WinMySQLAdmin 1.4 Tool #2005-12-4 15:37:01 #Uncomment or Add only the keys that you know how works. #Read the MySQL Manual for instructions [mysqld] basedir=C:/Inetpub/MySQL #bind-address=192.168.1.1 datadir=C:/Inetpub/MySQL/data #language=C:/Inetpub/MySQL/share/your language directory #slow query log#= #tmpdir#= #port=3306 set-variable = max_connections=2500 skip-locking #skip-networking set-variable = key_buffer=384M set-variable = max_allowed_packet=1M set-variable = table_cache=512 set-variable = sort_buffer=2M set-variable = record_buffer=2M set-variable = thread_cache=8 # Try number of CPU's*2 for thread_concurrency set-variable = thread_concurrency=8 set-variable = myisam_sort_buffer_size=64M #set-variable = connect_timeout=5 set-variable = wait_timeout=5 server-id = 1 [isamchk] set-variable = key_buffer=128M set-variable = sort_buffer=128M set-variable = read_buffer=2M set-variable = write_buffer=2M [myisamchk] set-variable = key_buffer=128M set-variable = sort_buffer=128M set-variable = read_buffer=2M set-variable = write_buffer=2M [WinMySQLadmin] Server=C:/Inetpub/MySQL/bin/mysqld-nt.exe user=root password=clang.cn |
对于MYSQL4.1以上的版本还应该加在[mysqld]中加一句:
default-character-set=gbk
这句话的意思是指定mysql数据库默认的字符集是gbk。
因为MySQL 从 4.1开始把多国语言字符集分的更加详细,默认的字符集为latin1,所以导致数据库迁移,或者某些程序升级后出现乱码问题。因为 latin1 在许多地方 (下边会详细描述具体是哪些地方) 作为默认的字符集,成功的蒙蔽了许多 PHP 程序的开发者和用户,掩盖了在中文等语言环境下会出现的问题。
五、安装 Zend Optimizer :
下载后得到 ZendOptimizer-2.5.7-Windows-i386.exe ,直接双击安装即可,安装过程要你选择 Web Server 时,选择 IIS ,然后提示你是否 Restart Web Server,选择是,完成安装之前提示是否备份 php.ini ,点确定后安装完成。需要注意的是:如果您的PHP是4.3以上版本,那么就不要用缺省安装,而应该用定制安装并选择 PHP的版本为PHP 4.3.X,方能正确安装,否则会说版本不支持。
我这里安装到C:\Inetpub\Zend
Zend Optimizer 的安装向导会自动根据你的选择来修改 php.ini 帮助你启动这个引擎。下面简单介绍一下 Zend Optimizer 的配置选项。以下为本人安装完成后 php.ini 里的默认配置代码(分号后面的内容为注释):
1 2 3 4 5 6 | zend_extension_ts="C:\Inetpub\Zend\lib\ZendExtensionManager.dll" ;Zend Optimizer 模块在硬盘上的安装路径。 zend_extension_manager.optimizer_ts="C:\Inetpub\Zend\lib\Optimizer-2.5.7" ;优化器所在目录,默认无须修改。 zend_optimizer.optimization_level=15 ;优化程度,这里定义启动多少个优化过程,默认值是 15 ,表示同时开启 10 个优化过程中的 1-4 ,我们可以将这个值改为 1023 ,表示开启全部10个优化过程。 |
各个优化过程的对应的数字代码(值)如下:
不使用 0 <= 如果这样不如不装,还能节约点内存的说!
优化过程1(PASS1) 1
优化过程2(PASS2) 2
优化过程3(PASS3) 4
优化过程4(PASS4) 8
优化过程5(PASS5) 16
优化过程6(PASS6) 32
优化过程7(PASS7) 64
优化过程8(PASS8) 128
优化过程9(PASS9) 256
优化过程10(PASS10) 512
调用phpinfo()函数后显示:
Zend Engine v1.3.0, Copyright (c) 1998-2002 Zend Technologies with Zend Optimize
r v2.1.0, Copyright (c) 1998-2003, by Zend Technologies 则表示安装成功。
六、安装GD库
这一步在前面PHP.INI配置中实际上已经安装好了~
在php.ini里找到 "extension_dir",然后将路径指向extension,如下(假设你的php安装路
径为:C:\Inetpub\php,设置
1 | extension_dir = "C:\Inetpub\php\extensions" |
完成这步后,在php.ini里找到"extension=php_gd2.dll"这一行,并且去掉前面的分号,gd库安装完成,运行http://localhost/phpinfo.php测试是否成功!
七、安装 phpMyAdmin:
下载得到 phpMyAdmin-2.6.0.zip ,将其解压到 IIS 根目录,找到并打开 config.inc.php ,做以下修改:
搜索
1 | $cfg['PmaAbsoluteUri'] |
设置你的phpmyadmin的URL,如:
1 | $cfg['PmaAbsoluteUri'] = 'http://localhost/phpmyadmin/' |
注意这里假设phpmyadmin在默认站点的根目录下
搜索
1 | $cfg['blowfish_secret'] |
设定好root密码后这里也要填写比如ROOT密码clang.cn则设置为
1 | $cfg['blowfish_secret'] = 'clang.cn'; |
搜索
1 | $cfg['DefaultLang'] |
将其设置为 zh-gb2312 ;
搜索
1 | $cfg['DefaultCharset'] |
将其设置为 gb2312 ;
搜索
1 | $cfg['Servers'][$i]['auth_type'] |
默认为config,是不安全的,不推荐,推荐使用cookie,将其设置为
1 | $cfg['Servers'][$i]['auth_type'] = 'cookie'; |
注意这里如果设置为config请在下面设置用户名和密码!例如:
1 2 | $cfg['Servers'][$i]['user'] = 'root'; // MySQL user-----MySQL连接用户 $cfg['Servers'][$i]['password'] = 'clang.cn'; |
打开浏览器,输入:http://localhost/phpMyAdmin/ ,若 IIS 和 MySQL 均已启动,输入用户ROOT密码clang.cn即可浏览数据库内容。
phpMyAdmin 的具体功能,请慢慢熟悉,这里不再赘述。
至此所有安装完毕。

