wukaiqiang 发布的文章

1、自动安装oracle.zip
2、InstallOracleshell-main (1).zip

1参考:同事上传
2参考:https://github.com/pc-study/InstallOracleshell

[root@dbbackup opt]# sh auto_install_oracle_server.sh
========>-------- seletion------------
========>1.install database
========>2.deinstall database
========>3.configure local yum
========>-----------------------------
========>Your choice:1^C
[root@dbbackup opt]# sh auto_install_oracle_server.sh /data orcl
========>-------- seletion------------
========>1.install database
========>2.deinstall database
========>3.configure local yum
========>-----------------------------
========>Your choice:1
[ok]====>begin install_db
[ok]====>current user is root
[OK]====>the yum configure
[OK]====>the installfile
[OK]====>the config file
========>----charcaterset seletion----
========>1.AMERICAN_AMERICA.ZHS16GBK
========>2.AMERICAN_AMERICA.AL32UTF8
========>-----------------------------
========>Your choice:(default 1):
========>please input sid(less than 8 letters):orcl
========>please input memory target(MB):4096
========>please input ORACLE_BASE(will auto create):/data/oracle
========>please input host IP address:192.168.1.49
[ok]====>cpu
[ok]====>memory
[ok]====>/tmp
[ok]====>swap
[ok]====>ORACLE_BASE
[OK]====>the yum configure
[ok]====>the yum package has been installed
[ok]====>the sysctl.conf has been backup and change
[ok]====>the limits.conf has been backup and change
[ok]====>the login has been backup and change
[ok]====>the profile has been backup and change
[ok]====>the oracle user and oinstall,dba group has been created
[ok]====>the .bash_profile has been backup and change
[ok]====>the dir has been created
[ok]====>the install file has been unzip
[ok]====>the hosts has been backup and change
[ok]====>the db_install.rsp has been backup and change
[ok]====>waiting for software install . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
[ok]====>software has installed
[ok]====>two script has been run by root
[ok]====>netca.rsp has been backup and change
[ok]====>waiting for netca install .
[ok]====>netca has installed
[ok]====>dbca.rsp has been backup and change
Copying database files
1% complete
3% complete
11% complete
18% complete
26% complete
37% complete
Creating and starting Oracle instance
40% complete
45% complete
50% complete
55% complete
56% complete
60% complete
62% complete
Completing Database Creation
66% complete
70% complete
73% complete
85% complete
96% complete
100% complete
Look at the log file "/data/oracle/cfgtoollogs/dbca/orcl/orcl.log" for further details.
[ok]====>dbca has installed
[ok]====>the install process success

概述

DataGuard是甲骨文推出的一种高可用性数据库方案,在Oracle 8i之前被称为Standby Database。从Oracle 9i开始,正式更名为Data Guard。它是在主节点与备用节点间通过日志同步来保证数据的同步,可以实现数据库快速切换与灾难性恢复。Data Guard只是在软件上对数据库进行设置,并不需要额外购买任何组件。用户能够在对主数据库影响很小的情况下,实现主备数据库的同步。而主备机之间的数据差异只限于在线日志部分,因此被不少企业用作数据容灾解决方案。

分类

DataGuard分为"物理standby"和"逻辑standby"

物理standby

主备库之间物理结构逻辑结构保持一致。通常情况下备用库通过主库传输过来的归档日志做恢复。

基于"块对块"方式。与主数据库相同。物理standby等同于生产库。物理standby能以read only方式打开(或者在flashback数据库下以"读写方式打开")。

物理standby一旦以"读写"方式打开,备用库将不会从主数据库接受重做数据。只有当备库flashback到过去的点,当备用库flashback到"读写"打开时间点前的状态时,DataGuard会自动同步备库与主库。才能恢复standby角色。

逻辑standby

只保证逻辑结构与主库一致。备用库要处于打开状态,通过从主库归档日志文件中提取出来的SQL语句做恢复。

创建时,与物理standby一样,使用主库copy.

