参考文献:
http://www.5ienet.com/note/html/st11g/index.shtml
Oracle Enterprise Linux Server 5 U3安装64位ORACLE11gR2
=======================================================
较早期的服务器在centos5.5 64位操作系统下安装oracle很顺利。
而后来的IBM服务器推出的M4机器以及其他品牌后期的机器,有些驱动在centos5.8的版本才有,因此,推荐使用centos5.8 64位操作系统安装oracle11g。
而centos6版本由于缺少oracle11g安装所需的依赖包,因此,不推荐使用centos6版本。
1,将11g安装文件上传到服务器的/tmp目录下并解压:
1)linux.x64_11gR2_database_1of2.zip
2)linux.x64_11gR2_database_2of2.zip
解压命令:
unzip linux.x64_11gR2_database_1of2.zip
unzip linux.x64_11gR2_database_2of2.zip
解压完成后,在tmp目录下会生成database的安装包目录。
2,添加以下行到 /etc/security/limits.conf 文件中
#vi /etc/security/limits.conf
oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536
或:
sed -i '$ a\oracle soft nproc 2047' /etc/security/limits.conf
sed -i '$ a\oracle hard nproc 16384' /etc/security/limits.conf
sed -i '$ a\oracle soft nofile 1024' /etc/security/limits.conf
sed -i '$ a\oracle hard nofile 65536' /etc/security/limits.conf
3,添加以下行到 /etc/pam.d/login 文件中:
#vi /etc/pam.d/login
session required pam_limits.so
或:
sed -i '$ a\session required pam_limits.so' /etc/pam.d/login
4,修改 /etc/selinux/config 文件来关闭linux防火墙,确保SELINUX设置如下:
#vi /etc/selinux/config
SELINUX=disabled
5,编辑文件 /etc/profile ,增加以下内容设置oracle用户的默认的shell
#vi /etc/profile
if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
umask 022
fi
6,创建oracle用户及关联组
groupadd oinstall
groupadd -g 502 dba
useradd -u 502 -g oinstall -G dba oracle
passwd oracle
输入oracle用户密码
7,建立oracle安装目录
mkdir -p /u01/oracle/product/11.2.0/db_1
chown -R oracle:oinstall /u01/
chmod -R 775 /u01/oracle
mkdir /u01/oradata
chown -R oracle:oinstall /u01/oradata
chmod 775 /u01/oradata
mkdir /u01/recovery_area
chown -R oracle:oinstall /u01/recovery_area
chmod 775 /u01/recovery_area
如果创建的数据库表空间目录不在这个目录中,也需要通过这个方法授于数据库目录的权限
8,使用vi命令编辑/home/oracle/.bash_profile,添加oracle环境变量:
#su - oracle
$vi .bash_profile
export TMP=/tmp
export TMPDIR=$TMP
export ORACLE_BASE=/u01/oracle/
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1
export ORACLE_SID=voddb
export ORACLE_TERM=xterm
export PATH=/usr/sbin:$ORACLE_HOME/bin:$PATH
export CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
export LD_ASSUME_KERNEL=2.6.18
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK"
#安装了rlwrap的rpm包后,加入这个配置可以在sqlplus环境下使用Backspace键和上下键
alias sqlplus='rlwrap sqlplus'
alias rman='rlwrap rman'
9,为了使所有设置生效,需要重启一下系统
# reboot
10,重启完后,可使用oracle用户登录,也可使用root用户登录进行安装数据库。
如果是使用root用户登录的,则需要在字符控制台上执行以下命令,并切换到oracle用户进行安装数据库
#xhost +
#su - oracle
$cd /tmp/database
$./runInstaller
11,在oracle用户环境中,执行以下命令进行oracle的安装:
$/tmp/database/runInstaller
12,oracle11g的安装界面的验证页面中,会提示缺失的rpm包,根据提示信息,安装缺失的rpm包及其依赖包;
64位的依赖包一般包括:
compat-libstdc++-33-3.2.3-61.x86_64.rpm
libaio-devel-0.3.106-5.x86_64.rpm
pdksh-5.2.14-36.el5.x86_64.rpm
sysstat-7.0.2-3.el5.x86_64.rpm
unixODBC-2.2.11-7.1.x86_64.rpm
unixODBC-devel-2.2.11-7.1.x86_64.rpm
rlwrap-0.37-1.el5.x86_64.rpm 这个包可以让你登录sqlplus环境后,可以使用Backspace键以及上下键;
32位的操作系统也有相对应的依赖包。请安装以上的依赖包后,再次在安装界面中进行验证。
如果还有其他的依赖包尚未安装,一般可以到centos安装镜像文件中找到。确保所有的依赖包都安装,保证验证通过。
(如果是centos6.4版本的,则高版本的rpm又不验证不过去,只好使用强制命令安装低版本的rpm包,但目前尚未有资料说这样安装是否可靠。
rpm -i --force --nodeps [rpm_name].rpm)
13,执行验证页面中的 fixup & Check Again 按钮,执行提示中的脚本后,再次点击这个按钮,直到系统参数验证通过。
14,以上12、13步骤执行后,可按 check again按钮进行重新验证。我们选择安装企业版,只安装oracle系统软件而不创建数据库(数据库到后面用命令去创建)。
15,如果分配给ORACLE的内存比较大,则会提示/dev/shm不够,或者在创建数据库时提示 ORA-00845 错误,则修改/etc/fstab文件:
将其中的
tmpfs /dev/shm tmpfs defaults 0 0
改成
tmpfs /dev/shm tmpfs defaults,size=1024M 0 0
这里增大到了1G,然后重新mount即可生效(根据提示的错误信息,将size参数值修改成大于提示的值)。
mount -o remount /dev/shm
16,具备安装环境后,数据库软件就能顺利的安装上了。
17,安装完数据库系统后,使用netca创建监听,默认一直按next下去就行;然后使用dbca创建数据库。
需要注意的是,在创建数据库,选择字符集时,需要选择简体中文字符集,以支持简体中文,即
Choose from the list of character sets
Database Character Sets: ZHS16GBK - GBK 16-bit Simplified Chinese
National Character Sets: AL16UTF16 - Unicode UTF-16 Universal character set (默认)
Default Language: Simplified Chinese
Default Date Format: China
SGA参数值可以使用创建数据库时界面上的推荐值。
如果服务器只当数据库服务器使用,SGA使用的内存推荐系统内存的50%到70%。
如果服务器还有其他的应用,则SGA使用的内存推荐系统内存的50%以下。
18,数据库创建完毕后,去除用户密码3个月过期和输入密码10次错误后用户锁定的限制
--SELECT username,PROFILE FROM dba_users;
--SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='PASSWORD_LIFE_TIME';
--SELECT * FROM dba_profiles s WHERE s.profile='DEFAULT' AND resource_name='FAILED_LOGIN_ATTEMPTS';
ALTER PROFILE DEFAULT LIMIT PASSWORD_LIFE_TIME UNLIMITED;
ALTER PROFILE DEFAULT LIMIT FAILED_LOGIN_ATTEMPTS UNLIMITED;
19,可以取消audit审计功能,将初始化参数audit_trail设置为NONE http://blog.csdn.net/yobyin/article/details/8883441
否则,可能会由于审计过于频繁导致数据库表空间用完后报错,甚至数据库不可用。
alter system set audit_trail=none scope=spfile;
然后重启数据库.
shutdown immediate;
startup;
删除审计数据:
sqlplus / as sysdba
truncate table SYS.AUD$;
20,如果在sqlplus环境中,使用类似:
conn sys/password as sysdba 能够连接到数据库,而是用
conn sys/password@voddb as sysdba 不能连接数据库报:
ora-12514 错误,请查看listener:
lsnrctl status,如果有发现 有类似信息:
The listener supports no services
则可以在listener.ora中添加如下信息,然后重启监听,看看是否就能解决问题了:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = voddb)
(ORACLE_HOME = /u01/oracle//product/11.2.0/db_1)
(SID_NAME = voddb)
)
)
21,jdbc链接oracle 11g时, 会报ora-01017的错误的解决方法,摘录网上的一段原话:
在oracle的之前版本时, 你的用户名密码是大小写不敏感的, 但在11g中, 数据库默认密码的大小写是敏感的, 于是我们就知道了一个事实,
那就是jdbc在给oracle密码时, 会将其变成大写,真是一个奇怪的事情啊.
你可能会说: 那好, 那我就把密码设置为大写的好了, 哈哈哈哈, 你完了, 要知道有些程序, 在链接oracle时, 会将密码变为小写, 这是不是很奇怪, 很晕菜呢?
在oracle数据库的密码是大小写敏感的事实千秋万代, 一统江湖前, 你还会遇上很多会把密码改来改去的奇妙程序, 那怎么办呢?
其实很简单, 那就是去除oracle的密码大写敏感设定:
alter system set sec_case_sensitive_logon=false
22,默认的联机日志为3组,每组1个文件,每个文件100M;可以将联机日志增加到6组,每组可保持1个文件,每个文件可增加到200M;
某地的一个生产系统可能在进行批处理时候,需要处理大量数据,由于联机日志文件组不够多,文件不够大而报错。
后来将日志组更加到6个,每个文件增加到200M就能减少报错的频率。
23,数据库创建完后,建议安装 rlwrap,方便在sql环境下使用上下按键获取以往输入过的命令。上面已经安装了。
24,如果oracle安装文件是独立的分区,建议总共容量在40G左右或以上,因为数据库的默认日志是放在oracle主目录下,系统如果运行了好几年的话,这些日志可能会很大。
25,安装完后,进入sqlplus,如果连不上数据库,可能是listener监听问题。
在安装数据库时候,安装界面会提示创建监听。请在安装完数据库后,最好将创建的这个监听删除,重新用图形化界面创建下,一般能够解决这个问题。
26,配置oracle自动启动服务
--1,以root用户登录,首先在/etc/init.d/目录下配置Oracle的服务文件:
#cd /etc/init.d
touch oracle11g
chmod a+x oracle11g
--2,然后编辑此oracle11g文件。内容如下:
################################################
# !/bin/bash
# whoami
# root
# chkconfig: 345 51 49
# /etc/init.d/oracle11g
# description: starts the oracle dabase deamons
#
ORACLE_HOME=/u01/oracle/product/11.2.0/db_1
ORACLE_OWNER=oracle
case "$1" in
start)
echo -n "Starting oracle11g: "
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbstart" &
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl start"
touch /var/lock/subsys/oracle11g
echo
;;
stop)
echo -n "shutting down oracle11g: "
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/dbshut" &
su - $ORACLE_OWNER -c "$ORACLE_HOME/bin/lsnrctl stop"
rm -f /var/lock/subsys/oracle11g
echo
;;
restart)
echo -n "restarting oracle11g: "
$0 stop
$0 start
echo
;;
*)
echo "Usage: `basename $0` start|stop|restart"
exit 1
esac
exit 0
################################################
--3,保存文件,退出以后,添加并启动服务
#chkconfig --add oracle11g
#chkconfig --list oracle11g
#service oracle11g status
#service oracle11g start
--4,重新启动Linux的时候,如果看到启动项Oracle出现OK,代表Oracle成功随Linux启动了.
--5,注意:
--1)这样的脚本启动一般不会启动实例,如果想让实例也随脚本一起启动的话,
-- 就需要修改文件:/etc/oratab 。如果这个文件不存在,那么就得运行脚本文件产生它:
一般情况下,这个脚本是能够找到的。因为安装数据库的最后阶段会提示你去执行两个脚本,其中之一就是要你去执行/u01/oracle/product/11.2.0/db_1/root.sh。如果没有执行的话,就现在执行吧:
#sh /u01/oracle/product/11.2.0/db_1/root.sh
--2)vi /etc/oratab 代码如下:
voddb:/oracle/product/11.2.0/db_1:N
--修改为:
voddb:/oracle/product/11.2.0/db_1:Y
--Y 表示自动启动;N表示不自动启动
--3)如果系统还不能自动启动,报 ORACLE_HOME_LISTNER 没有设置,则需要修改 /oracle/product/11.2.0/db_1/bin/ 文件夹下 dbstart 和 dbshut 文件。
这个必须要修改,请提前修改吧:
--找到 ORACLE_HOME_LISTNER=$1 将其修改为 ORACLE_HOME_LISTNER=$ORACLE_HOME
-- dbstart 文件
# First argument is used to bring up Oracle Net Listene
#ORACLE_HOME_LISTNER=$1
ORACLE_HOME_LISTNER=$ORACLE_HOME
-- dbshut 文件
# The this to bring down Oracle Net Listener
#ORACLE_HOME_LISTNER=$1
ORACLE_HOME_LISTNER=$ORACLE_HOME
--可以在root用户下使用 service oracle11g start|stop|restart 启动,关闭或重启数据库
--可以使用ps -ef|grep ora_ 和 ps -ef|grep tns 检查数据库和监听是否正常启动
27,自动数据库备份
#su - oracle
--1)创建备份目录:
$mkdir /u01/oradata/orabak
sqlplus /nolog
SQL>conn sys/password@voddb as sysdba
--drop directory expdp_dir;
create directory expdp_dir as '/u01/oradata/orabak';
grant read,write on directory expdp_dir to system;
exit
--2)创建备份脚本
$cd /u01/oradata
$mkdir orabak
$vi orabak.sh
##########################################################################
ORACLE_HOME=/u01/oracle/product/11.2.0/db_1
export ORACLE_HOME
ORACLE_SID=voddb
export ORACLE_SID
export NLS_LANG=american_america.zhs16gbk
rq=voddb`date +%d`
#rqyes=voddb`date +%d -d "3 days ago"`
echo "++++++++++++++++++" >> /tmp/oracle.log
$ORACLE_HOME/bin/expdp system/password@voddb DIRECTORY=expdp_dir DUMPFILE="${rq}".dmp SCHEMAS=VOD LOGFILE="${rq}".log
tar -cf - /u01/oradata/orabak/"${rq}".dmp /u01/oradata/orabak/"${rq}".log | gzip > /u01/oradata/orabak/"${rq}".tar.gz
#scp /oradata/orabak/"${rq}".tar.gz [email protected]:/usr/local/remote/voddb_bak
rm /oradata/orabak/"${rq}".dmp /oradata/orabak/"${rq}".log
#rm /oradata/orabak/"${rq}".tar.gz
#rm /oradata/orabak/"${rqyes}".tar.gz
##########################################################################
--创建每天晚上10点自动执行备份动作:
$chmod a+x orabak.sh
$crontab -e
0 22 * * * /u01/orabak/orabak.sh
--如果条件允许,可以在自动备份脚本中增加 scp 上传,将备份的数据库压缩文件自动上传到文件备份服务器(以上脚本中有删除3天前的数据命令,即在本地保留3天数据,其他备份到文件备份服务器):
--#配置sftp上传
--1,在本机上创建密钥:
ssh-keygen -t dsa
--2,将公钥传给服务器:
scp id_dsa.pub 192.168.50.100:/root/.ssh
--3,登录服务器,将客户机公钥文件改成认证文件:
ssh 192.168.50.100
cd /root/.ssh
mv id_dsa.pub authorized_keys
--如果已经存在 authorized_keys 文件,则可以通过以下命令将公钥粘贴到 认证文件中:
cat id_dsa.pub >> authorized_keys
--更改属性:
chmod 600 authorized_keys
28,表回收站
删除的表会放到表回收站中。一旦表空间吃紧,Oracle会自动清空回收站中的对象。
下面,进行手工清空回收站及从回收站中取回删除的表:
1)查看回收站:
show recyclebin 或:
select * from recyclebin;
2)清空回收站中的表:
purge table [recyclebin name]
3)清空所有的表:
purge recyclebin;
4)彻底删除表(不把该表扔到回收站)
drop table tb_name purge;
5)从回收站中捡回被删除的表:
flashback table table_name to before drop;
flashback table table_name to before drop rename to table_newname;
29,使用 merge into table_name using ... on ... when matched then ...有条件的多行插入一个表,参加《成功之路 oracle11g 学习笔记》 261 页
30,行列互换参见 275页;
31,查询表空间大小:
select tbs 表空间名,
sum(totalM) 总共大小M,
sum(usedM) 已使用空间M,
sum(remainedM) 剩余空间M,
sum(usedM)/sum(totalM)*100 已使用百分比,
sum(remainedM)/sum(totalM)*100 剩余百分比
from (
select b.file_id id,
b.tablespace_name tbs,
b.file_name name,
b.bytes/1024/1024 totalM,
(b.bytes - sum(nvl(a.bytes,0)))/1024/1024 usedM,
sum(nvl(a.bytes,0))/1024/1024 remainedM,
sum(nvl(a.bytes,0))/(b.bytes)*100 剩余百分比,
(100-(sum(nvl(a.bytes,0))/(b.bytes)*100)) 已使用百分比
from dba_free_space a, dba_data_files b
where a.file_id =b.file_id
group by b.tablespace_name, b.file_name, b.file_id, b.bytes
order by b.tablespace_name
) group by tbs;
--如果以上命令的中文在linux环境下不好使,则使用以下命令:
select tbs TABLESPACE_NAME,
sum(totalM) TOTAL_SIZE,
sum(usedM) USEED_SIZE,
sum(remainedM) FREE_SIZE,
sum(usedM)/sum(totalM)*100 USED_percent,
sum(remainedM)/sum(totalM)*100 FREE_percent
from (
select b.file_id id,
b.tablespace_name tbs,
b.file_name name,
b.bytes/1024/1024 totalM,
(b.bytes - sum(nvl(a.bytes,0)))/1024/1024 usedM,
sum(nvl(a.bytes,0))/1024/1024 remainedM
from dba_free_space a, dba_data_files b
where a.file_id =b.file_id
group by b.tablespace_name, b.file_name, b.file_id, b.bytes
order by b.tablespace_name
) group by tbs;
调整表空间:
select * from dba_free_space;
alter database datafile '/u01/oradata/voddb/users01.dbf' resize 512M ;
----查找非临时表空间中各文件使用情况:
select
b.file_name 物理文件名,
b.tablespace_name 表空间,
b.bytes/1024/1024 大小M,
(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 已使用M,
substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) 利用率
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.bytes
order by b.tablespace_name;
--如果以上命令的中文在linux环境下不好使,则使用以下命令:
select b.file_name FILE_NAME, b.tablespace_name TABLESPACE_NAME,
b.bytes/1024/1024 SIZE_M,
(b.bytes-sum(nvl(a.bytes,0)))/1024/1024 USED_M,
substr((b.bytes-sum(nvl(a.bytes,0)))/(b.bytes)*100,1,5) USED_percent
from dba_free_space a,dba_data_files b
where a.file_id=b.file_id
group by b.tablespace_name,b.file_name,b.bytes
order by b.tablespace_name;
----查找临时表空间使用情况:
SELECT a.tablespace_name, a.BYTES total, a.bytes - nvl(b.bytes, 0) free,
nvl(b.bytes, 0)/a.BYTES *100 "used(%)"
FROM (SELECT tablespace_name, SUM (bytes) bytes FROM dba_temp_files GROUP BY tablespace_name) a,
(SELECT tablespace_name, SUM (bytes_cached) bytes FROM v$temp_extent_pool GROUP BY tablespace_name) b
WHERE a.tablespace_name = b.tablespace_name(+);
追加联机日志文件:
select * from v$log;
alter database add logfile group 1 '/oracle/product/10.2.0/oradata/DVN/redo01.log' size 200m;
alter database add logfile group 2 '/oracle/product/10.2.0/oradata/DVN/redo02.log' size 200m;
alter database add logfile group 3 '/oracle/product/10.2.0/oradata/DVN/redo03.log' size 200m;
alter database add logfile group 4 '/oracle/product/10.2.0/oradata/DVN/redo04.log' size 200m;
alter database add logfile group 5 '/oracle/product/10.2.0/oradata/DVN/redo05.log' size 200m;
alter system switch logfile;
alter system checkpoint;
alter database drop logfile group 1;
32,数据库EXPDP备份:
某地的数据库为双机热备系统,由于数据库比较小,导出速度在1、2分钟之内能够完成,因此,我们在主机和备机上都做一下备份。
备份的脚本,以及备份的目录都在/home/oracle/orabak内。
创建备份目录:
su - oracle
$mkdir u01/orabak
$sqlplus /nolog
conn sys/password@voddb as sysdba
create directory expdp_dir as '/u01/orabak';
grant read,write on directory expdp_dir to system;
exit
//主机orabak.sh脚本:
$ more orabak.sh
#!/bin/sh
##########################################################################
ORACLE_HOME=/u01/oracle//product/11.2.0/db_1
export ORACLE_HOME
ORACLE_SID=voddb
export ORACLE_SID
export NLS_LANG=american_america.zhs16gbk
rq=voddb1_`date +%d`
#rqyes=voddb`date +%d -d "3 days ago"`
echo "++++++++++++++++++" >> /tmp/oracle.log
if [ -f "${rq}".dmp ]
then rm ${rq}.dmp ${rq}.log
fi
$ORACLE_HOME/bin/expdp system/password@voddb DIRECTORY=expdp_dir REUSE_DUMPFILES=Y DUMPFILE="${rq}".dmp SCHEMAS=VOD LOGFILE="${rq}".log
test -e ${rq}.dmp || (scp [email protected]:/home/oracle/orabak/${rq}.dmp [email protected]:/home/oracle/orabak/${rq}.log .)
sleep 5
tar -cf - /home/oracle/orabak/"${rq}".dmp /home/oracle/orabak/"${rq}".log | gzip > /home/oracle/orabak/"${rq}".tar.gz
rm /home/oracle/orabak/"${rq}".dmp /home/oracle/orabak/"${rq}".log
##########################################################################
//备机的orabak.sh脚本:
$ more orabak.sh
#!/bin/sh
ORACLE_HOME=/u01/oracle//product/11.2.0/db_1
export ORACLE_HOME
ORACLE_SID=voddb
export ORACLE_SID
export NLS_LANG=american_america.zhs16gbk
rq=voddb2_`date +%d`
if [ -f "${rq}".dmp ]
then rm ${rq}.dmp ${rq}.log
fi
$ORACLE_HOME/bin/expdp system/password@voddb DIRECTORY=expdp_dir REUSE_DUMPFILES=Y DUMPFILE="${rq}".dmp SCHEMAS=VOD LOGFILE="${rq}".log
test -e ${rq}.dmp || (scp [email protected]:/home/oracle/orabak/${rq}.dmp [email protected]:/home/oracle/orabak/${rq}.log .)
sleep 5
tar -cf - /home/oracle/orabak/"${rq}".dmp /home/oracle/orabak/"${rq}".log | gzip > /home/oracle/orabak/"${rq}".tar.gz
rm /home/oracle/orabak/"${rq}".dmp /home/oracle/orabak/"${rq}".log
这里,需要双方配置下ssh密钥可访问的权限。因为,备机在expdp导出的时候,导出的文件也是放在主机,因此,需要把导出的dmp和log文件拷回到本机后进行压缩。
//在主机和备机使用oracle用户登录,都执行一下以下命令产生密钥:
$ ssh-keygen -d
//将备机的公钥传到主机(将主机的公钥也要传到备机)
$ scp id_dsa.pub [email protected]:/home/oracle/.ssh/authorized_keys
在主机及备机中,进行授权:
# cd /home/oracle/.ssh/
# chown -R oracle:oinstall *
# chmod 600 authorized_keys
33,--在一个用户所有的表的所有字段中,查询包含某串字符串的脚本(适用于小数据量schema):
--以下例子为在VOD用户的所有表的所有 VARCHAR2 字段的列中查询包含“山西某城”的所在的表。
declare
in_date varchar2(100):='山西某城';
in_schema varchar2(20):='VOD';
in_data_type varchar2(20):='VARCHAR2';
v_tablename varchar2(28);
v_column_name varchar2(28);
v_sql varchar2(2000):='';
v_size number(2):=0;
cursor cur_data is
select TABLE_NAME from all_tables WHERE owner=in_schema;
cursor col_data(p_table_name in varchar2) is select column_name from All_Tab_Columns where owner=in_schema and table_name=p_table_name
and data_type=in_data_type;
begin
open cur_data;
loop
fetch cur_data into v_tablename;
exit when cur_data%notfound;
begin
v_sql :='';
open col_data(v_tablename);
loop
fetch col_data into v_column_name;
exit when col_data%notfound;
begin
if (v_sql is not null) then
v_sql := v_sql||' or ';
end if;
v_sql := v_sql ||v_column_name ||' like ''%'||in_date||'%''';
end;
end loop;
close col_data;
if (v_sql is not null) then
v_sql := 'select count(*) c_size from '||in_schema||'.'||v_tablename||' where '||v_sql||'';
--dbms_output.put_line(v_sql);
end if;
if (length(v_sql)>0) then
execute immediate v_sql into v_size;
if (v_size >0) then
dbms_output.put_line('schema:'||in_schema||' table_name:'|| v_tablename);
end if;
end if;
end;
end loop;
close cur_data;
end;
删除超过31天的备份文件(可以根据以下命令格式改成删除超过31天的oracle日志,并加入到操作系统的crontab定时执行守护进程中):
find /opt/oracle/dataBackUp -mtime +31 -type f -name '*.*' -exec rm -f {} \;
34,oracle日志处理(这里,摘录一些网上的资料):
/u01/oracle/diag/rdbms/voddb/voddb/trace/alert_voddb.log
/u01/oracle/diag/tnslsnr/vod-db2/listener/trace/listener.log
每周自动备份alert日志文件
定期备份Oracle (http://space.itpub.net/519536/viewspace-681984) alert日志文件是值得推崇的,因为非常繁杂的信息都会写入到alert日志文件中。随着时间的推移,alert日志将会变得越来越大,这样对于检索和定位故障带来了不便。
1.alert日志的管理方法
Oracle的alert日志文件的特殊性在于,即便该文件被误删除也不会对系统产生任何影响。当有新的警告信息需要写入到alert日志时,如找不到对应的警告日志文件,警告日志文件将会被系统自动创建。
基于这个特点,我们可以通过定期将alert日志重命名的方式实现备份管理。
将过大的alert文件拆分为多个小的文件的好处很多,例如在寻求Oracle服务时,可以比较便捷的找到并提供相应的警告日志。
2.实现alert的备份管理
使用Shell脚本结合cron可以完成每周重命名的目的。
具体实现如下。
1)重命名alert日志文件的Shell脚本
ora10g@asdlabdb01 /home/oracle$ vi mv_alert_log.sh
mv /oracle/app/oracle/admin/ora10g/bdump/alert_ora10g.log /oracle/app/oracle/admin/ora10g/bdump/alert_ora10g.`date +"%Y%m%d%H%M%S"`
~
~
没错,就包含这么简单的一条重命名命令。
重命名后的样例如下:
alert_ora10g.20101214215101
2)授予该脚本执行权限
ora10g@asdlabdb01 /home/oracle$ chmod +x mv_alert_log.sh
3)结合cron每周执行一次该重命名脚本
ora10g@asdlabdb01 /home/oracle$ crontab -e
crontab: no changes made to crontab
在cron中添加一条计划任务,内容如下:
10 1 * * 6 /home/oracle/mv_alert_log.sh 1>/dev/null 2>&1
表示每周六的1:10完成一次alert日志重命名备份的工作。
3.小结
一句话:alert日志文件需要特殊关照和管理。
除了本文介绍的通过重命名方式管理alert日志文件之外,欢迎好朋友们提出更多更好的方法。
另外一种解决方法(http://space.itpub.net/267265/viewspace-607459):
使用logrotate命令管理listener.log文件
上一篇 / 下一篇 2009-06-24 16:43:37 / 个人分类:oracle2008
查看( 1457 ) / 评论( 0 )
前一阵子,朋友管理的机器linux机器listener.log文件太大,导致硬盘空间不足,也怪自己当时分区/u01太小了.
远程指导一番问题还是解决了.
想一下,实际上可以通过logrotate来定时管理listener.log文件:
方法如下:
进入 /etc/logrotate.d目录,建立oracle文件,我参照squid的文件来配置:
/u01/app/oracle/product/10.2.0/db_1/network/log/listener.log {
size=200M
rotate 5
copytruncate
compress
notifempty
missingok
}
可以根据自己需求改变size的大小,也可以改用monthly参数。里面的参数我自己也不是太了解,大家熟悉可以看man文档吧!