SQL*Net more data to client 等待事件造成的性能问题

客户在升级程序时死机.原因是因为

select  *  from  application_versions

是查询这个语句时死机,因为在 application_versions表中存储了几十个更新程序的文件是以blob类型来存储的,当客户登录系统时会检查更新并下载这些程序文件.

下面是执行升级时所执行语句的跟踪信息

TKPROF: Release 11.2.0.3.0 - Development on Thu Oct 11 11:56:47 2012

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

Trace file: /database/diag/rdbms/xxdyb/xxdyb1/trace/xxdyb1_ora_802824_Jy_Trace_20121011.trc
Sort options: default

********************************************************************************
count    = number of times OCI procedure was executed
cpu      = cpu time in seconds executing
elapsed  = elapsed time in seconds executing
disk     = number of physical reads of buffers from disk
query    = number of buffers gotten for consistent read
current  = number of buffers gotten in current mode (usually for update)
rows     = number of rows processed by the fetch or execute call
********************************************************************************

SQL ID: cf06fwacdmgfk Plan Hash: 1546270724

select 'x'
from
 dual


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch        1      0.00       0.00          0          0          0           1
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total        3      0.00       0.00          0          0          0           1

Misses in library cache during parse: 0
Optimizer mode: ALL_ROWS
Parsing user id: 85  (INSUR_TEST)
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
         1          1          1  FAST DUAL  (cr=0 pr=0 pw=0 time=3 us cost=2 size=0 card=1)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   MODE: ALL_ROWS
      1   FAST DUAL


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                       2        0.00          0.00
  SQL*Net message from client                     2        0.01          0.01
********************************************************************************

SQL ID: fdjxawa50ppb3 Plan Hash: 2249315794

select *
from
 application_version


call     count       cpu    elapsed       disk      query    current        rows
------- ------  -------- ---------- ---------- ---------- ----------  ----------
Parse        1      0.00       0.00          0          0          0           0
Execute      1      0.00       0.00          0          0          0           0
Fetch      100      0.52    1137.37          0      18010          1          99
------- ------  -------- ---------- ---------- ---------- ----------  ----------
total      102      0.52    1137.37          0      18010          1          99

Misses in library cache during parse: 1
Optimizer mode: ALL_ROWS
Parsing user id: 85  (INSUR_TEST)
Number of plan statistics captured: 1

Rows (1st) Rows (avg) Rows (max)  Row Source Operation
---------- ---------- ----------  ---------------------------------------------------
        99         99         99  TABLE ACCESS FULL APPLICATION_VERSION (cr=9409 pr=0 pw=0 time=710 us cost=2495 size=4512 card=96)


Rows     Execution Plan
-------  ---------------------------------------------------
      0  SELECT STATEMENT   MODE: ALL_ROWS
     99   TABLE ACCESS   MODE: ANALYZED (FULL) OF 'APPLICATION_VERSION'
              (TABLE)


Elapsed times include waiting on following events:
  Event waited on                             Times   Max. Wait  Total Waited
  ----------------------------------------   Waited  ----------  ------------
  SQL*Net message to client                     101        0.00          0.00
  SQL*Net message from client                   101       10.60        184.38
  SQL*Net more data to client                 34094       10.73       1136.87
********************************************************************************

但在通过应用程序程序上传这个程序文件并保存在application_versions表中是速度很快.
SQL*Net more data to client 这个等待事件是指示数据库在不断地发送数据到客户端时的网络问题.
后经地检查发送是华为交换机的问题,但上传更新程序到数据库中网络没有问题,但是下载时网络出问题.

windows主机访问虚拟机linux中的oracle实例的安装方法

在学习oracle时一般都会在windows中安装虚拟机,在虚拟机安装linux系统并[安装oracle.
下面是自己的在windows中安装虚拟机并让windows主机能访问虚拟机中oracle实例的安装方法写的不好请大家多多包涵.
一.准备安装所需要的软件:

1.VMware虚拟机的下载和安装在我的博客中已经提到,这里就不再详细阐述。

2.先推荐一个redhat的下载地址,RedHat Linux 5企业版:content.gougou.com/content,
这个比较全面,但是也比较大(2.68G),如果自己有合适的linux安装版本,可以不使用这个。

二.在VMware虚拟机为RedHat Linux创建新的虚拟机就不详述了

三.在新建的虚拟机里安装RedHat Linux就不详述了

四.在linux系统中安装oracle
为了创建一个新的oracle用户输入和以下相似的命令:

# /usr/sbin/useradd -g oinstall -G dba[,oper] oracle
给oralce用户设置密码
# passwd oracle
修改内核参数编辑/etc/sysctl.conf文件
kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144

当在/etc/sysctl.conf文件中指定这些内核参数后你要重启系统
也可以执行以下命令让内核参数生效

/sbin/sysctl -p

给oracle用户设置shell限制
为了提高数据库软件在linux系统中的性能你必须给oracle用户增加以下shell限制:

shell limit item in limits.confg hard limit

能打开文件的最大数量 nofile 65536
单个用户可用的最大进程数 nproc 16384

在/etc/security/limits.conf文件中增加以下限制:

oracle soft nproc 2047
oracle hard nproc 16384
oracle soft nofile 1024
oracle hard nofile 65536

在/ect/pam.d/login文件如果下面显示的参数没有就增加到该文件中

session required pam_limits.so

根据oracle用户的默认shell,对默认的shell启动文件进行以下更改:
对于Bourne, Bash, or Korn shell在/etc/profile文件中增加下面的代码

if [ $USER = "oracle" ]; then
if [ $SHELL = "/bin/ksh" ]; then
ulimit -p 16384
ulimit -n 65536
else
ulimit -u 16384 -n 65536
fi
fi

对C shell(csh or tcsh)在/etc/csh.login文件中增加以下代码

if ( $USER == "oracle" ) then
limit maxproc 16384
limit descriptors 65536
endif

创建oracle根目录可以输入以下相似的命令:

# mkdir -p /mount_point/app/oracle_sw_owner
# chown -R oracleinstall /mount_point/app/oracle_sw_owner
# chmod -R 775 /mount_point/app/oracle_sw_owner

如果oracle根目录的加载点是/u01并且oracle软件使用者用户为oracle那么oracle根目录的路径为:
/u01/app/oracle

[root@weblogic28 ~]# mkdir -p /u01/app/oracle
[root@weblogic28 ~]# chown -R oracleinstall /u01/app/oracle
[root@weblogic28 ~]# chmod -R 775 /u01/app/oracle

当你配置oracle用户环境变量时设置ORACLE_BASE时就将oracle根目录的路径赋给ORACLE_BASE

创建存储数据库文件和数据库恢复文件的目录
创建存储数据库文件的目录的命令如下:

# mkdir /mount_point/oradata
# chown oracleinstall /mount_point/oradata
# chmod 775 /mount_point/oradata

将存放数据库文件的目录创建在oracle根目录下/u01/app/oracle/oradata

[root@weblogic28 ~]# mkdir /u01/app/oracle/oradata
[root@weblogic28 ~]# chown oracleinstall /u01/app/oracle/oradata
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/oradata

创建oracle Home目录/u01/app/oracle/10.2.0/db

[root@weblogic28 ~]# mkdir /u01/app/oracle/10.2.0/db
[root@weblogic28 ~]# chown oracleinstall /u01/app/oracle/10.2.0/db
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/10.2.0/db

创建存储数据库恢复文件的目录的命令如下:

# mkdir /mount_point/flash_recovery_area
# chown oracleinstall /mount_point/flash_recovery_area
# chmod 775 /mount_point/flash_recovery_area

将存放数据库恢复文件的目录创建在oracle根目录下/u01/app/oracle

[root@weblogic28 ~]# mkdir /u01/app/oracle/flash_recovery_area
[root@weblogic28 ~]# chown oracleinstall /u01/app/oracle/flash_recovery_area
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/flash_recovery_area

创建一个/tmp目录

[root@weblogic28 ~]# mkdir /u01/tmp
[root@weblogic28 ~]# chmod a+wr /u01/tmp

切换到oracle用户来设置环境变量

[oracle@weblogic28 ~]$
ls -a

查看.bash_profile文件

vi .bash_profile

TEMP=/u01/tmp
TMPDIR=/u01/tmp
export TEMP TMPDIR
export LD_ASSUME_KERNEL=2.6.9
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/10.2.0/db
export ORACLE_SID=jycs
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH

[oracle@weblogic28 tmp]$# umask
0022

umask命令将会显示22,022或0022

[oracle@weblogic28 tmp]$# env | more
REMOTEHOST=10.138.135.242
HOSTNAME=weblogic28
SHELL=/bin/bash
TERM=ansi
HISTSIZE=1000
TMPDIR=/u01/tmp
KDE_NO_IPV6=1
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
USER=root
TEMP=/u01/tmp
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36i=40;33:so=01;35:bd=40;33;01:cd=40;33;0
1r=01;05;37;41:mi=01;05;37;41:ex=01;32:.cmd=01;32:.exe=01;32:.com=01;32:.b
tm=01;32:.bat=01;32:.sh=01;32:.csh=01;32:.tar=01;31:.tgz=01;31:.arj=01;31:
.taz=01;31:.lzh=01;31:.zip=01;31:.z=01;31:.Z=01;31:.gz=01;31:.bz2=01;31:
.bz=01;31:.tz=01;31:.rpm=01;31:.cpio=01;31:.jpg=01;35:.gif=01;35:.bmp=01;3
5:.xbm=01;35:.xpm=01;35:.png=01;35:.tif=01;35:
ORACLE_SID=jycs
ORACLE_BASE=/u01/app/oracle
KDEDIR=/usr
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc

上面显示了你所设置的环境变量

也可以用下面的命令来查看环境变量

[oracle@weblogic28 tmp]$ echo $ORACLE_HOME[$ORACLE_SID,$ORACLE_BASE]

将数据库软件包拷贝到linux系统中
然后解压文件

$ gunzip filename.cpio.gz
[oracle@weblogic28 tmp]$ gunzip 10201_database_linux_x86_64.cpio.gz

执行上面的命令后会出现在 10201_database_linux_x86_64.cpio文件包
再执行如下命令解压文件

$ cpio -idmv < filename.cpio
[oracle@weblogic28 tmp]$ cpio -idmv <10201_database_linux_x86_64.cpio
database/stage/prereq/db/refhost_Custom.xml
database/stage/prereq/db/refhost.xml
database/stage/prereq/db/db_prereq.xml
database/stage/prereq/db/dbprereq.jar
database/stage/prereq/db
database/stage/prereq/oui/knowledgesrc.xml
database/stage/prereq/oui/rulemap.xml
database/stage/prereq/oui/OraPrereqChecks.jar
database/stage/prereq/oui
database/stage/prereq/common/rulemap.xml
database/stage/prereq/common
......

会出现以上信息

如果是远程安装可以使用VNC远程连接到linux服务器上来执行界面安装
1、配置并开启vnc服务

[oracle@localhost ~]$ vncserver
You will require a password to access your desktops.
Password: ---这里要求输入vnc客户端登录的密码并重复
Verify:
New 'localhost.localdomain:2 (oracle)' desktop is localhost.localdomain:2
Creating default startup script. /home/oracle/.vnc/xstartup
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:2.log

—-如上告诉你vnc终端已经创建好,用的是第二个终端
2、在创建vnc服务的用户目录下会生成一个.vnc的隐藏目录

[oracle@localhost ~]$ ls -a
. .bash_profile Disk1 .gconfd .gstreamer-0.10 .metacity README.htm .viminfo
.. .bashrc .eggcups .gnome .gtkrc-1.2-gnome2 .mozilla .redhat .vnc
.bash_history .chewing .emacs .gnome2 .ICEauthority .nautilus .scim .Xauthority
.bash_logout Desktop .gconf .gnome2_private .kde p8202632_10205_Linux-x86-64.zip .Trash .zshrc

3、进入.vnc目录,找到xstartup可执行文件,用vi 编辑器打开

[oracle@localhost ~]$ cd .vnc/
[oracle@localhost .vnc]$ ls
localhost.localdomain:2.log localhost.localdomain:2.pid passwd xstartup
[oracle@localhost .vnc]$ vi xstartup
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
exec /etc/X11/xinit/xinitrc ---去掉前面的#号即可 --保存退出
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &
~
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
"xstartup" 12L, 333C 已写入
[oracle@localhost .vnc]$ vncserver
New 'localhost.localdomain:3 (oracle)' desktop is localhost.localdomain:3
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:3.log

4、清除刚才创建的vnc虚拟终端

[oracle@localhost .vnc]$ vncserver -kill :1
Can't find file /home/oracle/.vnc/localhost.localdomain:1.pid
You'll have to kill the Xvnc process manually
[oracle@localhost .vnc]$ vncserver -kill :2
Killing Xvnc process ID 11889
[oracle@localhost .vnc]$ vncserver -kill :3
Killing Xvnc process ID 11945
[oracle@localhost .vnc]$ vncserver -kill :4
Can't find file /home/oracle/.vnc/localhost.localdomain:4.pid
You'll have to kill the Xvnc process manually

5、重新建立新的vnc虚拟终端

[oracle@localhost .vnc]$ vncserver
New 'localhost.localdomain:2 (oracle)' desktop is localhost.localdomain:2
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:2.log --该终端号为 :2

6、在windows客户端用RealVNC软件中的Run VNC Viewer客户端连接。
7、在Run VNC Viewer 只需输入linux服务器的地址和刚才生成的终端号:2
格式:192.168.1.56:2
8、输入刚才配置vnc服务的时候配的即可登录linux服务器图形界面。

如果是本地安装的话执行下面的步骤
用root用户登录
[root@weblogic28 ~]#xhost + 让任何用户都是启用图形界面
切换到oracle用户

[root@weblogic28 ~]su - oracle
[oracle@localhost ~]$ cd /database
[oracle@weblogic28 database]$./runInstaller

设置虚拟机的IP地址让主机可以访问虚拟机
1、 NAT方式
1.1 右键单击主机任务栏上的网络连接图标,选择打开网络连接页面
1.2 启动”VMware Network Adapter VMnet8” 和 “VMware Network Adapter VMnet1”这两个连接
1.3 右键单击“本地连接”,选择属性,打开”本地连接属性”对话框,选择”高级”标签,打开高级标签页面,选中选项”允许其它网络用户通过此计算机的internet连接来连接”,然后在”家庭网络连接”下拉列表中选择VMware Network Adapter VMnet8。
1.4 在虚拟机上右键单击你要设置的虚拟机选“setting”(因为有的不止虚拟一台),打开”Hardware”标签页,单击”device”下的ethernet,此时在右边选中NAT:Used to share the host’s IP address. 然后点击确定。
1.5 打开虚拟机上的Edit菜单,选择virtual network settings打开virtual network editor页面,先打开automatic bridging标签页,关闭automagic bridging,点击应用;再打开DHCP标签页,启动DHCP服务,然后点击应用;最后打开NAT标签页,启动NAT服务,然后点击应用;点击确定后退出
1.9 启动虚拟机中的系统。
1.10 设置虚拟机中的系统的IP地址为192.168.100.200,默认网关为192.168.100.1 (VMware Network Adapter VMnet8的IP地址),DNS服务器设置和主机中的DNS服务器一致。
1.11 重新加载网络参数或者重新启动虚拟机中的系统。
1.12设置静态IP地址.
(1).命令行设置(该方式只是临时设置,系统重启后失效)
[1].设置IP和掩码
ifconfig 接口名(如eth0) IP地址 netmask 子网掩码
[2].设置网关
route add default gw 默认网关
[3].设置DNS服务器地址
echo “nameserver DNS服务器地址”>/etc/resolv.conf
实例:假设设置eth0的IP:192.168.1.100,DNS:192.168.1.12
ifconfig eth0 192.168.100.200 netmask 255.255.255.0
route add default gw 192.168.100.1
echo “nameserver=192.168.1.12″>/etc/resolv.conf
(2).修改文件来实现配置网络(需要重启网络接口重启后IP不会改变)
[1].修改IP地址,文件:/etc/sysconfig/network-scripts/ifcfg-接口名
这里假设网络接口名为eth0.
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0 (注:这里填的是网络接口名)
BOOTPROTO=static
NBOOT=yes (注:是否随系统启动)
IPADDR=192.168.100.200(注:这里填写的是IP地址)
PREFIX=24 (注:这里填写的是掩码的长度)
NETMASK=255.255.255.0
GATEWAY=192.168.100.1( 注:这里写的是网关)就是VMware Network Adapter VMnet8的IP地址

[2].修改DNS
echo “nameserver DNS服务器地址”>/etc/resolv.conf
[3].重启网络接口(假设为eth0)
ifup eth0(注:这里写的是接口名)

关闭linux防火墙
(1) 重启后永久性生效:
开启:chkconfig iptables on
关闭:chkconfig iptables off
(2) 即时生效,重启后失效:
开启:service iptables start
关闭:service iptables stop

linux下Oracle自动启动与停止
1.修改Oracle系统配置文件/etc/oratab
/etc/oratab 格式为: SID:ORACLE_HOME:AUTO
把AUTO域设置为Y(大写),只有这样,oracle 自带的dbstart和dbshut才能够发挥作用。我的为:
$ORACLE_SID:$ORACLE_HOME:Y
这儿的ORACLE_SID和ORACLE_HOME是oracle用户下的环境变量,在不同的电脑上有不同的值.当你打开/etc/oratab的时候,修改一下就行了.
2.编写服务脚本
在/etc/rc.d/init.d目录下创建oracle文件作为启动脚本,内容如下:容如下:

#!/bin/sh
#chkconfig: 2345
#descriptionracle_orcl
#
# /etc/rc.d/init.d/oracle_orcl
# auto start database orcl instance
#set oracle env
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=$ORACLE_BASE/oracle/product/10.2.0/db_1
export PATH=$PATH:$ORACLE_HOME/bin
export ORACLE_SID=orcl
ORACLE_USER=oracle

#start or stop script
case $1 in
start)
su - "$ORACLE_USER"< 
在oracle用户下输入如上的内容,然后保存退出,由于是启动脚本,需要执行权限;执行命令chmod a+x oracle授予oracle执行权限.
3.建立服务连接
ln -s /etc/rc.d/init.d/oracle /etc/rc.d/rc2.d/S99oracle
ln -s /etc/rc.d/init.d/oracle /etc/rc.d/rc3.d/S99oracle
ln -s /etc/rc.d/init.d/oracle /etc/rc.d/rc5.d/S99oracle
ln -s /etc/rc.d/init.d/oracle /etc/rc.d/rc0.d/K01oracle
ln -s /etc/rc.d/init.d/oracle /etc/rc.d/rc6.d/K01oracle