逻辑备库通过执行SQL语句来更新。DataGuard转换日志文件中的数据为SQL语句,然后在逻辑standby上执行SQL语句.因为逻辑standby是通过SQL语句来实现数据同步,那么在同步期间其必须保持打开状态。

DataGuard环境规划

内容主库备库
操作系统CENTOS 7.4CENTOS 7.4
IP192.168.117.129192.168.117.128
db_namedgdg
db_unique_namedg1dg2
数据库安装安装数据库软件+创建监听+安装数据库安装数据库软件+创建监听
  1. IP地址

[oracle@dg1 dbs]$ cat /etc/hosts

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

192.168.117.129  dg1 
192.168.117.128  dg2
  1. 监听
[oracle@dg1 dbs]$ lsnrctl status

LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 08-AUG-2021 10:21:04

Copyright (c) 1991, 2013, Oracle.  All rights reserved.

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 11.2.0.4.0 - Production
Start Date                08-AUG-2021 02:41:32
Uptime                    0 days 7 hr. 39 min. 31 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u01/app/oracle/11.2.0.4/product/network/admin/listener.ora
Listener Log File         /u01/app/oracle/diag/tnslsnr/dg1/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=dg1)(PORT=1521)))
Services Summary...
Service "dg1" has 2 instance(s).
  Instance "dg1", status UNKNOWN, has 1 handler(s) for this service...
  Instance "dg1", status READY, has 1 handler(s) for this service...
Service "dg1XDB" has 1 instance(s).
  Instance "dg1", status READY, has 1 handler(s) for this service...
