通过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
对于上面的磁盘信息,产生了一连串的疑问:
- 为什么/dev/sda1与/dev/sda2相加已经是1T了(服务器的总容量就是1T),后面还有/dev/mapper/vg_viti1-lv_root等的三个分区呢?
- 对于/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>
大功告成!
下面整理一下此次解决问题的思路:
- 遇到问题时,首先就是应该将问题的错误信息(或是错误代码)放到google中进行搜索;搜索后寻求多个结果,看哪个是可以执行的。
- 在解决问题中定会遇到不懂的地方(如:命令不理解,代码不理解),我觉得最好不要直接用自己不理解的东西进行测试,因为如果你不理解命令或是代码的真正用以,是无法知道解决问题的真正思路,进而就无法思考如何解决问题了。
- 在查看资料中,每个可能解决问题的点都要予以关注,就像这次,看到了lvm,了解一下,就解决了问题。
- 在解决问题中,应该有着积极/自信的态度。
- 一定要有个宏观的思路去思考问题,不能只关注到问题的一个点。