或可以通过执行以下命令来实现
chkconfig –add oracle
chkconfig命令运行成功后,在rc2.d,rc3.d,rc4.d,rc5.d下面建立了S99oracle 连接文件,可以在系统启动的时候,运行脚本启动数据库。在rc0.d、rc1.d和rc6.d目录下面建立了K99oracle文件,用于在系统关闭的时候自动运行脚本关闭数据库。可以使用 chkconfig –list oracle 命令查看服务配置,关于chkconfig更多的用法,可以通过man chkconfig查看

4.测试
启动,运行命令:./oracle_linuxdb start
关闭,执行命令:./oracle_linuxdb stop
可以用sqlplus user/passward@tnsname来测试启动和关闭数据库是否成功。现在重新启动linux主机,看数据库是否自动启动了.

这样主机就能访问虚拟机中的oracle数据库了

create table as select * from xx是否会生成redo

redo

重做日志文件(redo log file)对Oracle数据库来说至关重要,它们是数据库的事务日志。Oracle维护着两类重做日志文件:
在线(online)重做日志文件和归档(archived)重做日志文件。这两类重做日志文件都用于恢复;其主要目的是,
万一实例失败或介质失败,它们就能派上用场。
如果数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恰好恢复到掉电之前的那个时间点。
如果磁盘驱动器出现故障(这是一个介质失败),Oracle会使用归档重做日志以及在线重做日志将该驱动器上的
数据备份恢复到适当的时间点。

归档重做日志文件实际上就是已填满的”旧”在线重做日志文件的副本。系统将日志文件填满时,
ARCH进程会在另一个位置建立在线重做日志文件的一个副本,也可以在本地和远程位置上建立多个另外的副本.
如果由于磁盘驱动器损坏或者其他物理故障而导致失败,就会用这些归档重做日志文件来执行介质恢复.
Oracle拿到这些归档重做日志文件,并把它们应用于数据文件的备份,使这些数据文件能与数据库的其余部分保持一至.
归档重做日志文件是数据库的事务历史。

测量redo
redo管理是数据库中的一个串行点.任何Oracle实例都有一个LGWR,最终所有事务都会归于LGWR,要求这个进程管理它们的redo,
并COMMIT其事务,LGWR工作越忙,系统就会越慢.通过查看一个操作会生成多少redo,并对一个问题的多种解决方法进行测试,
可以从中找出最佳的方法。

与redo有关的视图
V$MYSTAT,其中有会话的提交信息
V$STATNAME,这个视图能告诉我们V$MYSTAT中的每一行表示什么(查看的统计名)。

查询redo大小的语句

SELECT a.NAME,
b.VALUE cur_size_byte,
round(b.VALUE / 1024, 3) || 'KB' cur_size_kb
FROM v$statname a, v$mystat b
WHERE a.statistic# = b.statistic#
AND lower(a.NAME) LIKE '%' || lower('redo size') || '%'

数据库归档模式
数据库归档用来保存redo的日志文件副本,一般安装时默认未开启数据库的归档模式。
在NOARCHIVELOG模式的数据库中,除了数据字典的修改外,CREATE TABLE不会记录日志.
如果你想在NOARCHIVELOG模式的数据库上看到差别,可以把对表T的DROP TABLE和CREATE TABLE换成DROP INDEX和CREATE INDEX。
默认情况下,不论数据库以何种模式运行,这些操作都会生成日志。
因为不同的模式可能导致不同的行为。你的生产系统可能采用ARCHIVELOG模式运行.
倘若你执行的大量操作在ARCHIVELOG模式下会生成redo,而在NOARCHIVELOG模式下不会生成redo,
你肯定想在测试时就发现这一点,而不要等到系统交付给用户时才暴露出来!
查看是否归档
查看数据库是否开启归档

select name,log_mode from v$database;

启用归档

startup mount
alter database archivelog;
alter database open;

禁止归档

shutdown immediate
startup mount
alter database noarchivelog
alter database open

force logging(强制日志)模式:
如果数据库强制日志模式开启后,则Oracle无论什么操作都进行redo的写入。
查看强制日志模式
通过

select force_logging from v$database

可以看到当前数据库是否开启了强制日志模式状态
开启强制日志模式
如果未开启数据库强制日志模式(默认未开启),则可以通过

alter database force logging

开启,之后Oracle无论什么操作都进行redo的写入,不依赖于数据库的归档模式等其他因素.
关闭强制日志模式
如果已经开启了数据库强制日志模式,则可以通过

alter database no force logging

关闭强制日志模式。
使数据库恢复先前的设置,数据库是否写入redo由数据库的归档模式等其他因素决定

disable_logging
那么在Oracle内部还存在一个内部参数:_disable_logging 默认是false
通过更改为true可以让Oracle在修改表中的记录的时候完全不记录redo,这个参数要甚用,平时,我们只作为性能测试用。
查看:

show parameter disa /disable/_disable_logging

开启:

alter system set "_disable_logging"=true scope=both;

禁用:

alter system set "_disable_logging"=false

表的归档模式
查看表的logging模式
查看表是否是logging状态用如下SQL:

select table_name,logging from dba_tables where table_name=’tablename’;

修改表的logging模式
修改表的logging状态sql:

alter table table_name nologging/logging

减少redo写入
本节所讲的都是当数据库未开启强制日志模式时的操作。
对象的操作在执行时会产生重做日志,采用某种方式,生成的redo会比平常(即不使用NOLOGGING子句时)少得多.
注意,这里说”redo”少得多,而不是”完全没有redo”.所有操作都会生成一些redo,不论数据库的日志模式是什么,
所有数据字典操作都会计入日志。

如何减少redo
create table时减少redo的方法
创建表时crate table as加入nolongging选项减少redo,格式如下
create table [table_name] nologging as [select表达式]。
insert into减少redo的方法
insert 大批量数据时加入/*+append */选项减少redo写入,格式如下
insert /*+append */ into [table_name] [select表达式]

数据库归档模式下生成redo规则
create table时nologging效果
归档模式下创建的表,默认为logging模式。
创建表时crate table as加入nolongging选项减少redo写入明显
验证
下面比较以下两种create table as时产生的redo size量。