The command completed successfully
[oracle@dg1 dbs]$ 
  1. listener.ora

    [oracle@dg1 admin]$ cat listener.ora 
    # listener.ora Network Configuration File: /u01/app/oracle/11.2.0.4/product/network/admin/listener.ora
    # Generated by Oracle configuration tools.
    
    LISTENER =
      (DESCRIPTION_LIST =
     (DESCRIPTION =
       (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
       (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))
     )
      )
    
    SID_LIST_LISTENER=
      (SID_LIST =
      (SID_DESC =
       (GLOBAL_DBNAME = dg1)
       (ORACLE_HOME =/u01/app/oracle/11.2.0.4/product)
       (SID_NAME = dg1)
     )
      ) 
    
    
    ADR_BASE_LISTENER = /u01/app/oracle
  2. tnsnames.ora

    # tnsnames.ora Network Configuration File: /u01/app/oracle/11.2.0.4/product/network/admin/tnsnames.ora
    # Generated by Oracle configuration tools.
    
    DG2 =
      (DESCRIPTION =
     (ADDRESS_LIST =
       (ADDRESS = (PROTOCOL = TCP)(HOST =dg2 )(PORT = 1521))
     )
     (CONNECT_DATA =
       (SERVICE_NAME = dg2)
     )
      )
    
    DG1 =
      (DESCRIPTION =
     (ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))
     (CONNECT_DATA =
       (SERVER = DEDICATED)
       (SERVICE_NAME = dg1)
     )
      )
  3. 参数文件

    [oracle@dg1 dbs]$ cat initdg1.ora
    dg1.__db_cache_size=557842432
    dg1.__java_pool_size=4194304
    dg1.__large_pool_size=8388608
    dg1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
    dg1.__pga_aggregate_target=293601280
    dg1.__sga_target=884998144
    dg1.__shared_io_pool_size=0
    dg1.__shared_pool_size=293601280
    dg1.__streams_pool_size=8388608
    *.audit_file_dest='/u01/app/oracle/admin/dg1/adump'
    *.audit_trail='db'
    *.compatible='11.2.0.4.0'
    *.control_files='/u01/app/oracle/oradata/dg1/control01.ctl','/u01/app/oracle/recovery_area/dg1/control02.ctl'#Restore Controlfile
    *.db_block_size=8192
    *.db_domain=''
    *.db_name='dg1'
    *.db_recovery_file_dest='/u01/app/oracle/recovery_area'
    *.db_recovery_file_dest_size=4385144832
    *.DB_UNIQUE_NAME='dg1'
    *.diagnostic_dest='/u01/app/oracle'
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=dg1XDB)'
    *.FAL_CLIENT='dg1'
    *.FAL_SERVER='dg2'
    *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg1,dg2)'
    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/archive  VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg1'
    *.LOG_ARCHIVE_DEST_2='SERVICE=dg2  LGWR ASYNC  VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg2'
    *.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
    *.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
    *.LOG_ARCHIVE_FORMAT='%t_%s_%r.arc'
    *.open_cursors=300
    *.pga_aggregate_target=293601280
    *.processes=1000
    *.remote_login_passwordfile='EXCLUSIVE'
    *.sga_target=881852416
    *.STANDBY_FILE_MANAGEMENT='AUTO'
    *.undo_tablespace='UNDOTBS1'
    *.DB_FILE_NAME_CONVERT='dg1','dg2' 

    节点2

    [oracle@dg2 dbs]$ cat initdg2.ora 
    dg2.__db_cache_size=633339904
    dg2.__java_pool_size=4194304
    dg2.__large_pool_size=8388608
    dg2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
    dg2.__pga_aggregate_target=293601280
    dg2.__sga_target=880803840
    dg2.__shared_io_pool_size=0
    dg2.__shared_pool_size=222298112
    dg2.__streams_pool_size=0
    *.audit_file_dest='/u01/app/oracle/admin/dg2/adump'
    *.audit_trail='db'
    *.compatible='11.2.0.4.0'
    *.control_files='/u01/app/oracle/oradata/dg2/control01.ctl','/u01/app/oracle/fast_recovery_area/dg2/control02.ctl'
    *.db_block_size=8192
    *.db_domain=''
    *.db_name='dg1'
    *.db_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
    *.db_recovery_file_dest_size=4385144832
    *.DB_UNIQUE_NAME='dg2'
    *.diagnostic_dest='/u01/app/oracle'
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=dg2XDB)'
    *.FAL_CLIENT='dg2'
    *.FAL_SERVER='dg1'
    *.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg1,dg2)'
    *.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg2'
    *.LOG_ARCHIVE_DEST_2='SERVICE=dg1 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg1'
    *.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
    *.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
    *.LOG_ARCHIVE_FORMAT='log%t_%s_%r.arc'
    *.log_file_name_convert='</u01/app/oracle/oradata/dg1/>','</u01/app/oracle/oradata/dg2>'
    *.open_cursors=300
    *.pga_aggregate_target=293601280
    *.processes=150
    *.remote_login_passwordfile='EXCLUSIVE'
    *.sga_target=880803840
    *.STANDBY_FILE_MANAGEMENT='AUTO'
    *.undo_tablespace='UNDOTBS1'

    复制节点1的密码文件到节点2

    dg1正常运行,dg2启动到nomount状态
    rman target  sys/oracle@dg1 auxiliary sys/oracle@dg2

    复制数据库到dg2

    duplicate target database for standby from active database;
    duplicate target database for standby from active database nofilenamecheck;(节点1和节点2的目录完全一样时,使用nofilenamecheck参数)

备库开始接收应用日志
[oracle@oracle10g-dg2-213-101 ~]$ sqlplus / as sysdba

SQL> alter database recover managed standby database disconnect from session;

验证是否同步
备库:
archive log list;

select name,sequence#,applied from v$archived_log a where a.sequence#=(select max(sequence#) from v$archived_log);

col dest_name format A40
SQL> select dest_name,status,error from v$archive_dest where rownum<3;

主库:
archive log list;

SQL> col dest_name format A40
col error format A20
set line 200;
select name,sequence#,applied from v$archived_log a where a.sequence#=(select max(sequence#) from v$archived_log);
SQL> col dest_name format A40
select dest_name,status,error from v$archive_dest where rownum<3;

查看DG的日志信息

SQL> select * from v$dataguard_status;

