2011年2月

mysql5.5.x问题 Can't get hostname for your address

今天装了个mysql5.5.9远程连接出现Can't get hostname for your address 。
网上查了下,是由于mysql5以后,mysql增加了对连接服务器进行反向dns查询。

解决方案:(注:windows下为my.ini)
编辑/etc/my.cnf,在:
[mysqld]
内添加一行:skip-name-resolve

MySQL忽略数据库表名大小写
修改/etc/my.cnf,在
[mysqld]
内添加一行:lower_case_table_names=1

附:MySQL常见错误代码说明
1005:创建表失败
1006:创建数据库失败
1007:数据库已存在,创建数据库失败
1008:数据库不存在,删除数据库失败
1009:不能删除数据库文件导致删除数据库失败
1010:不能删除数据目录导致删除数据库失败
1011:删除数据库文件失败
1012:不能读取系统表中的记录
1020:记录已被其他用户修改
1021:硬盘剩余空间不足,请加大硬盘可用空间
1022:关键字重复,更改记录失败
1023:关闭时发生错误
1024:读文件错误
1025:更改名字时发生错误
1026:写文件错误
1032:记录不存在
1036:数据表是只读的,不能对它进行修改
1037:系统内存不足,请重启数据库或重启服务器
1038:用于排序的内存不足,请增大排序缓冲区
1040:已到达数据库的最大连接数,请加大数据库可用连接数
1041:系统内存不足
1042:无效的主机名
1043:无效连接
1044:当前用户没有访问数据库的权限
1045:不能连接数据库,用户名或密码错误
1048:字段不能为空
1049:数据库不存在
1050:数据表已存在
1051:数据表不存在
1054:字段不存在
1065:无效的SQL语句,SQL语句为空
1081:不能建立Socket连接
1114:数据表已满,不能容纳任何记录
1116:打开的数据表太多
1129:数据库出现异常,请重启数据库
1130:连接数据库失败,没有连接数据库的权限
1133:数据库用户不存在
1141:当前用户无权访问数据库
1142:当前用户无权访问数据表
1143:当前用户无权访问数据表中的字段
1146:数据表不存在
1147:未定义用户对数据表的访问权限
1149:SQL语句语法错误
1158:网络错误,出现读错误,请检查网络连接状况
1159:网络错误,读超时,请检查网络连接状况
1160:网络错误,出现写错误,请检查网络连接状况
1161:网络错误,写超时,请检查网络连接状况
1062:字段值重复,入库失败
1169:字段值重复,更新记录失败
1177:打开数据表失败
1180:提交事务失败
1181:回滚事务失败
1203:当前用户和数据库建立的连接已到达数据库的最大连接数,请增大可用的数据库连接数或重启数据库
1205:加锁超时
1211:当前用户没有创建用户的权限
1216:外键约束检查失败,更新子表记录失败
1217:外键约束检查失败,删除或修改主表记录失败
1226:当前用户使用的资源已超过所允许的资源,请重启数据库或重启服务器
1227:权限不足,您无权进行此操作
1235:MySQL版本过低,不具有本功能

Linux系统管理员应该知道的20个系统监控工具

原文:http://hi.baidu.com/imlidapeng/blog/item/76cc8b15bf38265af2de32cc.html

需要监控Linux服务器系统性能吗?尝试下面这些系统内置或附件的工具吧。大多数Linux发行版本都装备了大量的监控工具。这些工具提供了能用作取得相关信息和系统活动的量度指标。你能使用这些工具发现造成性能问题可能原因。此次讨论到的工具只是分析和调试服务器下面问题时最基本工具中的一部分。1.找出瓶颈2.硬盘(存储)瓶颈3.CPU及内存瓶颈4.网络瓶颈

#1: top - 进程活动

top提供一个当前运行系统实时动态的视图,也就是正在运行进程。在默认情况下,显示系统中CPU使用率最高的任务,并每5秒钟刷新一次。
图01.Linux top命令
常用热键
热键 用途
t显示摘要信息开关.
m显示内存信息开关.
A分类显示系统不同资源的使用大户。有助于快速识别系统中资源消耗多的任务。
f添加删除所要显示栏位.
o调整所要显示栏位的顺序.
r调整一个正在运行的进程Nice值.
k结束一个正在运行的进程.
z彩色/黑白显示开关
相关链接:How do I Find Out Linux CPU Utilization?译者推荐链接:Linux系统管理员必备工具系列之top(原创)#2:vmstat -系统活动、硬件及系统信息使用vmstat命令可以得到关于进程、内存、内存分页、堵塞IO、traps及CPU活动的信息。# vmstat 3输出样例:


procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 2540988 522188 5130400 0 0 2 32 4 2 4 1 96 0 0
1 0 0 2540988 522188 5130400 0 0 0 720 1199 665 1 0 99 0 0
0 0 0 2540956 522188 5130400 0 0 0 0 1151 1569 4 1 95 0 0
0 0 0 2540956 522188 5130500 0 0 0 6 1117 439 1 0 99 0 0
0 0 0 2540940 522188 5130512 0 0 0 536 1189 932 1 0 98 0 0
0 0 0 2538444 522188 5130588 0 0 0 0 1187 1417 4 1 96 0 0
0 0 0 2490060 522188 5130640 0 0 0 18 1253 1123 5 1 94 0 0

显示内存使用详细信息

# vmstat -m

显示内存活动/不活动的信息

# vmstat -a
相关链接:How do I find out Linux Resource utilization to detect system bottlenecks?
译者推荐链接:Linux系统管理员必备工具系列之vmstat(原创)

#3: w - 显示谁已登录,他们正在做什么?

w命令显示系统当前用户及其运行进程的信息。
# w username
# w vivek