SELECT a.NAME,
b.VALUE cur_size_byte,
round(b.VALUE / 1024, 3) || 'KB' cur_size_kb
FROM v$statname a, v$mystat b
WHERE a.statistic# = b.statistic#
AND lower(a.NAME) LIKE '%' || lower('redo size') || '%'

查询当前的重做日志大小记录下来

create table test_1 as select * from test;
SELECT a.NAME,
b.VALUE cur_size_byte,
round(b.VALUE / 1024, 3) || 'KB' cur_size_kb
FROM v$statname a, v$mystat b
WHERE a.statistic# = b.statistic#
AND lower(a.NAME) LIKE '%' || lower('redo size') || '%'

查询当前的重做日志大小减去前面记录下来的值计算刚才这个操作产生的redo大小标记为redo_1

SELECT a.NAME,
b.VALUE cur_size_byte,
round(b.VALUE / 1024, 3) || 'KB' cur_size_kb
FROM v$statname a, v$mystat b
WHERE a.statistic# = b.statistic#
AND lower(a.NAME) LIKE '%' || lower('redo size') || '%'

查询当前的重做日志大小记录下来

create table test_2 nologging as select * from test;
SELECT a.NAME,
b.VALUE cur_size_byte,
round(b.VALUE / 1024, 3) || 'KB' cur_size_kb
FROM v$statname a, v$mystat b
WHERE a.statistic# = b.statistic#
AND lower(a.NAME) LIKE '%' || lower('redo size') || '%'

查询当前的重做日志大小减去前面记录下来的值计算刚才这个操作产生的redo大小标记为redo_2
比较redo_1和redo_2的大小就知道crate table as加入nolongging或不加nologging选项的区别了

insert into时加入append效果
表模式logging
当表模式为logging状态时,无论是append模式还是no append模式,redo都会生成,即加入append选项无法生效。
验证
下面比较以下两种insert时产生的redo size量,可以看出redo量是差不多的。
计算重做大小的方法与上面的一样就不说了

1、insert /*+append */ into test_1 select * from test;
commit;
2、insert  into  test_1 select * from test;
commit;

表模式nologging
当表模式为nologging状态时,只有加入append模式会明显减少生成redo。
验证

1、insert /*+append */ into test_1 select * from test;
commit;
2、insert  into  test_1 select * from test;
commit;

数据库非归档模式生成redo规则
create table 使用nologging对产生redo的影响
非归档模式下创建的表,默认为nologging模式。
在NOARCHIVELOG模式的数据库中,除了数据字典的修改外,CREATE TABLE不会记录日志。
因此创建表时(crate table as)加入nologging选项减少redo写入不明显,即nologging选项加不加都差不多
验证
下面比较以下两种create table as时产生的redo size量。

create table test_1 as select * from test;
create table test_2 nologging as select * from test;

insert into时append效果
表模式logging
当表模式为logging状态时,加入append模式明显减少生成redo,而no append模式下不会减少生成。
验证

insert /*+append */ into test_1 select * from test;
commit;
insert  into  test_1 select * from test;
commit;

表模式nologging
当表模式为nologging状态时,append的模式会减少生成redo,而no append模式不会减少生成。
验证

insert /*+append */ into test_1 select * from test;
commit;
insert  into  test_1 select * from test;
commit;

其实就是直截加载与传统加载的区别

直接加载优势
直接加载比传统加载效率要高
不扫描原来的空数据块
不需要sql解析,减少系统的负载
不经过SGA
不走DBWR进程,走自己的专属进程,所以速度快

直接加载限制
不能加载簇表
锁定整个表,在表上有活动事务的时候不能加载

直接加载特点
直接加载是在所有数据块后面加载新数据块,修改高水位线,不扫描原来的空数据块。
直接加载只产生一点点的管理redo,因为要修改数据字典(也可以讲不产生redo)。
回滚,如果加载失败把新分配数据块抹掉就行了。
无需SGA,无需SQL解析,无需DBWR进程

实验

现在我们已经定义了test;

SQL> select count(*) from test;    现在表里没有记录数
  COUNT(*)
----------
         0

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST'; 现在分配了1个区

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     0      65536

[oracle@secdb1 ~]$ sqlldr userid=ls/ls control=leo_test.ctl data=leo_test.data log=leo_test.log    传统方式加载数据
LS@LEO> select count(*) from test;                   已经成功加载了100万条数据
  COUNT(*)
----------
   1000000

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST'; 100万条数据占用28个区

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                      0      65536
TEST                                                                                      1      65536
TEST                                                                                      2      65536
TEST                                                                                      3      65536
TEST                                                                                      4      65536
TEST                                                                                      5      65536
TEST                                                                                      6      65536
TEST                                                                                      7      65536
TEST                                                                                      8      65536
TEST                                                                                      9      65536
TEST                                                                                     10      65536
TEST                                                                                     11      65536
TEST                                                                                     12      65536
TEST                                                                                     13      65536
TEST                                                                                     14      65536
TEST                                                                                     15      65536
TEST                                                                                     16    1048576
TEST                                                                                     17    1048576
TEST                                                                                     18    1048576
TEST                                                                                     19    1048576

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     20    1048576
TEST                                                                                     21    1048576
TEST                                                                                     22    1048576
TEST                                                                                     23    1048576
TEST                                                                                     24    1048576
TEST                                                                                     25    1048576
TEST                                                                                     26    1048576
TEST                                                                                     27    1048576

28 rows selected
SQL> delete from test;                     删除100万条数据
1000000 rows deleted.
SQL> commit;                                           提交
Commit complete.
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST';

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                      0      65536
TEST                                                                                      1      65536
TEST                                                                                      2      65536
TEST                                                                                      3      65536
TEST                                                                                      4      65536
TEST                                                                                      5      65536
TEST                                                                                      6      65536
TEST                                                                                      7      65536
TEST                                                                                      8      65536
TEST                                                                                      9      65536
TEST                                                                                     10      65536
TEST                                                                                     11      65536
TEST                                                                                     12      65536
TEST                                                                                     13      65536
TEST                                                                                     14      65536
TEST                                                                                     15      65536
TEST                                                                                     16    1048576
TEST                                                                                     17    1048576
TEST                                                                                     18    1048576
TEST                                                                                     19    1048576

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     20    1048576
TEST                                                                                     21    1048576
TEST                                                                                     22    1048576
TEST                                                                                     23    1048576
TEST                                                                                     24    1048576
TEST                                                                                     25    1048576
TEST                                                                                     26    1048576
TEST                                                                                     27    1048576

28 rows selected

把数据都删除了还占用空间,oracle的delete操作不回收空间,只是把自己的记录标记为删除,实际呢还占用的空间不释放

[oracle@secdb1 ~]$ sqlldr userid=ls/ls control=leo_test.ctl data=leo_test.data log=leo_test.log    第二次传统方式加载数据

SQL> select count(*) from test;                   已经成功加载了100万条数据
  COUNT(*)
----------
   1000000
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST';

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                      0      65536
TEST                                                                                      1      65536
TEST                                                                                      2      65536
TEST                                                                                      3      65536
TEST                                                                                      4      65536
TEST                                                                                      5      65536
TEST                                                                                      6      65536
TEST                                                                                      7      65536
TEST                                                                                      8      65536
TEST                                                                                      9      65536
TEST                                                                                     10      65536
TEST                                                                                     11      65536
TEST                                                                                     12      65536
TEST                                                                                     13      65536
TEST                                                                                     14      65536
TEST                                                                                     15      65536
TEST                                                                                     16    1048576
TEST                                                                                     17    1048576
TEST                                                                                     18    1048576
TEST                                                                                     19    1048576

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     20    1048576
TEST                                                                                     21    1048576
TEST                                                                                     22    1048576
TEST                                                                                     23    1048576
TEST                                                                                     24    1048576
TEST                                                                                     25    1048576
TEST                                                                                     26    1048576
TEST                                                                                     27    1048576

28 rows selected

使用传统方式加载数据,会扫描原来的空数据块,会把新加载的数据插入到空数据块内,看我们还是使用原来的28个区

SQL> delete from test;                     这是第二次删除100万条数据
1000000 rows deleted.
SQL> commit;                                           提交
Commit complete.
SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST';

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                      0      65536
TEST                                                                                      1      65536
TEST                                                                                      2      65536
TEST                                                                                      3      65536
TEST                                                                                      4      65536
TEST                                                                                      5      65536
TEST                                                                                      6      65536
TEST                                                                                      7      65536
TEST                                                                                      8      65536
TEST                                                                                      9      65536
TEST                                                                                     10      65536
TEST                                                                                     11      65536
TEST                                                                                     12      65536
TEST                                                                                     13      65536
TEST                                                                                     14      65536
TEST                                                                                     15      65536
TEST                                                                                     16    1048576
TEST                                                                                     17    1048576
TEST                                                                                     18    1048576
TEST                                                                                     19    1048576

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     20    1048576
TEST                                                                                     21    1048576
TEST                                                                                     22    1048576
TEST                                                                                     23    1048576
TEST                                                                                     24    1048576
TEST                                                                                     25    1048576
TEST                                                                                     26    1048576
TEST                                                                                     27    1048576

28 rows selected

delete还是不回收空间,我们依然占用着28个区

[oracle@secdb1 ~]$ sqlldr userid=ls/ls control=leo_test.ctl data=leo_test.data log=leo_test.log direct=true    直接方式加载数据

SQL> select segment_name,extent_id,bytes from user_extents where segment_name='TEST';

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                      0      65536
TEST                                                                                      1      65536
TEST                                                                                      2      65536
TEST                                                                                      3      65536
TEST                                                                                      4      65536
TEST                                                                                      5      65536
TEST                                                                                      6      65536
TEST                                                                                      7      65536
TEST                                                                                      8      65536
TEST                                                                                      9      65536
TEST                                                                                     10      65536
TEST                                                                                     11      65536
TEST                                                                                     12      65536
TEST                                                                                     13      65536
TEST                                                                                     14      65536
TEST                                                                                     15      65536
TEST                                                                                     16    1048576
TEST                                                                                     17    1048576
TEST                                                                                     18    1048576
TEST                                                                                     19    1048576

SEGMENT_NAME                                                                      EXTENT_ID      BYTES
-------------------------------------------------------------------------------- ---------- ----------
TEST                                                                                     20    1048576
TEST                                                                                     21    1048576
TEST                                                                                     22    1048576
TEST                                                                                     23    1048576
TEST                                                                                     24    1048576
TEST                                                                                     25    1048576
TEST                                                                                     26    1048576
TEST                                                                                     27    1048576
TEST                                                                                     28    1048576
TEST                                                                                     29    1048576
TEST                                                                                     30    1048576
TEST                                                                                     31    1048576
TEST                                                                                     32    1048576
TEST                                                                                     33    1048576
TEST                                                                                     34    1048576
TEST                                                                                     35    1048576
TEST                                                                                     36    1048576
TEST                                                                                     37    1048576
TEST                                                                                     38    1048576
TEST                                                                                     39    1048576
TEST                                                                                     40    1048576
TEST                                                                                     41    1048576
TEST                                                                                     42    1048576
TEST                                                                                     43    1048576
TEST                                                                                     44    1048576
TEST                                                                                     45    1048576
TEST                                                                                     46    1048576
TEST                                                                                     47    1048576

48 rows selected

发现同样的100万条记录,竟然占用了48个区,传统加载只用了28个,而我们使用直接加载到多了20个数据块,
对了直接加载不扫描原来的空数据块,会在所有数据块之后加载新的数据块插入数据修改高水位线HWM,
当提交事务之后,把高水位线移到新数据之后,其他的用户就可以看见了。

比较直接加载使用conventional 和direct方式产生的redo大小(可以通过/*+ append */模拟直接加载)。
明确:直接加载与logging配合下并不能显著的减少redo日志量
直接加载与nologging配合下可以大幅度的减少redo日志量

SQL> create table leo_t1 as select * from test where 1=2;          创建leo_t1表
Table created.
SQL> alter table leo_t1 logging;                                               设置leo_t1表logging模式
Table altered.
SQL> set autotrace  traceonly;
SQL> insert into leo_t1 select * from leo_test_sqlload where rownum < = 20000;  采用传统方式加载2万条记录
20000 rows created.

Statistics   统计信息
----------------------------------------------------------
       1071  recursive calls
       2668  db block gets
       1860  consistent gets
        386  physical reads
    1680404  redo size                                                这是产生的日志量1680404
        680  bytes sent via SQL*Net to client
        603  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          6  sorts (memory)
          0  sorts (disk)
      20000  rows processed
