bash shell基本知识

bash shell执行命令前的动作
  1. 分割管道前后的命令
  2. 分割命令中的单词
  3. 替换别名命令
  4. 将括号扩展为指代字符串
  5. “~”符号扩展为实际路径
  6. 替换变量
  7. 替换”$()”和”“形式的命令
  8. 替换运算符”$(())”为其结果
  9. 替换通配符”*”和”?”为指代本地文件或目录
  10. 根据”函数”,”内部命令”,”外部程序”的顺序搜索路径找到命令
  11. 运行替换后的整体程序
bash shell脚本程序变量
  • 参数位置变量
    $0-$9,${10}-${n}
  • 所有参数位置视为一个字符串
    $*
  • 所有参数位置视为一个串行多个字符串
    $@
  • 参数个数
    $#
特殊的内置变量
  • 上一条命令执行结束后的返回值
    $?
  • 目前bash shell的进程号
    $$
  • 上一个后台程序的进程号
    $!
测试变量存在性及空值

${变量名称:-默认值}变量为空时回传默认值

输出

${变量名称:+默认值}变量为空时设置成默认值

输出

${变量名称:?提示信息}变量为空时停止显示程序显示提示信息

输出

字符串切片,长度

${变量:位置起点},由指定的位置开始截取字符串到结尾
${变量:位置起点:长度},由指定的位置开始截取指定长度的子字符串
${#变量},传回子变量的长度
例子
逐个输出字符串

对比样式

${变量#样式},从左开始对比变量,删除最短相符字串
${变量##样式},从左开始对比变量,删除最长相符字串
${变量%样式},从右开始对比变量,删除最短相符字串
${变量%%样式},从右开始对比变量,删除最长相符字串
${变量/样式/替换字串},如果变量中右匹配样式(取最长),则使用替代字串替换第一个匹配
${变量//样式/替换字串},如果变量中右匹配样式(取最长),则使用替代字串替换所有匹配
例子

输出

取变量名列表,数组索引列表

${!开头字串@}或者${!开头字串},取当前匹配的变量名列表,各变量之前用$IFS第一个分割字符(默认为空格)隔开
${!数组变量名[@]}或${!数组变量名[
]},取出数组索引列表,各索引之间用$IFS第一个分隔符(默认为空格)隔开

算术运算
  • 算数扩展 $((算数式))
  • 外部命令 expr 算数式
  • 内置命令 declare -i 变量=算数式
  • 内置命令 let 算数式
  • $[]方式 $[算数式]
  • 浮点运算用bc命令,最慢

例子

输出

流程控制

函数的基本使用

文件的重定向

文件描述符
一个非负整数,用来索引和追踪文件,可以认为是打开文件的编号
在/proc/PID/fd中标识

打开文件

关闭文件
fd<&-或者fd>&-

作用
如下情况,逐行读取会跳过一行

如下就可避免这种情况

限制程序指定进程数运行
  • 使用read -u文件描述符方式读取字符串内容
  • 设置文件描述符中的回车符号个数为预设的进程数
  • 通过循环完成进程的创建

例子

MySQL性能优化之参数配置

1.目的:

通过根据服务器目前状况,修改MySQL的系统参数,达到合理利用服务器现有资源,最大合理的提高MySQL性能。

2.服务器参数:

32G内存、4个CPU,每个CPU 8核。

3.MySQL目前安装状况。

4.修改MySQL配置

打开MySQL配置文件my.cnf

4.1 MySQL非缓存参数变量介绍及修改

4.1.1 修改back_log参数值:由默认的50修改为500.(每个连接256kb,占用:125M)

back_log=500

back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。也就是说,如果MySql的连接数据达到max_connections时,新来的请求将会被存在堆栈中,以等待某一连接释放资源,该堆栈的数量即back_log,如果等待连接的数量超过back_log,将不被授予连接资源。将会报:unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时.
back_log值不能超过TCP/IP连接的侦听队列的大小。若超过则无效,查看当前系统的TCP/IP连接的侦听队列的大小命令:cat /proc/sys/net/ipv4/tcp_max_syn_backlog,目前系统为1024。对于Linux系统推荐设置为小于512的整数。
修改系统内核参数参考,http://www.51testing.com/html/64/n-810764.html
查看mysql 当前系统默认back_log值,命令:
show variables like 'back_log'; 查看当前数量

4.1.2 修改wait_timeout参数值,由默认的8小时,修改为30分钟。(本次不用)

wait_timeout=1800(单位为妙)

我对wait-timeout这个参数的理解:MySQL客户端的数据库连接闲置最大时间值。
说得比较通俗一点,就是当你的MySQL连接闲置超过一定时间后将会被强行关闭。MySQL默认的wait-timeout值为8个小时,可以通过命令show variables like 'wait_timeout'查看结果值;。
设置这个值是非常有意义的,比如你的网站有大量的MySQL链接请求(每个MySQL连接都是要内存资源开销的 ),由于你的程序的原因有大量的连接请求空闲啥事也不干,白白占用内存资源,或者导致MySQL超过最大连接数从来无法新建连接导致“Too many connections”的错误。在设置之前你可以查看一下你的MYSQL的状态(可用show processlist),如果经常发现MYSQL中有大量的Sleep进程,则需要 修改wait-timeout值了。
interactive_timeout:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
wait_timeout:服务器关闭非交互连接之前等待活动的秒数。在线程启动时,根据全局wait_timeout值或全局 interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义).
这两个参数必须配合使用。否则单独设置wait_timeout无效

4.1.3 修改max_connections参数值,由默认的151,修改为3000(750M)。

max_connections=3000

max_connections是指MySql的最大连接数,如果服务器的并发连接请求量比较大,建议调高此值,以增加并行连接数量,当然这建立在机器能支撑的情况下,因为如果连接数越多,介于MySql会为每个连接提供连接缓冲区,就会开销越多的内存,所以要适当调整该值,不能盲目提高设值。可以过’conn%’通配符查看当前状态的连接数量,以定夺该值的大小。
MySQL服务器允许的最大连接数16384;
查看系统当前最大连接数:
show variables like 'max_connections';

4.1.4 修改max_user_connections值,由默认的0,修改为800

max_user_connections=800

max_user_connections是指每个数据库用户的最大连接
针对某一个账号的所有客户端并行连接到MYSQL服务的最大并行连接数。简单说是指同一个账号能够同时连接到mysql服务的最大连接数。设置为0表示不限制。
目前默认值为:0不受限制。
这儿顺便介绍下Max_used_connections:它是指从这次mysql服务启动到现在,同一时刻并行连接数的最大值。它不是指当前的连接情况,而是一个比较值。如果在过去某一个时刻,MYSQL服务同时有1000个请求连接过来,而之后再也没有出现这么大的并发请求时,则Max_used_connections=1000.请注意与show variables里的max_user_connections的区别。默认为0表示无限大。
查看max_user_connections值
show variables like 'max_user_connections';

4.1.5 修改thread_concurrency值,由目前默认的8,修改为64

thread_concurrency=64

thread_concurrency的值的正确与否, 对mysql的性能影响很大, 在多个cpu(或多核)的情况下,错误设置了thread_concurrency的值, 会导致mysql不能充分利用多cpu(或多核), 出现同一时刻只能一个cpu(或核)在工作的情况。
thread_concurrency应设为CPU核数的2倍. 比如有一个双核的CPU, 那thread_concurrency 的应该为4; 2个双核的cpu, thread_concurrency的值应为8.
比如:根据上面介绍我们目前系统的配置,可知道为4个CPU,每个CPU为8核,按照上面的计算规则,这儿应为:482=64
查看系统当前thread_concurrency默认配置命令:
show variables like 'thread_concurrency';

4.1.6 添加skip-name-resolve,默认被注释掉,没有该参数。

skip-name-resolve

skip-name-resolve:禁止MySQL对外部连接进行DNS解析,使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意,如果开启该选项,则所有远程主机连接授权都要使用IP地址方式,否则MySQL将无法正常处理连接请求!

4.1.7 skip-networking,默认被注释掉。没有该参数。(本次无用)

skip-networking建议被注释掉,不要开启

开启该选项可以彻底关闭MySQL的TCP/IP连接方式,如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项!否则将无法正常连接!

4.1.8 default-storage-engine(设置MySQL的默认存储引擎)

default-storage-engine= InnoDB(设置InnoDB类型,另外还可以设置MyISAM类型)

设置创建数据库及表默认存储类型
show table status like ‘tablename’显示表的当前存储状态值
查看MySQL有哪些存储状态及默认存储状态
show engines;
创建表并指定存储类型
CREATE TABLE mytable (id int, title char(20)) ENGINE = INNODB;
修改表存储类型:
Alter table tableName engine =engineName

备注:设置完后把以下几个开启:

4.2 MySQL缓存变量介绍及修改

数据库属于IO密集型的应用程序,其主职责就是数据的管理及存储工作。而我们知道,从内存中读取一个数据库的时间是微秒级别,而从一块普通硬盘上读取一个 IO是在毫秒级别,二者相差3个数量级。所以,要优化数据库,首先第一步需要优化的就是IO,尽可能将磁盘IO转化为内存IO。本文先从MySQL数据库 IO相关参数(缓存参数)的角度来看看可以通过哪些参数进行IO优化

4.2.1全局缓存

启动MySQL时就要分配并且总是存在的全局缓存。目前有:key_buffer_size(默认值:402653184,即384M)、innodb_buffer_pool_size(默认值:134217728即:128M)、innodb_additional_mem_pool_size(默认值:8388608即:8M)、innodb_log_buffer_size(默认值:8388608即:8M)、query_cache_size(默认值:33554432即:32M)等五个。总共:560M.
这些变量值都可以通过命令如:show variables like '变量名';查看到。

4.2.1.1 key_buffer_size,本系统目前为384M,可修改为400M

key_buffer_size=400M

key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),对MyISAM(MySQL表存储的一种类型,可以百度等查看详情)表性能影响最大的一个参数。如果你使它太大,系统将开始换页并且真的变慢了。严格说是它决定了数据库索引处理的速度,尤其是索引读的速度。对于内存在4GB左右的服务器该参数可设置为256M或384M.
怎么才能知道key_buffer_size的设置是否合理呢,一般可以检查状态值Key_read_requestsKey_reads,比例key_reads / key_read_requests应该尽可能的低,比如1:100,1:1000 ,1:10000。其值可以用以下命令查得:show status like ‘key_read%’;
比如查看系统当前key_read和key_read_request值为:

可知道有28535个请求,有269个请求在内存中没有找到直接从硬盘读取索引.
未命中缓存的概率为:0.94%=269/28535*100%. 一般未命中概率在0.1之下比较好。目前已远远大于0.1,证明效果不好。若命中率在0.01以下,则建议适当的修改key_buffer_size值。
http://dbahacker.com/mysql/innodb-myisam-compare(InnoDB与MyISAM的六大区别)
http://kb.cnblogs.com/page/99810/(查看存储引擎介绍)
MyISAM、InnoDB、MyISAM Merge引擎、InnoDB、memory(heap)、archive

4.2.1.2 innodb_buffer_pool_size(默认128M)

innodb_buffer_pool_size=1024M(1G)

innodb_buffer_pool_size:主要针对InnoDB表性能影响最大的一个参数。功能与Key_buffer_size一样。InnoDB占用的内存,除innodb_buffer_pool_size用于存储页面缓存数据外,另外正常情况下还有大约8%的开销,主要用在每个缓存页帧的描述、adaptive hash等数据结构,如果不是安全关闭,启动时还要恢复的话,还要另开大约12%的内存用于恢复,两者相加就有差不多21%的开销。假设:12G的innodb_buffer_pool_size,最多的时候InnoDB就可能占用到14.5G的内存。若系统只有16G,而且只运行MySQL,且MySQL只用InnoDB,
那么为MySQL开12G,是最大限度地利用内存了。
另外InnoDB和 MyISAM 存储引擎不同, MyISAM 的 key_buffer_size 只能缓存索引键,而 innodb_buffer_pool_size 却可以缓存数据块和索引键。适当的增加这个参数的大小,可以有效的减少 InnoDB 类型的表的磁盘 I/O 。
当我们操作一个 InnoDB 表的时候,返回的所有数据或者去数据过程中用到的任何一个索引块,都会在这个内存区域中走一遭。
可以通过 (Innodb_buffer_pool_read_requests – Innodb_buffer_pool_reads) / Innodb_buffer_pool_read_requests 计算缓存命中率,并根据命中率来调整 innodb_buffer_pool_size 参数大小进行优化。值可以用以下命令查得:show status like 'Innodb_buffer_pool_read%';
比如查看当前系统中系统中

其命中率99.959%=(1283826-519)/1283826*100% 命中率越高越好。

4.2.1.3:innodb_additional_mem_pool_size(默认8M)

innodb_additional_mem_pool_size=20M

innodb_additional_mem_pool_size 设置了InnoDB存储引擎用来存放数据字典信息以及一些内部数据结构的内存空间大小,所以当我们一个MySQL Instance中的数据库对象非常多的时候,是需要适当调整该参数的大小以确保所有数据都能存放在内存中提高访问效率的。
这个参数大小是否足够还是比较容易知道的,因为当过小的时候,MySQL会记录Warning信息到数据库的error log中,这时候你就知道该调整这个参数大小了。
查看当前系统mysql的error日志 cat /var/lib/mysql/机器名.error 发现有很多waring警告。所以要调大为20M.
根据MySQL手册,对于2G内存的机器,推荐值是20M。
32G内存的 100M

4.2.1.4:innodb_log_buffer_size(默认8M)

innodb_log_buffer_size=20M

innodb_log_buffer_size 这是InnoDB存储引擎的事务日志所使用的缓冲区。类似于Binlog Buffer,InnoDB在写事务日志的时候,为了提高性能,也是先将信息写入Innofb Log Buffer中,当满足innodb_flush_log_trx_commit参数所设置的相应条件(或者日志缓冲区写满)之后,才会将日志写到文件 (或者同步到磁盘)中。可以通过innodb_log_buffer_size 参数设置其可以使用的最大内存空间。
InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。 因此,如果有大的事务处理,设置大的日志缓冲可以减少磁盘I/O。 在 my.cnf中以数字格式设置。
默认是8MB,写的很频繁的系统可适当增大至4MB~8MB。当然如上面介绍所说,这个参数实际上还和另外的flush参数相关。一般来说不建议超过32MB
注:innodb_flush_log_trx_commit参数对InnoDB Log的写入性能有非常关键的影响,默认值为1。该参数可以设置为0,1,2,解释如下:
0:log buffer中的数据将以每秒一次的频率写入到log file中,且同时会进行文件系统到磁盘的同步操作,但是每个事务的commit并不会触发任何log buffer 到log file的刷新或者文件系统到磁盘的刷新操作;
1:在每次事务提交的时候将log buffer 中的数据都会写入到log file,同时也会触发文件系统到磁盘的同步;
2:事务提交会触发log buffer到log file的刷新,但并不会触发磁盘文件系统到磁盘的同步。此外,每秒会有一次文件系统到磁盘同步操作。
实际测试发现,该值对插入数据的速度影响非常大,设置为2时插入10000条记录只需要2秒,设置为0时只需要1秒,而设置为1时则需要229秒。因此,MySQL手册也建议尽量将插入操作合并成一个事务,这样可以大幅提高速度。根据MySQL手册,在存在丢失最近部分事务的危险的前提下,可以把该值设为0。

4.5.1.5 query_cache_size(默认32M)

query_cache_size=40M

query_cache_size: 主要用来缓存MySQL中的ResultSet,也就是一条SQL语句执行的结果集,所以仅仅只能针对select语句。当我们打开了 Query Cache功能,MySQL在接受到一条select语句的请求后,如果该语句满足Query Cache的要求(未显式说明不允许使用Query Cache,或者已经显式申明需要使用Query Cache),MySQL会直接根据预先设定好的HASH算法将接受到的select语句以字符串方式进行hash,然后到Query Cache中直接查找是否已经缓存。也就是说,如果已经在缓存中,该select请求就会直接将数据返回,从而省略了后面所有的步骤(如SQL语句的解析,优化器优化以及向存储引擎请求数据等),极大的提高性能。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。
当然,Query Cache也有一个致命的缺陷,那就是当某个表的数据有任何任何变化,都会导致所有引用了该表的select语句在Query Cache中的缓存数据失效。所以,当我们的数据变化非常频繁的情况下,使用Query Cache可能会得不偿失
Query Cache的使用需要多个参数配合,其中最为关键的是query_cache_size和query_cache_type,前者设置用于缓存 ResultSet的内存大小,后者设置在何场景下使用Query Cache。在以往的经验来看,如果不是用来缓存基本不变的数据的MySQL数据库,query_cache_size一般256MB是一个比较合适的大小。当然,这可以通过计算Query Cache的命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)100))来进行调整。 query_cache_type可以设置为0(OFF),1(ON)或者2(DEMOND),分别表示完全不使用query cache,除显式要求不使用query cache(使用sql_no_cache)之外的所有的select都使用query cache,只有显示要求才使用query cache(使用sql_cache)。如果Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲. 如果Qcache_hits的值也非常大,则表明查询缓冲使用非常频繁,此时需要增加缓冲大小;
根据命中率(Qcache_hits/(Qcache_hits+Qcache_inserts)
100))进行调整,一般不建议太大,256MB可能已经差不多了,大型的配置型静态数据可适当调大.
可以通过命令:show status like 'Qcache_%';查看目前系统Query catch使用大小