输出样例:
17:58:47 up 5 days, 20:28, 2 users, load average: 0.36, 0.26, 0.24
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.1.3.145 14:55 5.00s 0.04s 0.02s vim /etc/resolv.conf
root pts/1 10.1.3.145 17:43 0.00s 0.03s 0.00s w

#4:uptime - 告诉系统已经运行了多久?

uptime命令过去只显示系统运行多久。现在,可以显示系统运行多久、当前有多少的用户登录、在过去的1,5,15分钟里平均负载时多少。
# uptime
输入样例:
18:02:41 up 41 days, 23:42, 1 user, load average: 0.00, 0.00, 0.00

1可以被认为是最优的负载值。负载是会随着系统不同改变得。单CPU系统1-3和SMP系统6-10都是可能接受的。

#5:ps - 显示进程

ps命令显示当前运行进程的快照。使用-A或-e显示所有进程。
# ps -A
输出样例:

PID TTY TIME CMD
1 ? 00:00:02 init
2 ? 00:00:02 migration/0
3 ? 00:00:01 ksoftirqd/0
4 ? 00:00:00 watchdog/0
5 ? 00:00:00 migration/1
6 ? 00:00:15 ksoftirqd/1
....
.....
4881 ? 00:53:28 java
4885 tty1 00:00:00 mingetty
4886 tty2 00:00:00 mingetty
4887 tty3 00:00:00 mingetty
4888 tty4 00:00:00 mingetty
4891 tty5 00:00:00 mingetty
4892 tty6 00:00:00 mingetty
4893 ttyS1 00:00:00 agetty
12853 ? 00:00:00 cifsoplockd
12854 ? 00:00:00 cifsdnotifyd
14231 ? 00:10:34 lighttpd
14232 ? 00:00:00 php-cgi
54981 pts/0 00:00:00 vim
55465 ? 00:00:00 php-cgi
55546 ? 00:00:00 bind9-snmp-stat
55704 pts/1 00:00:00 ps

ps与top非常相似,但ps提供更多的信息。

输出长格式

# ps -Al

输出附加全格式(显示进程在执行时传入的参数)

# ps -AlF

显示进程结构

# ps -AlFH
在进程后显示线程
# ps -AlLm
打印服务器上所有进程
# ps ax
# ps axu

打印进程树
# ps -ejH
# ps axjf
# pstree
打印安全信息
# ps -eo euser,ruser,suser,fuser,f,comm,label
# ps axZ
# ps -eM

查看使用Vivek用户名运行的进程
# ps -U vivek -u vivek u
设置自定义输出格式
# ps -eo pid,tid,class,rtprio,ni,pri,psr,pcpu,stat,wchan:14,comm
# ps axo stat,euid,ruid,tty,tpgid,sess,pgrp,ppid,pid,pcpu,comm
# ps -eopid,tt,user,fname,tmout,f,wchan

只显示Lighttpd的进程ID
# ps -C lighttpd -o pid=
或者
# pgrep lighttpd
或者
# pgrep -u vivek php-cgi
显示PID为55977的进程名称
# ps -p 55977 -o comm=
找出消耗内存最多的前10名进程
# ps -auxf | sort -nr -k 4 | head -10
找出使用CPU最多的前10名进程
# ps -auxf | sort -nr -k 3 | head -10

#6:free - 内存使用情况

free命令显示系统中空闲的、已用的物理内存及swap内存,及被内核使用的buffer。
# free
输出样例:

total used free shared buffers cached
Mem: 12302896 9739664 2563232 0 523124 5154740
-/+ buffers/cache: 4061800 8241096
Swap: 1052248 0 1052248

相关链接:

  1. Linux Find Out Virtual Memory PAGESIZE
  2. Linux Limit CPU Usage Per Process
  3. How much RAM does my Ubuntu / Fedora Linux desktop PC have?
#7:iostat - CPU平均负载,硬盘活动

iostat命令可报告中央处理器(CPU)的统计信息,各种设备、分区及网络文件系统输入/输出的统计信息。
# iostat
输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

avg-cpu: %user %nice %system %iowait %steal %idle
3.50 0.09 0.51 0.03 0.00 95.86

Device: tps Blk_read/s Blk_wrtn/s Blk_read Blk_wrtn
sda 22.04 31.88 512.03 16193351 260102868
sda1 0.00 0.00 0.00 2166 180
sda2 22.04 31.87 512.03 16189010 260102688
sda3 0.00 0.00 0.00 1615 0

相关链接:Linux Track NFS Directory / Disk I/O Stats

#8:sar - 搜集和报告系统活动



sar命令用来搜集、报告和储存系统活动信息。查看网路计数器,输入:

# sar -n DEV | more

显示最近24小时网络计数器

# sar -n DEV -f /var/log/sa/sa24 | more

你亦可以用sar显示实时情况

# sar 4 5

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

06:45:12 PM CPU %user %nice %system %iowait %steal %idle
06:45:16 PM all 2.00 0.00 0.22 0.00 0.00 97.78
06:45:20 PM all 2.07 0.00 0.38 0.03 0.00 97.52
06:45:24 PM all 0.94 0.00 0.28 0.00 0.00 98.78
06:45:28 PM all 1.56 0.00 0.22 0.00 0.00 98.22
06:45:32 PM all 3.53 0.00 0.25 0.03 0.00 96.19
Average: all 2.02 0.00 0.27 0.01 0.00 97.70

相关链接:How to collect Linux system utilization data into a file

#9:mpstat - 多处理器使用率



mpstat命令可以显示所有可用处理器的使用情况,处理器编号从0开始。mpstat -P ALL显示每个处理器的平均使用率。