Open Read Only standby数据库并且开启实时日志应用

SQL> shutdown immediate 

ORA-01109: database not open 

Database dismounted. 

ORACLE instance shut down. 

SQL> startup 

ORACLE instance started. 

Total System Global Area 1188511744 bytes 

Fixed Size                  1364228 bytes 

Variable Size             754978556 bytes 

Database Buffers          419430400 bytes 

Redo Buffers               12738560 bytes 

Database mounted. 

Database opened. 

SQL> select database_role,protection_mode,protection_level,open_mode from v$database; 

DATABASE_ROLE    PROTECTION_MODE      PROTECTION_LEVEL     OPEN_MODE 

---------------- -------------------- -------------------- -------------------- 

PHYSICAL STANDBY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE  READ ONLY 

SQL> select process,client_process,sequence#,status from v$managed_standby; 

PROCESS   CLIENT_P  SEQUENCE# STATUS 

--------- -------- ---------- ------------ 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH             26 CLOSING 

RFS       ARCH              0 IDLE 

RFS       UNKNOWN           0 IDLE 

RFS       LGWR             27 IDLE 

7 rows selected. 

SQL> recover managed standby database using current logfile disconnect from session; 

Media recovery complete. 

SQL> select process,client_process,sequence#,status from v$managed_standby; 

PROCESS   CLIENT_P  SEQUENCE# STATUS 

--------- -------- ---------- ------------ 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH              0 CONNECTED 

ARCH      ARCH             26 CLOSING 

RFS       ARCH              0 IDLE 

RFS       UNKNOWN           0 IDLE 

RFS       LGWR             27 IDLE 

MRP0      N/A              27 APPLYING_LOG 

8 rows selected. 

SQL> select process,client_process,sequence#,status from v$managed_standby;

PROCESS CLIENT_P SEQUENCE# STATUS


ARCH ARCH 19 CLOSING

ARCH ARCH 20 CLOSING

ARCH ARCH 0 CONNECTED

ARCH ARCH 21 CLOSING

MRP0 N/A 22 WAIT_FOR_LOG

RFS ARCH 0 IDLE

RFS UNKNOWN 0 IDLE

RFS UNKNOWN 0 IDLE

RFS LGWR 22 IDLE

9 rows selected.

mysql内存计算.zip
Mysql占用内存过高参数优化

计算mysql各项参数
http://www.mysqlcalculator.com/

key_buffer_size
指定索引缓冲区的大小,对MyISAM表起作用
query_cache_size 
查询缓存大小,默认改选项为关闭
tmp_table_size
临时表缓存
innodb_buffer_pool_size
innodb表的索引,数据,插入数据时的缓冲
innodb_additional_mem_pool_size
innodb 内部缓存
innodb_log_buffer_size
日志缓存
max_connections 
最大连接数,不超过16384
sort_buffer_size
connection级参数,在每个connection连接时分配
read_buffer_size 
MySQL读入缓冲区的大小
read_rnd_buffer_size 
随机读缓存
thread_stack 
连接线程分配空间
binlog_cache_size 
每个session的binlog缓存

1.内存优化原则

将尽量多的内存分配给MySQL做缓存,但要给操作系统和其他程序预留足够内存。
MyISAM存储引擎的数据文件读取依赖于操作系统自身的IO缓存,因此,如果有MyISAM表,就要预留更多的内存给操作系统做IO缓存。
排序区、连接区等缓存是分配给每个数据库会话(session)专用的,其默认值的设置要根据最大连接数合理分配,如果设置太大,不但浪费资源,而且在并发连接较高时会导致物理内存耗尽。

2.MyISAM 内存优化