命中率98.17%=1892463/(1892463 +35627 )*100

4.2.2局部缓存

除了全局缓冲,MySql还会为每个连接发放连接缓冲。每个连接到MySQL服务器的线程都需要有自己的缓冲。大概需要立刻分配256K,甚至在线程空闲时,它们使用默认的线程堆栈,网络缓存等。事务开始之后,则需要增加更多的空间。运行较小的查询可能仅给指定的线程增加少量的内存消耗,然而如果对数据表做复杂的操作例如扫描、排序或者需要临时表,则需分配大约read_buffer_size,
sort_buffer_size,read_rnd_buffer_size,tmp_table_size 大小的内存空间. 不过它们只是在需要的时候才分配,并且在那些操作做完之后就释放了。有的是立刻分配成单独的组块。tmp_table_size 可能高达MySQL所能分配给这个操作的最大内存空间了
。注意,这里需要考虑的不只有一点——可能会分配多个同一种类型的缓存,例如用来处理子查询。一些特殊的查询的内存使用量可能更大——如果在MyISAM表上做成批的插入
时需要分配 bulk_insert_buffer_size 大小的内存;执行 ALTER TABLE, OPTIMIZE TABLE, REPAIR TABLE 命令时需要分配 myisam_sort_buffer_size 大小的内存。

