MySQL5.1.x的安装、优化和安全配置
groupaddmysql新建一个名为mysql的用户组useradd-gmysqlmysql在mysql用户组下新建一个名为mysql的用户tarzxvfmysql-5.1.70.tar.gz-C/usr/local解压下载到的.gz文件cd/usr/local/mysql-5.1.70进入解压后的目录./configure\--prefix=/usr/local/mysql\--localstatedir=/data/mysql\--enable-assembler\--with-plugins=innobase,partition\--with-extra-charsets=gbk,gb2312,utf8\--enable-thread-safe-client\--with-client-ldflags=-all-static\--with-mysqld-ldflags=-all-static\--enable-local-infile\--with-pthread
配置mysql
configure的相关参数:
–prefix=/usr/local/mysql/指定安装目录–without-debug去除debug模式–with-extra-charsets=gbk,gb2312,utf8添加gbk,gb2312,utf8中文字符支持–with-pthread强制使用pthread库(posix线程库)–enable-assembler使用一些字符函数的汇编版本–enable-thread-safe-client以线程方式编译客户端–with-client-ldflags=-all-static以纯静态方式编译客户端–with-mysqld-ldflags=-all-static以纯静态方式编译服务端–with-plugins已插件方式增加表类型支持make编译makeinstall安装cpsupport-files/my-medium.cnf/etc/my.cnf将mysql的配置文件copy到/etc目录下,并更名为my.cnf
/home/mysql下面有5个my-xxxx.cnf文件
my-small.cnf最小配置安装,内存<=64M,数据数量最少my-large.cnf内存=512Mmy-medium.cnf32M<内存<64M,或者内存有128M,但是数据库与web服务器公用内存my-huge.cnf1G<内存<2G,服务器主要运行mysqlmy-innodb-heavy-4G.cnf最大配置安装,内存至少4Gcd/usr/local/mysql/进入安装目录bin/mysql_install_db--user=mysql--datadir=/data/mysql--defaults-file=/etc/my.cnf以mysql用户的身份建立数据表chown-Rroot:mysql.将mysql的主目录(即/usr/local/mysql)的属主设为root用户。这是官方文档上的命令,但奇怪的是,如果将mysql的主目录属主设成root用户,在运行了下面的bin/mysqld_safe–user=mysql&后则不能启动mysql。问题出在“权限”上,运行chown-Rmysql.则可以用下面的命令正常启动mysql。难道官方文档有错?希望大家一起来探讨一下。
chown-Rmysql:mysql/data/mysql将mysql数据目录的属主设为mysql用户bin/mysqld_safe–user=mysql&启动mysql,如果一切正常的话,运行此命令后,不会有任何提示。bin/mysqladmin-urootpasswordpassword修改root用户的密码,这里的root用户指的是mysql的root用户,与Linux的root用户无关。绿色的password就是你需要设置的新密码,牢记!bin/mysql-uroot-p如果正常的话,用这个名字可以登录,在输入密码后,出现mysql>的提示符表明登录成功。用quit命令可退出以下命令用于设置mysql开机自动运行
cdmysql-5.1.70再次进入解压后的目录,即源码目录。cpsupport-files/mysql.server/etc/init.d/mysql将mysql.server这个文件copy到/etc/init.d/目录下,并更名为mysqlchmod755/etc/init.d/mysql给/etc/init.d/mysql这个文件赋予“执行”权限chkconfig–level2345mysqlon加入到开机自动运行,运行级别为2345servicemysqlrestart重启mysql服务installplugininnodbsoname'ha_innodb.so';安装innodb
Q:为什么我用PHP连接Mysql时提示“connectfail:Can’tconnecttolocalMySQLserverthroughsocket‘/home/mysql/tmp/mysql.sock‘(13)”
A:这是因为PHP没能正常的连接到Mysql套接字,即mysql.sock文件。首先,检查/usr/local/mysql/tmp/目录下是否有mysql.sock这个文件。如果没有,可能是mysql没有正常启动;如果有,可能是/usr/local/mysql/tmp/这个目录的权限不够,用chmod755/usr/local/mysql/tmp可解决此问题。———————————————————————————————–Mysql的优化设置
打开/etc/my.cnf文件,修改以下设置,如果没有,可手动添加。调整设置时,请量力而行,这与你的服务器的配置有关,特别是内存大小。以下设置比较适合于1G-4G内存的服务器,但并不绝对。
#指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads/key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用showstatuslike‘key_reads’获得)。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。
key_buffer=384M#要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。试图设定back_log高于你的操作系统的限制将是无效的。默认数值是50
back_log=200#一个包的最大尺寸。消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。缺省地,该值太小必能捕捉大的(可能错误)包。如果你正在使用大的BLOB列,你必须增加该值。它应该象你想要使用的最大BLOB的那么大。
max_allowed_packet=4M#允许的同时客户的数量。增加该值增加mysqld要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到Toomanyconnections错误。默认数值是100
max_connections=1024#指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用showstatuslike‘Open_tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。
table_cache=512#每个线程排序所需的缓冲
sort_buffer_size=4M#当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。read_buffer_size变量控制这一缓冲区的大小。如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
read_buffer_size=4M#加速排序操作后的读数据,提高读分类行的速度。如果正对远远大于可用内存的表执行GROUPBY或ORDERBY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取。仍然不明白这个选项的用处……
read_rnd_buffer_size=8M#用于REPAIRTABLE。不明白这个选项的用处,百度上找到的设置方向也是五花八门,有128M、64M、32M等,折中选一个。
myisam_sort_buffer_size=64M#可以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以这个变量值。通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。
thread_cache_size=128#查询结果缓存。第一次执行某条SELECT语句的时候,服务器记住该查询的文本内容和它返回的结果。服务器下一次碰到这个语句的时候,它不会再次执行该语句。作为代替,它直接从查询缓存中的得到结果并把结果返回给客户端。
query_cache_size=32M#最大并发线程数,cpu数量*2
thread_concurrency=2#设置超时时间,能避免长连接
wait_timeout=120#关闭不需要的表类型,如果你需要,就不要加上这个
skip-innodbskip-bdb———————————————————————————————–
Mysql的安全设置打开/etc/my.cnf文件,修改以下设置,如果没有,可手动添加。
#取消文件系统的外部锁skip-locking#不进行域名反解析,注意由此带来的权限/授权问题
skip-name-resolve#禁止MySQL中用“LOADDATALOCALINFILE”命令。这个命令会利用MySQL把本地文件读到数据库中,然后用户就可以非法获取敏感信息了。网络上流传的一些***方法中就有用它的,它也是很多新发现的SQLInjection***利用的手段!
local-infile=0#关闭远程连接,即3306端口。这是MySQL的默认监听端口。由于此处MySQL只服务于本地脚本,所以不需要远程连接。尽管MySQL内建的安全机制很严格,但监听一个TCP端口仍然是危险的行为,因为如果MySQL程序本身有问题,那么未授权的访问完全可以绕过MySQL的内建安全机制。(你必须确定,你是否真的不需要远程连接mysql)
skip-networking修改完my.cnf后,还需要对mysql的用户名、帐号、及默认数据库进行调整首先先登录mysql,在终端窗口输入/home/mysql/bin/mysql-uroot-p然后会提示输入密码,输入正确密码后,会出现mysql>提示符。输入以下命令:
mysql>usemysql;mysql>updateusersetuser='centos',password=password('centos')whereuser='root';(将mysql的root用户名修改成centos,防止root的密码被暴力破解)mysql>selectHost,User,Password,Select_priv,Grant_privfromuser;mysql>deletefromuserwhereuser='';(删除user用户)mysql>deletefromuserwherepassword='';(删除user用户)mysql>deletefromuserwherehost='';(删除user用户)mysql>dropdatabasetest;(删除默认的test数据库)mysql>flushprivileges;(刷新mysql的缓存,让以上设置立即生效)mysql>GRANTALLPRIVILEGESON*.*TOroot@"%"IDENTIFIEDBY"root"; //为root添加远程连接的能力。mysql>quit;为了使以上优化和安全设置生效,请重启Mysql服务