# mpstat -P ALL

输出样例:

Linux 2.6.18-128.1.14.el5 (www03.nixcraft.in) 06/26/2009

06:48:11 PM CPU %user %nice %sys %iowait %irq %soft %steal %idle intr/s
06:48:11 PM all 3.50 0.09 0.34 0.03 0.01 0.17 0.00 95.86 1218.04
06:48:11 PM 0 3.44 0.08 0.31 0.02 0.00 0.12 0.00 96.04 1000.31
06:48:11 PM 1 3.10 0.08 0.32 0.09 0.02 0.11 0.00 96.28 34.93
06:48:11 PM 2 4.16 0.11 0.36 0.02 0.00 0.11 0.00 95.25 0.00
06:48:11 PM 3 3.77 0.11 0.38 0.03 0.01 0.24 0.00 95.46 44.80
06:48:11 PM 4 2.96 0.07 0.29 0.04 0.02 0.10 0.00 96.52 25.91
06:48:11 PM 5 3.26 0.08 0.28 0.03 0.01 0.10 0.00 96.23 14.98
06:48:11 PM 6 4.00 0.10 0.34 0.01 0.00 0.13 0.00 95.42 3.75
06:48:11 PM 7 3.30 0.11 0.39 0.03 0.01 0.46 0.00 95.69 76.89

相关链接:Linux display each multiple SMP CPU processors utilization individually.

#10: pmap - 进程的内存使用



pmap命令可以显示进程的内存映射,使用这个命令可以找出造成内存瓶颈的原因。

# pmap -d PID

显示PID为47394进程的内存信息。

# pmap -d 47394

输出样例:

47394: /usr/bin/php-cgi
Address Kbytes Mode Offset Device Mapping
0000000000400000 2584 r-x-- 0000000000000000 008:00002 php-cgi
0000000000886000 140 rw--- 0000000000286000 008:00002 php-cgi
00000000008a9000 52 rw--- 00000000008a9000 000:00000 [ anon ]
0000000000aa8000 76 rw--- 00000000002a8000 008:00002 php-cgi
000000000f678000 1980 rw--- 000000000f678000 000:00000 [ anon ]
000000314a600000 112 r-x-- 0000000000000000 008:00002 ld-2.5.so
000000314a81b000 4 r---- 000000000001b000 008:00002 ld-2.5.so
000000314a81c000 4 rw--- 000000000001c000 008:00002 ld-2.5.so
000000314aa00000 1328 r-x-- 0000000000000000 008:00002 libc-2.5.so
000000314ab4c000 2048 ----- 000000000014c000 008:00002 libc-2.5.so
.....
......
..
00002af8d48fd000 4 rw--- 0000000000006000 008:00002 xsl.so
00002af8d490c000 40 r-x-- 0000000000000000 008:00002 libnss_files-2.5.so
00002af8d4916000 2044 ----- 000000000000a000 008:00002 libnss_files-2.5.so
00002af8d4b15000 4 r---- 0000000000009000 008:00002 libnss_files-2.5.so
00002af8d4b16000 4 rw--- 000000000000a000 008:00002 libnss_files-2.5.so
00002af8d4b17000 768000 rw-s- 0000000000000000 000:00009 zero (deleted)
00007fffc95fe000 84 rw--- 00007ffffffea000 000:00000 [ stack ]
ffffffffff600000 8192 ----- 0000000000000000 000:00000 [ anon ]
mapped: 933712K writeable/private: 4304K shared: 768000K

最后一行非常重要:

* mapped: 933712K 内存映射所占空间大小

* writeable/private: 4304K 私有地址空间大小

* shared: 768000K 共享地址空间大小

相关链接:Linux find the memory used by a program / process using pmap command

#11和#12: netstat和ss - 网络相关信息

netstat可以显示网络链接、路由表信息、接口统计信息、伪装链接和多播成员(multicast memberships),ss命令用来显示网络套接字信息,它允许显示类似netstat一样的信息。关于ss和netstat使用,可参考下列资源。
相关链接:

#13: iptraf - 网络实时信息

iptraf是一个可交互式的IP网络监控工具。它可以生成多种网络统计信息包括:TCP信息、UDP数量、ICMP和OSPF信息、以太网负载信息、节点状态、IP校验错误等。有下面几种信息格式:

  • 不同网络TCP链接传输量
  • 不同网络接口IP传输量
  • 不同协议网络传输量
  • 不同TCP/UDP端口和不同包大小网络传输量
  • 不同第二层地址网络传输量


图02:一般接口信息:不同网络接口IP传输量



图03:不同网络TCP链接传输量

#14:tcpdump:详细的网络流量分析

tcpdump是一个简单网络流量转储工具,然而要使用好需要对TCP/IP协议非常熟悉。例如要显示关于DNS的网络流量,输入:

# tcpdump -i eth1 'udp port 53'

显示所有进出80端口IPv4 HTTP包,也就是只打印包含数据的包。例如:SYN、FIN包和ACK-only包输入:

# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

显示所有到的FTP会话,输入:

# tcpdump -i eth1 'dst 202.54.1.5 and (port 21 or 20'显示所有到192.168.1.5的HTTP会话# tcpdump -ni eth0 'dst 192.168.1.5 and tcp and port http'用wireshark浏览转储文件中的详细信息,输入:# tcpdump -n -i eth1 -s 0 -w output.txt src or dst port 80#15:strace - 系统调用追踪系统调用和型号,这对于调试Web服务器和其他服务器非常有用。了解怎样追踪进程和他功能#16:/proc文件系统 - 各种内核信息/proc目录下文件提供了很多不同硬件设备和内核的详细信息。更多详情参见Linux kernel /proc。一般/proc例如:# cat /proc/cpuinfo
# cat /proc/meminfo
# cat /proc/zoneinfo
# cat /proc/mounts
#17:Nagios - 服务器及网络监控