SQL> rollback;                                                     回滚操作,使用undo表空间
Rollback complete.
SQL> insert /*+ append */ into leo_t1 select * from leo_test_sqlload where rownum < = 20000; 使用直接加载方式插入2万条记录
20000 rows created.

Statistics
----------------------------------------------------------
         94  recursive calls
        268  db block gets
       1294  consistent gets
        202  physical reads
    1627260  redo size                                当leo_t1为logging属性时,直接加载和传统加载产生redo日志差不多
        664  bytes sent via SQL*Net to client
        617  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      20000  rows processed

小结:这是因为在logging模式下,所有的数据块的改变都会产生redo日志,为以后恢复做准备,这时候直接加载没有多大的优势。
直接加载与nologging配合下可以大幅度的减少redo日志量
重大前提
如果你的数据库开启了force_logging=yes模式,那么不管你是传统加载还是直接加载都不会减少redo产生量
所以要想大幅度减少redo日志就必须满足3个条件
(1)关闭force_logging选项

alter database no force logging;

启动

alter database force logging;

(2)数据对象级别nologging模式

 alter table leo_t1 nologging;

(3)直接加载

insert /*+ append */ into

数据库归档与redo日志量关系
数据库处于归档模式
当表模式为logging状态时,无论是否使用append模式,都会生成redo.当表模式为nologging状态时,只有append模式,不会生成redo。
数据库处于非归档模式
无论是在logging还是nologing的模式下,append的模式都不会生成redo,而no append模式下都会生成redo。

SQL> alter database no force logging;
SQL> select force_logging from v$database;                       已经关闭force_logging选项
FOR
---
NO
SQL> alter table leo_t1 nologging;                                       设置leo_t1表nologging模式
Table altered.
SQL> select logging from user_tables where table_name='LEO_T1';
LOG
---
NO
SQL> select count(*) from leo_t1;                                       0条记录
  COUNT(*)
----------
         0
SQL> select index_name from user_indexes where table_name='LEO_T1';   表上没有索引
no rows selected

SQL> insert /*+ append */ into leo_t1 select * from leo_test_sqlload where rownum < = 20000;    直接加载
20000 rows created.

Statistics
----------------------------------------------------------
       1443  recursive calls
        649  db block gets
       1702  consistent gets
       1519  physical reads
      44900  redo size                                    直接加载产生的redo日志非常少
        658  bytes sent via SQL*Net to client
        617  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          9  sorts (memory)
          0  sorts (disk)
      20000  rows processed
SQL> rollback;
Rollback complete.
LS@LEO> insert into leo_t1 select * from leo_test_sqlload where rownum < = 20000;       传统加载
20000 rows created.

Statistics
----------------------------------------------------------
          4  recursive calls
       2207  db block gets
       1534  consistent gets
        441  physical reads
    1634064  redo size                                      传统加载产生的redo日志非常非常的多
        673  bytes sent via SQL*Net to client
        603  bytes received via SQL*Net from client
          4  SQL*Net roundtrips to/from client
          1  sorts (memory)
          0  sorts (disk)
      20000  rows processed

小结:直接加载与nologging配合下可以大幅度的减少redo日志量,因为插入的数据不产生redo日志,
所以在插入后要做备份操作,一旦数据损坏,就要使用备份来恢复,不能使用redo来恢复。注意要关闭force_logging选项

迁移数据时oracle字符集的转换迁移数据时oracle字符集的转换

按照oracle官方文档所说,数据库字符集在创建后原则上不能更改。因此,在设计和安装之初考虑使用哪一种字符集十分重要。对数据库server而言,错误的修改字符集将会导致很多不可测的后果,可能会严重影响数据库的正常运行.但是由于每家软件公司使用的字符集一样,迁移数据时肯定是会遇到字符集转换的问题.比如最常遇到是英文字符集转换成中文,中文的转换成英文.而且在迁移数据时都是上百GB的dmp文件啊.
在迁移数据过程中我使用过两种方法一是修改dmp文件的字符集一是修改数据库的字符集.
修改dmp文件字符集,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。
比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码: SQL> select to_char(nls_charset_id(‘ZHS16GBK’), ‘xxxx’) from dual;
0354 然后将dmp文件的2、3字节修改为0354即可,但是这样种方法只能使用oracle8及以下版本的客户端导出的dmp才能修改
一种是修改数据库字符集,因为官方文档是说创建数据库后是不能修改,但是没办法工作需要在迁移数据时先创建一个中间数据库使用源数据库的字符集进行创建的
将源数据库的数据导入中间数据库后修改中间数据库的字符集使其与目标数据库的字符集一至,再从中间数据库将数据导入目标数据库.我这样做很麻烦,后面有一次由于
目标数据库是没有业务数据所以就直接修改了目标数据库字符集将源数据库的数据导入进来了.
—1—修改数据库里的字符集
—中文字符集转英文字符集
–英文

update sys.props$ set value$='US7ASCII' where name='NLS_CHARACTERSET';

commit;

update sys.props$ set value$='US7ASCII' where name='NLS_NCHAR_CHARACTERSET';
commit;

—2—修改强制同步数据库里的字符集

SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

—给CHARSET变量赋值

COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

–INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化

ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;

— 再次启动数据库一遍

SHUTDOWN IMMEDIATE;
STARTUP;

set nls_lang=AMERICAN_AMERICA.US7ASCII;

—英文字符集转中文字符集

update sys.props$ set value$='ZHS16GBK' where name='NLS_CHARACTERSET';

commit;

update sys.props$ set value$='ZHS16GBK' where name='NLS_NCHAR_CHARACTERSET';

commit;

—2—修改强制同步数据库里的字符集

SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER SYSTEM ENABLE RESTRICTED SESSION;

ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;

ALTER SYSTEM SET AQ_TM_PROCESSES=0;

ALTER DATABASE OPEN;

—给CHARSET变量赋值

COL VALUE NEW_VALUE CHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_CHARACTERSET';

COL VALUE NEW_VALUE NCHARSET
SELECT VALUE FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER='NLS_NCHAR_CHARACTERSET';

–INTERNAL_USE是没有写在文档中的参数,用以强制完成字符集一致化

ALTER DATABASE CHARACTER SET INTERNAL_USE &CHARSET;
--ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE &NCHARSET;

— 再次启动数据库一遍

SHUTDOWN IMMEDIATE;
STARTUP;

set nls_lang=SIMPLIFIED CHINESE_CHINA.ZHS16GBK;

1,修改dmp的时候,注意数据库版本
9i以以下的数据库,需要修改dmp文件第1行的第2和第3个字节
10g以上的数据库,需要修改dmp文件第3行的第3和第4个字节

这个方法比较局限,比如,你的数据库10T,这个方法显然就不行。。。。

2,强制修改是数据库字符集
从10以后,oracle推荐使用csscan

3,补充一个,对于数据量大的数据库整体迁移,这个方法显然不行,仅仅是用于少量数据库或者某些含多字节(如中文)少的表
dblink+utl_raw

这是Lunar_Zhang给我的提供的另外的方法在这附上,谢谢他的方法

Oracle 高水位(HWM)标记

1. 准备知识:ORACLE的逻辑存储管理.

ORACLE在逻辑存储上分4个粒度:表空间,段,区和块.

1.1 块:是粒度最小的存储单位,现在标准的块大小是8K,ORACLE每一次I/O操作也是按块来操作的,也就是说当ORACLE从数据文件读数据时,是读取多少个块,而不是多少行.
1.2 区:由一系列相邻的块而组成,这也是ORACLE空间分配的基本单位,举个例子来说,当我们创建一个表PM_USER时,首先ORACLE会分配一区的空间给这个表,随着不断的INSERT数据到PM_USER,原来的这个区容不下插入的数据时,ORACLE是以区为单位进行扩展的,也就是说再分配多少个区给PM_USER,而不是多少个块.
1.3 段:是由一系列的区所组成,一般来说,当创建一个对象时(表,索引),就会分配一个段给这个对象.所以从某种意义上来说,段就是某种特定的数据.如CREATE TABLE PM_USER,这个段就是数据段,而CREATE INDEX ON PM_USER(NAME),ORACLE同样会分配一个段给这个索引,但这是一个索引段了.查询段的信息可以通过数据字典: SELECT * FROM USER_SEGMENTS来获得,
1.4 表空间:包含段,区及块.表空间的数据物理上储存在其所在的数据文件中.一个数据库至少要有一个表空间.

当我们创建了一个表,即使我没有插入任何一行记录,ORACLE还是给它分配了8个块.当然这个跟建表语句的INITIAL 参数及MINEXTENTS参数有关:请看TEST_TAB的存储参数:

STORAGE
(
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
);

也就是说,在这个对象创建以后,ORACLE至少给它分配一个区,初始大小是64K,一个标准块的大小是8K,刚好是8个BLOCK.

2. 什么是高水线(High Water Mark)

所有的oracle段都有一个在段内容纳数据的上限,我们把这个上限称为”high water mark”或HWM。这个HWM是一个标记,用来说明已经有多少没有使用的数据块分配给这个segment。HWM通常增长的幅度为一次5个数据块,原则上HWM只会增大,不会缩小,即使将表中的数据全部删除,HWM还是为原值,由于这个特点,使HWM很象一个水库的历史最高水位,这也就是HWM的原始含义,当然不能说一个水库没水了,就说该水库的历史最高水位为0。但是如果我们在表上使用了truncate命令,则该表的HWM会被重新置为0。

如何知道一个表的HWM?
a) 首先对表进行分析:

ANALYZE TABLE  ESTIMATE/COMPUTE STATISTICS;

b) 查看相关信息:

SELECT  blocks, empty_blocks, num_rows  FROM user_tables
WHERE table_name = ;

BLOCKS 列代表该表中曾经使用过得数据库块的数目,即水线。
EMPTY_BLOCKS 代表分配给该表,但是在水线以上的数据库块,即从来没有使用的数据块.
示例进行说明:

SQL>SELECT segment_name,segment_type,blocks FROM dba_segments
                 WHERE segment_name='TEST';
SEGMENT_NA SEGMENT_TYPE           BLOCKS
---------- ------------------ ----------
TEST       TABLE                       8
TEST       TABLE                       8
SQL> ANALYZE TABLE TEST COMPUTE STATISTICS;

表已分析。

SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables
                  WHERE table_name='TEST';
TABLE_NAME    NUM_ROWS   BLOCKS  EMPTY_BLOCKS
------------------------ -------------------- ----------    ------------
TEST             10           1            6

注意:BLOCKS + EMPTY_BLOCKS (6+1=7)比DBA_SEGMENTS.BLOCKS(8)少一个数据库块,这是因为有一个数据库块被保留用作segment header。

DBA_SEGMENTS.BLOCKS 表示分配给这个表的所有的数据库块的数目。USER_TABLES.BLOCKS 表示已经使用过的数据库块的数目。


SQL> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) ||
  2              DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used"FROM TEST;
    Used
----------
     1
SQL> DELETE from TEST;
已删除10行。
SQL> COMMIT;
提交完成。
SQL> ANALYZE TABLE TEST ESTIMATE STATISTICS;
表已分析。
SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables
 WHERE table_name='TEST';
TABLE_NAME  NUM_ROWS   BLOCKS  EMPTY_BLOCKS
------------------   ------------ ---    ---------- -  --------------------
TEST           0             1            6
SQL> SELECT COUNT (DISTINCT DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) ||
  2            DBMS_ROWID.ROWID_RELATIVE_FNO(rowid)) "Used" FROM TEST;

      Used
    ----------
         0
    注:Used = 0  这表名没有任何数据库块容纳数据,即表中无数据
SQL> TRUNCATE TABLE TEST;
表被截断。
SQL> ANALYZE TABLE TEST COMPUTE STATISTICS;
表已分析。
SQL> SELECT table_name,num_rows,blocks,empty_blocks FROM user_tables
WHERE table_name='TEST';
TABLE_NAME  NUM_ROWS  BLOCKS  EMPTY_BLOCKS
----------------------------------------  ----------   ------------
TEST          0             0            7

SQL> SELECT segment_name,segment_type,blocks FROM dba_segments
WHERE segment_name='TEST';
SEGMENT_NA  SEGMENT_TYPE      BLOCKS
--------------------   -------------------------   -------------
TEST            TABLE                 8
TEST            TABLE                 8

