免编译版linux系统mysql安装配置优化手册V21.docx
- 文档编号:28408411
- 上传时间:2023-07-13
- 格式:DOCX
- 页数:13
- 大小:22.53KB
免编译版linux系统mysql安装配置优化手册V21.docx
《免编译版linux系统mysql安装配置优化手册V21.docx》由会员分享,可在线阅读,更多相关《免编译版linux系统mysql安装配置优化手册V21.docx(13页珍藏版)》请在冰豆网上搜索。
免编译版linux系统mysql安装配置优化手册V21
(免编译版)linux系统mysql安装配置优化手册V2.1
Version:
2.1
Author:
reed
Time:
2012-05-14
1.适用的安装包
1.1mysql-5.1.48-linux-x86_64-glibc23.tar.gz(64位)
1.2安装mysql-5.1.48的32位版本请参考《(编译版)linux系统mysql安装配置优化手册V2.0》
1.3mysql-5.0.41-linux-i686-glibc23.tar.gz(32位)
注:
本次安装的linux系统环境为64位(查看版本:
#uname-m),则mysql也对应要64位。
2.建立mysql需要的用户和组
2.1#groupaddmysql
2.2#useradd–gmysqlmysql–s/sbin/nologin(–s/sbin/nologin参数为设置不允许mysql用户进行系统登录)
3.解压缩
#cd/usr/local
#tar-xzvfmysql-5.1.48-linux-x86_64-glibc23.tar.gz
#ln-s/usr/local/mysql-5.1.48-linux-x86_64-glibc23mysql
4.生成系统数据库
#cd/usr/local/mysql
#scripts/mysql_install_db--user=mysql
5.修改mysql目录权限
#chown-Rroot/usr/local/mysql
#chgrp-Rmysql/usr/local/mysql
#chown-Rmysql/usr/local/mysql/data
注:
操作mysql数据库的用户是mysql所以要拥有数据库目录的所有权
6.修改配置文件
把配置文件复制到/etc下
#cp/usr/local/mysql/support-files/my-f/etc/f
注:
如果你的内存≤64M,则复制my-f为/etc/f
如果内存是128M,则复制my-f为/etc/f
如果内存是512M,则复制my-f为/etc/f
如果内存是1-2G,则复制my-f为/etc/f
如果内存是4G,则复制my-innodb-heavy-4G.cnf为/etc/f
7.设置mysql中文编码问题
注:
这一步在创建用户数据库之前完成,并要重启MYSQL
#vi/etc/f
[client]
#password=your_password
port=3306
socket=/tmp/mysql.sock
#添加的内容
default-character-set=gb2312
[mysqld]
port=3306
socket=/tmp/mysql.sock
#添加的内容
default-character-set=utf8
8.设置Mysql执行程序的path环境变量
#vi/etc/profile
在最后处添加:
PATH=$PATH:
/usr/local/mysql/bin
exportPATH
保存退出。
#source/etc/profile
9.设置随系统开机启动
9.1启动mysql,如果一切正常的话,运行此命令后,不会有错误提示
#/usr/local/mysql/bin/mysqld_safe--user=mysql&
注:
在Unix和NetWare中推荐使用mysqld_safe来启动mysqld服务器。
mysqld_safe增加了一些安全特性,例如当出现错误时重启服务器并向错误日志文件写入运行时间信息。
9.2将mysql.server这个文件copy到/etc/init.d/目录下,并更名为mysql
#cpsupport-files/mysql.server/etc/init.d/mysql
9.3给/etc/init.d/mysql这个文件赋予“执行”权限
#chmod755/etc/init.d/mysql
9.4加入到开机自动运行,运行级别为345
#chkconfig--level345mysqlon
9.5重启mysql服务
#ps–ef|grepmysql
#kill-9id
#servicemysqlstart
注:
如果这里启动失败报错,类似这样的错误信息“StartingMySQL.Managerofpid-filequitwithoutupdatingfile.[失败]”,不要担心,先看下mysql的日志究竟报了什么错,#vi/usr/local/mysql/data/*.err(星号表示你主机的名字),错误的日志如下:
InnoDB:
Error:
datafile./ibdata1isofadifferentsize
InnoDB:
640pages(roundeddowntoMB)
InnoDB:
thanspecifiedinthe.cnffile64000pages!
InnoDB:
Couldnotopenorcreatedatafiles.
InnoDB:
Ifyoutriedtoaddnewdatafiles,anditfailedhere,
InnoDB:
youshouldnoweditinnodb_data_file_pathinfback
InnoDB:
towhatitwas,andremovethenewibdatafilesInnoDBcreated
InnoDB:
inthisfailedattempt.InnoDBonlywrotethosefilesfullof
InnoDB:
zeros,butdidnotyetusetheminanyway.Butbecareful:
donot
InnoDB:
removeolddatafileswhichcontainyourpreciousdata!
1204109:
43:
24[ERROR]Plugin'InnoDB'initfunctionreturnederror.
1204109:
43:
24[ERROR]Plugin'InnoDB'registrationasaSTORAGEENGINEfailed.
1204109:
43:
24[ERROR]Unknown/unsupportedtabletype:
InnoDB
1204109:
43:
24[ERROR]Aborting
从日志看到,文件ibdata1跟配置文件里面设置的值不一致,无法创建或打开该文件,如果你想新增一个datafile,同时又失败了,你应该把移除旧的datafile,然后重新启动mysql,这样就OK啦。
10.修改mysql超级用户root密码
#mysqladmin-uroot-ppassword'123456'(注:
此处改密码为123456为例)
Enterpassword:
回车就行,默认的密码为空
11.优化、安全设置
#vi/etc/f
添加以下内容(注:
所设置的某些参数要根据实际进行调整):
default-storage-engine=InnoDB
innodb_file_per_table
innodb_data_file_path=ibdata1:
1000M;ibdata2:
1000M;ibdata3:
1000M;ibdata4:
1000M;ibdata5:
1000M:
autoextend
innodb_log_file_size=500M
innodb_log_files_in_group=4
innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=4G
innodb_additional_mem_pool_size=16M
max_connections=65535
tmp_table_size=200M
max_heap_table_size=256M
query_cache_size=64M
query_cache_limit=4M
wait_timeout=300
interactive_timeout=300
thread_cache_size=64
skip-external-locking
key_buffer=256M
max_allowed_packet=4M
table_cache=512
sort_buffer_size=6M
net_buffer_length=8K
read_buffer_size=4M
read_rnd_buffer_size=1024K
myisam_sort_buffer_size=64M
#TrynumberofCPU's*2forthread_concurrency
thread_concurrency=4
local-infile=0
#以下这些系统缺省配置,跟上面的配置有冲突,需要屏蔽:
#key_buffer_size=256M
#max_allowed_packet=1M
#table_open_cache=256
#sort_buffer_size=1M
#read_buffer_size=1M
#read_rnd_buffer_size=4M
#myisam_sort_buffer_size=64M
#thread_cache_size=8
#query_cache_size=16M
附注解:
#缺省存储引擎
default-storage-engine=InnoDB
#使每个Innodb的表,有自已独立的表空间。
如删除文件后可以回收那部分空间
innodb_file_per_table
#数据文件个数及最后一个文件自动扩充2G为限
innodb_data_file_path=ibdata1:
1000M;ibdata2:
1000M;ibdata3:
1000M;ibdata4:
1000M;ibdata5:
1000M:
autoextend
#日志文件大小
innodb_log_file_size=500M
#指定日志组的文件个数
innodb_log_files_in_group=4
#事务在内存中的缓冲。
这个参数设置InnoDB用来往磁盘上的日志文件写操作的缓冲区的大小。
这有点像Oracle的log_buffer,通过内存缓冲来延缓磁盘I/O以提高访问的效率。
因为MySQL每秒都会将日志缓冲区的内容刷新到日志文件,因此无需设置超过1秒所需的内存空间。
通常设置为8~16MB就足够了,默认值是1MB。
innodb_log_buffer_size=8M
#控制事务的提交方式。
抱怨Innodb比MyISAM慢100倍?
那么你大概是忘了调整这个值。
默认值1的意思是每一次事务提交或事务外的指令都需要把日志写入(flush)硬盘,这是很费时的。
特别是使用电池供电缓存(Batterybackedupcache)时。
设成2对于很多运用,特别是从MyISAM表转过来的是可以的,它的意思是不写入硬盘而是写入系统缓存。
日志仍然会每秒flush到硬盘,所以你一般不会丢失超过1-2秒的更新。
设成0会更快一点,但安全方面比较差,即使MySQL挂了也可能会丢失事务的数据。
而值2只会在整个操作系统挂了时才可能丢数据。
innodb_flush_log_at_trx_commit=2
#缓存innodb表的索引,数据,插入数据时的缓冲。
官方的说明是#Youcanset.._buffer_pool_sizeupto50-80%ofRAMbutbewareofsettingmemoryusagetoohigh。
所以要根据本机实际的内存设定,这里只设置4G。
(很有用)
innodb_buffer_pool_size=4G
#用来存放Innodb的内部目录。
这个参数用来设置InnoDB存储的数据目录信息和其它内部数据结构的内存池大小。
应用程序里的表越多,你需要在这里分配越多的内存。
对于一个相对稳定的应用,这个参数的大小也是相对稳定的,也没有必要预留非常大的值。
如果InnoDB用光了这个池内的内存,InnoDB开始从操作系统分配内存,并且往MySQL错误日志写警告信息。
默认值是1MB,当发现错误日志中已经有相关的警告信息时,就应该适当的增加该参数的大小。
innodb_additional_mem_pool_size=16M
#最大连接数(很有用)
max_connections=65535
#临时表大小。
mysql的配置文件中,tmp_table_size的默认大小是32M。
如果一张临时表超出该大小,MySQL产生一个Thetabletbl_nameisfull形式的错误,如果你做很多高级GROUPBY查询,增加tmp_table_size值。
tmp_table_size=200M
#这个变量定义了用户可以创建的内存表(memorytable)的大小。
和tmp_table_size一起限制了内部内存表的大小。
max_heap_table_size=256M
#查询结果缓存。
第一次执行某条SELECT语句的时候,服务器记住该查询的文本内容和它返回的结果。
服务器下一次碰到这个语句的时候,它不会再次执行该语句。
作为代替,它直接从查询缓存中的得到结果并把结果返回给客户端。
query_cache_size=64M
#指定单个查询能够使用的缓冲区大小,缺省为1M。
query_cache_limit=4M
#服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果没有事情发生,服务器在8个小时后关闭连接。
wait_timeout=300
#服务器在关闭连接前在一个交互连接上等待行动的秒数。
一个交互的客户被定义为对mysql_real_connect()使用CLIENT_INTERACTIVE选项的客户,默认数值是28800。
interactive_timeout=300
#每建立一个连接,都需要一个线程来与之匹配。
用来缓存空闲的线程,以至不被销毁,如果线程缓存中有空闲线程,这时候如果建立新连接,MYSQL就会很快的响应连接请求。
通过比较Connections和Threads_created状态的变量,可以看到这个变量的作用。
根据物理内存设置规则如下:
1G设置为8,2G为16,3G为32,大于3G设置为64。
thread_cache_size=64
#取消文件系统的外部锁。
当外部锁定(external-locking)起作用时,每个进程若要访问数据表,则必须等待之前的进程完成操作并解除锁定。
由于服务器访问数据表时经常需要等待解锁,因此在单服务器环境下externallocking会让MySQL性能下降。
所以在很多Linux发行版的源中,MySQL配置文件中默认使用了skip-external-locking来避免externallocking。
skip-locking
(注:
以后用Mysql版本参数用skip-external-locking)
#指定索引缓冲区的大小,它决定索引处理的速度,尤其是索引读的速度。
通过检查状态值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=256M
#一个包的最大尺寸。
消息缓冲区被初始化为net_buffer_length字节,但是可在需要时增加到max_allowed_packet个字节。
缺省地,该值太小必能捕捉大的(可能错误)包。
如果你正在使用大的BLOB列,你必须增加该值。
它应该象你想要使用的最大BLOB的那么大。
如:
通常通过MySQL的"loaddatalocalinfile"语句将一个文本文件中的内容导入到数据库中,这样速度会很快,但今天发现如果文本的大小超过1M时,出现异常:
“Packetslargerthanmax_allowed_packetarenotallowed”。
max_allowed_packet=4M
#指定表高速缓存的大小。
每当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=6M
#用于建立连接时的连接缓冲和结果缓冲。
最小值是1K,最大值是1M。
但有需要时,可以动态扩大到max_allowed_packet的大小。
貌似跟mysqldump时有关。
net_buffer_length=8K
#当一个查询不断地扫描某一个表,MySQL会为它分配一段内存缓冲区。
read_buffer_size变量控制这一缓冲区的大小。
如果你认为连续扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能。
read_buffer_size=4M
#加速排序操作后的读数据,提高读分类行的速度。
如果正对远远大于可用内存的表执行GROUPBY或ORDERBY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取。
仍然不明白这个选项的用处……
read_rnd_buffer_size=1024K
#用于REPAIRTABLE。
不明白这个选项的用处,XX上找到的设置方向也是五花八门,有128M、64M、32M等,折中选一个。
myisam_sort_buffer_size=64M
#TrynumberofCPU's*2forthread_concurrency。
最大并发线程数,为CPU个数的2倍(根据实际情况设置)
thread_concurrency=4
(查看本机CPU个数命令:
#grep'physicalid'/proc/cpuinfo|sort|uniq|wc-l)
#禁止MySQL中用“LOADDATALOCALINFILE”命令。
这个命令会利用MySQL把本地文件读到数据库中,然后用户就可以非法获取敏感信息了。
网络上流传的一些攻击方法中就有用它的,它也是很多新发现的SQLInjection攻击利用的手段!
local-infile=0
12.mysql常用查看系统参数命令
参考官方文档:
13.mysql常用命令
导出整个数据库结构和数据
mysqldump-uroot-p123456database>dump.sql
导出单个数据表结构和数据
mysqldump-uroot-p123456databasetablename>tablename.sql
导出整个数据库结构(不包含数据,-d参数)
mysqldump-d-uroot-p123456database>dump.sql
导出单个数据表结构(不包含数据)
mysqldump-d-uroot-p123456databasetable>dump.sql
导出整个数据库数据(不包含结构,-t参数)
mysqldump-t-uroot-p123456database>dump.sql
导出部分表数据(忽略几张表,连同结构都会忽略,--ignore-table参数)
mysqldump-uroot-p123456--ignore-table=database.tablename--ignore-table=database.tablename--ignore-table=database.tablenamedatabase>database.sql
以一行一行形式导出数据(--skip-extended-insert参数)
mysqldump-uroot-p123456--skip-extended-insertdatabaetablename>dump.sql
导出数据库(记录:
file和position记录的位置就是slave从master端复制文件的起始位置,此参数一般用于同步,--master-data=1参数)
mysqldump-uroot-p--master-data=1database>database.sql
根据某个条件导出数据(-w参数)
mysqldump-uroot-p123456databasetable-w"条件语句(where后面的sql语句)">dump.sql
脚本自动执行source命令方法(-e参数)
mysql(注意:
是mysql,而不是mysqldump)-uroot-p123456database-e"sourcexxx.sql"
删除权限
REVOKEprivilegesON数据库名[.表名]FROMuser_name
更改表字段
altertable表名modify字段varchar(20);
删除字段
ALTERTABLE表名drop字段;
更新表
update表set字段where条件
加主键
altertable表名addPRIMARYKEY(`字段`
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 linux 系统 mysql 安装 配置 优化 手册 V21