Nagios 是一款非常流行的系统及网络监控软件。你可以轻松监控所有的主机、网络设备及服务。它能在发生故障和重新恢复后发送警讯。FAN是"Fully Automated Nagios"的缩写。FAN的目标就是由Nagios社群提供Nagios的安装。为了使安装Nagios服务器更加容易,FAN提供一个标准ISO格式的光盘镜像。此发行版中还会包含一组增强用户使用体验的工具。

#18:Cacti - 基于Web的监控工具

Cacti是一套完成的网络图形化解决方案,基于RRDTool的资料存储和图形化功能。Cacti提供一个快速的轮询器、进阶的图形化模板、多种数据采集方法和用户管理功能。这些功能都拥有非常友好易用的界面,确保可以部署在一个包含数百台设备的复杂网络中。它提供关于网络、CPU、内存、已登录用户、Apache、DNS等信息。关于怎样在CentOS / RHEL安装配置Cacti,详见:http://www.cyberciti.biz/faq/fedora-rhel-install-cacti-monitoring-rrd-software/

#19:KDE System Guard

KSysguard是在KDE桌面下一个网络化的系统监控工具。这个工具可以通过SSH会话运行。它提供很多功能,例如可以监控本机和远程主机的客户端/服务器架构,前端图形界面使用所谓传感器得到信息并展现出来。传感器返回的可以是一个简单的数值或是一组表格的信息。针对不同的信息类型,提供一个或多个显示。这些显示被组织多个工作表中,可以工作表可以独体储存和加载。所以,KSysguard不只是一个简单的任务管理器,还是一个可以控制多台服务器的强大工具。

图05:KDE System Guard

详细用法参见: the KSysguard handbook#20:Gnome System MonitorSystem Monitor可以显示系统基本信息、监控系统进程、系统资源及文件系统使用率。你也可以使用System Monitor监控和修改系统行为。尽管没有KDE System Guard功能强大,但其提供的基本信息对于入门用户还是非常有用的。* 显示关于计算机硬件和软件的各种基本信息。
* Linux内核版本
* GNOME版本
* 硬件
* 安装的内存
* 处理器及其速度
* 系统状态
* 当前可用的硬盘空间
* 进程
* 内存及交换空间
* 网络使用率
* 文件系统
* 所有挂载的文件系统及其基本信息

图06:The Gnome System Monitor application

MySQL的表分区

一、什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表mysql5.1开始支持数据表分区了。
如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。

二、为什么要对表进行分区
为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区的一些优点包括:
1)、与单个磁盘或文件系统分区相比,可以存储更多的数据
2)、
对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那
些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的
优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分
区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT
salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY
salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。
三、分区类型

· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

  • RANGE分区

基于属于一个给定连续区间的列值,把多行分配给分区。
这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INTNOTNULL,
  8. store_id INTNOTNULL
  9. )
  10. partition BYRANGE (store_id) (
  11. partition p0 VALUESLESS THAN (6),
  12. partition p1 VALUESLESS THAN (11),
  13. partition p2 VALUESLESS THAN (16),
  14. partition p3 VALUESLESS THAN (21)
  15. );

按照这种分区方案,在商店1到5工作的雇员相对应的所有行被保存在分区P0中,商店6到10的雇员保存在P1中,依次类推。注意,每个分区都是按顺序进行定义,从最低到最高。这是PARTITION BY RANGE 语法的要求;在这点上,它类似于C或Java中的“switch ... case”语句。
对于包含数据(72, 'Michael', 'Widenius', '1998-06-25', NULL,
13)的一个新行,可以很容易地确定它将插入到p2分区中,但是如果增加了一个编号为第21的商店,将会发生什么呢?在这种方案下,由于没有规则把
store_id大于20的商店包含在内,服务器将不知道把该行保存在何处,将会导致错误。 要避免这种错误,可以通过在CREATE
TABLE语句中使用一个“catchall” VALUES LESS THAN子句,该子句提供给所有大于明确指定的最高值的值:

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INTNOTNULL,
  8. store_id INTNOTNULL
  9. )
  10. PARTITION BYRANGE (store_id) (
  11. PARTITION p0 VALUESLESS THAN (6),
  12. PARTITION p1 VALUESLESS THAN (11),
  13. PARTITION p2 VALUESLESS THAN (16),
  14. PARTITION p3 VALUESLESS THAN MAXVALUE
  15. );

MAXVALUE 表示最大的可能的整数值。现在,store_id 列值大于或等于16(定义了的最高值)的所有行都将保存在分区p3中。在将来的某个时候,当商店数已经增长到25, 30, 或更多 ,可以使用ALTER TABLE语句为商店21-25, 26-30,等等增加新的分区。
在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code
列值的连续区间。例如——假定2位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你可以使用下
面的语句创建该分区表:

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INTNOTNULL,
  8. store_id INTNOTNULL
  9. )
  10. PARTITION BYRANGE (job_code) (
  11. PARTITION p0 VALUESLESS THAN (100),
  12. PARTITION p1 VALUESLESS THAN (1000),
  13. PARTITION p2 VALUESLESS THAN (10000)
  14. );