myisam存储引擎使用 key_buffer 缓存索引块,加速myisam索引的读写速度。对于myisam表的数据块,mysql没有特别的缓存机制,完全依赖于操作系统的IO缓存。

  key_buffer_size:
    key_buffer_size决定MyISAM索引块缓存区的大小,直接影响到MyISAM表的存取效率。可以在MySQL参数文件中设置key_buffer_size的值,对于一般MyISAM数据库,建议至少将1/4可用内存分配给key_buffer_size。
    在/usr/my.cnf 中做如下配置:key_buffer_size=512M 

  read_buffer_size:
    如果需要经常顺序扫描myisam表,可以通过增大read_buffer_size的值来改善性能。但需要注意的是read_buffer_size是每个session独占的,如果默认值设置太大,就会造成内存浪费。

  read_rnd_buffer_size:

    对于需要做排序的myisam表的查询,如带有order by子句的sql,适当增加 read_rnd_buffer_size 的值,可以改善此类的sql性能。但需要注意的是 read_rnd_buffer_size 是每个session独占的,如果默认值设置太大,就会造成内存浪费。

3.InnoDB 内存优化

  innodb用一块内存区做IO缓存池,该缓存池不仅用来缓存innodb的索引块,而且也用来缓存innodb的数据块。

  innodb_buffer_pool_size:
    该变量决定了 innodb 存储引擎表数据和索引数据的最大缓存区大小。在保证操作系统及其他程序有足够内存可用的情况下,innodb_buffer_pool_size 的值越大,缓存命中率越高,访问InnoDB表需要的磁盘I/O 就越少,性能也就越高。
    innodb_buffer_pool_size=512M

  innodb_log_buffer_size:
    决定了innodb重做日志缓存的大小,对于可能产生大量更新记录的大事务,增加innodb_log_buffer_size的大小,可以避免innodb在事务提交前就执行不必要的日志写入磁盘操作。
    innodb_log_buffer_size=10M

转载链接https://www.cnblogs.com/roadlandscape/p/12808344.html,如侵权,请联系。

lsof(list open files)是一个列出当前系统打开文件的工具。在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

输出信息含义
在终端下输入lsof即可显示系统打开的文件,因为 lsof 需要访问核心内存和各种文件,所以必须以 root 用户的身份运行它才能够充分地发挥其功能。

直接输入lsof部分输出为:

COMMAND     PID        USER   FD      TYPE             DEVICE SIZE/OFF       NODE NAME
init          1        root  cwd       DIR                8,1     4096          2 /
init          1        root  rtd       DIR                8,1     4096          2 /
init          1        root  txt       REG                8,1   150584     654127 /sbin/init
udevd       415        root    0u      CHR                1,3      0t0       6254 /dev/null
udevd       415        root    1u      CHR                1,3      0t0       6254 /dev/null
udevd       415        root    2u      CHR                1,3      0t0       6254 /dev/null
udevd       690        root  mem       REG                8,1    51736     302589 /lib/x86_64-linux-gnu/libnss_files-2.13.so
syslogd    1246      syslog    2w      REG                8,1    10187     245418 /var/log/auth.log
syslogd    1246      syslog    3w      REG                8,1    10118     245342 /var/log/syslog
dd         1271        root    0r      REG                0,3        0 4026532038 /proc/kmsg
dd         1271        root    1w     FIFO               0,15      0t0        409 /run/klogd/kmsg
dd         1271        root    2u      CHR                1,3      0t0       6254 /dev/null

每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件。

lsof输出各列信息的意义如下:

COMMAND:进程的名称 PID:进程标识符

USER:进程所有者

FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等 TYPE:文件类型,如DIR、REG等

DEVICE:指定磁盘的名称

SIZE:文件的大小

NODE:索引节点(文件在磁盘上的标识)

NAME:打开文件的确切名称

FD 列中的文件描述符cwd 值表示应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改,txt 类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序。

其次数值表示应用程序的文件描述符,这是打开该文件时返回的一个整数。如上的最后一行文件/dev/initctl,其文件描述符为 10。u 表示该文件被打开并处于读取/写入模式,而不是只读 ® 或只写 (w) 模式。同时还有大写 的W 表示该应用程序具有对整个文件的写锁。该文件描述符用于确保每次只能打开一个应用程序实例。初始打开每个应用程序时,都具有三个文件描述符,从 0 到 2,分别表示标准输入、输出和错误流。所以大多数应用程序所打开的文件的 FD 都是从 3 开始。