注意:TRUNCATE命令回收了由delete命令产生的空闲空间,注意该表分配的空间由原先的1024块降为512块。为了保留由delete命令产生的空闲空间,可以使用TRUNCATE TABLE TEST REUSE STORAGE用此命令后,该表还会是原先的1024块。

3. Oracle表段中的高水位线HWM

在Oracle数据的存储中,可以把存储空间想象为一个水库,数据想象为水库中的水。水库中的水的位置有一条线叫做水位线,在Oracle中,这条线被称为高水位线(High-warter mark, HWM)。在数据库表刚建立的时候,由于没有任何数据,所以这个时候水位线是空的,也就是说HWM为最低值。当插入了数据以后,高水位线就会上涨,但是这里也有一个特性,就是如果你采用delete语句删除数据的话,数据虽然被删除了,但是高水位线却没有降低,还是你刚才删除数据以前那么高的水位。也就是说,这条高水位线在日常的增删操作中只会上涨,不会下跌。

下面我们来谈一下Oracle中Select语句的特性。Select语句会对表中的数据进行一次扫描,但是究竟扫描多少数据存储块呢,这个并不是说数据库中有多少数据,Oracle就扫描这么大的数据块,而是Oracle会扫描高水位线以下的数据块。现在来想象一下,如果刚才是一张刚刚建立的空表,你进行了一次Select操作,那么由于高水位线HWM在最低的0位置上,所以没有数据块需要被扫描,扫描时间会极短。而如果这个时候你首先插入了一千万条数据,然后再用delete语句删除这一千万条数据。由于插入了一千万条数据,所以这个时候的高水位线就在一千万条数据这里。后来删除这一千万条数据的时候,由于delete语句不影响高水位线,所以高水位线依然在一千万条数据这里。这个时候再一次用select语句进行扫描,虽然这个时候表中没有数据,但是由于扫描是按照高水位线来的,所以需要把一千万条数据的存储空间都要扫描一次,也就是说这次扫描所需要的时间和扫描一千万条数据所需要的时间是一样多的。所以有时候有人总是经常说,怎么我的表中没有几条数据,但是还是这么慢呢,这个时候其实奥秘就是这里的高水位线了。

那有没有办法让高水位线下降呢,其实有一种比较简单的方法,那就是采用TRUNCATE语句进行删除数据。采用TRUNCATE语句删除一个表的数据的时候,类似于重新建立了表,不仅把数据都删除了,还把HWM给清空恢复为0。所以如果需要把表清空,在有可能利用TRUNCATE语句来删除数据的时候就利用TRUNCATE语句来删除表,特别是那种数据量有可能很大的临时存储表。

在手动段空间管理(Manual Segment Space Management)中,段中只有一个HWM,但是在Oracle 9i Release1才添加的自动段空间管理(Automatic Segment Space Management)中,又有了一个低HWM的概念出来。为什么有了HWM还又有一个低HWM呢, 这个是因为自动段空间管理的特性造成的。在手段段空间管理中,当数据插入以后,如果是插入到新的数据块中,数据块就会被自动格式化等待数据访问。而在自动 段空间管理中,数据插入到新的数据块以后,数据块并没有被格式化,而是在第一次访问这个数据块的时候才格式化这个块。所以我们又需要一条水位线,用来标示 已经被格式化的块。这条水位线就叫做低HWM。一般来说,低HWM肯定是低于等于HWM的。

4. 修正ORACLE表的高水位线
  在ORACLE中,执行对表的删除操作不会降低该表的高水位线。而全表扫描将始终读取一个段(extent)中所有低于高水位线标记的块。如果在执行删除操作后不降低高水位线标记,则将导致查询语句的性能低下。

下面的方法都可以降低高水位线标记。

1. 执行表重建指令 alter table table_name move;
在线转移表空间ALTER TABLE … MOVE TABLESPACE ..
当你创建了一个对象如表以后,不管你有没有插入数据,它都会占用一些块,ORACLE也会给它分配必要的空间.同样,用ALTER TABLE MOVE释放自由空间后,还是保留了一些空间给这个表.
ALTER TABLE … MOVE 后面不跟参数也行,不跟参数表还是在原来的表空间,Move后记住重建索引. 如果以后还要继续向这个表增加数据,没有必要move, 只是释放出来的空间,只能这个表用,其他的表或者segment无法使用该空间。
2. 执行alter table table_name shrink space;
注意,此命令为Oracle 10g新增功能,再执行该指令之前必须允许行移动 alter table table_name enable row movement;
3. 复制要保留的数据到临时表t,drop原表,然后rename临时表t为原表
4. 用逻辑导入导出: Emp/Imp
5. Alter table table_name deallocate unused
注:这证明,DEALLOCATE UNUSED为释放HWM上面的未使用空间,但是并不会释放HWM下面的自由空间,也不会移动HWM的位置.
6. 尽量使用truncate.

注意:
在9I中:
1. 如果是INEXTENT, 可以使ALTER TABLE TABLENAME DEALLOCATE UNUSED将HWM以上所有没使用的空间释放
2. 如果MINEXTENT >HWM 则释放MINEXTENTS 以上的空间。如果要释放HWM以上的空间则使用KEEP 0。
ALTER TABLE TABLESNAME DEALLOCATE UNUSED KEEP 0;
3. TRUNCATE TABLE DROP STORAGE(缺省值)命令可以将MINEXTENT 之上的空间完全释放(交还给操作系统),并且重置HWM。
4. 如果仅是要移动HWM,而不想让表长时间锁住,可以用TRUNCATE TABLE REUSE STORAGE,仅将HWM重置。
5. ALTER TABLE MOVE会将HWM移动,但在MOVE时需要双倍的表空间,而且如果表上有索引的话,需要重构索引
6. DELETE表不会重置HWM,也不会释放自由的空间(也就是说DELETE空出来的空间只能给对象本身将来的INSERT/UPDATE使用,不能给其它的对象使用)

在ORACLE 10G:
1. 可以使用ALTER TABLE TEST_TAB SHRINK SPACE命令来联机移动HWM,
2. 如果要同时压缩表的索引,可以发布:ALTER TABLE TEST_TAB SHRINK SPACE CASCADE

5. HWM 特点:

1. ORACLE用HWM来界定一个段中使用的块和未使用的块.

举个例子来说,当我们创建一个表时,ORACLE就会为这个对象分配一个段.在这个段中,即使我们未插入任何记录,也至少有一个区被分配,第一个区的第一个块就称为段头(SEGMENT HEADE),段头中就储存了一些信息,基中HWM的信息就存储在此.此时,因为第一个区的第一块用于存储段头的一些信息,虽然没有存储任何实际的记录,但也算是被使用,此时HWM是位于第2个块.当我们不断插入数据到表后,第1个块已经放不下后面新插入的数据,此时,ORACLE将高水位之上的块用于存储新增数据,同时,HWM本身也向上移.也就是说,当我们不断插入数据时,HWM会往不断上移,这样,在HWM之下的,就表示使用过的块,HWM之上的就表示已分配但从未使用过的块.

2. HWM在插入数据时,当现有空间不足而进行空间的扩展时会向上移,但删除数据时不会往下移.
这就好比是水库的水位,当涨水时,水位往上移,当水退出后,最高水位的痕迹还是清淅可见.
ORACLE 不会释放空间以供其他对象使用,有一条简单的理由:由于空间是为新插入的行保留的,并且要适应现有行的增长。被占用的最高空间称为最高使用标记 (HWM),

3. HWM的信息存储在段头当中.
HWM本身的信息是储存在段头.在段空间是手工管理方式时,ORACLE是通过FREELIST(一个单向链表)来管理段内的空间分配.在段空间是自动管理方式时(ASSM),ORACLE是通过BITMAP来管理段内的空间分配.

4. ORACLE的全表扫描是读取高水位标记(HWM)以下的所有块.
所以问题就产生了.当用户发出一个全表扫描时,ORACLE 始终必须从段一直扫描到 HWM,即使它什么也没有发现。该任务延长了全表扫描的时间。

5. 当用直接路径插入行时,即使HWM以下有空闲的数据库块,键入在插入数据时使用了append关键字,则在插入时使用HWM以上的数据块,此时HWM会自动增大。
例如,通过直接加载插入(用 APPEND 提示插入)或通过 SQL*LOADER 直接路径 数据块直接置于 HWM 之上。它下面的空间就浪费掉了

linux下oracle数据库的安装

在linux系统中安装oracle

用root用户登录到操作系统
检查硬件配置
检查软件配置
检查网络设置
创建操作系统组和用户
配置内核参数
识别所要求的软件目录
标识或创建一个oracle基础目录
给数据库和恢复文件选择一个存储选项
给数据库或恢复文件创建一个目录
给一个自动存储管理安装准备磁盘组
配置裸分区或逻辑卷
停止现有的数据库进程
配置数据库用户环境变量

用root用户登录到操作系统
在你开始安装数据库软件之前,你必须用root用户完成以下一些任务:
1.启动一个本地终端会话
2.如果不是在本地系统安装软件,那么输入以下命令在本地的X服务器来显示远程的X应用程序

$ xhost fully_qualified_remote_host_name

例如:
$ xhost somehost.us.acme.com

3.如果不是在本地操作系统上安装软件,那么使用ssh,rlogin或telnet命令来连接系统
$ telnet fully_qualified_remote_host_name

4.如果你不是以root用户来登录的系统,那么在登录系统后可使用下面的命令来切换到root用户:

$ su -root
password:
#

检查硬件配置
系统必须要满足以下硬件要求
至少1GB的物理内存
下面的表格描述了在物理内存和配置的交接空间要求的相关关系.
RAM(物理内存) Swap Space(交换空间)
小于等于512MB 交接空间是ram的2倍
在1024MB和2048MB之间 交接空间是ram的1.5倍
在2049MB和8192MB之间 交接空间与ram的的大小相等
大于8192MB 交接空间是ram的0.75倍

/tmp目录要有400MB的磁盘空间

根据你的数据库安装类型,要给oracle软件给1.5GB到3.5GB的磁盘空间.

要给预定义的数据库使用的文件系统存储给1.2GB的磁盘空间

如果你选择配置了自动备份那么在文件系统或自动存储管理磁盘组中还要给快速恢复区保留额外的磁盘空间.

为了确保系统满足所必须的硬件要求:
1.判断物理内存的大小可以输入以下命令:
# grep MemTotal /proc/meminfo

[root@weblogic28 /]# grep MemTotal /proc/meminfo
MemTotal:     32949872 kB

如果物理内存的大小小于所要求的大小,那么在执行后面的操作之前你必须增加物理内存的大小

2.为了判断配置的交换空间的大小,输入以下命令:
# grep SwapTotal /proc/meminfo

[root@weblogic28 /]# grep SwapTotal /proc/meminfo
SwapTotal:    32764556 kB

如果需要,可以参考操作系统文档关于怎么配置交换空间

3.为了判断可用的物理内存和交换空间大小,可以输入以下命令:
#free

[root@weblogic28 /]# free
             total       used       free     shared    buffers     cached
Mem:      32949872   10721532   22228340          0     232296    1326880
-/+ buffers/cache:    9162356   23787516
Swap:     32764556          0   32764556

4.为了判断加载/tmp目录的可用的磁盘空间,输入以下命令:
# df -k /tmp (df -m /tmp)

[root@weblogic28 /]# df -k /tmp
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3            251322808  11730392 226619932   5% /
[root@weblogic28 /]# df -m /tmp
Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/sda3               245433     11456    221309   5% /

如果/tmp目录的可用磁盘空间小于400MB,那么可以执行以下操作
从tmp目录下删除不必要的文件直到达到400MB的空间要求
当设置oracle用户环境时设置tmep和tmpdir环境变量.

扩展/tmp目录下的文件系统.如果需要,联系你的系统管理员

5.判断系统中已经加载的可用磁盘空间,输入以下命令:
# df -k(以k字节来显示大小) (df -m)(以兆字节显示)

[root@weblogic28 /]# df -k
Filesystem           1K-blocks      Used Available Use% Mounted on
/dev/sda3            251322808  11730216 226620108   5% /
/dev/sda1               194442     11888    172515   7% /boot
tmpfs                 16474936         0  16474936   0% /dev/shm
[root@weblogic28 /]# df -m
Filesystem           1M-blocks      Used Available Use% Mounted on
/dev/sda3               245433     11456    221309   5% /
/dev/sda1                  190        12       169   7% /boot
tmpfs                    16089         0     16089   0% /dev/shm

