zoukankan      html  css  js  c++  java
  • 无法登录oracle数据库--由于资源不足引起

      通过sqlplus以sysdba登录数据库时,出现了资源不足的错误(具体错误代码已经记不住了)。

      首先应该观察一下系统中资源的一些限制参数。

    [oracle@viti1 ~]$ cat /etc/security/limits.conf 
    # /etc/security/limits.conf
    #
    #Each line describes a limit for a user in the form:
    #
    #<domain>        <type>  <item>  <value>
    #
    #Where:
    #<domain> can be:
    #        - an user name
    #        - a group name, with @group syntax
    #        - the wildcard *, for default entry
    #        - the wildcard %, can be also used with %group syntax,
    #                 for maxlogin limit
    #
    #<type> can have the two values:
    #        - "soft" for enforcing the soft limits
    #        - "hard" for enforcing hard limits
    #
    #<item> can be one of the following:
    #        - core - limits the core file size (KB)
    #        - data - max data size (KB)
    #        - fsize - maximum filesize (KB)
    #        - memlock - max locked-in-memory address space (KB)
    #        - nofile - max number of open files
    #        - rss - max resident set size (KB)
    #        - stack - max stack size (KB)
    #        - cpu - max CPU time (MIN)
    #        - nproc - max number of processes
    #        - as - address space limit (KB)
    #        - maxlogins - max number of logins for this user
    #        - maxsyslogins - max number of logins on the system
    #        - priority - the priority to run user process with
    #        - locks - max number of file locks the user can hold
    #        - sigpending - max number of pending signals
    #        - msgqueue - max memory used by POSIX message queues (bytes)
    #        - nice - max nice priority allowed to raise to values: [-20, 19]
    #        - rtprio - max realtime priority
    #
    #<domain>      <type>  <item>         <value>
    #
    
    #*               soft    core            0
    #*               hard    rss             10000
    #@student        hard    nproc           20
    #@faculty        soft    nproc           20
    #@faculty        hard    nproc           50
    #ftp             hard    nproc           0
    #@student        -       maxlogins       4
    
    # End of file
    oracle    soft    nproc   2047
    oracle    hard    nproc   16384
    oracle    soft    nofile  1024
    oracle    hard    nofile  65536

      通过上面都输出可以知道,oracle用户的最大进程数为16384,能够打开的最大文件数为65536

      通过一下命令查看oracle用户下一个运行了多少进程:

    [oracle@viti1 ~]$ ps -U oracle | wc -l
    45

      如果oracle的进程数超过了限制,则需要对进行进行处理。否则继续。

      查看oracle用户下打开的文件的个数:

    [oracle@viti1 ~]$ lsof | grep oracle | wc -l
    4850

      观察是否超过了文件个数的上线,如果超过,则同样应该进行处理。否则继续

      查看整个系统磁盘的使用情况:

    [oracle@viti1 ~]$ df -lh
    文件系统          容量  已用  可用 已用%% 挂载点
    /dev/mapper/vg_viti1-lv_root
                          443G   47G  374G  12% /
    tmpfs                  16G  3.3G   13G  21% /dev/shm
    /dev/sda1             485M   68M  392M  15% /boot
    /dev/mapper/vg_viti1-lv_home
                          445G   80G  344G  19% /home

      观察是否有磁盘以满的情况,如果满了,或是快满则应该进行处理。

      对于我遇到都问题,就是由于dev/mapper/vg_viti1-lv_root分区的使用率为100%造成的。上面的输出是在我重新分区后的结构,最初dev/mapper/vg_viti1-lv_root的可用空间为50G,/dev/mapper/vg_viti1-lv_home为845G。对硬盘重新进行分区,将/dev/mapper/vg_viti1-lv_home中的400G给了/dev/mapper/vg_viti1-lv_root

      既然已经造成磁盘的使用率为100%,我们就需要去解决。首先,我希望找到,是什么数据导致了如此庞大的数据。通过du命令可以进行查看:

    [root@viti1 ~]# du -sm /*
    8    /bin
    58    /boot
    1    /cgroup
    3316    /dev
    26    /etc
    80845    /home
    239    /lib
    29    /lib64
    1    /lost+found
    1    /media
    0    /misc
    1    /mnt
    0    /net
    2    /opt
    du: cannot access `/proc/46443/task/46443/fd/4': No such file or directory
    du: cannot access `/proc/46443/task/46443/fdinfo/4': No such file or directory
    du: cannot access `/proc/46443/fd/4': No such file or directory
    du: cannot access `/proc/46443/fdinfo/4': No such file or directory
    0    /proc
    1196    /root
    15    /sbin
    0    /selinux
    1    /srv
    0    /sys
    1    /tmp
    44971    /usr
    150    /var

      如上所示,/usr目录中的文件占据了很大的空间。经过一步又一步的查看,最后锁定了一下文件:

    [root@viti1 ~]# du -sm /usr/local/oracle/data/orcl11g/*
    10    /usr/local/oracle/data/orcl11g/control01.ctl
    51    /usr/local/oracle/data/orcl11g/redo01.log
    51    /usr/local/oracle/data/orcl11g/redo02.log
    51    /usr/local/oracle/data/orcl11g/redo03.log
    641    /usr/local/oracle/data/orcl11g/sysaux01.dbf
    851    /usr/local/oracle/data/orcl11g/system01.dbf
    7    /usr/local/oracle/data/orcl11g/temp01.dbf
    15676    /usr/local/oracle/data/orcl11g/undotbs01.dbf
    6    /usr/local/oracle/data/orcl11g/users01.dbf

      通过上面的输出可知,是undotbs01.dbf逐渐庞大导致的,上网查看得知undotbs01.dbf是数据回滚的日志文件。既然找到了罪魁祸首那么就看看应该如何解决掉这个家伙。在google中输入undotbs01.dbf,竟然都是undotbs01.dbf过大的问题,网上的答案都是新建一个回滚日志的表空间,然后设置新的回滚日志表空间,删除旧的回滚日志表空间。但是,这一系列的操作都需要登录到oracle数据库才能够执行啊。无奈之下放弃这样方法。

      接下来的方法就应该是从新给磁盘分区,在网上查了一下重新分区的方法,不懂~(主要是对linux的文件系统理解的还不够)。首先,就是对磁盘的分区不够理解。通过dfisk命令,查看磁盘分区如下:

    [root@viti1 ~]# fdisk -l
    
    Disk /dev/sda: 1000.1 GB, 1000148590592 bytes
    255 heads, 63 sectors/track, 121594 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x0005b4a9
    
       Device Boot      Start         End      Blocks   Id  System
    /dev/sda1   *           1          64      512000   83  Linux
    Partition 1 does not end on cylinder boundary.
    /dev/sda2              64      121595   976194560   8e  Linux LVM
    
    Disk /dev/mapper/vg_viti1-lv_root: 483.2 GB, 483183820800 bytes
    255 heads, 63 sectors/track, 58743 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0xa5285a9d
    
                           Device Boot      Start         End      Blocks   Id  System
    
    Disk /dev/mapper/vg_viti1-lv_swap: 16.9 GB, 16894656512 bytes
    255 heads, 63 sectors/track, 2053 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000
    
    
    Disk /dev/mapper/vg_viti1-lv_home: 499.5 GB, 499541606400 bytes
    255 heads, 63 sectors/track, 60732 cylinders
    Units = cylinders of 16065 * 512 = 8225280 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disk identifier: 0x00000000

      对于上面的磁盘信息,产生了一连串的疑问:

    1. 为什么/dev/sda1与/dev/sda2相加已经是1T了(服务器的总容量就是1T),后面还有/dev/mapper/vg_viti1-lv_root等的三个分区呢?
    2. 对于/dev/sda1文件系统,通过命名方式可以知道是一个磁盘,但是/dev/mapper/vg_viti1-lv_root又是什么东西?

      由于上面的疑问说明我存在知识的盲点,在查询磁盘重新分区的过程中我遇到了lvm,这个词没见过,抱着试试看的态度,翻阅了一下鸟哥(当初也是跳着看的,一些不感兴趣的章节没有看)。看了之后真是或然开朗,lvm是一个虚拟分区的机制。目的是为了对分区进行扩容或是缩小。

      这不正式我的需求吗!

      快速在网上查阅如果对lvm的分区进行缩小和扩充(网上关于lvm解释的还是非常详细的)

      调整分区后重新测试!

      数据库成功登录:

    [oracle@viti1 ~]$ sqlplus /nolog
    
    SQL*Plus: Release 11.2.0.1.0 Production on Fri Nov 8 19:49:27 2013
    
    Copyright (c) 1982, 2009, Oracle.  All rights reserved.
    
    SQL> conn /as sysdba
    Connected.
    SQL> 

      大功告成!

      下面整理一下此次解决问题的思路:

    1. 遇到问题时,首先就是应该将问题的错误信息(或是错误代码)放到google中进行搜索;搜索后寻求多个结果,看哪个是可以执行的。
    2. 在解决问题中定会遇到不懂的地方(如:命令不理解,代码不理解),我觉得最好不要直接用自己不理解的东西进行测试,因为如果你不理解命令或是代码的真正用以,是无法知道解决问题的真正思路,进而就无法思考如何解决问题了。
    3. 在查看资料中,每个可能解决问题的点都要予以关注,就像这次,看到了lvm,了解一下,就解决了问题。
    4. 在解决问题中,应该有着积极/自信的态度。
    5. 一定要有个宏观的思路去思考问题,不能只关注到问题的一个点。

      

  • 相关阅读:
    ios webview调试
    iOS与网页JS交互,看我就够了
    iOS开发工具-网络封包分析工具Charles
    使用 Charles 抓取 App 网络请求
    用css解决table文字溢出控制td显示字数
    Docker容器学习与分享03
    Docker容器学习与分享02
    Docker容器学习与分享01
    写在重新更新之前
    Kali学习笔记30:身份认证与命令执行漏洞
  • 原文地址:https://www.cnblogs.com/yts1dx/p/3414838.html
Copyright © 2011-2022 走看看