与 FD 列相比,Type 列则比较直观。文件和目录分别称为 REG 和 DIR。而CHR 和 BLK,分别表示字符和块设备;或者 UNIX、FIFO 和 IPv4,分别表示 UNIX 域套接字、先进先出 (FIFO) 队列和网际协议 (IP) 套接字。

常用参数

lsof语法格式是:
lsof [options] filename

lsof abc.txt 显示开启文件abc.txt的进程
lsof -c abc 显示abc进程现在打开的文件
lsof -c -p 1234 列出进程号为1234的进程所打开的文件
lsof -g gid 显示归属gid的进程情况
lsof +d /usr/local/ 显示目录下被进程开启的文件
lsof +D /usr/local/ 同上,但是会搜索目录下的目录,时间较长
lsof -d 4 显示使用fd为4的进程
lsof -i 用以显示符合条件的进程情况
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]
  46 --> IPv4 or IPv6
  protocol --> TCP or UDP
  hostname --> Internet host name
  hostaddr --> IPv4地址
  service --> /etc/service中的 service name (可以不止一个)
  port --> 端口号 (可以不止一个)

lsof使用实例
查找谁在使用文件系统

在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:

lsof /GTES11/

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。一个 bash是实例正在运行,并且它当前的目录为/GTES11,另一个则显示的是vim正在编辑/GTES11下的文件。要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的目录更改为根目录、或服务特定的目录(如 sendmail 示例中的 /var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

恢复删除的文件

当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志。有时可以通过lsof来恢复这些文件。
当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中。这意味着,进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。
在/proc 目录下,其中包含了反映内核和进程树的各种文件。/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。
当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容。 假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下:
首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:

lsof |grep /var/log/messages

syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下:

head -n 10 /proc/1283/fd/2

Aug 4 13:50:15 holmes86 syslogd 1.4.1: restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 (root@everestbuilder.linux-ren.org) (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007 Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map: Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 - 000000000009f000 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000000009f000 - 00000000000a0000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 - 000000001f7d3800 (usable) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000000001f7d3800 - 0000000020000000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 - 00000000f0007000 (reserved) Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000f0008000 - 00000000f000c000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如:
cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有用。

实用命令

lsof `which httpd` //那个进程在使用apache的可执行文件
lsof /etc/passwd //那个进程在占用/etc/passwd
lsof /dev/hda6 //那个进程在占用hda6
lsof /dev/cdrom //那个进程在占用光驱
lsof -c sendmail //查看sendmail进程的文件使用情况
lsof -c courier -u ^zahn //显示出那些文件被以courier打头的进程打开,但是并不属于用户zahn
lsof -p 30297 //显示那些文件被pid为30297的进程打开
lsof -D /tmp 显示所有在/tmp文件夹中打开的instance和文件的进程。但是symbol文件并不在列

lsof -u1000 //查看uid是100的用户的进程的文件使用情况
lsof -utony //查看用户tony的进程的文件使用情况
lsof -u^tony //查看不是用户tony的进程的文件使用情况(^是取反的意思)
lsof -i //显示所有打开的端口
lsof -i:80 //显示所有打开80端口的进程
lsof -i -U //显示所有打开的端口和UNIX domain文件
lsof -i UDP@[url]www.akadia.com:123 //显示那些进程打开了到www.akadia.com的UDP的123(ntp)端口的链接
lsof -i tcp@ohaha.ks.edu.tw:ftp -r //不断查看目前ftp连接的情况(-r,lsof会永远不断的执行,直到收到中断信号,+r,lsof会一直执行,直到没有档案被显示,缺省是15s刷新)
lsof -i tcp@ohaha.ks.edu.tw:ftp -n //lsof -n 不将IP转换为hostname,缺省是不加上-n参数

转载链接:https://blog.csdn.net/tianyihuyidao9/article/details/84219236,如侵权,请联系。