下面的表格显示了安装各种类型数据库所要求的磁盘空间大小
安装类型 要求的磁盘空间大小(GB)
企业版 1.9
标准版 1.9
自定义 2.0

6.为了判断系统的体系结构能否运行数据库软件,可以输入以下命令:
#grep “model name” /proc/cpuinfo

[root@weblogic28 /]# grep "model name" /proc/cpuinfo
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz
model name      : Intel(R) Xeon(R) CPU           E5620  @ 2.40GHz

注意:这个命令将显示处理器的类型,验证处理器的类型与你所要安装的数据库软件是否匹配.
如果你没有看到你所期望的输出,那么不能在这个操作系统上安装数据库软件.

检查软件配置
根据你所要安装的数据库软件,验证在系统中安装的软件.下面的表格描述了怎样验证这些要求
是否已经得到解决了.

注:数据库统一安装程序将会执行检查来验证你的系统是否满足所列出的各项要求.为了确保这
些检查通过,在你开始执行数据库统一安装程序之前就要验证这些要求.

项目 要求
操作系统 必须满足以下一种操作系统版本

                                    Red Hat Enterprise Linux AS/ES 3.0 (Update 4 or later)
                                    Red Hat Enterprise Linux AS/ES 4.0 (Update 1 or later)
                                    SUSE Linux Enterprise Server 9.0 with SP2 or later

内核版本 操作系统必须运行的是以下内核版本中的一种(或都最近的内核版本)

                                    Red Hat Enterprise Linux 3.0:
                                    2.4.21-27.EL
                                    Note: This is the default kernel version.
                                    Red Hat Enterprise Linux 4.0:
                                    2.6.9-11.EL
                                    SUSE Linux Enterprise Server 9.0:
                                    2.6.5-7.201

包 这下面列出的包(或最新版本的包)必须要安装

                                    Red Hat Enterprise Linux 3.0:
                                    make-3.79.1-17
                                    compat-db 4.0.14-5.1
                                    control-center-2.2.0.1-13
                                    gcc-3.2.3-47
                                    gcc-c++-3.2.3-47
                                    gdb-6.1post-1.20040607.52
                                    glibc-2.3.2-95.30
                                    glibc-common-2.3.2-95.30
                                    glibc-devel-2.3.2-95.30
                                    glibc-devel-2.3.2-95.20 (32 bit)
                                    compat-db-4.0.14-5
                                    compat-gcc-7.3-2.96.128
                                    compat-gcc-c++-7.3-2.96.128
                                    compat-libstdc++-7.3-2.96.128
                                    compat-libstdc++-devel-7.3-2.96.128
                                    gnome-libs-1.4.1.2.90-34.2 (32 bit)
                                    libstdc++-3.2.3-47
                                    libstdc++-devel-3.2.3-47
                                    openmotif-2.2.3-3.RHEL3
                                    sysstat-5.0.5-5.rhel3
                                    setarch-1.3-1
                                    libaio-0.3.96-3
                                    libaio-devel-0.3.96-3

                                    Red Hat Enterprise Linux 4.0:
                                    binutils-2.15.92.0.2-10.EL4
                                    compat-db-4.1.25-9
                                    control-center-2.8.0-12
                                    gcc-3.4.3-9.EL4
                                    gcc-c++-3.4.3-9.EL4
                                    glibc-2.3.4-2
                                    glibc-common-2.3.4-2
                                    gnome-libs-1.4.1.2.90-44.1
                                    libstdc++-3.4.3-9.EL4
                                    libstdc++-devel-3.4.3-9.EL4
                                    make-3.80-5
                                    pdksh-5.2.14-30
                                    sysstat-5.0.5-1
                                    xscreensaver-4.18-5.rhel4.2

                                    SUSE Linux Enterprise Server 9:
                                    binutils-2.15.90.0.1.1-32.5
                                    gcc-3.3.3-43.24
                                    gcc-c++-3.3.3-43.24
                                    glibc-2.3.3-98.28
                                    gnome-libs-1.4.1.7-671.1
                                    libstdc++-3.3.3-43.24
                                    libstdc++-devel-3.3.3-43.24
                                    make-3.80-184.1
                                    pdksh-5.2.14-780.1
                                    sysstat-5.0.1-35.1
                                    xscreensaver-4.16-2.6

PL/SQL native                       Intel C++ Compiler 8.1 or later and the version of GNU C and
compilation, Pro*C/C++,             C++ compilers listed previously for the distribution are supported
Oracle Call Interface,              for use with these products.
Oracle C++ Call Interface,
Oracle XML Developer's              Note: Intel C++ Compiler v8.1 or later is supported. However, it is
Kit (XDK)                           not required for installation. On Red Hat Enterprise Linux 3,
                                    OCCI is supported with version 3.2 of the GNU C++ compiler.
                                    This is the default compiler version. OCCI is also supported with
                                    Intel Compiler v8.1 with gcc 3.2.3 standard template libraries.
                                    Oracle XML Developer's Kit is not supported with GCC on Red
                                    Hat Linux 4.0. It is supported only with Intel C++ Compiler (ICC).
                                    On Red Hat Enterprise Linux 4.0, Oracle C++ Call Interface
                                    (OCCI) does not support GCC 3.4.3. To use OCCI on Red Hat
                                    Enterprise Linux 4.0, you need to install GCC 3.2.3.

Oracle JDBC/OCI Drivers             You can use the following optional JDK version with the Oracle
                                    JDBC/OCI drivers; however, it is not required for the installation:
                                    Sun JDK 1.5.0 (64-bit)
                                    Sun JDK 1.5.0 (32-bit)
                                    Sun JDK 1.4.2_09 (32-bit)

为了确保系统满足这些要求
1.判断linux系统所发布的版本请输入以下命令:
#cat /proc/version

[root@weblogic28 /]# cat /proc/version
Linux version 2.6.18-164.el5 (mockbuild@x86-003.build.bos.redhat.com) (gcc versi
on 4.1.2 20080704 (Red Hat 4.1.2-46)) #1 SMP Tue Aug 18 15:51:48 EDT 2009

2.判断所安装的内核版本输入以下命令:
# uname -r

[root@weblogic28 /]# uname -r
2.6.18-164.el5

3.判断所要求包是否已经安装输入以下命令:

# rpm -q package_name

检查网络设置

配置命名解析
当你运行数据库统一安装程序时如果命名解析没有设置将会报错,为了避免这个错误,
在你安装之前,你必须通过/etc/hosts文件来解决主机命名

为了确保通过/etc/hosts文件来解决主机命名
1.验证/etc/hosts文件是否已经被用来命名解析.你可以通过输入nsswitch.conf文件来检查主机文件
# cat /etc/nsswitch.conf |grep hosts

[root@weblogic28 /]# cat /etc/nsswitch.conf |grep hosts
#hosts:     db files nisplus nis dns
hosts:      files dns

该命令输出应该包含一个文件条目

2.验证主机名是否已经设置可以使用hostname命令:
# hostname

[root@weblogic28 /]# hostname
weblogic28
这个输出类似于
myhost.mycomputer.com

3.验证域名是否已经被动态设置使用domainname命令:
# domainname

[root@weblogic28 /]# domainname
(none)

这个命令应该不会返回任何结果

4.验证主机文件是否包含完整的主机名使用以下命令:
# cat /etc/hosts | grep `eval hostname`

[root@weblogic28 /]# cat /etc/hosts | grep `eval hostname`
127.0.0.1               weblogic28    localhost

如果主机文件名不包含完整的主机名,那么打开文件修改它.

创建所需的操作系统的组和用户
根据是否第一次在该系统上安装数据库软件,你可能需要创建一些操作系统组和用户

如果你打算安装数据库软件那么这下面的操作系统组和用户是必须要创建的
OSDBA组(dba)
在系统中第一次安装数据库时你必须创建该组.它将识别操作系统用户账号有数据库管理权限
(sysdba权限).该组缺省的名字为dba
如果你想指定一个不是缺省的dba组名那么你必须选择自定义安装类型来安装软件或者
启动数据库统一安装程序作为了一个用户而不是这个组的一个成员.在这种情况下,
数据库统一安装程序提示你指定这个组名.

OSOPER组(oper)
这是一个可选组,如果你想有一个单独的操作系统用户组拥有一些受限的数据库管理权限
(sysoper权限).通常,OSDBA组的成员也有sysoper权限.
如果你想指定一个单独的osoper组,而不是缺省的dba组.那么你必须选择自定义安装类型
来安装软件或者启动数据库统一安装程序作为一个不是dba组的成员.在这种情况下,
数据库统一安装程序将提示你指定这个组名,这个组名通常是oper.

下面的操作系统组和用户是必须要创建
oracle目录组(oinstall)
在系统上第一次安装数据库软件时你必须创建这个用户组.通常这个组的名字为oinstall.
这个组拥有oracle详细目录,它是所有要安装的oracle软件的所在目录

oracle软件所有者用户(典型代表,oracle)
在第一次安装时你必须创建这个用户,在安装期间这个用户拥有所有要安装的软件.
这个用户必须首先是oracle目录组的成员,同时也还要是OSDBA和OSOPER组的成员

创建oracle软件清单目录组
判断系统中是否已经存在oracle软件清单目录组输入以下命令:
# more /etc/oraInst.loc

[root@weblogic28 ~]# more /etc/oraInst.loc
/etc/oraInst.loc: No such file or directory
如果这个命令的输出显示了oinstall的组名,那么这个oracle目录组已经存在了.
如果oraInst.loc文件存在,那么这个命令的输出和下面的相似
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inst_group参数显示了oracle目录组(oinstall)

如果oraInst.loc文件不存在那么通过下面的命令新建一个oracle目录组:

# /usr/sbin/groupadd oinstall

创建OSDBA组
当不存在osdba组或者你想对新安装的软件创建一个新的osdba组时你必须创建osdba组.
判断oadba组是否存在输入以下命令:
# grep dba /etc/group

[root@weblogic28 ~]# grep dba /etc/group

如果osdba组不存在,那么你可以使用下面的命令创建osdba组,这个组名为dba,如果这个名字
已经使用了就可以使用别的组名
# /usr/sbin/groupadd dba

[root@weblogic28 ~]# /usr/sbin/groupadd dba

创建OSOPER组(可选)
如果你想要标识一组操作系统用户有一些受限的数据库管理权限(sysoper操作权限)你就得创建osoper组.
对于大多数安装来说仅仅需要创建OSDBA组.如果你想创建osoper组,你可以执行以下命令
# /usr/sbin/groupadd oper

[root@weblogic28 ~]# /usr/sbin/groupadd oper

如果创建osoper组时你可以使用oper组名,如果这个oper组名已被使用可以输入其它名字

创建oracle软件所有者用户
如果oracle软件所有者用户不存在或者这个oracle软件所有者用户存在了,但是想创建另外的oracle
软件所有者用户

判断一个oracle软件所有者用户(oracle)是否存在输入以下命令:
# id oracle

[root@weblogic28 ~]# id oracle
id: oracle: No such user

如果这个oracle用户已经存在了那么输出和下面的类似:

uid=440(oracle) gid=200(oinstall) groups=201(dba),202(oper)

如果这个用户存在,然后你是想使用已经存在的这个用户还是想新建一个oracle用户.
如果你想使用已经存在的这个oracle用户那么要确保这个oracle用户的主组是oracle目录组,
并且同时还是osdba和osoper组的成员

为了创建一个新的oracle用户输入和以下相似的命令:
# /usr/sbin/useradd -g oinstall -G dba[,oper] oracle

[root@weblogic28 ~]# /usr/sbin/useradd -g oinstall -G dba,oper oracle

这个命令中的-g选项指定这个用户oracle主组,这个主组必须是oracle目录组例如oinstall
-G选项指定次组.它必须包含osdba组,osoper组是可选的.例如:dba 或者 dba,oper

给oralce用户设置密码
# passwd oracle

[root@weblogic28 ~]# passwd oracle
Changing password for user oracle.
New UNIX password:
BAD PASSWORD: it is based on a dictionary word
Retype new UNIX password:
passwd: all authentication tokens updated successfully.

修改oracle软件所有者用户
如果oracle用户已经存在,但是oracle用户的主组不是oinstall组,或者oracle用户不是
osdba或osoper组的成员,那么输入和下面相似的命令进行修改.-g选项指定主组,
-G选项指定次组.

# /usr/sbin/usermod -g oinstall -G dba[,oper] oracle

验证nobody用户是否存在
在安装软件之前必须验证nobody用户是否已经存在