4.2.2.1 read_buffer_size(默认值:2097144即2M)

read_buffer_size=4M

read_buffer_size 是MySql读入缓冲区大小。对表进行顺序扫描的请求将分配一个读入缓冲区,MySql会为它分配一段内存缓冲区。read_buffer_size变量控制这一
缓冲区的大小。如果对表的顺序扫描请求非常频繁,并且你认为频繁扫描进行得太慢,可以通过增加该变量值以及内存缓冲区大小提高其性能.

4.2.2.2 sort_buffer_size(默认值:2097144即2M)

sort_buffer_size=4M

sort_buffer_size是MySql执行排序使用的缓冲大小。如果想要增加ORDER BY的速度,首先看是否可以让MySQL使用索引而不是额外的排序阶段。如果不能,可以尝试增加sort_buffer_size变量的大小

4.2.2.3 read_rnd_buffer_size(默认值:8388608即8M)

read_rnd_buffer_size=8M

read_rnd_buffer_size 是MySql的随机读缓冲区大小。当按任意顺序读取行时(例如,按照排序顺序),将分配一个随机读缓存区。进行排序查询时,MySql会首先扫描一遍该缓冲,以避免磁盘搜索,提高查询速度,如果需要排序大量数据,可适当调高该值。但MySql会为每个客户连接发放该缓冲空间,所以应尽量适当设置该值,以避免内存开销过大。