在这个例子中, 店内工人相关的所有行将保存在分区p0中,办公室和支持人员相关的所有行保存在分区p1中,管理层相关的所有行保存在分区p2中。
在VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN (<)比较的一部分;因此,表达式的值不能为NULL 。由于这个原因,雇员表的hired, separated, job_code,和store_id列已经被定义为非空(NOT NULL)。
除了可以根据商店编号分割表数据外,你还可以使用一个基于两个DATE
(日期)中的一个的表达式来分割表数据。例如,假定你想基于每个雇员离开公司的年份来分割表,也就是说,YEAR(separated)的值。实现这种分
区模式的CREATE TABLE 语句的一个例子如下所示:

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BYRANGE (YEAR(separated)) (
  11. PARTITION p0 VALUESLESS THAN (1991),
  12. PARTITION p1 VALUESLESS THAN (1996),
  13. PARTITION p2 VALUESLESS THAN (2001),
  14. PARTITION p3 VALUESLESS THAN MAXVALUE
  15. );

在这个方案中,在1991年前雇佣的所有雇员的记录保存在分区p0中,1991年到1995年期间雇佣的所有雇员的记录保存在分区p1中, 1996年到2000年期间雇佣的所有雇员的记录保存在分区p2中,2000年后雇佣的所有工人的信息保存在p3中。
RANGE分区在如下场合特别有用:
1)、 当需要删除一个分区上的“旧的”数据时,只删除分区即可
如果你使用上面最近的那个例子给出的分区方案,你只需简单地使用 “ALTER TABLE employees DROP PARTITION
p0;”来删除所有在1991年前就已经停止工作的雇员相对应的所有行。对于有大量行的表,这比运行一个如“DELETE FROM employees
WHERE YEAR (separated) <= 1990;”这样的一个DELETE查询要有效得多。
2)、想要使用一个包含有日期或时间值,或包含有从一些其他级数开始增长的值的列。
3)、经常运行直接依赖于用于分割表的列的查询。例如,当执行一个如“SELECT COUNT(*) FROM employees WHERE
YEAR(separated) = 2000 GROUP BY
store_id;”这样的查询时,MySQL可以很迅速地确定只有分区p2需要扫描,这是因为余下的分区不可能包含有符合该WHERE子句的任何记录。
注释:这种优化还没有在MySQL 5.1源程序中启用,但是,有关工作正在进行中。

  • LIST分区

类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表
注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. );


假定有20个音像店,分布在4个有经销权的地区,如下表所示:
====================
地区 商店ID 号
------------------------------------
北区 3, 5, 6, 9, 17
东区 1, 2, 10, 11, 19, 20
西区 4, 12, 13, 14, 18
中心区 7, 8, 15, 16
====================
要按照属于同一个地区商店的行保存在同一个分区中的方式来分割表,可以使用下面的“CREATE TABLE”语句:

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BYLIST(store_id)
  11. PARTITION pNorth VALUESIN(3,5,6,9,17),
  12. PARTITION pEast VALUESIN(1,2,10,11,19,20),
  13. PARTITION pWest VALUESIN(4,12,13,14,18),
  14. PARTITION pCentral VALUESIN(7,8,15,16)
  15. );

这使得在表中增加或删除指定地区的雇员记录变得容易起来。例如,假定西区的所有音像店都卖给了其他公司。那么与在西区音像店工作雇员相关的所有记录
(行)可以使用查询“ALTER TABLE employees DROP PARTITION
pWest;”来进行删除,它与具有同样作用的DELETE (删除)查询“DELETE query DELETE FROM employees
WHERE store_id IN (4,12,13,14,18);”比起来,要有效得多。
【要点】:如果试图插入列值(或分区表达式的返回值)不在分区值列表中的一行时,那么“INSERT”查询将失败并报错。例如,假定LIST分区的采用上面的方案,下面的查询将失败:

Sql代码
  1. INSERTINTOemployeesVALUES(224,'Linus','Torvalds','2002-05-01','2004-10-12', 42, 21);


这是因为“store_id”列值21不能在用于定义分区pNorth, pEast, pWest,或pCentral的值列表中找到。要重点注意的是,LIST分区没有类似如“VALUES LESS THAN MAXVALUE”这样的包含其他值在内的定义。将要匹配的任何值都必须在值列表中找到。
LIST分区除了能和RANGE分区结合起来生成一个复合的子分区,与HASH和KEY分区结合起来生成复合的子分区也是可能的。

  • HASH分区