判断nobody用户是否存在输入以下命令:
# id nobody

[root@weblogic28 ~]# id nobody
uid=99(nobody) gid=99(nobody) groups=99(nobody)

如果这个命令输出和上面一样显示了关于nobody用户的信息那么你不必创建这个用户

如果nobody用户不存在那么输入以下命令来创建:

# /usr/sbin/useradd nobody

配置内核参数
验证下面表格中所列出的内核参数值应该要大于或等于所建议的值.

Parameter                     Value                File
semmsl                        250                  /proc/sys/kernel/sem
semmns                        32000
semopm                        100
semmni                        128

shmall                        2097152              /proc/sys/kernel/shmall

shmmax                        Half the size of     /proc/sys/kernel/shmmax
                              physical
                              memory (in
                              bytes)

shmmni                        4096                 /proc/sys/kernel/shmmni
file-max                      65536                /proc/sys/fs/file-max

ip_local_port_range           Minimum:1024         /proc/sys/net/ipv4/ip_local_port_range
                              Maximum:
                              65000

rmem_default                  262144               /proc/sys/net/core/rmem_default
rmem_max                      262144               /proc/sys/net/core/rmem_max
wmem_default                  262144               /proc/sys/net/core/wmem_default
wmem_max                      262144               /proc/sys/net/core/wmem_max

如果这上面所示的参数的参数值比所列出的值大时不必做任何修改
可以输入以下命令来查看这些参数的参数值

Parameter                                Command
semmsl, semmns,                          # /sbin/sysctl -a | grep sem
semopm, and semmni                       这个命令将会显示这些信号参数的值
[root@weblogic28 ~]# /sbin/sysctl -a | grep sem
kernel.sem = 250        32000   32      128


shmall, shmmax, and                      # /sbin/sysctl -a | grep shm
shmmni                                   这个命令将会显示共享内存段大小的值
[root@weblogic28 ~]# /sbin/sysctl -a | grep shm
vm.hugetlb_shm_group = 0
kernel.shmmni = 4096
kernel.shmall = 4294967296
kernel.shmmax = 68719476736

file-max                                 # /sbin/sysctl -a | grep file-max
                                         这个命令将会显示能处理的最大文件数
[root@weblogic28 ~]# /sbin/sysctl -a | grep file-max
fs.file-max = 3224915


ip_local_port_range                      # /sbin/sysctl -a | grep ip_local_port_range
                                         这个命令将显示端口号的范围
[root@weblogic28 ~]# /sbin/sysctl -a | grep ip_local_port_range
net.ipv4.ip_local_port_range = 32768    61000

rmem_default                             # /sbin/sysctl -a | grep rmem_default
[root@weblogic28 ~]# /sbin/sysctl -a | grep rmem_default
net.core.rmem_default = 129024

rmem_max                                 # /sbin/sysctl -a | grep rmem_max
[root@weblogic28 ~]# /sbin/sysctl -a | grep rmem_max
net.core.rmem_max = 131071

wmem_default                             # /sbin/sysctl -a | grep wmem_default
[root@weblogic28 ~]# /sbin/sysctl -a | grep wmem_default
net.core.wmem_default = 129024

wmem_max                                 # /sbin/sysctl -a | grep wmem_max
[root@weblogic28 ~]# /sbin/sysctl -a | grep wmem_max
net.core.wmem_max = 131071

如果任何内核参数与建议值不同可以使用任何文本编辑器来创建或编辑/etc/sysctl.conf文件
来增加或修改这些内核参数
修改这些内核参数时要注意如果这些内核参数的当前值比建议值大的话那么就指定为两者中的大者

kernel.shmall = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file-max = 65536
net.ipv4.ip_local_port_range = 1024 65000
net.core.rmem_default = 262144
net.core.rmem_max = 262144
net.core.wmem_default = 262144
net.core.wmem_max = 262144

当在/etc/sysctl.conf文件中指定这些内核参数后你要重启系统

给oracle用户设置shell限制
为了提高数据库软件在linux系统中的性能你必须给oracle用户增加以下shell限制:

shell limit                        item in limits.confg          hard limit
能打开文件的最大数量               nofile                        65536
单个用户可用的最大进程数           nproc                         16384

1.在/etc/security/limits.conf文件中增加以下限制:

oracle soft nproc  2047
oracle hard nproc  16384
oracle soft nofile 1024
oracle hard nofile 65536

2.在/ect/pam.d/login文件如果下面显示的参数没有就增加到该文件中

session required pam_limits.so

3.根据oracle用户的默认shell,对默认的shell启动文件进行以下更改:
对于Bourne, Bash, or Korn shell在/etc/profile文件中增加下面的代码

if [ $USER = "oracle" ]; then
      if [ $SHELL = "/bin/ksh" ]; then
        ulimit -p 16384
        ulimit -n 65536
      else
        ulimit -u 16384 -n 65536
      fi
fi

对C shell(csh or tcsh)在/etc/csh.login文件中增加以下代码

if ( $USER == "oracle" ) then
    limit maxproc 16384
    limit descriptors 65536
endif

识别所需的软件目录
必须要识别或创建以下oracle软件目录
oracle根目录
oracle软件清单目录
oracle Home目录

Oracle根目录是一个为安装数据库软件的顶级目录
/mount_point/app/oracle_sw_owner

/u01/app/oracle
/u01/app/orauser
/opt/oracle/app/oracle

oracle软件清单目录
oracle_base/oraInventory

oracle Home目录
是所有软件安装后存放的所在位置
oracle_base/product/10.2.0/db_1

为了查看是否已经存在oracle软件清单目录输入以下命令:
# more /etc/oraInst.loc
如果已经存在就是显示和以下相似的信息
inventory_loc=/u01/app/oracle/oraInventory
inst_group=oinstall
inventory_loc参数值就是oracle的软件清单目录,它的父目录就是oracle的根目录
在上面的输出中/u01/app/oracle就是oracle的根目录

为了查看是否已经存在oracle Home目录输入以下命令:
# more /etc/oratab
如果已经存在就显示和以下相似的信息
*:/u03/app/oracle/product/10.2.0/db_1:N
*:/opt/orauser/infra_904:N
*:/oracle/9.2.0:N

创建oracle根目录可以输入以下相似的命令:

# mkdir -p /mount_point/app/oracle_sw_owner
# chown -R oracle:oinstall /mount_point/app/oracle_sw_owner
# chmod -R 775 /mount_point/app/oracle_sw_owner

如果oracle根目录的加载点是/u01并且oracle软件使用者用户为oracle那么oracle根目录的路径为:
/u01/app/oracle

[root@weblogic28 ~]# mkdir -p /u01/app/oracle
[root@weblogic28 ~]# chown -R oracle:oinstall /u01/app/oracle
[root@weblogic28 ~]# chmod -R 775  /u01/app/oracle

当你配置oracle用户环境变量时设置ORACLE_BASE时就将oracle根目录的路径赋给ORACLE_BASE

创建存储数据库文件和数据库恢复文件的目录
创建存储数据库文件的目录的命令如下:

# mkdir /mount_point/oradata
# chown oracle:oinstall /mount_point/oradata
# chmod 775 /mount_point/oradata

将存放数据库文件的目录创建在oracle根目录下/u01/app/oracle/oradata

[root@weblogic28 ~]# mkdir  /u01/app/oracle/oradata
[root@weblogic28 ~]# chown oracle:oinstall /u01/app/oracle/oradata
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/oradata

创建oracle Home目录/u01/app/oracle/10.2.0/db

[root@weblogic28 ~]# mkdir  /u01/app/oracle/10.2.0/db
[root@weblogic28 ~]# chown oracle:oinstall /u01/app/oracle/10.2.0/db
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/10.2.0/db

创建存储数据库恢复文件的目录的命令如下:

# mkdir /mount_point/flash_recovery_area
# chown oracle:oinstall /mount_point/flash_recovery_area
# chmod 775 /mount_point/flash_recovery_area

将存放数据库恢复文件的目录创建在oracle根目录下/u01/app/oracle

[root@weblogic28 ~]# mkdir /u01/app/oracle/flash_recovery_area
[root@weblogic28 ~]# chown oracle:oinstall /u01/app/oracle/flash_recovery_area
[root@weblogic28 ~]# chmod 775 /u01/app/oracle/flash_recovery_area

创建一个/tmp目录

[root@weblogic28 ~]# mkdir /u01/tmp
[root@weblogic28 ~]# chmod a+wr /u01/tmp

切换到oracle用户来设置环境变量

[oracle@weblogic28 ~]$
 ls -a
查看.bash_profile文件
vi .bash_profile

TEMP=/u01/tmp
TMPDIR=/u01/tmp
export TEMP TMPDIR
export LD_ASSUME_KERNEL=2.6.9
export ORACLE_BASE=/u01/app/oracle
export ORACLE_HOME=/u01/app/oracle/10.2.0/db
export ORACLE_SID=jycs
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib
export LD_LIBRARY_PATH
export PATH=$PATH:$ORACLE_HOME/bin
CLASSPATH=$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib
CLASSPATH=$CLASSPATH:$ORACLE_HOME/network/jlib
export CLASSPATH




[oracle@weblogic28 tmp]$# umask
0022

umask命令将会显示22,022或0022

[oracle@weblogic28 tmp]$# env | more
HOSTNAME=weblogic28
SHELL=/bin/bash
TERM=ansi
HISTSIZE=1000
TMPDIR=/u01/tmp
KDE_NO_IPV6=1
QTDIR=/usr/lib64/qt-3.3
QTINC=/usr/lib64/qt-3.3/include
USER=root
TEMP=/u01/tmp
LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;0
1:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.b
tm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:
*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*
.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3
5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:
ORACLE_SID=jycs
ORACLE_BASE=/u01/app/oracle
KDEDIR=/usr
MAIL=/var/spool/mail/root
PATH=/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:
/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
INPUTRC=/etc/inputrc

上面显示了你所设置的环境变量

也可以用下面的命令来查看环境变量

[oracle@weblogic28 tmp]$ echo $ORACLE_HOME[$ORACLE_SID,$ORACLE_BASE]

将数据库软件包拷贝到linux系统中
然后解压文件
$ gunzip filename.cpio.gz

[oracle@weblogic28 tmp]$ gunzip 10201_database_linux_x86_64.cpio.gz

执行上面的命令后会出现在 10201_database_linux_x86_64.cpio文件包
再执行如下命令解压文件
$ cpio -idmv < filename.cpio

[oracle@weblogic28 tmp]$ cpio -idmv <10201_database_linux_x86_64.cpio
database/stage/prereq/db/refhost_Custom.xml
database/stage/prereq/db/refhost.xml
database/stage/prereq/db/db_prereq.xml
database/stage/prereq/db/dbprereq.jar
database/stage/prereq/db
database/stage/prereq/oui/knowledgesrc.xml
database/stage/prereq/oui/rulemap.xml
database/stage/prereq/oui/OraPrereqChecks.jar
database/stage/prereq/oui
database/stage/prereq/common/rulemap.xml
database/stage/prereq/common
……

会出现以上信息

如果是远程安装可以使用VNC远程连接到linux服务器上来执行安装
1、配置并开启vnc服务
[oracle@localhost ~]$ vncserver
You will require a password to access your desktops.
Password:              ---这里要求输入vnc客户端登录的密码并重复
Verify:
New 'localhost.localdomain:2 (oracle)' desktop is localhost.localdomain:2
Creating default startup script. /home/oracle/.vnc/xstartup
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:2.log

—-如上告诉你vnc终端已经创建好,用的是第二个终端
2、在创建vnc服务的用户目录下会生成一个.vnc的隐藏目录

[oracle@localhost ~]$ ls -a
.              .bash_profile  Disk1     .gconfd          .gstreamer-0.10    .metacity                        README.htm  .viminfo
..             .bashrc        .eggcups  .gnome           .gtkrc-1.2-gnome2  .mozilla                         .redhat     .vnc
.bash_history  .chewing       .emacs    .gnome2          .ICEauthority      .nautilus                        .scim       .Xauthority
.bash_logout   Desktop        .gconf    .gnome2_private  .kde               p8202632_10205_Linux-x86-64.zip  .Trash      .zshrc

3、进入.vnc目录,找到xstartup可执行文件,用vi 编辑器打开