4.2.2.4 tmp_table_size(默认值:8388608 即:16M)

tmp_table_size=16M

tmp_table_size是MySql的heap(堆积)表缓冲大小。所有联合在一个DML指令内完成,并且大多数联合甚至可以不用临时表即可以完成。大多数临时表是基于内存的(HEAP)表。具有大的记录长度的临时表 (所有列的长度的和)或包含BLOB列的表存储在硬盘上。如果某个内部heap(堆积)表大小超过tmp_table_size,MySQL可以根据需要自动将内存中的heap表改为基于硬盘的MyISAM表。还可以通过设置tmp_table_size选项来增加临时表的大小。也就是说,如果调高该值,MySql同时将增加heap表的大小,可达到提高联接查询速度的效果。

4.2.2.5 record_buffer:(默认值:)

record_buffer每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K)

4.2.3 其它缓存:
4.2.3.1 table_cache(默认值:512)

TABLE_CACHE(5.1.3及以后版本又名TABLE_OPEN_CACHE)
table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能不稳定或者连接失败。

open_tables表示当前打开的表缓存数,如果执行flush tables操作,则此系统会关闭一些当前没有使用的表缓存而使得此状态值减小;
opend_tables表示曾经打开的表缓存数,会一直进行累加,如果执行flush tables操作,值不会减小。
在mysql默认安装情况下,table_cache的值在2G内存以下的机器中的值默认时256到512,如果机器有4G内存,则默认这个值 是2048,但这决意味着机器内存越大,这个值应该越大,因为table_cache加大后,使得mysql对SQL响应的速度更快了,不可避免的会产生 更多的死锁(dead lock),这样反而使得数据库整个一套操作慢了下来,严重影响性能。所以平时维护中还是要根据库的实际情况去作出判断,找到最适合你维护的库的 table_cache值。
由于MySQL是多线程的机制,为了提高性能,每个线程都是独自打开自己需要的表的文件描 述符,而不是通过共享已经打开的.针对不同存储引擎处理的方法当然也不一样
在myisam表引擎中,数据文件的描述符 (descriptor)是不共享的,但是索引文件的描述符却是所有线程共享的.Innodb中和使用表空间类型有关,假如是共享表空间那么实际就一个数据文件,当然占用的数据文件描述符就会比独立表空间少.
mysql手册上给的建议大小 是:table_cache=max_connections*n
n表示查询语句中最大表数, 还需要为临时表和文件保留一些额外的文件描述符。
这个数据遭到很多质疑,table_cache够用就好,检查 Opened_tables值,如果这个值很大,或增长很快那么你就得考虑加大table_cache了.
table_cache:所有线程打开的表的数目。增大该值可以增加mysqld需要的文件描述符的数量。默认值是64.