基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH
(expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL
整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num
是一个非负的整数,它表示表将要被分割成分区的数量。

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BYHASH(store_id)
  11. PARTITIONS 4;

如果没有包括一个PARTITIONS子句,那么分区的数量将默认为1。 例外: 对于NDB Cluster(簇)表,默认的分区数量将与簇数据节点的数量相同,
这种修正可能是考虑任何MAX_ROWS 设置,以便确保所有的行都能合适地插入到分区中。

  • LINER HASH

MySQL还支持线性哈希功能,它与常规哈希的区别在于,线性哈希功能使用的一个线性的2的幂(powers-of-two)运算法则,而常规 哈希使用的是求哈希函数值的模数。
线性哈希分区和常规哈希分区在语法上的唯一区别在于,在“PARTITION BY” 子句中添加“LINEAR”关键字。

Sql代码
  1. CREATETABLEemployees (
  2. id INTNOTNULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATENOTNULLDEFAULT'1970-01-01',
  6. separated DATENOTNULLDEFAULT'9999-12-31',
  7. job_code INT,
  8. store_id INT
  9. )
  10. PARTITION BYLINEAR HASH(YEAR(hired))
  11. PARTITIONS 4;

假设一个表达式expr, 当使用线性哈希功能时,记录将要保存到的分区是num 个分区中的分区N,其中N是根据下面的算法得到:
1. 找到下一个大于num.的、2的幂,我们把这个值称为V ,它可以通过下面的公式得到:
2. V = POWER(2, CEILING(LOG(2, num)))
(例如,假定num是13。那么LOG(2,13)就是3.7004397181411。 CEILING(3.7004397181411)就是4,则V = POWER(2,4), 即等于16)。
3. 设置 N = F(column_list) & (V - 1).
4. 当 N >= num:
· 设置 V = CEIL(V / 2)
· 设置 N = N & (V - 1)
例如,假设表t1,使用线性哈希分区且有4个分区,是通过下面的语句创建的:
CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE)
PARTITION BY LINEAR HASH( YEAR(col3) )
PARTITIONS 6;
现在假设要插入两行记录到表t1中,其中一条记录col3列值为'2003-04-14',另一条记录col3列值为'1998-10-19'。第一条记录将要保存到的分区确定如下:
V = POWER(2, CEILING(LOG(2,7))) = 8
N = YEAR('2003-04-14') & (8 - 1)
= 2003 & 7
= 3
(3 >= 6 为假(FALSE): 记录将被保存到#3号分区中)
第二条记录将要保存到的分区序号计算如下:
V = 8
N = YEAR('1998-10-19') & (8-1)
= 1998 & 7
= 6
(6 >= 4 为真(TRUE): 还需要附加的步骤)
N = 6 & CEILING(5 / 2)
= 6 & 3
= 2

(2 >= 4 为假(FALSE): 记录将被保存到#2分区中)
按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1000吉)数据的表。它的缺点在于,与使用
常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。

  • KSY分区

类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

Sql代码
  1. CREATETABLEtk (
  2. col1 INTNOTNULL,
  3. col2 CHAR(5),
  4. col3 DATE
  5. )
  6. PARTITION BYLINEARKEY(col1)
  7. PARTITIONS 3;


在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。

mysql分区功能详细介绍,以及实例

3,list分区
LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分 区是从属于一个连续区间值的集合。

  1. //这种方式失败  
  2. mysql> CREATE TABLE IF NOT EXISTS `list_part` (  
  3.  ->   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户ID',  
  4.  ->   `province_id` int(2) NOT NULL DEFAULT 0 COMMENT '省',  
  5.  ->   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称',  
  6.  ->   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女',  
  7.  ->   PRIMARY KEY (`id`)  
  8.  -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1  
  9.  -> PARTITION BY LIST (province_id) (  
  10.  ->     PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),  
  11.  ->     PARTITION p1 VALUES IN (9,10,11,12,16,21),  
  12.  ->     PARTITION p2 VALUES IN (13,14,15,19),  
  13.  ->     PARTITION p3 VALUES IN (17,18,20,22,23,24)  
  14.  -> );  
  15. ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function 
  16.  
  17. //这种方式成功 
  18. mysql> CREATE TABLE IF NOT EXISTS `list_part` ( 
  19.  ->   `id` int(11) NOT NULL  COMMENT '用户ID',  
  20.  ->   `province_id` int(2) NOT NULL DEFAULT 0 COMMENT '', 
  21.  ->   `name` varchar(50) NOT NULL DEFAULT '' COMMENT '名称', 
  22.  ->   `sex` int(1) NOT NULL DEFAULT '0' COMMENT '0为男,1为女'  
  23.  -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8  
  24.  -> PARTITION BY LIST (province_id) (  
  25.  ->     PARTITION p0 VALUES IN (1,2,3,4,5,6,7,8),  
  26.  ->     PARTITION p1 VALUES IN (9,10,11,12,16,21),  
  27.  ->     PARTITION p2 VALUES IN (13,14,15,19),  
  28.  ->     PARTITION p3 VALUES IN (17,18,20,22,23,24)  
  29.  -> );  
  30. Query OK, 0 rows affected (0.33 sec)  

上面的这个创建list分区时,如果有主銉的话,分区时主键必须在其中,不然就会报错。如果我不用主键,分区就创建成功了,一般情况下,一个张表肯定会有一个主键,这算是一个分区的局限性吧。
如果对数据进行测试,请参考range分区的测试来操作
4,hash分区
HASH分区主要用来确保数据在预先确定数目的分区中平均分布,你所要做的只是基于将要被哈希的列值指定一个列值或表达式,以 及指定被分区的表将要被分割成的分区数量。

  1. mysql> CREATE TABLE IF NOT EXISTS `hash_part` (  
  2.  ->   `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '评论ID',  
  3.  ->   `comment` varchar(1000) NOT NULL DEFAULT '' COMMENT '评论',  
  4.  ->   `ip` varchar(25) NOT NULL DEFAULT '' COMMENT '来源IP',  
  5.  ->   PRIMARY KEY (`id`)  
  6.  -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1  
  7.  -> PARTITION BY HASH(id)  
  8.  -> PARTITIONS 3;  
  9. Query OK, 0 rows affected (0.06 sec)  

测试请参考range分区的操作
5,key分区
按照KEY进行分区类似于按照HASH分区,除了HASH分区使用的用 户定义的表达式,而KEY分区的 哈希函数是由MySQL 服务器提供。

  1. mysql> CREATE TABLE IF NOT EXISTS `key_part` (  
  2.  ->   `news_id` int(11) NOT NULL  COMMENT '新闻ID',  
  3.  ->   `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',  
  4.  ->   `u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '来源IP',  
  5.  ->   `create_time` DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '时间'  
  6.  -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8  
  7.  -> PARTITION BY LINEAR HASH(YEAR(create_time))  
  8.  -> PARTITIONS 3;  
  9. Query OK, 0 rows affected (0.07 sec)  

测试请参考range分区的操作
6,子分区
子分区是分区表中每个分区的再次分割,子分区既可以使用HASH希分区,也可以使用KEY分区。这 也被称为复合分区(composite partitioning)。

1,如果一个分区中创建了子分区,其他分区也要有子分区

2,如果创建了了分区,每个分区中的子分区数必有相同

3,同一分区内的子分区,名字不相同,不同分区内的子分区名子可以相同(5.1.50不适用)

  1. mysql> CREATE TABLE IF NOT EXISTS `sub_part` (  
  2.  ->   `news_id` int(11) NOT NULL  COMMENT '新闻ID',  
  3.  ->   `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',  
  4.  ->   `u_id`  int(11) NOT NULL DEFAULT 0s COMMENT '来源IP',  
  5.  ->   `create_time` DATE NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '时间'  
  6.  -> ) ENGINE=INNODB  DEFAULT CHARSET=utf8  
  7.  -> PARTITION BY RANGE(YEAR(create_time))  
  8.  -> SUBPARTITION BY HASH(TO_DAYS(create_time))(  
  9.  -> PARTITION p0 VALUES LESS THAN (1990)(SUBPARTITION s0,SUBPARTITION s1,SUBPARTITION s2),  
  10.  -> PARTITION p1 VALUES LESS THAN (2000)(SUBPARTITION s3,SUBPARTITION s4,SUBPARTITION good),  
  11.  -> PARTITION p2 VALUES LESS THAN MAXVALUE(SUBPARTITION tank0,SUBPARTITION tank1,SUBPARTITION tank3)  
  12.  -> );  
  13. Query OK, 0 rows affected (0.07 sec)  

官方网站说不同分区内的子分区可以有相同的名字,但是mysql5.1.50却不行会提示以下错误
ERROR 1517 (HY000): Duplicate partition name s1
三,分区管理
1,删除分区

  1. mysql> alter table user drop partition p4;  

2,新增分区

  1. //range添加新分区  
  2. mysql> alter table user add partition(partition p4 values less than MAXVALUE);  
  3. Query OK, 0 rows affected (0.06 sec)  
  4. Records: 0  Duplicates: 0  Warnings: 0  
  5.   
  6. //list添加新分区  
  7. mysql> alter table list_part add partition(partition p4 values in (25,26,28));  
  8. Query OK, 0 rows affected (0.01 sec)  
  9. Records: 0  Duplicates: 0  Warnings: 0  
  10.   
  11. //hash重新分区  
  12. mysql> alter table hash_part add partition partitions 4;  
  13. Query OK, 0 rows affected (0.12 sec)  
  14. Records: 0  Duplicates: 0  Warnings: 0  
  15.   
  16. //key重新分区  
  17. mysql> alter table key_part add partition partitions 4;  
  18. Query OK, 1 row affected (0.06 sec)    //有数据也会被重新分配  
  19. Records: 1  Duplicates: 0  Warnings: 0  
  20.   
  21. //子分区添加新分区,虽然我没有指定子分区,但是系统会给子分区命名的  
  22. mysql> alter table sub1_part add partition(partition p3 values less than MAXVALUE);  
  23. Query OK, 0 rows affected (0.02 sec)  
  24. Records: 0  Duplicates: 0  Warnings: 0  
  25.   
  26. mysql> show create table sub1_part\G;  
  27. *************************** 1. row ***************************  
  28.  Table: sub1_part  
  29. Create Table: CREATE TABLE `sub1_part` (  
  30.  `news_id` int(11) NOT NULL COMMENT '新闻ID',  
  31.  `content` varchar(1000) NOT NULL DEFAULT '' COMMENT '新闻内容',  
  32.  `u_id` varchar(25) NOT NULL DEFAULT '' COMMENT '来源IP',  
  33.  `create_time` date NOT NULL DEFAULT '0000-00-00' COMMENT '时间'  
  34. ) ENGINE=InnoDB DEFAULT CHARSET=utf8  
  35. !50100 PARTITION BY RANGE (YEAR(create_time))  
  36. SUBPARTITION BY HASH (TO_DAYS(create_time))  
  37. (PARTITION p0 VALUES LESS THAN (1990)  
  38.  (SUBPARTITION s0 ENGINE = InnoDB,  
  39.  SUBPARTITION s1 ENGINE = InnoDB,  
  40.  SUBPARTITION s2 ENGINE = InnoDB),  
  41.  PARTITION p1 VALUES LESS THAN (2000)  
  42.  (SUBPARTITION s3 ENGINE = InnoDB,  
  43.  SUBPARTITION s4 ENGINE = InnoDB,  
  44.  SUBPARTITION good ENGINE = InnoDB),  
  45.  PARTITION p2 VALUES LESS THAN (3000)  
  46.  (SUBPARTITION tank0 ENGINE = InnoDB,  
  47.  SUBPARTITION tank1 ENGINE = InnoDB,  
  48.  SUBPARTITION tank3 ENGINE = InnoDB),  
  49.  PARTITION p3 VALUES LESS THAN MAXVALUE  
  50.  (SUBPARTITION p3sp0 ENGINE = InnoDB,    //子分区的名子是自动生成的  
  51.  SUBPARTITION p3sp1 ENGINE = InnoDB,  
  52.  SUBPARTITION p3sp2 ENGINE = InnoDB))  
  53. 1 row in set (0.00 sec)  

3,重新分区

  1. //range重新分区  
  2. mysql> ALTER TABLE user REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES LESS THAN MAXVALUE);  
  3. Query OK, 11 rows affected (0.08 sec)  
  4. Records: 11  Duplicates: 0  Warnings: 0  
  5.   
  6. //list重新分区  
  7. mysql> ALTER TABLE list_part REORGANIZE PARTITION p0,p1,p2,p3,p4 INTO (PARTITION p0 VALUES in (1,2,3,4,5));  
  8. Query OK, 0 rows affected (0.28 sec)  
  9. Records: 0  Duplicates: 0  Warnings: 0  
  10.   
  11. //hash和key分区不能用REORGANIZE,官方网站说的很清楚  
  12. mysql> ALTER TABLE key_part REORGANIZE PARTITION COALESCE PARTITION 9;  
  13. ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'PARTITION 9' at line 1  

四,分区优点

1,分区可以分在多个磁盘,存储更大一点

2,根据查找条件,也就是where后面的条件,查找只查找相应的分区不用全部查找了

3,进行大数据搜索时可以进行并行处理。

4,跨多个磁盘来分散数据查询,来获得更大的查询吞吐量

lsof命令常见参数说明

lsof全名list opened files,也就是列举系统中已经被打开的文件。我们都知道,linux环境中,任何事物都是文件,设备是文件,目录是文件,甚至sockets也是文件。所以,用好lsof命令,对日常的linux管理非常有帮助。以下的说明,大部分内容来自lsof的manual文档。我所做的只是在中文翻译的基础上,进行简单的分类说明,并列举最常用的参数。

一、输出说明
lsof是linux最常用的命令之一,通常的输出格式为:
引用
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME

常见包括如下几个字段:更多的可见manual。
1、COMMAND
默认以9个字符长度显示的命令名称。可使用+c参数指定显示的宽度,若+c后跟的参数为零,则显示命令的全名
2、PID:进程的ID号
3、PPID
父进程的IP号,默认不显示,当使用-R参数可打开。
4、PGID
进程组的ID编号,默认也不会显示,当使用-g参数时可打开。
5、USER
命令的执行UID或系统中登陆的用户名称。默认显示为用户名,当使用-l参数时,可显示UID。
6、FD
是文件的File Descriptor number,或者如下的内容:
(这里很难翻译对应的意思,保留英文)
引用
cwd current working directory;
Lnn library references (AIX);
jld jail directory (FreeBSD);
ltx shared library text (code and data);
Mxx hex memory-mapped type number xx.
m86 DOS Merge mapped file;
mem memory-mapped file;
mmap memory-mapped device;
pd parent directory;
rtd root directory;
tr kernel trace file (OpenBSD);
txt program text (code and data);
v86 VP/ix mapped file;

文件的File Descriptor number显示模式有:
引用
r for read access;
w for write access;
u for read and write access;
N for a Solaris NFS lock of unknown type;
r for read lock on part of the file;
R for a read lock on the entire file;
w for a write lock on part of the file;
W for a write lock on the entire file;
u for a read and write lock of any length;
U for a lock of unknown type;
x for an SCO OpenServer Xenix lock on part of the file;
X for an SCO OpenServer Xenix lock on the entire file;
space if there is no lock.

7、TYPE
引用
IPv4 IPv4的包;
IPv6 使用IPv6格式的包,即使地址是IPv4的,也会显示为IPv6,而映射到IPv6的地址;
DIR 目录
LINK 链接文件

详情请看manual中更多的注释。
8、DEVICE
使用character special、block special表示的设备号
9、SIZE
文件的大小,如果不能用大小表示的,会留空。使用-s参数控制。
10、NODE
本地文件的node码,或者协议,如TCP等
11、NAME
挂载点和文件的全路径(链接会被解析为实际路径),或者连接双方的地址和端口、状态等

二、参数
1、不带额外参数运行
lsof path/filename

显示已打开该目录或文件的所有进程信息
lsof `which httpd`

显示指定命令的信息
2、参见参数
-c w 显示以w开头命令的已打开文件的信息
lsof -c sshd

-p PID 显示指定PID已打开文件的信息
lsof -p 4401

+d dir 依照文件夹dir来搜寻,但不会打开子目录
lsof +d /root

+D dir 打开dir文件夹以及其子目录搜寻
lsof +D /root/

-d s 以FD列的信息进行匹配,可使用3-10,表示范围,3,10表示某些值
lsof -d 3-10

-u 显示某用户的已经打开的文件(或该用户执行程序已经打开的文件)
lsof -u root
lsof -u 0

◎可配合正规表达式使用
表示不包括root用户的信息:
lsof -u ^root

-i 监听指定的协议、端口、主机等的网络信息,格式为:
引用
[46][proto][@host|addr][:svc_list|port_list]

例如:
lsof -i tcp@192.168.228.244
lsof -i:22

这个比较好用。比如看服务器的 lsof -i udp:611

还可以使用一些参数控制显示结果:
引用
-l 禁止将userID转换为登陆名称,即显示UID
-n 禁止将IP地址转换为hostname主机文件
-P 不显示端口名称

-g s 从PGID列进行匹配
lsof -g 3-10

3、其他参数
+f 所有路径参数都必须是文件系统,否则不能执行
-f 所有路径参数都将作为普通的文件,例如:"-f -- /"中的/,只会匹配单个/路径,而不会是根目录中的所有文件
+f和-f后都应加上“--”表终结符:
lsof -f -- /

+L/-L 打开或关闭文件的连结数计算,当+L没有指定时,所有的连结数都会显示(默认);若+L后指定数字,则只要连结数小于该数字的信息会显示;连结数会显示在NLINK列。
例如:+L1将显示没有unlinked的文件信息;+aL1,则显示指定文件系统所有unlinked的文件信息
-L 默认参数,其后不能跟数字,将不显示连结数信息
lsof +L1

-t 仅打印进程,方便shell脚本调用
lsof -t -c sshd

-F 指定输出那个列,可通过lsof -F?查看
-r 不断执行lsof命令,默认每15秒间隔执行一次
+r 也是不断执行lsof命令,但直到没有接受到文件信息,则停止

想了解更清楚的信息可以在linux下man lsof来查看其他参数的详细用法