[oracle@localhost ~]$ cd .vnc/
[oracle@localhost .vnc]$ ls
localhost.localdomain:2.log  localhost.localdomain:2.pid  passwd  xstartup
[oracle@localhost .vnc]$ vi xstartup
#!/bin/sh
# Uncomment the following two lines for normal desktop:
# unset SESSION_MANAGER
 exec /etc/X11/xinit/xinitrc                                          ---去掉前面的#号即可  --保存退出
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic &
xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
twm &
~
[ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup
"xstartup" 12L, 333C 已写入
[oracle@localhost .vnc]$ vncserver
New 'localhost.localdomain:3 (oracle)' desktop is localhost.localdomain:3
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:3.log

4、清除刚才创建的vnc虚拟终端

[oracle@localhost .vnc]$ vncserver  -kill :1
Can't find file /home/oracle/.vnc/localhost.localdomain:1.pid
You'll have to kill the Xvnc process manually
[oracle@localhost .vnc]$ vncserver  -kill :2
Killing Xvnc process ID 11889
[oracle@localhost .vnc]$ vncserver  -kill :3
Killing Xvnc process ID 11945
[oracle@localhost .vnc]$ vncserver  -kill :4
Can't find file /home/oracle/.vnc/localhost.localdomain:4.pid
You'll have to kill the Xvnc process manually

5、重新建立新的vnc虚拟终端

[oracle@localhost .vnc]$ vncserver
New 'localhost.localdomain:2 (oracle)' desktop is localhost.localdomain:2
Starting applications specified in /home/oracle/.vnc/xstartup
Log file is /home/oracle/.vnc/localhost.localdomain:2.log              --该终端号为 :2

6、在windows客户端用RealVNC软件中的Run VNC Viewer客户端连接。
7、在Run VNC Viewer 只需输入linux服务器的地址和刚才生成的终端号:2
格式:192.168.1.56:2
8、输入刚才配置vnc服务的时候配的即可登录linux服务器图形界面
9. 运行runInstaller来进行安装

如果是本地安装的话执行下面的步骤
用root用户登录

[root@weblogic28 ~]#xhost +

让任何用户都是启用图形界面
切换到oracle用户

[root@weblogic28 ~]su - oracle
[oracle@localhost ~]$ cd /database
[oracle@weblogic28 database]$./runInstaller

Oracle ORA-01102故障: cannot mount database in EXCLUSIVE mode

SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup
oracle instance started.

Total System Global Area 276824064 bytes
Fixed Size 778736 bytes
Variable Size 137371152 bytes
Database Buffers 138412032 bytes
Redo Buffers 262144 bytes
ORA-01102: cannot mount database in EXCLUSIVE mode

出现这个问题,可能是由于断电的问题,解决方法是

出现1102错误可能有以下几种可能:

一、在HA系统中,已经有其他节点启动了实例,将双机共享的资源(如磁盘阵列上的裸设备)占用了;

二、说明 oracle 被异常关闭时,有资源没有被释放,一般有以下几种可能,

1、 oracle 的共享内存段或信号量没有被释放;

2、 oracle 的后台进程(如SMON、PMON、DBWn等)没有被关闭;

3、 用于锁内存的文件lk和sgadef.dbf文件没有被删除。

首先,虽然我们的系统是HA系统,但是备节点的实例始终处在关闭状态,这点通过在备节点上查数据库状态可以证实。

其次、是因系统掉电引起数据库宕机的,系统在接电后被重启,因此我们排除了第二种可能种的1、2点。最可疑的就是第3点了。

查$ORACLE_HOME/dbs目录:

$ cd $ORACLE_HOME/dbs
$ ls sgadef*
sgadef* not found
$ ls lk*
lkORA92

果然,lk文件没有被删除。将它删除掉

$ rm lk*

再启动数据库,成功。

如果怀疑是共享内存没有被释放,可以用以下命令查看:

$ipcs -mop
IPC status from /dev/kmem as of Thu Jul 6 14:41:43 2006
T ID KEY MODE OWNER GROUP NATTCH CPID LPID
Shared Memory:
m 0 0×411c29d6 –rw-rw-rw- root root 0 899 899
m 1 0×4e0c0002 –rw-rw-rw- root root 2 899 901
m 2 0×4120007a –rw-rw-rw- root root 2 899 901
m 458755 0×0c6629c9 –rw-r—– root sys 2 9113 17065
m 4 0×06347849 –rw-rw-rw- root root 1 1661 9150
m 65541 0xffffffff –rw-r–r– root root 0 1659 1659
m 524294 0×5e100011 –rw——- root root 1 1811 1811
m 851975 0×5fe48aa4 –rw-r—– oracle oinstall 66 2017 25076

然后它ID号清除共享内存段:

$ipcrm –m 851975

对于信号量,可以用以下命令查看:

$ ipcs -sop
IPC status from /dev/kmem as of Thu Jul 6 14:44:16 2006
T ID KEY MODE OWNER GROUP
Semaphores:
s 0 0×4f1c0139 –ra——- root root
… …
s 14 0×6c200ad8 –ra-ra-ra- root root
s 15 0×6d200ad8 –ra-ra-ra- root root
s 16 0×6f200ad8 –ra-ra-ra- root root
s 17 0xffffffff –ra-r–r– root root
s 18 0×410c05c7 –ra-ra-ra- root root
s 19 0×00446f6e –ra-r–r– root root
s 20 0×00446f6d –ra-r–r– root root
s 21 0×00000001 –ra-ra-ra- root root
s 45078 0×67e72b58 –ra-r—– oracle oinstall

根据信号量ID,用以下命令清除信号量:

$ipcrm -s 45078

如果是 oracle 进程没有关闭,用以下命令查出存在的 oracle 进程:

$ ps -ef|grep ora
oracle 29976 1 0 Jun 22 ? 0:52 ora_dbw0_ora92
oracle 29978 1 0 Jun 22 ? 0:51 ora_dbw1_ora92
oracle 5128 1 0 Jul 5 ? 0:00 oracleora92 (LOCAL=NO)
… …

然后用kill -9命令杀掉进程

$kill -9 

总结:

当发生1102错误时,可以按照以下流程检查、排错:

1.如果是HA系统,检查其他节点是否已经启动实例;
2.检查 oracle 进程是否存在,如果存在则杀掉进程;
3.检查信号量是否存在,如果存在,则清除信号量;
4.检查共享内存段是否存在,如果存在,则清除共享内存段;
5.检查锁内存文件lk和sgadef.dbf是否存在,如果存在,则删除

当丢失控制文件但重做日志文件还在时如何恢复数据库

在使用resetlogs选重建控制文件后在打开数据库时会报错,错误信息如下:

ERROR at line 1:
ORA-01092: ORACLE instance terminated. Disconnection forced

而一般情况下如果数据文件和日志文件都在使用noresetlogs创建控制文件
后recover数据库是打开数据库.就是不明白为什么会报ora-01092这个错误
所以我就删除原来的重做日志文件

SQL> CREATE CONTROLFILE   set Database ocp  noresetlogs
  2    MAXLOGFILES 16
  3    MAXLOGMEMBERS 3
  4    MAXDATAFILES 100
  5    MAXINSTANCES 8
  6    MAXLOGHISTORY 292
  7  LOGFILE
  8  GROUP 1 'D:\oracle\product\10.2.0\oradata\ocp\RED001.LOG'SIZE 50M,
  9  GROUP 2 'D:\oracle\product\10.2.0\oradata\ocp\RED002.LOG'SIZE 50M,
 10  GROUP 3 'D:\oracle\product\10.2.0\oradata\ocp\RED003.LOG'SIZE 50M
 11  DATAFILE
 12  'D:\oracle\product\10.2.0\oradata\ocp\SYSTEM01.DBF',
 13  'D:\oracle\product\10.2.0\oradata\ocp\UNDOTBS01.DBF',
 14  'D:\oracle\product\10.2.0\oradata\ocp\SYSAUX01.DBF',
 15  'D:\oracle\product\10.2.0\oradata\ocp\USERS01.DBF'
 16  CHARACTER SET ZHS16GBK
 17  ;

控制文件已创建。

SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: ??????????? RESETLOGS ? NORESETLOGS ??


SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: ?? 1 ?????????????
ORA-01110: ???? 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\SYSTEM01.DBF'


SQL> alter database add logfile group 1;
alter database add logfile group 1
*
第 1 行出现错误:
ORA-01184: ????? 1 ???


SQL> select group#,sequence#,members,bytes,status,archived from v$log;

    GROUP#  SEQUENCE#    MEMBERS      BYTES STATUS           ARC
---------- ---------- ---------- ---------- ---------------- ---
         1          0          1   52428800 UNUSED           YES
         3          0          1   52428800 CURRENT          YES
         2          0          1   52428800 UNUSED           YES

SQL> ALTER DATABASE ADD LOGFILE GROUP 4
  2      ('D:\oracle\product\10.2.0\oradata\ocp\redo04a.log','D:\oracle\product\
10.2
  3  .0\oradata\ocp\redo04b.log')
  4      SIZE 512 M;
ALTER DATABASE ADD LOGFILE GROUP 4
*
第 1 行出现错误:
ORA-00301: ?????? 'D:\oracle\product\10.2
.0\oradata\ocp\redo04b.log' ??? - ??????
ORA-27040: ??????, ??????
OSD-04002: ????????????
O/S-Error: (OS 123) ????????????????????????????????


SQL> ALTER DATABASE ADD LOGFILE GROUP 4
  2      ('D:\oracle\product\10.2.0\oradata\ocp\redo04a.log','D:\oracle\product\
10.2.0\oradata\ocp\redo04b.log')
  3      SIZE 50 M;

数据库已更改。

SQL>  alter database drop logfile group 1;

数据库已更改。

SQL>  alter database drop logfile group 2;

数据库已更改。

SQL> recover database until cancel;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????


SQL> alter database open resetlogs;
alter database open resetlogs
*
第 1 行出现错误:
ORA-01194: ?? 1 ?????????????
ORA-01110: ???? 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\SYSTEM01.DBF'


SQL> recover database;
ORA-00283: ??????????
ORA-01610: ?? BACKUP CONTROLFILE ??????????


SQL> create pfile from spfile;

文件已创建。

在创建的initSID.ora的初始化参数文件中加入以下参数:

_allow_resetlogs_corruption=true
_allow_terminal_recovery_corruption=true
undo_tablespace='SYSTEM'
undo_management='MANUAL'
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> startup mount pfile=D:\oracle\product\10.2.0\db_1\database\initocp.ora
ORACLE 例程已经启动。

Total System Global Area  612368384 bytes
Fixed Size                  1250428 bytes
Variable Size              88083332 bytes
Database Buffers          515899392 bytes
Redo Buffers                7135232 bytes
数据库装载完毕。


SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01113: 文件 1 需要介质恢复
ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\OCP\SYSTEM01.DBF'

SQL> recover datafile 1;
完成介质恢复。
SQL> recover datafile 2;
完成介质恢复。
SQL> recover datafile 3;
完成介质恢复。
SQL> recover datafile 4;
完成介质恢复。
SQL> recover datafile 5;
ORA-01179: 文件 5 不存在


SQL> alter database open;

数据库已更改。

dbms_metadata.get_ddl()来获得对象的定义语句

今天打算将一个数据库的索引在另一个测试库上重新创建一遍,研究了一下。

set pagesize 0
set long 90000
set feedback off
set echo off
spool all_index.sql
SELECT DBMS_METADATA.GET_DDL('INDEX',u.index_name)
FROM USER_INDEXES u;
spool off;
最后找个编辑器替换一下表空间名,在表空间名后面加上个;
然后让ORACLE慢慢执行吧
其实是调用DBMS_METADATA.GET_DDL这个外部过程来获得创建DLL语句,还能获得很多东西

这个是所有用户的创建DLL
SELECT DBMS_METADATA.GET_DDL('USER',U.username)
FROM DBA_USERS U;
这个是所有表的DLL
SELECT DBMS_METADATA.GET_DDL('TABLE',u.table_name)
FROM USER_TABLES u;

所有表空间的DLL

SELECT DBMS_METADATA.GET_DDL('TABLESPACE', TS.tablespace_name)
FROM DBA_TABLESPACES TS;

组合一下,所有表,索引存储过程

SELECT DBMS_METADATA.GET_DDL(U.OBJECT_TYPE, u.object_name)
  FROM USER_OBJECTS u
 where U.OBJECT_TYPE IN ('TABLE','INDEX','PROCEDURE');

另外一个相关的语句生成删除某个用户全部索引的语句

select 'drop index '||index_name||';' form. user_indexes;