4.2.3.2 thread_cache_size (服务器线程缓存)

thread_cache_size=64

默认的thread_cache_size=8,但是看到好多配置的样例里的值一般是32,64,甚至是128,感觉这个参数对优化应该有帮助,于是查了下:
根据调查发现以上服务器线程缓存thread_cache_size没有进行设置,或者设置过小,这个值表示可以重新利用保存在缓存中线程的数量,当断开连接时如果缓存中还有空间,那么客户端的线程将被放到缓存中,如果线程重新被请求,那么请求将从缓存中读取,如果缓存中是空的或者是新的请求,那么这个线程将被重新创建,如果有很多新的线程,增加这个值可以改善系统性能.通过比较 Connections 和Threads_created 状态的变量,可以看到这个变量的作用。(–>表示要调整的值) 根据物理内存设置规则如下:
1G —> 8
2G —> 16
3G —> 32 >3G —> 64

查看开机起来数据库被连接了多少次?

通过连接线程池的命中率来判断设置值是否合适?命中率超过90%以上,设定合理。
(Connections – Threads_created) / Connections * 100 %

转载自 http://blog.csdn.net/nightelve/article/details/17393631

配置DNS服务器主从

修改主服务器配置

在主服务器的zone配置中添加

修改从服务器配置

一定注意配置文件的权限是否能被named程序读写

重启就能看到数据同步了

在主服务器设置从服务器的NS记录

记得要修改 serial的值,然后重启

使不同的客户端查询时获得不同的ip

把上面的配置文件中的

修改成如下即可

使用秘钥认证来提高安全性
生成秘钥,我的centos 6.6 minimal系统不能生成秘钥,我在其他系统生成的

从生成的文件获取到秘钥

修改主服务器配置文件named.conf

重启named

修改从服务器配置

ok

centos6.6配置dns服务器

服务器环境 centos 6.6 minimal

安装
安装bind

因为依赖关系所以需要安装这些包

安装bind-chroot,可以使bind即使被黑也不会影响系统

安装caching-nameserver,生成配置文件的范本,在6以下的版本需要单独安装,我这个系统是centos 6.6,不需要单独安装
配置文件

编辑配置

添加要解析的zone

配置zone的配置文件
复制一份已有的配置文件,进行修改

配置zone

解释下上面的参数

参数 解释
$TTL 代表SOA记录的有效期
Serial 代表这个zone 文件的版本,每当zone 文件内容有变动,name server 管理者就应该增加这个号码,因为slave 会将这个号码与其copy 的那份比对以便决定是否要再copy 一次(即进行zone 传输
Refresh Slave server 每隔这段时间(秒),就会检查Master server 上的serial number。不过这里会发生一个问题就是,在master server 在update data 完成到slave server 来检查时再update 可能还有好一段时间,因此这段期间master/slave DNS server间zone files 就可能出现不一致。所以在Bind较新的版本中便加入”notify”功能,使用者在”named.conf” 设定中在需要的zone 中加入”notify”的设定,则master server在update 完成某个zone file 的data 后便会主动发个讯息(NOTIFY),借以通知该其它的slave servers,因此如果slave servers 也有支援这个”notify”功能时,接下来slave servers 马上就可以做zone 传输来更新数据
Retry 当从服务器无法和主站进行串行检查时,要每隔几秒再试一次
Expire 当时间超过Expire 所定的秒数而slave server 都无法和master 取得连络,那么slave 会删除自己的这份copy
Minimum 代表这个zone 文件中所有record 的内定的TTL 值,也就是其它的DNS server cache 这个record时,最长不应该超过这个时间
NS IN NS ns1.kutea.net. (name server, 用来指定操作的DNS服务器主机名称,NS记录是不允许用主机IP地址来表示的。有过域名注册和使用域名的朋友或许知道 域名商要求你指定你域名解释的NS服务器时,你用服务器IP地址来替换,就会报错。就是这个原因了。NS记录其本身就不允许用IP地址来制定
A 和 AAAA A记录 address,即主机记录。(就是将一个域名对应IP地址的记录。)例如下面
IPv4和IPv6指定A记录的格式是:
www IN A 122.128.109.86
mail IN AAAA CDCD:910A:2222:5498:8475:1FF1:3900:2027
PTR 其中这个记录是出现在反向解析zone文件中):
Pointer , 定义某一 IP 地址对应的 domain name ,就是将 IP 地址转换成主机的FQDN
86 IN PTR www.kutea.net. (注意别名记录后面有个小数点)
CNAME Canonical name , 可为同一部主机设定许多别名,例如cdn.kutea.net的别名可为
www.kutea.net和ftp.kutea.net 因此所设定的别名都会连到同一台服务器上。
MX mail exchanger,设定区域中担任邮件服务器的主机,所有要送往那部机器的mail 都要经过mail exchanger 转送。注意 而数字则是该主机邮件传递时的优先次序,此值越低表示有越高的邮件处理优先权。
mail IN MX 3 ns.kutea.net.

因为使用空格代替当前zone又点不直观,就直接写完整的域名了

修改named.conf,允许所有ip可以访问,可以根据需要自己调整,找到下面两项修改

ok

配置查询不在配置文件里面的ip

上面配置完成之后,就可以获取到已经设置了的域名的ip,但是没有在配置文件的就不行了

yum常用的

使用本地文件作为仓库

yum repolist列出可用的仓库
yum list列出已安装的仓库中的可用软件包
yum list installed列出已经安装的软件包
yum install mysql安装软件包
yum localinstall mysql使用本地已经下载的缓存文件安装
yum remove mysql删除已经安装的文件
yum info mysql查看已安装的程序的信息
yum clean packages清除缓存的包
yum clean headers清楚软件头信息
yum clean all 清除上面的两种信息

rpm包安装

rpm包

系统包所在路径

系统版本 目录
rhel6 /mnt/Packages
rhel5 /mnt/Server
rhel2,3,4 /mnt/RedHat/RPMS

rpm -ivf 安装某个rpm包
rpm -ivf –force 强制重新安装
rpm -ivf –nodeps 忽略依赖关系安装
rpm -qf /usr/bin/mysql 查看执行文件所属的包
rpm -qfi /usr/bin/mysql 查看执行文件所属包的描述信息
rpm -qpi mysql-5.1.73-3.el6_5.x86_64.rpm 查看执行文件所属包的描述信息
rpm -qpl mysql-5.1.73-3.el6_5.x86_64.rpm 查看包里面的文件
rpm -qfl /usr/bin/mysql 查看执行文件所属包里面的文件
rpm -ivf –root /tmp/mysql –nodeps mysql-5.1.73-3.el6_5.x86_64.rpm 解压出包里面的文件
rpm -e 删除
rpm –import ../RPM-GPG-KEY-CentOS-6 导入密钥
rpm -Vf /usr/bin/mysql 查看文件是否修改过

安装的时候,会遇到很多依赖关系的问题
范例,使用系统镜像文件里面带的rpm包安装mysql,系统版本 centos 6.6 minimal

需要安装的包有

直接安装mysql,缺少perl支持

安装perl,需要perl-libs

安装perl-libs,失败,和上面的包互相需要,这种时候需要两个包一起安装,并且很多这种模块的包都是互相

同时安装,又和其他的互相依赖,同理,全都一起安装

再次安装

再次安装mysql,根据提示安装所有mysql需要的程序,使用命令的关键字查看包,然后安装,提示变少了

安装perl-DBI

再安装mysql查看需要的包

安装openssl-devel

加上这两个再安装

又出现新的,再加

安装

提示有个包已经安装,去掉这个,再安装

再安装mysql查看需要的包

安装这个两个包

再安装mysql

去掉这个提示的已经安装过的包,再安装

修复已经损坏的文件系统

1.根据开机信息确认损坏文件的系统的分区

错误信息如下:

有上可知/dev/sda2,/dev/sdb1,/dev/sda3,/dev/sda6分区是好了,排除下,其余的的分区可能就有问题了

我这里是修改了fstab文件引起的问题,进入系统挂载文件所在目录,把fstab修改成正确的文件就行了

2.镜像损坏文件系统的分区中的数据到另一个硬盘
  • 如果遇到fsck时,请小心,如果可能,尽快断开系统,unmount所有分区
  • 必须执行fsck时,先做准备工作
    1.使用dd命令将涉及到的分区输出到另外的存储体(最好不要在出错的存储体上做dd),命令dd if=/dev/sda of=/dev/sdb0
    2.将整个linux存储体挂载到虚拟机环境中,将linux存储体设置为 Nopersisten 模式。再执行,执行后,如果数据完好,尽快使用ftp等方式拷贝出来
    3.将整个linux存储体挂载到其他系统,做好镜像后,在fsck
3.使用linux系统光盘进入lnux rescue模式进行修复
4.卸载在损坏的分区
5.使用fsck命令检查文件系统,再修复文件系统

如以上几种方式不能执行,必须执行fsck时,小心观察fsck的执行提示(关掉-a),如果发现有提示节点错误需更正或清0,节点描述文件大小不正确等信息,应立即停止fsck
因回复需要参考很多信息,应尽可能保持系统不工作状态,至少不能再次mount分区(即使不做任何读写操作,也会因为系统的工作原理不断降低数据恢复的可能性,增加数据恢复的难度)
寻求专业数据恢复公司的帮助

6.重启系统查看分区数据是否真正常
7.修复完文件系统可能会丢失一些文件,丢失的文件在相应的分区的lost+found目录
8.回复lost+found文件中丢失的文件

使用 `parted` 命令分区

在一些fdisk不支持的硬盘上,可以使用这个命令我的 minimal的系统没有这个命令,需要单独安装
使用help可以查看帮助,就不解释含义了,不支持某些格式文件系统(例如ext3和ext4)的格式化,可以在这里分区,再退出用其他的命令格式化分区

创建设备文件

分区之后,如果没有创建设备文件,则需要手动创建

上面的执行完之后确实创建了一个设备文件,修改文件权限和文件所数用户和所属数组之后,不能对文件进行格式化

查看

获得使用start_udev命令自动创建,(我执行这个命令无效)

格式化

上面的步骤执行完毕失败的话,再运行了partprobe,如果还是无效,就重启在格式化吧,格式化就用正常的格式化命令就行

添加新硬盘

原本的一块硬盘是sda,新加了一块硬盘为sdb

查看新硬盘

分区

格式化分区

如果系统版本较老(centOS 5或之前的版本需先运行partprobe命令)

挂载

配置启动加载
查看磁盘 UUID

编辑vim /etc/fstab文件

nginx内置预定义变量

nginx的配置文件中可以使用的内置变量以美元符$开始,也有人叫全局变量。其中,部分预定义的变量的值是可以改变的。
$arg_PARAMETER 这个变量值为:GET请求中变量名PARAMETER参数的值。

$args 这个变量等于GET请求中的参数。例如,foo=123&bar=blahblah;这个变量只可以被修改

$binary_remote_addr 二进制码形式的客户端地址。

$body_bytes_sent 传送页面的字节数

$content_length 请求头中的Content-length字段。

$content_type 请求头中的Content-Type字段。

$cookie_COOKIE cookie COOKIE的值。

$document_root 当前请求在root指令中指定的值。

$document_uri 与$uri相同。

$host 请求中的主机头(Host)字段,如果请求中的主机头不可用或者空,则为处理请求的server名称(处理请求的server的server_name指令的值)。值为小写,不包含端口。

$hostname 机器名使用 gethostname系统调用的值

$http_HEADER HTTP请求头中的内容,HEADER为HTTP请求中的内容转为小写,-变为_(破折号变为下划线),例如:$http_user_agent(Uaer-Agent的值), $http_referer…;

$sent_http_HEADER HTTP响应头中的内容,HEADER为HTTP响应中的内容转为小写,-变为_(破折号变为下划线),例如: $sent_http_cache_control, $sent_http_content_type…;

$is_args 如果$args设置,值为”?”,否则为””。

$limit_rate 这个变量可以限制连接速率。

$nginx_version 当前运行的nginx版本号。

$query_string 与$args相同。

$remote_addr 客户端的IP地址。

$remote_port 客户端的端口。

$remote_user 已经经过Auth Basic Module验证的用户名。

$request_filename 当前连接请求的文件路径,由root或alias指令与URI请求生成。

$request_body 这个变量(0.7.58+)包含请求的主要信息。在使用proxy_pass或fastcgi_pass指令的location中比较有意义。

$request_body_file 客户端请求主体信息的临时文件名。

$request_completion 如果请求成功,设为”OK”;如果请求未完成或者不是一系列请求中最后一部分则设为空。

$request_method 这个变量是客户端请求的动作,通常为GET或POST。
包括0.8.20及之前的版本中,这个变量总为main request中的动作,如果当前请求是一个子请求,并不使用这个当前请求的动作。

$request_uri 这个变量等于包含一些客户端请求参数的原始URI,它无法修改,请查看$uri更改或重写URI。

$scheme 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme://example.com$1 redirect;

$server_addr 服务器地址,在完成一次系统调用后可以确定这个值,如果要绕开系统调用,则必须在listen中指定地址并且使用bind参数。

$server_name 服务器名称。

$server_port 请求到达服务器的端口号。

$server_protocol 请求使用的协议,通常是HTTP/1.0或HTTP/1.1。

$uri 请求中的当前URI(不带请求参数,参数位于$args),不同于浏览器传递的$request_uri的值,它可以通过内部重定向,或者使用index指令进行修改。不包括协议和主机名,例如/foo/bar.html

转自 http://www.nginx.cn/273.html