这两天遇到客户因为误操作,将RAC环境下的所有共享存储格式化掉了,客户只有一个最近的RMAN的0级全备(无数据文件,无控制文件,无归档日志,无redo日志),需要帮忙恢复。将大致的恢复过程记录一下。
0.恢复共享存储是第一步,给存储原厂打电话,原厂推是os的问题,让给os打电话,结果只能初始化了,最后只能恢复到被识别的状态,一切从头开始。
1.因为集群软件是装在本地的,所以恢复rac的集群环境,只需要将ocr和vdisk重新配置一下,就可以了。可以执行root.sh脚本来进行重新的配置,如果中间报一个已经被配置过的提示,那就先用dd清除ocr和vdisk的信息,并删除相应的目录文件,如下:
rm -rf /usr/tmp/.oracle /var/tmp/.oracle /tmp/.oracle /etc/oracle/* /var/opt/oracle/*
rm -rf /etc/init.cssd /etc/init.crs* /etc/init.evmd /etc/init.d/init.cssd /etc/init.d/init.crs
rm -rf /etc/init.d/init.crsd /etc/init.d/init.evmd /etc/rc3.d/K96init.crs /etc/rc3.d/S96init.crs
rm -rf /etc/rc.d/rc2.d/K96init.crs /etc/rc.d/rc2.d/S96init.crs
2.恢复完集群环境之后,开始恢复数据库。因为询问到客户有去年年底的一个RMAN的0级全备,以及控制文件的快照没有放到共享存储上,故可以采用重建控制文件+restore备份的方法来恢复。中途遇到很多问题,因为所有的日志备份均放到共享存储下的,故这次恢复在recover的步骤时是没有日志用来补充的。所以restore databse until 时间后,再recover,再alter database open resetlogs后,会报一个需要恢复数据文件的错误提示,操作的时候运气不好,刚好遇到的是需要恢复datafile 1,再折腾了几个小时候,终于发现按照正常的手段是行不通的.
3.因为没有日志,无法使得数据库达到一致性,所以只有采取修改隐藏参数的办法来忽略数据库的不一致,来强行打开数据库.先将数据库打到mount状态,在做完restore,recover之后,将隐藏参数修改 alter system set "_allow_resetlogs_corruption"=true scope=spfile;再shutdown数据库,启动到mount状态之后,alter database open resetlogs; resetlogs打开数据库后,运气仍然不是太好,又遇到了ORA-00600 2662号的错误.
4. 当使用修改_allow_resetlogs_corruption ,再打开数据库时遇到了ORA-00600 2662号的错误, 如果SCN相差不多,可以通过多次重起数据库解决 ,但是这次遇到的SCN相差很大(通过查v$datafile和v$datafile_header的CHECKPOINT_CHANGE#来判断),这个时候只有再修改另外一个隐藏参数 _minimum_giga_scn来解决问题._minimum_giga_scn的作用是推进SCN号,该参数值的单位是billion,也就是说设置了该参数后,SCN号会变成XX* (1024*1024*1024) ,XX可以通过2662的几个参数来确定. 2662后的参数[2662],[a],[b],[c],[d],[e]…[a] Current SCN WRAP,[b] Current SCN BASE,[c] dependent SCN WRAP,[d] dependent SCN BASE,[e] Where present this is the DBA where the dependent SCN came from.
5.当修改了2个隐藏参数之后,数据库终于能启动了,但是alert日志还是会报一些600的错误,暂时忽略.用exp(expdp可能会报错)将数据全部导出,重建新的实例,再用imp导入数据到新的库中.exp的时候需要注意一个参数compress,这个参数可以降低HWM,使的imp的时候,时间相对尽量少一些.
posted @
2012-04-12 00:24 xrzp 阅读(392) |
评论 (0) |
编辑 收藏
早上做个实验,update数据的时候报错ora-30036:无法按8扩展段(在还原表空间‘undotbs_new’中)
1.查询了一下undo表空间的使用,发现已经超过了80%
SELECT a.tablespace_name as tablespace_name,
to_char(b.total/1024/1024,999999.99) as Total,
to_char((b.total-a.free)/1024/1024,999999.99) as Used,
to_char(a.free/1024/1024,999999.99) as Free,
to_char(round((total-free)/total,4)*100,999.99) as Used_Rate
FROM (SELECT tablespace_name, sum(bytes) free FROM DBA_FREE_SPACE GROUP BY tablespace_name) a,
(SELECT tablespace_name, sum(bytes) total FROM DBA_DATA_FILES GROUP BY tablespace_name ) b
WHERE a.tablespace_name=b.tablespace_name
AND a.tablespace_name='UNDOTBS_NEW'
ORDER BY a.tablespace_name;
2.将undo表空间大小重新加大点,解决问题~
alter database datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\UNTOTBS_NEW_01.DBF' resize 2048M;
posted @
2011-11-07 10:30 xrzp 阅读(18057) |
评论 (0) |
编辑 收藏
v$sqltext:存储的是完整的SQL,SQL被分割
v$sqlarea:存储的SQL 和一些相关的信息,比如累计的执行次数,逻辑读,物理读等统计信息.v$sqlarea 忽略了执行计划等差异,只是在形式上sql文本看起来一样.相当于做了个聚合,是多个不同执行计划的sql的聚合和累计信息
v$sql:存储的是具体的SQL 和执行计划相关信息,v$sqlarea 可以看做 v$sql 根据 sqltext 等 做了 group by 之后的信息
v$sql_plan:代表了具体的sql的执行计划,通过下面3个字段做连接(与v$sql)
ADDRESS RAW(4),HASH_VALUE NUMBER,CHILD_NUMBER NUMBER
posted @
2011-11-07 00:00 xrzp 阅读(346) |
评论 (0) |
编辑 收藏
这几天安装oracle,检查包的时候,发现一些包没有装上,使用rpm来装的时候,又发现包的依耐性很重,所以就搭建一个本地的源,使用yum install来安装.
1.挂载安装介质
mount /dev/cdrom /mnt/cdrom
如果是实体机:
mount -o loop 镜像所在目录 挂载点
2.vi /etc/yum.repos.d/server.repo
[dange] #随意填
name=red hat #随意填
baseurl=file:///mnt/cdrom/RedHat/Server #光盘挂载,Server目录所在路径
enable=1 #yum开关
gpgcheck=1 #是否检查密钥
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release #密钥所在地
3.如果安装软件包提示没有key的话导入key
cd /mnt/cdrom
rpm --import RPM-GPG-KEY-redhat-release //安装验证文件,导入key
yum list //列出仓库中的所有软件,查看yum是否搭建成功
yum clean all //清空yum仓库
4.OK,可以直接使用yum install了
posted @
2011-10-20 09:22 xrzp 阅读(408) |
评论 (0) |
编辑 收藏
1.现象:装clusterware,执行第二个脚本的时候可能会报错
Running vipca(silent) for configuring nodeapps
/u01/app/oracle/crs/jdk/jre//bin/java: error while loading shared libraries: libpthread.so.0: cannot open shared object file: No such file or directory
2. 解决方案:分别修改 $CRS_HOME/bin 目录下的srvctl和vipca文件,在vipca文件ARGUMENTS=""行之前和srvctl文件的export LD_ASSUME_KERNEL行之后增加 unset LD_ASSUME_KERNEL 语句.
修改之后再用root用户执行vipca就可以了.
posted @
2011-10-16 23:31 xrzp 阅读(312) |
评论 (0) |
编辑 收藏
Mount Options for Oracle files when used with NAS devices [ID 359515.1] |
|
| 修改时间 23-SEP-2011 类型 BULLETIN 状态 PUBLISHED | |
In this Document
Purpose
Scope and Application
Mount Options for Oracle files when used with NAS devices
RAC
Single Instance
References
Applies to:
Oracle Server - Enterprise Edition - Version: 10.1.0.2 to 11.2.0.2 - Release: 10.1 to 11.2
Information in this document applies to any platform.
Oracle Clusterware, Oracle Real Application Clusters, NASPurpose
The purpose of this bulletin is to document the options with which the NAS systems should be mounted. This note does not cover the new dNFS feature that was introduced in 11g.
Scope and Application
This document is relevant to all environments using Oracle Clusterware & RAC.
Mount Options for Oracle files when used with NAS devices
RAC
In the table below
- Binaries is the shared mount points where the Oracle Home and CRS_HOME is installed.
- Datafiles includes Online Logs, Controlfile and Datafiles
- nfsvers and vers are identical on those OS platforms that has nfsvers. The ver option is an alternative to the nfsvers option. It is included for compatibility with other operating systems
- Please note that the mount options on each of the following cells are applicable only to those type of files listed in the column heading.
- For RMAN backup sets, image copies, and Data Pump dump files, the "NOAC" mount option should not be specified - that is because RMAN and Data Pump do not check this option and specifying this can adversely affect performance.
Operating System | Mount options for Binaries ## | Mount options for Oracle Datafiles | Mount options for CRS Voting Disk and OCR |
Sun Solaris * | rw,bg,hard,nointr,rsize=32768, wsize=32768,proto=tcp,noac, vers=3,suid | rw,bg,hard,nointr,rsize=32768, wsize=32768,proto=tcp,noac, forcedirectio, vers=3,suid | rw,bg,hard,nointr,rsize=32768, wsize=32768,proto=tcp,vers=3, noac,forcedirectio |
AIX (5L) ** | rw,bg,hard,nointr,rsize=32768, wsize=32768,proto=tcp, vers=3,timeo=600 | cio,rw,bg,hard,nointr,rsize=32768, wsize=32768,proto=tcp,noac, vers=3,timeo=600 | cio,rw,bg,hard,intr,rsize=32768, wsize=32768,tcp,noac, vers=3,timeo=600 |
HPUX 11.23 *** -- | rw,bg,vers=3,proto=tcp,noac, hard,nointr,timeo=600, rsize=32768,wsize=32768,suid | rw,bg,vers=3,proto=tcp,noac, forcedirectio,hard,nointr,timeo=600, rsize=32768,wsize=32768,suid | rw,bg,vers=3,proto=tcp,noac, forcedirectio,hard,nointr,timeo=600 ,rsize=32768,wsize=32768,suid |
Windows | Not Supported | Not Supported | Not Supported |
Linux x86 # ****
| rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp, vers=3, timeo=600, actimeo=0 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,actimeo=0, vers=3,timeo=600 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,noac,actimeo=0, vers=3,timeo=600 |
Linux x86-64 # ****
| rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,vers=3, timeo=600, actimeo=0 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,actimeo=0, vers=3,timeo=600 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,noac,vers=3, timeo=600,actimeo=0 |
Linux - Itanium | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,vers=3, timeo=600, actimeo=0 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,actimeo=0, vers=3,timeo=600 | rw,bg,hard,nointr,rsize=32768, wsize=32768,tcp,noac,vers=3, timeo=600,actimeo=0 |
* NFS mount option “forcedirectio” is required on Solaris platforms when mounting the OCR/CRS files when using Oracle 10.1.0.4 or 10.2.0.2 or later (Oracle unpublished bug 4466428)
** AIX is only supported with NAS on AIX 5.3 TL04 and higher with Oracle 10.2.0.1 and later (NetApp)
*** NAS devices are only supported with HPUX 11.23 or higher ONLY
**** As per BUG 11812928, the 'intr' & 'nointr' are deprecated in OEL 5.6 kernels and up including Oracle Linux 6. It is harmless to still include it, but the "NFS: ignoring mount option: nointr" will appears. This message can be ingnored.
# These mount options are for Linux kernels 2.6 and above for older kernels please check Note 279393.1
Due to Unpublished bug 5856342, it is necessary to use the following init.ora parameter when using NAS with all versions of RAC on Linux (x86 & X86-64 platforms) until 10.2.0.4. This bug is fixed and included in 10.2.0.4 patchset.
filesystemio_options = DIRECTIO
Single Instance
Operating System | Mount options for Binaries | Mount options for Oracle Datafiles |
Sun Solaris * (8, 9, 10) | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,proto=tcp,suid | rw,bg,hard,rsize=32768,wsize=32768,vers=3,[forcedirectio or llock],nointr,proto=tcp,suid |
AIX (5L) ** | rw,bg,hard,rsize=32768,wsize=32768,vers=3,intr,timeo=600,proto=tcp | rw,bg,hard,rsize=32768,wsize=32768,vers=3,cio,intr,timeo=600,proto=tcp |
HPUX 11.23 **** | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,proto=tcp,suid | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,proto=tcp, suid, forcedirectio |
Windows | Not Supported | Not Supported |
Linux x86 # | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp,actimeo=0* |
Linux x86-64 # | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp,actimeo=0* |
Linux - Itanium | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp | rw,bg,hard,rsize=32768,wsize=32768,vers=3,nointr,timeo=600,tcp |
* actime=0 or noac can be used
References
http://now.netapp.com/Knowledgebase/solutionarea.asp?id=kb7518
http://linux.oracle.com/pls/apex/f?p=102:2:3947951439689189::NO::P2_VC_ID:424
相关内容
|
posted @
2011-10-16 23:16 xrzp 阅读(1529) |
评论 (0) |
编辑 收藏
1.检查时区:
检查/etc/sysconfig/clock设置:
ZONE="Asia/Shanghai"(Linux会拷贝/usr/share/zoneinfo/Asia/Shanghai 到/etc/locatime作为本地时区,如果我们需要改变时区,那么只需要修改/etc/sysconfig/clock,并且将对应的/usr/share/zoneinfo/Asia的时区文件拷贝成/etc/localtime即可)
UTC=false
ARC=false
2.安装NTP包:
rpm -ivh ntp-xxxxxx.rpm
或者:
yum install ntp
3.编辑/etc/ntp.conf文件:
服务端:
server 127.127.1.0
fudge 127.127.1.0 stratum 11
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
客户端:
server 192.168.0.11 prefer #192.168.0.11为服务端的ip地址
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
4.重启ntp服务:
service ntpd restart
5.等待5分钟,测试客户端更新时间:
ntpdate 192.168.0.11
Oct 16 21:09:28 ntpdate[8316]: step time server 192.168.0.11 offset -1791.709393 sec
6.在客户端将更新时间加入crontab:
(1).cp /usr/sbin/ntpdate /usr/bin/
(2).crontab –e
加入
*/1 * * * * /usr/sbin/ntpdate 192.168.0.11 ; hwclock –w
posted @
2011-10-16 23:14 xrzp 阅读(414) |
评论 (0) |
编辑 收藏
gunzip xxx.cpio.gz
cpio -idcmv < xxx.cpio
posted @
2011-10-16 23:02 xrzp 阅读(452) |
评论 (1) |
编辑 收藏
1.查看版本
crsctl query crs softwareversion
crsctl query crs activeversion
2.管理
srvctl start nodeapps -n <node1 hostname>
srvctl start nodeapps -n <node2 hostname>
srvctl start asm -n <node1 hostname>
srvctl start asm -n <node2 hostname>
srvctl start database -d <database name>
srvctl start service -d <database name> -s <service name>
crs_stat -t
srvctl stop service -d <database name> -s <service name>
srvctl stop database -d <database name>
srvctl stop asm -n <node1 hostname>
srvctl stop asm -n <node2 hostname>
srvctl stop nodeapps -n <node1 hostname>
srvctl stop nodeapps -n <node2 hostname>
crs_stat -t
posted @
2011-10-16 23:01 xrzp 阅读(257) |
评论 (0) |
编辑 收藏
当服务器没有装图形化界面的时候,如不能使用xhost之类的命令,就不能使用vnc了,那这个时候可以使用xmanager来代替
1.网上可以下载一个xmanager企业版,下载完后打开Xbrowser,在help-->about Xbrowser中输入注册码
2.在服务器端
DISPLAY=192.168.X.X:0.0
export DISPLAY
echo $DISPLAY
3.使用xmanager的xshell来打开图形化界面.(有可能会提醒运行一个rootpre之类的脚本)
posted @
2011-10-14 01:35 xrzp 阅读(503) |
评论 (0) |
编辑 收藏
在Redhat5之前通过/etc/sysconfig/rawdevices配置raw的控制文件,通过/etc/init.d/rawdevices来管理raw设备的启动和关闭.
在Redhat5之后,需要编辑/etc/udev/rules.d/60-raw.rules 这个文件.
1.假设已经把一个硬盘新建了几个区
fdisk -l /dev/sdc
/dev/sdc1
/dev/sdc2
/dev/sdc3
2.修改/etc/udev/rules.d/60-raw.rules
添加:
ACTION=="add", KERNEL=="sdc1",RUN+="/bin/raw /dev/raw/raw1 %N"
ACTION=="add", KERNEL=="sdc2",RUN+="/bin/raw /dev/raw/raw2 %N"
ACTION=="add", KERNEL=="sdc3",RUN+="/bin/raw /dev/raw/raw3 %N"
假设这个设备是给oracle用的,那再加上权限
KERNEL=="raw[1-3]*", NAME="raw/%k" OWNER="oracle" GROUP="oinstall", MODE="0660"
3.修改完之后重启服务
start_udev
4.查看
raw -qa 或者 ls -lrt /dev/raw/
5.取消映射
raw /dev/raw/rawX 0 0
posted @
2011-10-14 01:28 xrzp 阅读(445) |
评论 (0) |
编辑 收藏
1.停止数据库
2.停止Listener
3.用su或者重新登录到root将oracle安装目录删除
4.将/usr/bin下的文件删除(删除这三个文件后,Oracle就不能使用了)
rm /usr/local/bin/dbhome
rm /usr/local/bin/oraenv
rm /usr/local/bin/coraenv
5.将/etc/oratab删除
6.将/etc/oraInst.loc删除
7.将oracle用户删除(若要重新安装,可以不删除)
8.将用户组删除(若要重新安装,可以不删除)
posted @
2011-10-14 01:22 xrzp 阅读(343) |
评论 (1) |
编辑 收藏
做一个awr报告,在Load Profile可以查看到每秒的redo size(单位是byte),而redo log一般切换时间是1小时2-3次,按照3次来计算,就是20分钟切换一次,所以redo log的大小就 = (redo size per second) * 60 * 20.
如果不能做awr报告,就去查看alert日志,看日志的切换频率,根据切换的频率来确定redo log的大小.
可能会用到的sql语句:
select * from v$logfile;
select * from v$log;
alter database add logfile group x ('F:\oraredolog\REDO0x.LOG') size xxxM;
alter database drop logfile group x;
alter system switch logfile;
alter system checkpoint;
posted @
2011-10-10 13:34 xrzp 阅读(627) |
评论 (0) |
编辑 收藏
在虚拟机上起动系统的时候,每次都发现Sendmail服务很费时间,决定将其关闭了,反正也没怎么用.
1.关闭sendmail服务
[root@node1 ~]# /etc/rc.d/init.d/sendmail stop
Shutting down sm-client: [ OK ]
Shutting down sendmail: [ OK ]
2.
关闭sendmail自启动
[root@node1 ~]# chkconfig sendmail off
3.确认sendmail自启动已被关闭
[root@node1 ~]# chkconfig --list sendmail
sendmail 0:off 1:off 2:off 3:off 4:off 5:off 6:off
posted @
2011-10-10 11:36 xrzp 阅读(358) |
评论 (0) |
编辑 收藏
V9.7中提供了更简单易用的降低高水位标记功能。只需要使用ALTER TABLESPACE命令就可以达到效果。同时DB2还提供了两个表函数MON_GET_TABLESPACE和MON_GET_EXTENT_MOVEMENT_STATUS来获取和监控表空间以及数据块移动信息。
1.MON_GET_TABLESPACE语法
MON_GET_TABLESPACE--(--tbsp_name--,--member--)
tbsp_name是表空间对象,如果是空值,则会对所有的表空间操作。member的默认输入是-1,指当前成员,如果是-2,则是所有数据库成员。这个函数的返回值说明:
tbsp_name:表空间名
tbsp_type:表空间类型
tbsp_state:表空间状态
tbsp_used_pages:已使用页
tbsp_free_pages:空闲页
tbsp_total_pages:总页
tbsp_page_top:高水位标记页
reclaimble_space_enabled:值1代表可回收空间
select * from table(MON_GET_TABLESPACE(null,-2));
2.获取表空间信息
SELECT varchar(tbsp_name, 16) as tbsp_name,
RECLAIMABLE_SPACE_ENABLED,
TBSP_USED_PAGES,
TBSP_FREE_PAGES,
TBSP_PAGE_TOP
from TABLE(MON_GET_TABLESPACE('', -2)) AS t
where t.TBSP_PAGE_TOP > t.TBSP_USED_PAGES
该语句筛选出了所有高水位标记大于已使用页的表空间
3.ALTER TABLESPACE 语法
ALTER TABLESPACE--tablespace-name----------------------------> >----+-REDUCE--+-------------------------------+--+-----------------------------+-+ | +-| database-container-clause |-+ '-| on-db-partitions-clause |-' | | +-| all-containers-clause |-----+ | | +-MAX---------------------------+ | | +-STOP--------------------------+ | | '-integer--+---------+----------' | | +-K-------+ | | +-M-------+ | | +-G-------+ | | '-PERCENT-' | +-LOWER HIGH WATER MARK--+------+--------------------------------------------+ | '-STOP-' | '----------------------------------------------------------------------------'
MAX参数可以指定最大限度的降低高水位标记来释放空间。在运行REDUCE命令后,在数据块移动的过程中,也可以使用STOP参数来停止表空间移动。如果是DMS表空间,则需要先运行LOWER HIGH WATER MARK子句降低高水位标记,再运行REDUCE子句释放表空间。如果是启用了自动存储的表空间,直接运行REDUCE子句即可。
自动存储表空间
ALTER TABLESPACE REDUCE 100 M(MAX)
DMS 表空间
ALTER TABLESPACE LOWER HIGH WATER MARK ALTER TABLESPACE REDUCE (ALL CONTAINERS 10 M(MAX))
4.MON_GET_EXTENT_MOVEMENT_STATUS语法
MON_GET_EXTENT_MOVEMENT_STATUS--(--tbsp_name--,--member--)
tbsp_name 是表空间对象,如果是空值,则会对所有的表空间操作。member 的默认输入是 -1,指当前成员,如果是 -2,则是所有数据库成员。这个函数的返回值说明:
tbsp_name:表空间名
tbsp_id:表空间id
member:成员
current_extent:当前正在移动数据块
last_extent:最后移动的数据块
num_extents_moved:已移动的数据块
num_extents_left:未移动的数据块
total_move_time:总移动时间(微秒)
5.监视表空间的移动
SELECT varchar(tbsp_name, 20) as tbsp_name,
NUM_EXTENTS_MOVED,
NUM_EXTENTS_LEFT,
TOTAL_MOVE_TIME
from TABLE(MON_GET_EXTENT_MOVEMENT_STATUS('TBS1', -2)) AS t
6.验证高水位标记的降低
SELECT varchar(tbsp_name, 16) as tbsp_name,
BSP_USED_PAGES,
TBSP_FREE_PAGES,
TBSP_PAGE_TOP
from TABLE(MON_GET_TABLESPACE('TBS1', -2)) AS t
posted @
2011-10-08 10:20 xrzp 阅读(2932) |
评论 (1) |
编辑 收藏
1.查看表空间信息
使用list tablespaces show detail
需要关注的几个参数
Tablespace ID:db2dart工具需要以这个ID作为参数
表的类型:只有DMS管理的表空间才有HWM的标记属性
Used pages和High water mark:如果相等,说明高水位标记下没有空闲页可以被释放
2.查看HWM标记信息
使用db2dart dbname /DHWM /TSI tbsid
3.降低高水位标记建议
使用db2dart dbname /LHWM /TSI tbsid /NP 0
posted @
2011-10-08 09:52 xrzp 阅读(338) |
评论 (0) |
编辑 收藏
1.对索引结构进行统计
1.1analyze index indexname validate structure
联机文档的原文:Specify VALIDATE STRUCTURE to validate the structure of the analyzed object.
The statistics collected by this clause are not used by the Oracle Database optimizer, as are statistics collected by the COMPUTE STATISTICS and ESTIMATE STATISTICS clauses.
For an index, Oracle Database verifies the integrity of each data block in the index and checks for block corruption. This clause does not confirm that each row in the table has an index entry or that each index entry points to a row in the table. You can perform these operations by validating the structure of the table with the CASCADE clause.
这个命令主要是用来分析索引的数据块是否有坏块,以及根据分析得到的数据(存放在index_stats)來判断索引是否需要重新建立。
1.2 validate structure有二中模式:online, offline, 默认是offline模式。
联机文档原文:
Specify ONLINE to enable Oracle Database to run the validation while DML operations are ongoing within the object. The database reduces the amount of validation performed to allow for concurrency.
Specify OFFLINE, to maximize the amount of validation performed. This setting prevents INSERT, UPDATE, and DELETE statements from concurrently accessing the object during validation but allows queries. This is the default.
Restriction on ONLINE
You cannot specify ONLINE when analyzing a cluster or index.
Note:
When you validate the structure of an object ONLINE, Oracle Database does not collect any statistics, as it does when you validate the structure of the object OFFLINE.
以offline模式分析时,会对表加一个4级別的锁(表共享),对run系統可能造成一定的影响。
而online模式则没有表lock的影响,但当以online模式分析时, 在视图index_stats没有统计信息。
2.对索引状态进行统计
analyze index indexname compute statistics
联机文档原文:
COMPUTE STATISTICS instructs Oracle Database to compute exact statistics about the analyzed object and store them in the data dictionary. When you analyze a table, both table and column statistics are collected.
Both computed and estimated statistics are used by the Oracle Database optimizer to choose the execution plan for SQL statements that access analyzed objects. These statistics may also be useful to application developers who write such statements.
Column statistics appear in the data dictionary views USER_TAB_COLUMNS, ALL_TAB_COLUMNS, and DBA_TAB_COLUMNS. Histograms appear in the data dictionary views USER_TAB_HISTOGRAMS, DBA_TAB_HISTOGRAMS, and ALL_TAB_HISTOGRAMS; USER_PART_HISTOGRAMS, DBA_PART_HISTOGRAMS, and ALL_PART_HISTOGRAMS; and USER_SUBPART_HISTOGRAMS, DBA_SUBPART_HISTOGRAMS, and ALL_SUBPART_HISTOGRAMS.
总的来说,compute statistics是用来统计index的分析信息,来为CBO服务的。9i之后推荐使用dbms_stats。
ps:
for table的统计信息存在于视图:user_tables 、all_tables、dba_tables
for all indexes的统计信息存在于视图: user_indexes 、all_indexes、dba_indexes
for all columns的统计信息存在于试图:user_tab_columns、all_tab_columns、dba_tab_columns
3.一些sample
3.1使用validate structure分析一个索引是否需要重建
(1)analyze index index_name validate structure;
(2)select t.del_lf_rows_len /t.lf_blk_len from index_stats t where t.name = &index_name;
(3)如果结果大于20%,index就需要被rebuild了。
4.对于分区表,建议使用DBMS_STATS,而不是使用Analyze语句。
(1)可以并行进行,对多个用户,多个Table
(2)可以得到整个分区表的数据和单个分区的数据。
(3)可以在不同级别上Compute Statistics:单个分区,子分区,全表,所有分区
(4)可以导出统计信息
(5)可以用户自动收集统计信息
5.DBMS_STATS的缺点
(1)不能Validate Structure
(2)不能收集CHAINED ROWS, 不能收集CLUSTER TABLE的信息,这两个仍旧需要使用Analyze语句。
(3)DBMS_STATS 默认不对索引进行Analyze,因为默认Cascade是False,需要手工指定为True
6.对于oracle 9里面的External Table,Analyze不能使用,只能使用DBMS_STATS来收集信息。
posted @
2011-09-13 10:31 xrzp 阅读(374) |
评论 (0) |
编辑 收藏
事务隔离级别:一个事务对数据库的修改与并行的另一个事务的隔离程度。
两个并发事务同时访问数据库表相同的行时,可能存在以下三个问题:
1、幻想读:事务T1读取一条指定where条件的语句,返回结果集。此时事务T2插入一行新记录,恰好满足T1的where条件。然后T1使用相同的条件再次查询,结果集中可以看到T2插入的记录,这条新纪录就是幻想。
2、不可重复读取:事务T1读取一行记录,紧接着事务T2修改了T1刚刚读取的记录,然后T1再次查询,发现与第一次读取的记录不同,这称为不可重复读。
3、脏读:事务T1更新了一行记录,还未提交所做的修改,这个T2读取了更新后的数据,然后T1执行回滚操作,取消刚才的修改,所以T2所读取的行就无效,也就是脏数据。
为了处理这些问题,SQL标准定义了以下几种事务隔离级别
Oracle数据库支持READ COMMITTED 和 SERIALIZABLE这两种事务隔离级别。Oracle不支持脏读。
SQL标准所定义的默认事务隔离级别是SERIALIZABLE,但是Oracle 默认使用的是READ COMMITTED 设置隔离级别使用
SET TRANSACTION ISOLATION LEVEL
[READ UNCOMMITTED|READ COMMITTED|REPEATABLE READ|SERIALIZABLE]
posted @
2011-08-15 12:03 xrzp 阅读(313) |
评论 (0) |
编辑 收藏
1.概念设计:对用户要求描述的现实世界(可能是一个工厂、一个商场或者一个学校等),通过对其中住处的分类、聚集和概括,建立抽象的概念数据模型。这个概念模型应反映现实世界各部门的信息结构、信息流动情况、信息间的互相制约关系以及各部门对信息储存、查询和加工的要求等。所建立的模型应避开数据库在计算机上的具体实现细节,用一种抽象的形式表示出来。以扩充的实体—(E-R模型)联系模型方法为例,第一步先明确现实世界各部门所含的各种实体及其属性、实体间的联系以及对信息的制约条件等,从而给出各部门内所用信息的局部描述(在数据库中称为用户的局部视图)。第二步再将前面得到的多个用户的局部视图集成为一个全局视图,即用户要描述的现实世界的概念数据模型。
2.逻辑设计:主要工作是将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式。与此同时,可能还需为各种数据处理应用领域产生相应的逻辑子模式。这一步设计的结果就是所谓“逻辑数据库”。
3.物理设计:根据特定数据库管理系统所提供的多种存储结构和存取方法等依赖于具体计算机结构的各项物理设计措施,对具体的应用任务选定最合适的物理存储结构(包括文件类型、索引结构和数据的存放次序与位逻辑等)、存取方法和存取路径等。这一步设计的结果就是所谓“物理数据库”。
4.三者关系:由上到下,先要概念设计,接着逻辑设计,再是物理设计,一级一级设计。
posted @
2011-08-03 00:28 xrzp 阅读(346) |
评论 (0) |
编辑 收藏
直接alter index xxx rebuild tablespace xxx 不得行.
要酱紫,移动表的时候顺带一起移动:
ALTER TABLE 表名 MOVE
TABLESPACE 新表空间
LOB (字段名) STORE AS
(TABLESPACE 新表空间 );
posted @
2011-07-13 15:02 xrzp 阅读(307) |
评论 (0) |
编辑 收藏
1.报错:
Exception in thread "main" java.lang.UnsatisfiedLinkError: /tmp/OraInstall2011-07-06_03-14-36PM/jre/1.4.2/lib/i386/libawt.so: libXp.so.6: cannot open shared object file: No such file or directory
at java.lang.ClassLoader$NativeLibrary.load(Native Method)
at java.lang.ClassLoader.loadLibrary0(Unknown Source)
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at sun.security.action.LoadLibraryAction.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at sun.awt.NativeLibLoader.loadLibraries(Unknown Source)
at sun.awt.DebugHelper.<clinit>(Unknown Source)
at java.awt.Component.<clinit>(Unknown Source)
2.出错原因:缺少系统安装包:rpm -ivh libXp-1.0.0-8.i386.rpm
posted @
2011-07-06 15:26 xrzp 阅读(283) |
评论 (0) |
编辑 收藏
摘要: oracle读取数据的最小单位是块.oracle读取数据的最大限制取决于OS和oracle对多块读I/O的限制(db_file_multiblock_read_count).物理上来说,一个sql读取某个记录,得将记录读取到DB Cache中,然后才能从中或者,这个称为物理读.如果这个数据已经存在于DB Cache中,那么前台进程可以直接冲DB Cache中读取数据,这个称谓逻辑读.逻辑上来说,有...
阅读全文
posted @
2011-06-12 01:23 xrzp 阅读(180) |
评论 (0) |
编辑 收藏
1.查看隐藏参数
脚本1:
SELECT x.ksppinm NAME, y.ksppstvl VALUE, x.ksppdesc describ
FROM SYS.x$ksppi x, SYS.x$ksppcv y
WHERE x.inst_id = USERENV ('Instance')
AND y.inst_id = USERENV ('Instance')
AND x.indx = y.indx
AND x.ksppinm LIKE '%&par%' 脚本2:
select
x.ksppinm name,
y.ksppstvl value,
y.ksppstdf isdefault,
decode(bitand(y.ksppstvf,7),1,'MODIFIED',4,'SYSTEM_MOD','FALSE') ismod,
decode(bitand(y.ksppstvf,2),2,'TRUE','FALSE') isadj
from
sys.x$ksppi x,
sys.x$ksppcv y
where
x.inst_id = userenv('Instance') and
y.inst_id = userenv('Instance') and
x.indx = y.indx and
x.ksppinm like '%_&par%'
order by
translate(x.ksppinm,'_','') 2.Oracle通过一个内部参数_small_table_threshold来定义大表和小表的界限.缺省情况下该参数等于2%的数量,如果表的buffer大小小于这个参数的定义,则oracle认为它是小表,反之为大表.
select (db_cache_size/块size)*0.02 from dual
posted @
2011-06-11 20:44 xrzp 阅读(295) |
评论 (0) |
编辑 收藏
SELECT d.VALUE || '/' || LOWER(RTRIM(i.INSTANCE, CHR(0))) || '_ora_' ||
p.spid || '.trc' trace_file_name
FROM (SELECT p.spid
FROM v$mystat m, v$session s, v$process p
WHERE m.statistic# = 1
AND s.SID = m.SID
AND p.addr = s.paddr) p,
(SELECT t.INSTANCE
FROM v$thread t, v$parameter v
WHERE v.NAME = 'thread'
AND (v.VALUE = 0 OR t.thread# = TO_NUMBER(v.VALUE))) i,
(SELECT VALUE FROM v$parameter WHERE NAME = 'user_dump_dest') d
posted @
2011-06-11 19:38 xrzp 阅读(183) |
评论 (0) |
编辑 收藏
posted @
2011-06-06 20:58 xrzp 阅读(2589) |
评论 (0) |
编辑 收藏
安装clusterware之前做一个检查,./runcluvfy.sh stage -pre crsinst -n rac1,遇到反馈错误
ERROR:
User equivalence unavailable on all the nodes.
Verification cannot proceed.
网上查了下,解决方法如下
root@rac1 # mkdir -p /usr/local/bin
root@rac1 # ln -s -f /usr/bin/ssh /usr/local/bin/ssh
root@rac1 # ln -s -f /usr/bin/scp /usr/local/bin/scp
在oracle用户下:
$ exec /usr/bin/ssh-agent $SHELL
$ /usr/bin/ssh-add
再执行./runcluvfy.sh stage -pre crsinst -n rac1,rac2,就能正常检查了
[oracle@rac1 cluvfy]$ ./runcluvfy.sh stage -pre crsinst -n rac1,rac2
Performing pre-checks for cluster services setup
Checking node reachability
Node reachability check passed from node "rac1".
Checking user equivalence
User equivalence check passed for user "oracle".
Checking administrative privileges
User existence check passed for "oracle".
Group existence check passed for "oinstall".
Membership check for user "oracle" in group "oinstall" [as Primary] passed.
Administrative privileges check passed.
Checking node connectivity
Node connectivity check passed for subnet "172.16.0.0" with node(s) rac2,rac1.
WARNING:
Make sure IP address "10.10.10.51" is up and is a valid IP address on node "rac1".
Node connectivity check failed for subnet "10.10.10.0".
Suitable interfaces for the private interconnect on subnet "172.16.0.0":
rac2 eth0:172.16.40.52
rac1 eth0:172.16.40.51
ERROR:
Could not find a suitable set of interfaces for VIPs.
Node connectivity check failed.
Checking system requirements for 'crs'
Total memory check passed.
Free disk space check passed.
Swap space check passed.
System architecture check passed.
Kernel version check passed.
Package existence check passed for "make-3.79".
Package existence check passed for "binutils-2.14".
Package existence check passed for "gcc-3.2".
Package existence check passed for "glibc-2.3.2-95.27".
Package existence check passed for "compat-db-4.0.14-5".
Package existence check failed for "compat-gcc-7.3-2.96.128".
Check failed on nodes:
rac2,rac1
Package existence check failed for "compat-gcc-c++-7.3-2.96.128".
Check failed on nodes:
rac2,rac1
Package existence check failed for "compat-libstdc++-7.3-2.96.128".
Check failed on nodes:
rac2,rac1
Package existence check failed for "compat-libstdc++-devel-7.3-2.96.128".
Check failed on nodes:
rac2,rac1
Package existence check passed for "openmotif-2.2.3".
Package existence check passed for "setarch-1.3-1".
Group existence check passed for "dba".
Group existence check passed for "oinstall".
User existence check passed for "nobody".
System requirement failed for 'crs'
Pre-check for cluster services setup was unsuccessful on all the nodes.
posted @
2011-06-06 20:03 xrzp 阅读(3200) |
评论 (0) |
编辑 收藏
监控flash_recovery_area的使用情况可以查询2个视图:
1.V$FLASH_RECOVERY_AREA_USAGE:displays usage information about flashback recovery areas
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
-------------------- ------------------ ------------------------- ---------------
CONTROL FILE 0 0 0
REDO LOG 0 0 0
ARCHIVED LOG 30.81 0 61
BACKUP PIECE 0 0 0
IMAGE COPY 0 0 0
FLASHBACK LOG 12.99 8.54 70
FOREIGN ARCHIVED LOG 0 0 0
已选择7行。
SQL> select sum(PERCENT_SPACE_USED) from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)
-----------------------
43.8 2.V$RECOVERY_FILE_DEST:displays information about the disk quota and current disk usage in the flash recovery area.
SQL> select * from V$RECOVERY_FILE_DEST;
NAME SPACE_LIMIT SPACE_USED SPACE_RECLAIMABLE NUMBER_OF_FILES
---------------------------------------- ----------- ---------- ----------------- ---------------
/opt/oracle/flash_recovery_area 8589934592 3762538496 733315072 131
SQL> select round(100*(a.space_used/space_limit),2) from v$recovery_file_dest a;
ROUND(100*(A.SPACE_USED/SPACE_LIMIT),2)
---------------------------------------
43.8
posted @
2011-05-30 13:53 xrzp 阅读(1977) |
评论 (0) |
编辑 收藏
1.先将备份的控制文件和数据文件copy到原来的位置
2.mount数据库
3.RECOVER DATABASE USING BACKUP CONTROLFILE
4.ALTER DATABASE OPEN RESETLOGS;
代码如下:
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> host del D:\oracle\product\10.2.0\oradata\suredd\control*.ctl
/**//** 在此先将备份的控制文件和数据文件还原*/
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 230689668 bytes
Database Buffers 373293056 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 873855 (在 05/05/2011 15:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001
ORA-00280: 更改 873855 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 873855 (在 05/05/2011 15:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001
ORA-00280: 更改 873855 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:\oracletest\backup\suredd\REDO01.LOG
ORA-00339: 归档日志未包含任何重做
ORA-00334: 归档日志: 'E:\ORACLETEST\BACKUP\SUREDD\REDO01.LOG'
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 873855 (在 05/05/2011 15:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001
ORA-00280: 更改 873855 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:\ORACLETEST\BACKUP\SUREDD\REDO02.LOG
ORA-00339: 归档日志未包含任何重做
ORA-00334: 归档日志: 'E:\ORACLETEST\BACKUP\SUREDD\REDO02.LOG'
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE
ORA-00279: 更改 873855 (在 05/05/2011 15:47:47 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00001_0750352730.001
ORA-00280: 更改 873855 (用于线程 1) 在序列 #1 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
E:\ORACLETEST\BACKUP\SUREDD\REDO03.LOG
已应用的日志。
完成介质恢复。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
posted @
2011-05-05 16:02 xrzp 阅读(420) |
评论 (0) |
编辑 收藏
直接摘录2段话:
1.Set NORESETLOGS case
The following commands will create a new control file and use it to open the database.
Data used by Recovery Manager will be lost.
Additional logs may be required for media recovery of offline.
Use this only if the current versions of all online logs are available.
2.Set RESETLOGS case
The following commands will create a new control file and use it to open the database.
Data used by Recovery Manager will be lost.
The contents of online logs will be lost and all backups will be invalidated.
Use this only if online logs are damaged.
posted @
2011-05-05 15:39 xrzp 阅读(359) |
评论 (0) |
编辑 收藏
1.控制文件全部丢失,在线重做日志丢失,如果有备份的2进制的控制文件也不能使用,为什么呢?因为用备份的控制文件进行恢复时(
RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL),
由于使用了备份的控制文件,备份之后的归档日志信息丢失,所以需要在线重做日志来进行介质恢复,而当前的情况是在线重做日志也丢失了,所以只能进行手工创建控制文件.
2.以alter database open resetlogs打开数据库
2.1如果当初关闭数据库时是非正常关闭,那么在打开数据库之前应该先RECOVER DATABASE USING BACKUP CONTROLFILE
3.添加temp文件
代码如下:
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del D:\oracle\product\10.2.0\oradata\suredd\control*.ctl
SQL> host del D:\oracle\product\10.2.0\oradata\suredd\redo*.log
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 226495364 bytes
Database Buffers 377487360 bytes
Redo Buffers 7135232 bytes
SQL> edit
已写入 file afiedt.buf
1 CREATE CONTROLFILE REUSE DATABASE "SUREDD" RESETLOGS ARCHIVELOG
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\SUREDD\REDO01.LOG' SIZE 50M,
9 GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\REDO02.LOG' SIZE 50M,
10 GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\REDO03.LOG' SIZE 50M
11 DATAFILE
12 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSTEM01.DBF',
13 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSAUX01.DBF',
14 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\USERS01.DBF',
15 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\EXAMPLE01.DBF',
16 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF',
17 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\UNTOTBS_NEW_01.DBF'
18* CHARACTER SET ZHS16GBK
SQL> /
控制文件已创建。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\TEMP01.DBF'
2 SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;
表空间已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
posted @
2011-05-05 15:25 xrzp 阅读(539) |
评论 (0) |
编辑 收藏
摘要: 1.错误描述:在做一次恢复后,数据库能正常打开,数据表也能正常查询,但过不了多久数据库会自动down掉
2.查看alert日志,发现如下信息
Thu May 05 13:30:26 2011
Flush retried for xcb 0x333acd74, pmd 0x33bdaa68
D...
阅读全文
posted @
2011-05-05 14:53 xrzp 阅读(9759) |
评论 (2) |
编辑 收藏
1.将备份的控制文件(这里的备份指的是2进制的备份文件,非trace那个)copy到原来的位置
2.启动到mount状态
3.recover database using backup controlfile until cancel
4.再找重做联机日志恢复数据
5.alter database open resetlogs
代码如下:
SQL> alter database backup controlfile to 'c:\CONTROL01.CTL';
数据库已更改。
SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> host del D:\oracle\product\10.2.0\oradata\suredd\CONTROL*.CTL;
SQL> host copy c:\CONTROL01.CTL D:\oracle\product\10.2.0\oradata\suredd\
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 213912452 bytes
Database Buffers 390070272 bytes
Redo Buffers 7135232 bytes
ORA-00205: ?????????, ??????, ???????
SQL> shutdown immediate
ORA-01507: ??????
ORACLE 例程已经关闭。
============在此应该将备份的控制文件按照初始化文件里面设置的那样copy N份到指定的位置===================
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 213912452 bytes
Database Buffers 390070272 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
SQL> alter database open;
alter database open
*
第 1 行出现错误:
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项
SQL> recover database using backup controlfile ;
ORA-00279: 更改 761661 (在 05/05/2011 09:18:58 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001
ORA-00280: 更改 761661 (用于线程 1) 在序列 #11 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
=======以上失败的原因是:当前controlfile丢失,使用备份的controlfile打开数据库时,为不完全恢复,所以要使用until============
SQL> recover database using backup controlfile until cancel;
ORA-00279: 更改 761661 (在 05/05/2011 09:18:58 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001
ORA-00280: 更改 761661 (用于线程 1) 在序列 #11 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01152: 文件 1 没有从过旧的备份中恢复
ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSTEM01.DBF'
/**由于使用了备份的控制文件,备份之后的归档日志信息丢失,
因此,这时需要手工输入需要恢复的联机重做日志文件*/
SQL> SELECT GROUP#, SEQUENCE#, STATUS FROM V$LOG;
GROUP# SEQUENCE# STATUS
---------- ---------- ----------------
1 11 CURRENT
3 10 INACTIVE
2 9 INACTIVE
SQL> recover database using backup controlfile until cancel
ORA-00279: 更改 761661 (在 05/05/2011 09:18:58 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001
ORA-00280: 更改 761661 (用于线程 1) 在序列 #11 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
D:\oracle\product\10.2.0\oradata\suredd\REDO03.LOG
ORA-00328: 归档日志在更改 759772 结束, 需要稍后的更改 761661
ORA-00334: 归档日志: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\REDO03.LOG'
ORA-01547: 警告: RECOVER 成功但 OPEN RESETLOGS 将出现如下错误
ORA-01152: 文件 1 没有从过旧的备份中恢复
ORA-01110: 数据文件 1: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSTEM01.DBF'
SQL> recover database using backup controlfile until cancel
ORA-00279: 更改 761661 (在 05/05/2011 09:18:58 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00011_0750250093.001
ORA-00280: 更改 761661 (用于线程 1) 在序列 #11 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
D:\oracle\product\10.2.0\oradata\suredd\REDO01.LOG
已应用的日志。
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
posted @
2011-05-05 10:57 xrzp 阅读(675) |
评论 (0) |
编辑 收藏
1.归档日志已经备份并被删除掉原来的
2.在执行一些恢复操作时,可能会使用到以前的归档日志,但这个时候∵已经在原来的位置将归档日志删除,所以恢复时如果使用到归档日志的话会报错说找不着文件
3.解决方法:将归档日志copy回原来的位置,恢复时指定新的位置,或者使用SET LOGSOURCE,指向新的归档位置
代码如下:
SQL> recover tablespace ddtest;
ORA-00279: 更改 589779 (在 05/04/2011 14:46:43 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00004_0750250093.001
ORA-00280: 更改 589779 (用于线程 1) 在序列 #4 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00004_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ORA-00308: 无法打开归档日志
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00004_0750250093.001'
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
SQL> recover tablespace ddtest;
ORA-00279: 更改 589779 (在 05/04/2011 14:46:43 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00004_0750250093.001
ORA-00280: 更改 589779 (用于线程 1) 在序列 #4 中
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: 更改 609885 (在 05/04/2011 15:13:08 生成) 对于线程 1 是必需的
ORA-00289: 建议:
D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00005_0750250093.001
ORA-00280: 更改 609885 (用于线程 1) 在序列 #5 中
ORA-00278: 此恢复不再需要日志文件
'D:\ORACLE\PRODUCT\10.2.0\ARCHIVELOGS\SUREDD\ARC00004_0750250093.001'
已应用的日志。
完成介质恢复。
SQL> alter tablespace ddtest online;
表空间已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
注:
(1)或者将归档日志放到其他的地方,然后在指定日志时不用auto,而写新的路径
(2)SET LOGSOURCE '归档日志的放的位置',再recover ,然后使用auto
posted @
2011-05-05 00:29 xrzp 阅读(1323) |
评论 (0) |
编辑 收藏
1.还是用UE破坏所有的控制文件,并做checkpoint
2.连接数据库,将数据库启动到nomount状态
3.创建controlfile为noresetlog
4.recover数据库
5.归档所有日志
6.open数据库
7.添加temp表空间的数据文件
过程如下:
SQL> show parameter control
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
control_file_record_keep_time integer 7
control_files string D:\ORACLE\PRODUCT\10.2.0\ORADA
TA\SUREDD\CONTROL01.CTL, D:\OR
ACLE\PRODUCT\10.2.0\ORADATA\SU
REDD\CONTROL02.CTL, D:\ORACLE\
PRODUCT\10.2.0\ORADATA\SUREDD\
CONTROL03.CTL
======================此时破坏所有控制文件======================
SQL> alter system checkpoint;
alter system checkpoint
*
第 1 行出现错误:
ORA-00227: 控制文件中检测到损坏的块: (块 , # 块 )
SQL> select status from v$instance;
ERROR:
ORA-03114: 未连接到 ORALCE
SQL> conn / as sysdba
已连接到空闲例程。
SQL> startup nomount
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 201329540 bytes
Database Buffers 402653184 bytes
Redo Buffers 7135232 bytes
SQL> edit
已写入 file afiedt.buf
1 CREATE CONTROLFILE REUSE DATABASE "SUREDD" NORESETLOGS ARCHIVELOG
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\SUREDD\REDO01.LOG' SIZE 50M,
9 GROUP 2 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\REDO02.LOG' SIZE 50M,
10 GROUP 3 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\REDO03.LOG' SIZE 50M
11 DATAFILE
12 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSTEM01.DBF',
13 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\UNDOTBS01.DBF',
14 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSAUX01.DBF',
15 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\USERS01.DBF',
16 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\EXAMPLE01.DBF',
17 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
18* CHARACTER SET ZHS16GBK
SQL> /
控制文件已创建。
SQL> RECOVER DATABASE;
完成介质恢复。
SQL> ALTER SYSTEM ARCHIVE LOG ALL;
系统已更改。
SQL> ALTER DATABASE OPEN;
数据库已更改。
SQL> edit
已写入 file afiedt.buf
1 ALTER TABLESPACE TEMP ADD TEMPFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\TEMP01.DBF'
2* SIZE 20971520 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M
SQL> /
表空间已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
posted @
2011-05-05 00:01 xrzp 阅读(277) |
评论 (0) |
编辑 收藏
第一种情况:损坏的控制文件的磁盘位置仍能使用
1.将好的控制文件copy过去
2.startup
第二种情况:损坏的控制文件的磁盘位置不可用
1.在新的位置将好的控制文件copy过去
2.修改spfile,使得里面的控制文件的路径指向正确
3.startup
posted @
2011-05-04 23:36 xrzp 阅读(278) |
评论 (0) |
编辑 收藏
1.将数据库abort掉,然后破坏对应的数据文件
2.startup数据库,因为此时被破坏了,所以数据库只能到mount状态
3.当前情况是没有数据文件的备份,但是有完好的归档
4.∴可以利用create datafile来进行恢复
具体参看代码:
SQL> shutdown abort
ORACLE 例程已经关闭。
==============在这儿破坏数据文件==================
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 180358020 bytes
Database Buffers 423624704 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF'
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- -------------------------------------------
6 ONLINE ONLINE FILE NOT FOUND 0
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
1 NOT ACTIVE 0
2 NOT ACTIVE 0
3 NOT ACTIVE 0
4 NOT ACTIVE 0
5 NOT ACTIVE 0
6 FILE NOT FOUND 0
已选择6行。
SQL> edit
已写入 file afiedt.buf
1 SELECT D.NAME, T.NAME AS TABLESPACE_NAME
2 FROM V$DATAFILE D, V$TABLESPACE T
3 WHERE T.TS# = D.TS#
4* AND D.FILE# = 6
SQL> /
NAME
----------------------------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF
DDTEST
SQL> alter database create datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
2 as 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF';
数据库已更改。
SQL> recover datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF';
完成介质恢复。
SQL> select * from dd.t1;
select * from dd.t1
*
第 1 行出现错误:
ORA-01219: 数据库未打开: 仅允许在固定表/视图中查询
SQL> alter tablespace ddtest online;
alter tablespace ddtest online
*
第 1 行出现错误:
ORA-01109: 数据库未打开
SQL> alter database open;
数据库已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
注意:在这个地方要求:需要表空间创建后所有的归档日志,且控制文件中必须包含受损文件名
如果不是这样子的话,则会出现下面的情况:
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> SELECT * FROM V$RECOVER_FILE;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- -------
6 OFFLINE OFFLINE FILE NOT FOUND 0
SQL> alter database create datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
2 as 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF';
alter database create datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
*
第 1 行出现错误:
ORA-01178: 文件 6 在最后一个 CREATE CONTROLFILE 之前创建, 无法重新创建
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
查询联机文档:
ORA-01178: file string created before last CREATE CONTROLFILE, cannot recreate
Cause: Attempted to use ALTER DATABASE CREATE DATAFILE to recreate a datafile that existed at the last CREATE CONTROLFILE command. The information needed to recreate the file was lost with the control file that existed when the file was added to the database.
Action: Find a backup of the file, and recover it. Do incomplete recovery to time before file was originally created.
那只有用备份的数据文件进行恢复了.
SQL> alter database create datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
2 as 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS01.DBF';
alter database create datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
*
第 1 行出现错误:
ORA-01178: 文件 6 在最后一个 CREATE CONTROLFILE 之前创建, 无法重新创建
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
SQL> host copy E:\oracletest\backup\suredd\DDTESTTBS02.DBF D:\oracle\product\10.2.0\oradata\suredd\
SQL> recover datafile 'D:\oracle\product\10.2.0\oradata\suredd\DDTESTTBS02.DBF';
完成介质恢复。
SQL> select status from v$instance;
STATUS
------------
OPEN
SQL> alter tablespace ddtest online;
表空间已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
由此可见,有备份是多么的重要啊!!!
posted @
2011-05-04 23:32 xrzp 阅读(677) |
评论 (0) |
编辑 收藏
1.先备份数据文件
SQL> select file_name,tablespace_name from dba_data_files;
FILE_NAME TABLESPACE_NAME
------------------------------------------------------------ -----------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF DDTEST
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\EXAMPLE01.DBF EXAMPLE
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\USERS01.DBF USERS
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSAUX01.DBF SYSAUX
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\UNDOTBS01.DBF UNDOTBS1
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\SYSTEM01.DBF SYSTEM
SQL> alter tablespace ddtest begin backup;
表空间已更改。
SQL> alter tablespace ddtest end backup;
表空间已更改。
2.用UE将ddtest对应的数据文件破坏
3.直接shutdown abort,再startup
SQL> shutdown abort;
ORACLE 例程已经关闭。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 612368384 bytes
Fixed Size 1250428 bytes
Variable Size 197135236 bytes
Database Buffers 406847488 bytes
Redo Buffers 7135232 bytes
数据库装载完毕。
ORA-01157: 无法标识/锁定数据文件 6 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 6: 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF'
SQL>
4.查找需要恢复的数据文件
SQL> select status from v$instance;
STATUS
------------
MOUNTED
SQL> select * from v$recover_file;
FILE# ONLINE ONLINE_ ERROR CHANGE# TIME
---------- ------- ------- ----------------------------------------------------------------- -------
6 ONLINE ONLINE FILE NOT FOUND 0
SQL> select * from v$backup;
FILE# STATUS CHANGE# TIME
---------- ------------------ ---------- --------------
1 NOT ACTIVE 0
2 NOT ACTIVE 0
3 NOT ACTIVE 0
4 NOT ACTIVE 0
5 NOT ACTIVE 0
6 FILE NOT FOUND 0
已选择6行。
SQL> edit
已写入 file afiedt.buf
1 SELECT D.NAME, T.NAME AS TABLESPACE_NAME
2 FROM V$DATAFILE D, V$TABLESPACE T
3 WHERE T.TS# = D.TS#
4* AND D.FILE# = 6
SQL> /
NAME
----------------------------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF
DDTEST
SQL>
5.将备份的数据文件直接copy到原位置(因为此时为mount状态,所以可以直接copy,不用offline),再recover,再打开数据库。如果是打开的,(此时做了alter system checkpoint 也能使得表空间不可用),那就将对应的表空间先offline,再执行recover,执行完recover后,再将表空间online。
SQL> recover datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\SUREDD\DDTESTTBS02.DBF';
完成介质恢复。
SQL> alter database open;
数据库已更改。
SQL> select * from dd.t1;
ID NAME
---------- ----------
1 test1
2 test2
SQL>
注:dd.t1这个表在ddtest这个表空间上
至此恢复完成.
posted @
2011-05-04 22:56 xrzp 阅读(362) |
评论 (0) |
编辑 收藏
1.进行联机表空间备份的步骤
(1)ALTER TABLESPACE users BEGIN BACKUP;
(2)!cp /…/users01.dbf /BACKUP/users01.dbf
(3)ALTER TABLESPACE users END BACKUP;
(4)ALTER SYSTEM ARCHIVE LOG CURRENT;
ALTER TABLESPACE BEGIN BACKUP 和ALTER TABLESPACE END
BACKUP 命令之间的间隔时间应尽量缩短,因为修改后的块写入重做日志文件
将导致生成更多的重做信息。因此建议每次执行一个表空间的联机备份。
2.备份状态信息,查询的视图:
(1)V$BACKUP:以确定哪些文件处于备份模式。发出ALTER TABLESPACE BEGIN BACKUP 命令后,状态将更改为ACTIVE。备份文件后,“状态” (STATUS) 列的值将更改为NOT ACTIVE。
(2)V$DATAFILE_HEADER:表空间的数据文件的FUZZY 列中的值将更改为YES,表明相应的文件处于备份模式。
ALTER TABLESPACE END BACKUP 命令后,FUZZY 列的值将更改为NULL
SELECT name, status, fuzzy FROM v$datafile_header;
3.联机表空间备份过程中出现故障
查询V$BACKUP 以检查备份状态
ALTER DATABASE DATAFILE ‘<file#>’ END BACKUP;
4.只读表空间备份
ALTER TABLESPACE query_data READ ONLY;
(1)发出ALTER TABLESPACE 命令后,会对所有与表空间相关联的数据文件执行检查点。然后使用当前SCN 冻结文件头。
(2)使表空间成为只读状态之后,必须备份该表空间的所有数据文件。
DBW0 进程只写入其表空间处于读写模式的数据文件,正常的检查点也只对这些文件执行。
5.只读表空间备份问题
(1)在将表空间更改为只读后,只需要一个备份。
(2)在使表空间成为读写状态之后,应恢复按照正常备份日程对该表空间进行备份。
(3)控制文件必须能正确标识处在只读模式下的表空间;否则,必须恢复该表空间。
6.手动备份控制文件
(1)创建二进制映像
ALTER DATABASE BACKUP CONTROLFILE TO ‘control1.bkp`;
(2)创建文本跟踪文件
ALTER DATABASE BACKUP CONTROLFILE TO TRACE as ;
(3)以下命令更改数据库配置并导致控制文件更改:
ALTER DATABASE [ADD | DROP] LOGFILE
ALTER DATABASE [ADD | DROP] LOGFILE MEMBER
ALTER DATABASE [ADD | DROP ] LOGFILE GROUP
ALTER DATABASE [ NOARCHIVELOG | ARCHIVELOG ]
ALTER DATABASE RENAME FILE
CREATE TABLESPACE
ALTER TABLESPACE [ADD | RENAME ] DATAFILE
ALTER TABLESPACE [READ WRITE | READ ONLY ]
DROP TABLESPACE
7.使用DBVERIFY 实用程序验证备份
(1)用于确保备份数据库或数据文件在还原之前是有效的
(2)遇到数据损坏问题时可作为有用的诊断辅助工具
(3)使用:%dbv file=/ORADATA/u03/users01.dbf logfile=dbv.log
posted @
2011-05-02 19:05 xrzp 阅读(424) |
评论 (0) |
编辑 收藏
V$ARCHIVED_LOG:显示控制文件中的归档日志信息
V$ARCHIVE_DEST:对于当前例程,说明所有归档日志目标、当前值、模式和状态。
INACTIVE 状态表示该目标未定义。VALID 状态表示该目标已启用且没有错误。
要检查每个目标的错误和发生错误的日志序列号,可使用以下查询:
SELECT destination,fail_sequence,error
FROM v$archive_dest
WHERE status='ERROR';
V$LOG_HISTORY:包含控制文件中的日志文件信息
V$DATABASE:归档的当前状态
V$ARCHIVE_PROCESSES:提供有关例程的各种ARCH 进程的状态的信息
ACTIVE 状态表明进程已启动并正在运行。当前正在归档的进程的状态为BUSY。正忙的进程的LOG_SEQUENCE 列显示该进程正在归档的当前日志序列号
posted @
2011-05-02 14:25 xrzp 阅读(680) |
评论 (0) |
编辑 收藏
1.LOG_ARCHIVE_DEST_n最多可指定十个归档目标
可以是本地归档:log_archive_dest_1 = "LOCATION=/archive1"
指定的位置必须是有效的,并且不能是一个NFS 装载的目录
也可以是远程归档:log_archive_dest_2 = "SERVICE=standby_db1"
指定的服务名通过使用本地的tnsnames.ora 文件进行解析
2.LOG_ARCHIVE_DEST_n 选项
(1)将归档位置设置为MANDATORY 或OPTIONAL。
MANDATORY:表示必须成功完成归档到该目标的操作才可以覆盖联机重做日志文件。
OPTIONAL:表示即使联机重做日志文件尚未成功地归档到该目标,也可以重新使用。这是缺省设置
(2)在出现故障之后、重试之前定义时间
REOPEN:REOPEN 属性定义发生故障时是否必须重新尝试归档到目标。如果为关键字REOPEN指定了值,如REOPEN=600,则若发生故障,在经过指定时间(以秒计)后,归档程序将尝试写入该目标。缺省值为300 秒。归档到目标的尝试次数没有限制。归档中的所有错误将在主站点的警报文件中报告。
如果未指定REOPEN,则可选目标上的错误将被记录并忽略。不再将重做日志发送到这些目标。在归档成功之前,强制目标上的错误将导致无法重新使用联机重做日志。只要归档不成功,归档目标的状态就设置为ERROR。
log_archive_dest_1="LOCATION=/archive/ MANDATORY REOPEN"
log_archive_dest_2="SERVICE=standby_db1 MANDATORY REOPEN=600"
log_archive_dest_3="LOCATION=/archive2/ OPTIONAL"
posted @
2011-05-02 14:16 xrzp 阅读(779) |
评论 (0) |
编辑 收藏
1.在10g中,如果启用了归档模式,则自动归档,即使log_archive_start为false
2.在9i中要启用自动归档的话,需要alter system archive log start to '/path'
3.如果数据库设置了db_recovery_file_dest,就不能设置log_archive_dest
4.默认的归档日志存放于db_recovery_file_dest中,如果设置了log_archive_dest_n,那么归档日志不再存放于db_recovery_file_dest中,而是存放于设置的log_archive_dest_n目录中,如果想要归档日志继续存放在db_recovery_file_dest中,可以通过如下命令
alter system set log_archive_dest_2='location=USE_DB_RECOVERY_FILE_DEST';
5.log_archive_dest只能与 log_archive_duplex_dest共存,作用一样
6.如果设置的log_archive_dest_n不正确,那么ORACLE会在设置的上一级目录归档
7.指定多个archive进程工作 log_archive_max_process,最多10个
8.alter system archive log current通知server process去将写满的联机重做日志归档,用于手工归档
9.归档日志格式(log_archive_format):s/S:log sequence number,t/T:thread number,如果为单实例的话,thread===1
posted @
2011-05-02 10:31 xrzp 阅读(215) |
评论 (0) |
编辑 收藏
NOARCHIVELOG 模式
缺省情况下,数据库是以NOARCHIVELOG 模式创建的。
1.在NOARCHIVELOG 模式下操作数据库时有以下特性:
(1)重做日志文件以循环的方式使用。
(2)重做日志文件可以在检查点发生之后立即重新使用。
(3)重做日志被覆盖后,介质恢复将只能恢复到上一次完全备份。
2.NOARCHIVELOG 模式的含义
(1)如果某个表空间由于故障而不可用,将无法继续对数据库进行操作,除非删除了该表空间或从备份还原了整个数据库。
(2)只能在数据库关闭时对数据库执行操作系统备份。而且,必须使用NORMAL、IMMEDIATE 或TRANSACTIONAL 选项关闭数据库。
(3)必须在每次备份时完整备份所有的数据文件和控制文件。尽管也可以备份联机重做日志文件,但这是不必要的。由于此类备份中日志文件是一致的,无需恢复,因此,不需要备份联机日志。
(4)如果联机重做日志文件已被覆盖,则将丢失上次完全备份后的所有数据。
3.NOARCHIVELOG 模式下的介质恢复选项
必须从数据库的完全备份中还原数据文件和控制文件。如果使用导出实用程序来备份数
据库,则可使用导入实用程序还原丢失的数据。但是,通过这种方法恢复的数据并不完
整,在导出后执行的事务处理工作将丢失。
ARCHIVELOG 模式
在发生检查点并且已经通过ARCn 后台进程备份重做日志文件之前,不能重新使用填满的重做日志文件。控制文件中将有一个条目记录归档日志文件的日志序列号。
对数据库的最新更改在任何时候均可用于例程恢复,而归档重做日志文件可以用于介质恢复。
1.归档要求
(1)数据库必须处于ARCHIVELOG 模式。通过发出命令将数据库置于ARCHIVELOG 模式可以更新控制文件。可以启用ARCn 后台进程来实现自动归档。
(2)应该有足够的资源来存放生成的归档重做日志文件。
2.将数据库设置为ARCHIVELOG 模式的含义
(1)出现介质故障时,可以防止数据库丢失数据。
(2)可以在数据库联机时对其进行备份。
(3)由于介质故障导致表空间(非SYSTEM)脱机时,数据库的其余部分仍可用,因为表空间(非SYSTEM)可以在数据库打开时恢复。
3.介质恢复选项
(1)无论数据库处于联机或脱机状态,都可以还原损坏文件的备份副本,并使用归档日志文件将数据文件更新为当前的版本。
(2)可以将数据库恢复至特定的时间点。
(3)可以将数据库恢复至指定归档日志文件的末尾。
(4)可以将数据库恢复至特定的系统更改号(SCN)。
4.在设置归档日志模式时,应该考虑以下因素:
下述情况中,NOARCHIVELOG 模式可能比较合适:
(1)容许备份之间的数据损失(在开发、培训期间等)
(2)重新应用事务处理(从批处理文件)的速度更快
(3)数据极少更改(非OLTP)
下述情况中,ARCHIVELOG 模式则更合适:
(1)无法关闭数据库以执行关闭的数据库的备份
(2)不允许数据损失
(3) 使用归档重做日志文件比重新应用事务处理(OLTP) 更易于恢复
posted @
2011-05-02 01:20 xrzp 阅读(574) |
评论 (0) |
编辑 收藏
RAID 0+ 1
优点:
正常使用中,考虑性能上讲,RAID0+1 好,就是先做RAID 0 条带,再做 RAID 1 MIRROR,这样写入速度快,读的速度和RAID1+0一样.
缺点,一旦一个硬盘坏了,一半的硬盘无法工作,如果1个条带上各坏1个硬盘(RAID0+1只有2个条带),GAME OVER....即使是只有一个硬盘坏了,做数据恢复也很慢,因为一半的硬盘要rebuild(大家该知道为什么吧).
RAID 1+0
优点 数据安全性好,只要不是1个条带上的2个硬盘同时坏,没有问题,还可以继续跑数据.数据恢复快.
缺点 写性能稍微比RAID 0+1 差(读性能一样)
这里举个例子,20个硬盘
做RAID 0+1,共2个条带做MIRROR,每个条带10个硬盘,如果坏了1个硬盘,只能是另外一个完好的条带(10个硬盘)同时工作,这边条带9个好的硬盘也要休息.
做RAID 1+0,共10个条带,每个条带2个硬盘做MIRROR,如果坏了1个硬盘,没关系,其它19个硬盘还要同时工作,只要不是坏在一个MIRROR里面的,没事.
建议,硬盘很多时,同时坏的几率就比较大,建议使用安全系数高的RAID 1+0,宁愿损失点性能(其实差不多).
如果仅仅是4块硬盘或者不考虑安全,不是关键业务,只是为了追求速度快感,你可以选择RAID 0+1
posted @
2011-04-28 11:14 xrzp 阅读(165) |
评论 (0) |
编辑 收藏
RAID是通过磁盘阵列与数据条块化方法相结合,以提高数据可用率的一种结构.IBM早于1970年就开始研究此项技术.RAID 可分为RAID级别1到RAID级别6, 通常称为:RAID 0, RAID 1, RAID 2, RAID 3,RAID 4, RAID 5,RAID6.每一个RAID级别都有自己的强项和弱项. "奇偶校验"定义为用户数据的冗余信息, 当硬盘失效时,可以重新产生数据.
RAID 0: RAID 0 并不是真正的RAID结构, 没有数据冗余. RAID 0 连续地分割数据并并行地读/写于多个磁盘上. 因此具有很高的数据传输率. 但RAID 0在提高性能的同时,并没有提供数据可靠性,如果一个磁盘失效,将影响整个数据.因此RAID 0 不可应用于需要数据高可用性的关键应用.
RAID 1: RAID 1通过数据镜像实现数据冗余,在两对分离的磁盘上产生互为备份的数据. RAID 1可以提高读的性能, 当原始数据繁忙时,可直接从镜像拷贝中读取数据.RAID 1是磁盘阵列中费用最高的, 但提供了最高的数据可用率. 当一个磁盘失效,系统可以自动地交换到镜像磁盘上, 而不需要重组失效的数据.
RAID 2: 从概念上讲, RAID 2 同RAID 3类似, 两者都是将数据条块化分布于不同的硬盘上, 条块单位为位或字节.然而RAID 2 使用称为"加重平均纠错码"的编码技术来提供错误检查及恢复.这种编码技术需要多个磁盘存放检查及恢复信息, 使得RAID 2技术实施更复杂.因此,在商业环境中很少使用.
RAID 3: 不同于RAID 2, RAID 3使用单块磁盘存放奇偶校验信息. 如果一块磁盘失效, 奇偶盘及其他数据盘可以重新产生数据. 如果奇偶盘失效,则不影响数据使用.RAID 3对于大量的连续数据可提供很好的传输率, 但对于随机数据, 奇偶盘会成为写操作的瓶颈.
RAID 4: 同RAID 2, RAID 3一样, RAID 4, RAID 5也同样将数据条块化并分布于不同的磁盘上, 但条块单位为块或记录. RAID 4使用一块磁盘作为奇偶校验盘, 每次写操作都需要访问奇偶盘, 成为写操作的瓶颈. 在商业应用中很少使用.
RAID 5: RAID 5没有单独指定的奇偶盘, 而是交叉地存取数据及奇偶校验信息于所有磁盘上.在RAID5 上, 读/写指针可同时对阵列设备进行操作, 提供了更高的数据流量.RAID 5更适合于小数据块, 随机读写的数据.RAID 3 与RAID 5相比, 重要的区别在于RAID 3每进行一次数据传输,需涉及到所有的阵列盘.而对于RAID 5来说, 大部分数据传输只对一块磁盘操作, 可进行并行操作.在RAID 5中有"写损失", 即每一次写操作,将产生四个实际的读/写操作, 其中两次读旧的数据及奇偶信息, 两次写新的数据及奇偶信息.
RAID 6: RAID 6 与RAID 5相比,增加了第二个独立的奇偶校验信息块. 两个独立的奇偶系统使用不同的算法, 数据的可靠性非常高.即使两块磁盘同时失效,也不会影响数据的使用.但需要分配给奇偶校验信息更大的磁盘空间, 相对于RAID 5有更大的"写损失".RAID 6 的写性能非常差, 较差的性能和复杂的实施使得RAID 6很少使用.
posted @
2011-04-28 11:12 xrzp 阅读(162) |
评论 (0) |
编辑 收藏
web服务器数据库服务器分离-->垂直分割(按功能)-->分布式(按用户数)-->增加数据缓存层
页面静态化(apache?)
存储分离,页面图片分开
数据库的水平分割和垂直分割
各层的缓存技术:Oracle(cache group),hibernate(session缓存,sessionFactory缓存,好像名字叫Ehcache ),memcache,oscache
负载均衡:集群? 7层模型每一层都有解决方案
posted @
2011-04-28 11:05 xrzp 阅读(169) |
评论 (0) |
编辑 收藏
这个类型支持前后滚动取得纪录next()、previous(),回到第一行first(),同时还支持要去的ResultSet中的第几行absolute(int n),以及移动到相对当前行的第几行relative(int n),要实现这样的ResultSet在创建Statement时用如下的方法。
Statement st = conn.createStatement(int resultSetType, int resultSetConcurrency)
ResultSet rs = st.executeQuery(sqlStr)
其中两个参数的意义是:
resultSetType是设置ResultSet对象的类型可滚动,或者是不可滚动。取值如下:
ResultSet.TYPE_FORWARD_ONLY只能向前滚动
ResultSet.TYPE_SCROLL_INSENSITIVE和Result.TYPE_SCROLL_SENSITIVE这两个方法都能够实现任意的前后滚动,使用各种移动的ResultSet指针的方法。二者的区别在于前者对于修改不敏感,而后者对于修改敏感。
resultSetConcurency是设置ResultSet对象能够修改的,取值如下:
ResultSet.CONCUR_READ_ONLY 设置为只读类型的参数。
ResultSet.CONCUR_UPDATABLE 设置为可修改类型的参数。
所以如果只是想要可以滚动的类型的Result只要把Statement如下赋值就行了。
Statement st = conn.createStatement(Result.TYPE_SCROLL_INSENITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet rs = st.excuteQuery(sqlStr);
posted @
2011-01-10 17:19 xrzp 阅读(384) |
评论 (1) |
编辑 收藏
我们根据统计信息的详细程度可以设置不同的级别,每种级别见STATS$level_DESCRIPTION;
0: 一性性能统计:包含回退段状态、字典缓存、SGA、系统事件、后台事件、会话事件、系统统计、等待统计、锁统计、闩锁统计
5: 增加了收集SQL的信息、并包括0级收集的信息。
6: 增强了在SQL收集信息方面的功能(列出占用资源较高的SQL),并包所有低级别的信息。
7 增加了收集段级别的统计信息(如段的逻辑读与物理读、行锁、ITL及buffer busy waits), 并包括所有低级别的信息。
10 : 增加了收集子LATCH锁的信息,并包括所有低级别的信息。
如果你收用statspack确定热表及热索引,那就需要使用7/10的级别来收集快照。
9I默认是5级
我们可以手工修改这个级别:
永久修改收集级别
SQL>EXECUTE STATSPACK.SNAP(I_SNAP_LEVEL=>0,I_MODIFY_PARAMETER=>’TRUE’);
临时修改
SQL>EXECUTE STATSPACK.SNAP(I_SNAP_LEVEL=>0);
posted @
2010-12-26 22:31 xrzp 阅读(353) |
评论 (0) |
编辑 收藏
一些常用的动态性能试图
1.先来张总的
2.
实例级别统计
上面两个框是系统统计信息,包括了一些性能指标,有STAT关键字
下面两个框是事件统计信息,有EVENT关键字,包括了各种不同类型的等待事件信息
3.会话级别统计
上面三个框是会话的系统统计信息,包括了一些性能指标,有STAT关键字。
下面三个框是会话的事件统计信息,包括了该会话各种不同类型的等待事件信息,有EVENT或WAIT关键字。
4.这些事件都列在V$EVENT_NAME视图中,拥有以下字段:
EVENT#
事件号
NAME
事件名
PARAMETER1
第一个参数名
PARAMETER2
第二个参数名
PARAMETER3
第三个参数名
5.事件统计信息
V$SYSTEM_EVENT: 所有会话对一个事件的总等待,它是累计信息。
V$SESSION_EVENT: 每个会话对一个事件的总等待,它是累计信息。
V$SESSION_WAIT:正在等待的当前活动对一个事件的等待,它是实时状态。
6.V$SYSTEM_EVENT:整个实例某个特定等待事件的统计值
7.V$SESSION_EVENT:
某个会话特定等待事件的统计值
8. V$SESSION_WAIT :当前会话正在等待的事件及统计信息,我们通过它能准确的发现当前性能问题的现象是什么
WAIT_TIME
非0:最近一次等待的时间, (当STATE为waited known time,单位为厘秒)
0:当前正在等待
STATE
waiting:
正在等待中,该状态,通常seconds_in_wait会有值
waited known time:
现在已经不等待了,但提供了详细的等待信息
waited short time:
现在已经不等待了,但提供了简短的等待信息
posted @
2010-12-26 22:30 xrzp 阅读(219) |
评论 (0) |
编辑 收藏
一.调优的目标:
1.减少响应时间
2.减少数据库块访问
3.尽量把常用的块CACHE到内存中,提高访问的速度
4.提高OLTP的吞吐量
5.设置系统的负载
二.数据库的系统响应时间:
response time = service time + wait time
service's meaning:cpu used by this session
select * from v$sysstat t where t.name ='CPU used by this session';
时间单位:9i以后单位是百万分之一秒
其中
Service Time = SQL解析时间 + 递归调用时间 + 其他时间
1.视图的使用
--实例级系统性能视图:v$sysstat
使用:(以CPU used by this session为例)
select * from v$sysstat t where t.name ='CPU used by this session';
--会话级系统性能试图:
select a.STATISTIC# from v$statname a where a.NAME like '%CPU used by this session%';
找到STATISTIC#,代入到下面
--当前所有session的
select * from v$sesstat b where b.STATISTIC# = &STATISTIC#;
--自己的session的
select * from v$mystat c where c.STATISTIC# = &STATISTIC#;
--或者直接
select b.sid, a.STATISTIC#, a.name, b.value
from v$statname a, v$mystat b
where a.STATISTIC# = b.STATISTIC#;
and a.name like '%xxxxxxx%'
2.sql解析时间(sql解析过程..比较重要,后面专门写一篇)
select name, sid, value "Total parse Cpu time"
from v$statname a, v$mystat b
where a.name like '%parse%'
and a.statistic# = b.statistic#
3.递归调用时间是用在语义分析阶段查找数据字典或者PLSQL内部包造成的解析所花的CPU时间
select * from v$statname a where a.NAME like '%recursive cpu%';
实例级和会话级查询方法同上
4.其它CPU时间:通常占绝大多数,它是执行内存BUFFER搜索,索引和全表扫描涉及的IO操作所占有的CPU
select a.VALUE as "Total CPU",
b.VALUE as "Parse CPU",
c.VALUE as "Recursive CPU",
a.VALUE - b.VALUE - c.VALUE as "Others"
from v$sysstat a, v$sysstat b, v$sysstat c
where a.NAME = 'CPU used by this session'
and b.NAME = 'parse time cpu'
and c.NAME = 'recursive cpu usage';
5.等待常是由于并发,需要等待别的会话处理完独占的资源后所花的时间,这通常也是最常见的性能问题.
如果等待时间(wait time)占响应时间(Pesponse time)的大多数时,我们需要减小等待时间来提高系统性能。我们需要剥离等待时间来分析和优化等待时间
select d.EVENT, d.TIME_WAITED, d.AVERAGE_WAIT
from v$system_event d
where d.EVENT not in
('pmon timer', 'rdbms ipc message', 'smon timer',
'virtual circuit status', 'SQL*Net message from client')
not in 里面的event通常被认为是不会产生等待的事件
三.相关视图
1.v$sysstat
这个使徒列出系统统计数据.为找到与每个统计数据号(STATISTIC#)关联的统计数据
名称,请参阅V$STATNAME.
列 数据类型 说明
STATISTIC# NUMBER 统计数据号
NAME VARCHAR2 统计数据名
CLASS NUMBER 统计数据类别:1(用户);2(重做);
4(排队);8(高速缓存);16(操
作系统);32(并行服务器);64
(SQL);128(调试)
VALUE NUMBER 统计数据值
CLASS NUMBER 统计数据类别:
2.v$sesstat
这个视图给出用户会话的统计数据.为了找到与每个统计数据号(STATISTIC#)有关的
统计数据名称,请参阅V$STATNAME.
列 数据类型 说明
SID NUMBER 会话标识符
STATISTIC# NUMBER 统计数据名(标识符)
VALUE NUMBER 统计数据值
3.v$mystat
这个视图包含当前会话的统计数据。
列 数据类型 说明
SID NUMBER 当前会话的ID
STATISTIC NUMBER 统计数据号
VALUE NUMBER 统计数据值
4.v$statname
这个视图显示列在V$SESSTAT 和V$SYSSTAT 表中的统计数据的解码统计数据名。详细信
息,请参阅V$SESSTAT 和SYSSTAT。
列 数据类型 说明
STATISTIC# NUMBER 统计数据号
NAME VARCHAR2 统计数据名。参见表B-13
CLASS NUMBER 1(用户);2(重做);4(排
队);8(高速缓存);16(操
作系统);32(并行服务器);
128(调试)
posted @
2010-12-22 22:55 xrzp 阅读(274) |
评论 (2) |
编辑 收藏
摘要:
DB Name
DB Id
Instance
...
阅读全文
posted @
2010-12-20 23:06 xrzp 阅读(638) |
评论 (0) |
编辑 收藏
1.NESTED LOOP
对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。
一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nstedloop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。
可用ordered提示来改变CBO默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。
2.HASH JOIN
hash join是CBO 做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。
当小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。
至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。
使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可。
以下条件下hash join可能有优势:
两个巨大的表之间的连接。
在一个巨大的表和一个小表之间的连接。
可用ordered提示来改变CBO默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。
3.SORT MERGE JOIN
sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了。
通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。
在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。
可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。
4.半连接
nested loops semi是nested loop连接的变种,又叫半连接。原理与nl相同,通常用于in,exist操作,这种操作join时候,通常查找到一条纪录就可以了,所以用semi表示。与semi相似的有一种叫anti,反连接,一般用于not in,not exists,也有nest loop anti和hash anti两种。
5.星形
常用于OLAP系统
posted @
2010-12-19 23:49 xrzp 阅读(222) |
评论 (0) |
编辑 收藏
1.观察cache size,观察主机内存情况,判断SGA的内存分配是否合理
2.观察load profile的transaction情况,判断系统的繁忙程度
3.观察load profile的parse和hard prase值,观察是否存在过多的硬解析
4.观察top5 timed event查看系统的瓶颈所在
5.关注6个order by的sql语句
posted @
2010-12-19 23:15 xrzp 阅读(440) |
评论 (0) |
编辑 收藏
摘要: TABLE函数可接受查询语句或游标作为输入参数,并可输出多行数据。该函数可以平行执行,并可持续输出数据流,被称作管道式输出。应用TABLE函数可将数据转换分阶段处理,并省去中间结果的存储和缓冲表.
TABLE函数(它...
阅读全文
posted @
2010-12-19 22:53 xrzp 阅读(1676) |
评论 (1) |
编辑 收藏
配置 ASMLib,遇到一个问题,如图:
可能的问题:
1.linux的
selinux没有关闭
2.驱动不对.
1.关闭selinux
vi /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted
再重启:
[root@rac1 ~]# setenforce 0
[root@rac1 ~]# /usr/sbin/sestatus
[root@rac1 ~]# reboot
2.如果第一个不能解决问题,再查看驱动是否正确.
[root@rac1 ~]# ll
total 2084
drwxr-xr-x 2 root root 4096 Dec 5 15:37 Desktop
-rw-r--r-- 1 root root 1462 Dec 5 15:29 anaconda-ks.cfg
-rw-r--r-- 1 root root 54768 Dec 5 15:29 install.log
-rw-r--r-- 1 root root 69369 Dec 5 15:29 install.log.syslog
-rwxrwxr-x 1 root root 330867 Dec 6 00:43 ocfs2-2.6.9-78.EL-1.2.9-1.el4.i686.rpm
-rwxrwxr-x 1 root root 1044312 Dec 6 00:53 ocfs2-tools-1.2.7-1.el4.i386.rpm
-rwxrwxr-x 1 root root 173056 Dec 6 00:51 ocfs2console-1.2.7-1.el4.i386.rpm
-rwxrwxr-x 1 root root 132372 Dec 5 21:09 oracleasm-2.6.9-78.EL-2.0.5-1.el4.i686.rpm
-rwxrwxr-x 1 root root 82542 Dec 5 21:11 oracleasm-support-2.1.3-1.el4.i386.rpm
-rwxrwxr-x 1 root root 13105 Dec 5 21:11 oracleasmlib-2.0.4-1.el4.i386.rpm
注意标黄色的这个驱动应该为:
oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm..
去oracle官网上找到该驱动并下载下来,重新安装.
[root@rac1 ~]# rpm -ivh oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm
warning: oracleasm-2.6.9-78.ELsmp-2.0.5-1.el4.i686.rpm: V3 DSA signature: NOKEY, key ID b38a8516
Preparing ########################################### [100%]
1:oracleasm-2.6.9-78.ELsm########################################### [100%]
搞定:
posted @
2010-12-07 00:43 xrzp 阅读(212) |
评论 (0) |
编辑 收藏
ORA-12514可能的原因:
1.主机没有启动数据库
2.主机有多个ip地址,没在/etc/hosts中配置全
3.监听器配置错误,一劳永逸的方法是采用静态注册的方式
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /home/db/oracle/product/10.2.0)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = test1)
(ORACLE_HOME = /home/db/oracle/product/10.2.0)
(SID_NAME = test1)
)
)
posted @
2010-07-05 14:51 xrzp 阅读(221) |
评论 (0) |
编辑 收藏
硬解析需要更多的内存空间, 更多的并发控制对于频繁执行的语句性能会显著的降低,所以对相似的语句只有某些数值变化的语句改写成完全相同的文本,我们称其为绑定.
手工绑定:
EXECUTE IMMEDIATE 'UPDATE EMPLOYEE SET sal = :new_sal' USING v_sal;
不绑定:
EXECUTE IMMEDIATE 'UPDATE EMPLOYEE SET sal ='||new_sal;
系统绑定:
CURSOR_SHARING
exact:文本完全相同的SQL语句才可共享cursor, exact必须精确
force:server 端强制绑定变量
similar:存在histogram(直方图)时对于不同的变量值重新解析,相当于SIMILAR=EXACT, 不存时与force一样
posted @
2010-06-20 21:45 xrzp 阅读(161) |
评论 (0) |
编辑 收藏
1.
SQL> create table testlong(l1 long,id int);
表已创建。
SQL>
SQL> insert into testlong values('aaaaaaaa',1);
已创建 1 行。
SQL> commit;
提交完成。
2.
SQL>
SQL> create table testcopylong as select * from testlong;
create table testcopylong as select * from testlong
*
第 1 行出现错误:
ORA-00997: 非法使用 LONG 数据类型
3.
SQL> create table testcopylong(l1 long,id int);
表已创建。
SQL> copy from scott/tiger append testcopylong using select * from testlong;
SP2-0519: FROM 字符串缺失 Oracle Net @database 描述
SQL> copy from scott/tiger@test_10.10.10.1 append testcopylong using select * from testlong;
数组提取/绑定大小为 15。(数组大小为 15)
将在完成时提交。(提交的副本为 0)
最大 long 大小为 80。(long 为 80)
1 行选自 scott@test_10.10.10.1。
1 行已插入 TESTCOPYLONG。
1 行已提交至 TESTCOPYLONG (位于 DEFAULT HOST 连接)。
4.
SQL> select * from testcopylong;
L1 ID
---------- ----------
aaaaaaaa 1
posted @
2010-06-09 14:09 xrzp 阅读(290) |
评论 (0) |
编辑 收藏
1.查看表的使用情况的一些指标
SELECT TABLE_NAME,--表名
BLOCKS,--总的块数
EMPTY_BLOCKS,--空块数
PCT_FREE,--不解释
NUM_ROWS,--表的行数
AVG_USED_BLOCKS,--平均使用的块数
CHAIN_PER,--行迁移OR行链接数
GREATEST(ROUND(100 * (NVL(HWM - AVG_USED_BLOCKS, 0) /
GREATEST(NVL(HWM, 1), 1)),
2),
0) WASTE_PER --浪费的百分比
FROM (SELECT B.TABLE_NAME,
A.BLOCKS,
B.EMPTY_BLOCKS,
B.PCT_FREE,
B.NUM_ROWS,
(A.BLOCKS - B.EMPTY_BLOCKS - 1) HWM,
ROUND((B.AVG_ROW_LEN * NUM_ROWS * (1 + (PCT_FREE / 100))) / 8192,
0) AS AVG_USED_BLOCKS,
ROUND(100 *
(NVL(B.CHAIN_CNT, 0) / GREATEST(NVL(B.NUM_ROWS, 1), 1)),
2) CHAIN_PER
FROM DBA_SEGMENTS A, DBA_TABLES B
WHERE A.OWNER = B.OWNER
AND A.SEGMENT_NAME = B.TABLE_NAME
--AND A.SEGMENT_TYPE = 'TABLE'
AND A.TABLESPACE_NAME = B.TABLESPACE_NAME
AND B.TABLESPACE_NAME = '表空间名字')
2.其中的8192可以查DBA_TABLESPACES (TS$)获取
SELECT T.TABLESPACE_NAME,T.BLOCK_SIZE FROM DBA_TABLESPACES T
posted @
2010-06-04 15:01 xrzp 阅读(218) |
评论 (0) |
编辑 收藏
Oracle 10g默认的归档日志存放在flash_recovery_area,如果归档日志超过了默认值的大小,则会报ORA-16014的错误.
1.出错
SQL*Plus: Release 10.2.0.2.0 - Production on Sun May 30 10:32:43 2010
Copyright (c) 1982, 2005, Oracle. All Rights Reserved.
Connected to:
Oracle Database 10g Enterprise Edition Release 10.2.0.2.0 - Production
With the Partitioning, Oracle Label Security, OLAP and Data Mining options
SQL> startup mount
ORACLE instance started.
Total System Global Area 285212672 bytes
Fixed Size 1260396 bytes
Variable Size 96470164 bytes
Database Buffers 180355072 bytes
Redo Buffers 7127040 bytes
Database mounted.
SQL> alter database open
2 /
alter database open
*
ERROR at line 1:
ORA-16014: log 1 sequence# 86 not archived, no available destinations
ORA-00312: online log 1 thread 1: '/u01/app/oracle/oradata/orcl/redo01.log'
2.查看归档日志区的大小
SQL> show parameter db_rec
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_recovery_file_dest string /u01/app/oracle/flash_recovery
_area
db_recovery_file_dest_size big integer 2G
db_recycle_cache_size big integer 0
3.检查flash recovery area的使用情况
SQL> select * from v$flash_recovery_area_usage;
FILE_TYPE PERCENT_SPACE_USED PERCENT_SPACE_RECLAIMABLE NUMBER_OF_FILES
------------ ------------------ ------------------------- ---------------
CONTROLFILE 0 0 0
ONLINELOG 0 0 0
ARCHIVELOG 98.77 0 52
BACKUPPIECE 0 0 0
IMAGECOPY 0 0 0
FLASHBACKLOG 0 0 0
6 rows selected.
SQL> select sum( PERCENT_SPACE_USED )*3/100 from v$flash_recovery_area_usage;
SUM(PERCENT_SPACE_USED)*3/100
-----------------------------
2.9631
4.计算后,发现使用了2.96G>2G,将值设为4G,重新启动,成功
SQL> alter system set db_recovery_file_dest_size =4G;
System altered.
SQL> alter database open;
Database altered.
SQL>
posted @
2010-05-30 13:02 xrzp 阅读(742) |
评论 (0) |
编辑 收藏
1. create user aaa identified by 123 123需要用引号
2. 查看当前有什么权限,查看session_privs
3. 查看当前有什么角色,查看session_roles
4. 让用户的口令失效alter user xxx password expire
5. 回收的系统权限不递归,对象权限会级联
6. create database时,如果文件已经存在,不能直接覆盖原来文件,使用REUSE语句
7. alter system disable/enable restricted session;
posted @
2010-05-23 21:37 xrzp 阅读(140) |
评论 (0) |
编辑 收藏
改动之前:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
(ADDRESS = (PROTOCOL = TCP)(HOST = sure1212)(PORT = 1521))
)
)
在netmanager中添加数据库的监听
改动之后:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = TEST.SURE)
(ORACLE_HOME = C:\oracle\product\10.2.0\db_1)
(SID_NAME = test)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = sure1212)(PORT = 1521))
)
)
posted @
2010-05-16 17:09 xrzp 阅读(184) |
评论 (0) |
编辑 收藏
1.
SQL> drop user sysman cascade;
用户已删除。
SQL> drop role MGMT_USER;
角色已删除。
SQL> drop user MGMT_VIEW cascade;
用户已删除。
SQL> drop public synonym MGMT_TARGET_BLACKOUTS;
同义词已删除。
SQL> drop public synonym SETEMVIEWUSERCONTEXT;
同义词已删除。
2.emca -deconfig dbcontrol db -repos drop
3.emca -config dbcontrol db -repos create
posted @
2010-01-27 23:36 xrzp 阅读(184) |
评论 (0) |
编辑 收藏
/**
* 按照指定长度将字符串进行分割,中文字符算2个长度
* @param str 字符串
* @param length 指定长度
* @return 如果字符串长度超出指定长度
* ,则将字符串分成2个部分,分别装在map中
*/
public static Map getStr(String str, int length) {
HashMap hashMap = new HashMap();
String addr1 = "";
String addr2 = "";
byte tmpBytes[] = str.getBytes();
int iByteLen = tmpBytes.length;
if (iByteLen > length) {
int iLen = 0;
for (int i = 0; i < length; i++) {
if ((tmpBytes[i] & 0xFF) > 0x80) {
iLen += 2;
i++;
continue;
} else {
iLen += 1;
continue;
}
}
addr1 = new String(tmpBytes, 0, iLen);
addr2 = new String(tmpBytes, iLen, iByteLen - iLen);
} else {
addr1 = str;
}
hashMap.put(new Integer(1), addr1);
hashMap.put(new Integer(2), addr2);
return hashMap;
}
0x80等于十进制的128,Turbo C中规定对ASCII码值大于0x80的字符将被认为是负数。
posted @
2009-09-22 22:32 xrzp 阅读(2132) |
评论 (1) |
编辑 收藏
在web.xml,要对2个框架的分发,分别配置不同的
url-pattern!!!
posted @
2009-04-20 16:58 xrzp 阅读(555) |
评论 (0) |
编辑 收藏
public String getOriginalFilename(String filePath) {
String filename = filePath;
if (filename == null) {
return "";
}
int pos = filename.lastIndexOf("/");
if (pos == -1) {
pos = filename.lastIndexOf("\\");
}
if (pos != -1) {
return filename.substring(pos + 1);
} else {
return filename;
}
}
posted @
2009-04-18 20:14 xrzp 阅读(237) |
评论 (0) |
编辑 收藏
new java.text.DecimalFormat("0.00").format(xxx);
posted @
2009-04-08 12:41 xrzp 阅读(295) |
评论 (0) |
编辑 收藏
在web.xml中加入
<mime-mapping>
<extension>xls</extension>
<mime-type>application/excel</mime-type>
</mime-mapping>
服务器端同时安装上Excel
posted @
2009-03-26 10:29 xrzp 阅读(531) |
评论 (1) |
编辑 收藏
摘要: 1.用spring的mail发邮件需要将j2ee包里的mail.jar和activation.jar引入
2.遇见的异常可能会有
(1)java.lang.NoClassDefFoundError: com/sun/mail/util/LineInputStream
(2)java.lang.NoClassDefFoundErro...
阅读全文
posted @
2008-10-18 16:18 xrzp 阅读(2709) |
评论 (4) |
编辑 收藏
<!-- 配置事务开始 -->
<bean id="txManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<tx:advice id="txAdvice" transaction-manager="txManager">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="save*" propagation="REQUIRED"/>
<tx:method name="add*" propagation="REQUIRED"/>
<tx:method name="del*" propagation="REQUIRED"/>
<tx:method name="update*"/>
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="testTxAop"
expression="execution(* com.sure.demo.dao.*.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="testTxAop" />
</aop:config>
<!-- 配置事務結束 -->
使用事务的时候,在DAO就不要用try{}catch{}了,因为在catch里面捕获的异常,spring的事务貌似不能去回滚
posted @
2008-10-15 22:47 xrzp 阅读(282) |
评论 (0) |
编辑 收藏
今天做了个aop的试验,对于springmvc的action不能拦截成功,研究了很久,没有找到问题,所以请教下大家.
下面是代码:
1.springmvc的action:
package com.sure.demo.web;
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.multiaction.MultiActionController;
public class DemoTestAction extends MultiActionController {
//返回的test页面
private String testPage;
public String getTestPage() {
return testPage;
}
public void setTestPage(String testPage) {
this.testPage = testPage;
}
/**
* test入口
* @param request
* @param response
* @return
* @throws Exception
*/
public ModelAndView test(HttpServletRequest request,
HttpServletResponse response) throws Exception {
ModelAndView mav = null;
mav = new ModelAndView(this.getTestPage());
request.setAttribute("test", new Date().toString());
return mav;
}
}
2.jsp代码:
<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>
<%
String test = (String)request.getAttribute("test");
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
</head>
<body>
当前时间是:<%=test %> <br>
</body>
</html>
3.aop代码:
package com.sure.aopdemo;
import org.aspectj.lang.JoinPoint;
public class AopDemoTestImpl {
public void afterTest(JoinPoint joinPoint) {
System.out.println("aop--执行类:"+joinPoint.getThis()+"的"+joinPoint.getSignature().getName()+"方法之后");
}
public void beforeTest(JoinPoint joinPoint) {
System.out.println("aop--执行类:"+joinPoint.getThis()+"的"+joinPoint.getSignature().getName()+"方法之前");
}
public void exceptionTest() {
System.out.println("aop方法异常");
}
}
4.xml关于aop的配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<bean id="aopDemoTestImpl" class="com.sure.aopdemo.AopDemoTestImpl"></bean>
<aop:config>
<aop:aspect id="test" ref="aopDemoTestImpl">
<aop:pointcut id="a" expression="execution(* com.sure.demo..*.*(..))"/>
<aop:before method="beforeTest" pointcut-ref="a"/>
<aop:after method="afterTest" pointcut-ref="a"/>
<aop:after-throwing method="exceptionTest" pointcut-ref="a"/>
</aop:aspect>
</aop:config>
</beans>
posted @
2008-09-22 23:19 xrzp 阅读(7655) |
评论 (11) |
编辑 收藏
1.String.prototype.Trim = function()
{
return this.replace(/(^\s*)|(\s*$)/g, "");
}
String.prototype.LTrim = function()
{
return this.replace(/(^\s*)/g, "");
}
String.prototype.Rtrim = function()
{
return this.replace(/(\s*$)/g, "");
}
2.全文匹配替换
var regExp = new RegExp("需要被替换的字符',"g")
var text = "…………";
text = text.replace(regExp , "替换的字符");
3.方案
String .prototype.trim = function(){
var matches = this.match(/^[ \t\n\r]+/);
var prefixLength = (matches == null) ? 0:matches[0].length;
matches = this.match(/[ \t\r\n]+$/);
var suffixLength = (matches == null) ? 0:matches[0].length;
return this.slice(prefixLength,this.length-suffixLength);
}
posted @
2008-08-27 16:12 xrzp 阅读(8976) |
评论 (2) |
编辑 收藏
1.写文件并设置encoding
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("GBK");
output = new XMLWriter(new FileWriter(new File(filename)), format);
output.write(document);
2.先删文件再创建
File file = new File("d://xxx.xml");
if(file.exists()){
file.delete();
}
CreatXml temp = new CreatXml();
temp.createXMLFile("d://xxx.xml")
posted @
2008-08-20 23:50 xrzp 阅读(1221) |
评论 (0) |
编辑 收藏
1.要将驱动拷到\jboss-4.0.3\server\default\lib 这个文件夹里面去。
2.在数据源(连接池)的地方加个这个:<use-java-context>false</use-java-context>,能保证在java中查找数据源的时候
ctx.lookup("jdbc/xxx");就不需要写成ctx.lookup("java:/jdbc/xxx");
posted @
2008-08-19 00:09 xrzp 阅读(201) |
评论 (0) |
编辑 收藏
摘要: 下午没事做,第一次尝试着写数据连接池。
想到了大概几点:1.使用单例模式;2.在构造方法中将数据源初始化;3.大概包括几个方法:init()、destroy()、getConnect()、release()
代码如下:
1.连接池类:
1public class DBPool {
2
&nbs...
阅读全文
posted @
2008-07-31 22:16 xrzp 阅读(230) |
评论 (0) |
编辑 收藏
一.环境:JDK1.4,tomcat5.0.28,部署的时候报错:java.lang.UnsupportedClassVersionError.出错原因:编译和执行用了不同的jdk版本,(因为以前用过1.5,1.6),所以重新设置环境变量后,再重新发布,又报新的错误: The type java.lang.Object cannot be resolved.It is indirectly referenced from required.class files。出错原因:因为装了多个版本的jre或jdk的原因。本来Eclipse在建立工程时,会自动参照jre路径,但多个版本就没办法了。
解决方法:
1. 进入window\preferences\java\Installed JREs
1)按Add
2)输入JRE Name, 例JDK1.5.0.08
3)JRE home directory, 选择安装的路径
4)按OK
2. 进入Project\properties\Java Bulid Path
1)Add library
2)选JRE System Library后按Next
3)选workplace default JRE后按finish...
最后还是没解决...干脆直接就把机器里面所有的jdk都卸载了,只装了一个JDK1.4(应用需要的,有个地方不支持其他版本的JDK),然后重新设置了环境变量,新装了下myeclipse,在应用上面将jars加进去,在add library的地方将jre system library加进去就好了.
二.环境:JDK1.4,jboss4.0.4
部署好后,启动,会报一个错,关于log4j的,这个是因为应用本来带了一个log4j的包,而jboss自己也集成了log4j的,所以load的时候造成冲突,解决方法:到Jboss4.0\server\default\conf这个目录下,找到log4j.xml改成jboss-log4j.xml,再到jboss-service.xml找相应的地方改一下
三.有关乱码
1.对于tomcat,在server.xml文件找到<Connector port="8080".../>这段(8080是你Tomcat的端口),在这段里加URIEncoding="GBK"。
2.对于jboss,在\server\default\deploy\jbossweb-tomcat55.sar\server.xml,同tomcat
posted @
2008-04-28 15:39 xrzp 阅读(1041) |
评论 (0) |
编辑 收藏
完整的删除Oracle
可以完整的删除Oracle products, Oracle services和注册表信息
当然是很少情况下才想到删除oracle,只有确定真的不用的时候才做。
如果需要请备份所有相关的文件。
(下面操作假设是使用OFA结构)
NT环境下:
1、以NT的Administrator 登陆
2、通过控制面版-〉服务,停掉所有ORACLE服务
3、打开注册表(REGEDIT命令),删除
HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
4、打开注册表中的 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services
删除以ORACLE开头的所有服务
5、删除HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\EventLog\A
pplication下
以ORACLE开头的所有服务
6、关闭REGEDIT
7、打开控制面版-〉系统-〉环境变量
8、如果ORACLE安装了JRE,就删除%ORACLE_HOME%\BIN和JRE路径。
比如 \ORACLE\ORA81\BIN;G: \Program Files\Oracle\jre\1.1.7\bin
9、删除\Winnt\Profiles\All Users\Start Menu\Programs\Oracle 和
\Winnt\Profiles\All Users\Start Menu\Programs\Oracle
10、删除\Program Files\Oracle
11、重新启动机器
12、删除所有ORACLE目录(在注册表HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ORA CLE_HOMES下)
posted @
2008-03-28 11:24 xrzp 阅读(270) |
评论 (0) |
编辑 收藏
查询:
/** *//**
*
* @param regEx 设定的正则表达式
* @param tempStr 系统参数中的设定的字符串
* @return 是否系统参数中的设定的字符串含有设定的正则表达式
* 如果有的则返回true
*/
public static boolean isHaveBeenSetting(String regEx,String tempStr){
boolean result = false;
try{
Pattern p = Pattern.compile(regEx);
Matcher m=p.matcher(tempStr);
result=m.find();
}catch (Exception e) {
e.printStackTrace();
}
return result;
}
替换:
/** *//**
* 将字符串含有的regEx表达式替换为replaceRegEx
*
* @param regEx 需要被替换的正则表达式
* @param tempStr 替换的字符串
* @param replaceRegEx 替换的正则表达式
* @return 替換好后的字符串
*/
public static String replaceStr(String regEx, String tempStr, String replaceRegEx) {
Pattern p = Pattern.compile(regEx);
Matcher m = p.matcher(tempStr);
tempStr = m.replaceAll(replaceRegEx);
return tempStr;
}
后来发现替换这个方法可以用jarkata commons中的StringUtils.replace(tempStr, regEx, replaceRegex)来代替
posted @
2008-02-26 09:35 xrzp 阅读(273) |
评论 (0) |
编辑 收藏
select * from 树那张表 where status <> '-1'
start with id = ?
connect by prior id = parentid
posted @
2007-07-23 10:45 xrzp 阅读(501) |
评论 (0) |
编辑 收藏
如题,
if(typeof(myValueObj)!="undefined")
posted @
2007-07-13 11:05 xrzp 阅读(6732) |
评论 (2) |
编辑 收藏
Operation with out calling next/previous
原因是因为没用 rs.next() 。我直接用的rs!=null。即使SQL弄出来只有一条记录,也得用这个
posted @
2007-06-04 18:52 xrzp 阅读(416) |
评论 (0) |
编辑 收藏
//审核通过
function pass()
{
if(isCheck())
{
var checkBoxArray = document.getElementsByName("choose");
var countStatus = 0;//用来记录状态为1的数量
var countChecked = 0;//用来记录多选框被选中的数量
var countOpe = 0;//用来记录状态为3的数量
for(i = 0; i < checkBoxArray.length; i++)
{
if(checkBoxArray[i].checked)
{
countChecked++;
/** *//****************用来判断状态******************/
if (checkBoxArray[i].sta == "1")
{
countStatus++;
}
else
{
checkBoxArray[i].checked = false;
}
/** *//********************************************/
/** *//****************用来判断业务状态*****************/
if (checkBoxArray[i].ope == "3")
{
countOpe++;
} else
{
checkBoxArray[i].checked = false;
}
/** *//********************************************/
}
}
if(countStatus!=countChecked)
{
alert("某些记录的状态还是“待确认”的状态");
}
else
{
if(countOpe!=countStatus)
{
alert("某些记录的状态不是“待审核”的业务状态");
}
else
{
document.mm.target = "operate";
document.mm.action = "<%=moduleName%>.do?method=operateType&mode=unpass" ;
document.mm.submit();
}
}
}
else{
alert("请至少选择一条记录!");
}
}
posted @
2007-05-30 15:14 xrzp 阅读(283) |
评论 (0) |
编辑 收藏
1.document.write(""); 输出语句
2.JS中的注释为//
3.传统的HTML文档顺序是:document->html->(head,body)
4.一个浏览器窗口中的DOM顺序是:window->(navigator,screen,history,location,document)
5.得到表单中元素的名称和值:document.getElementById("表单中元素的ID號").name(或value)
6.一个小写转大写的JS: document.getElementById("output").value = document.getElementById("input").value.toUpperCase();
7.JS中的值类型:String,Number,Boolean,Null,Object,Function
8.JS中的字符型转换成数值型:parseInt(),parseFloat()
9.JS中的数字转换成字符型:("" 变量)
10.JS中的取字符串长度是:(length)
11.JS中的字符与字符相连接使用 號.
12.JS中的比较操作符有:==等于,!=不等于,>,>=,<.<=
13.JS中声明变量使用:var来进行声明
14.JS中的判断语句结构:if(condition){}else{}
15.JS中的循环结构:for([initial expression];[condition];[upadte expression]) {inside loop}
16.循环中止的命令是:break
17.JS中的函数定义:function functionName([parameter],...){statement[s]}
18.当文件中出现多个form表单时.可以用document.forms[0],document.forms[1]来代替.
19.窗口:打开窗口window.open(), 关闭一个窗口:window.close(), 窗口本身:self
20.状態栏的设置:window.status="字符";
21.弹出提示信息:window.alert("字符");
22.弹出確认框:window.confirm();
23.弹出输入提示框:window.prompt();
24.指定当前显示链接的位置:window.location.href="URL"
25.取出窗体中的所有表单的数量:document.forms.length
26.关闭文档的输出流:document.close();
27.字符串追加连接符: =
28.创建一个文档元素:document.createElement(),document.createTextNode()
29.得到元素的方法:document.getElementById()
30.设置表单中所有文本型的成员的值为空:
var form = window.document.forms[0]
for (var i = 0; i<form.elements.length;i ){
if (form.elements.type == "text"){
form.elements.value = "";
}
}
31.复选按钮在JS中判断是否选中:document.forms[0].checkThis.checked (checked属性代表为是否选中返回TRUE或FALSE)
32.单选按钮组(单选按钮的名称必须相同):取单选按钮组的长度document.forms[0].groupName.length
33.单选按钮组判断是否被选中也是用checked.
34.下拉列表框的值:document.forms[0].selectName.options[n].value (n有时用下拉列表框名称加上.selectedIndex来確定被选中的值)
35.字符串的定义:var myString = new String("This is lightsword");
36.字符串转成大写:string.toUpperCase(); 字符串转成小写:string.toLowerCase();
37.返回字符串2在字符串1中出现的位置:String1.indexOf("String2")!=-1则说明没找到.
38.取字符串中指定位置的一个字符:StringA.charAt(9);
39.取出字符串中指定起点和终点的子字符串:stringA.substring(2,6);
40.数学函数:Math.PI(返回圆周率),Math.SQRT2(返回开方),Math.max(value1,value2)返回两个数中的最在值,Math.pow(value1,10)返回value1的十次方,Math.round(value1)四舍五入函数,Math.floor(Math.random()*(n 1))返回隨机数
41.定义日期型变量:var today = new Date();
42.日期函数列表:dateObj.getTime()得到时间,dateObj.getYear()得到年份,dateObj.getFullYear()得到四位的年份,dateObj.getMonth()得到月份,dateObj.getDate()得到日,dateObj.getDay()得到日期几,dateObj.getHours()得到小时,dateObj.getMinutes()得到分,dateObj.getSeconds()得到秒,dateObj.setTime(value)设置时间,dateObj.setYear(val)设置年,dateObj.setMonth(val)设置月,dateObj.setDate(val)设置日,dateObj.setDay(val)设置星期几,dateObj.setHours设置小时,dateObj.setMinutes(val)设置分,dateObj.setSeconds(val)设置秒 [注意:此日期时间从0开始计]
43.FRAME的表示方式: [window.]frames[n].ObjFuncVarName,frames["frameName"].ObjFuncVarName,frameName.ObjFuncVarName
44.parent代表父亲对象,top代表最顶端对象
45.打开子窗口的父窗口为:opener
46.表示当前所属的位置:this
47.当在超链接中调用JS函数时用:(javascript :)来开头后面加函数名
48.在老的浏览器中不执行此JS:<!-- //-->
49.引用一个文件式的JS:<script type="text/javascript" src="aaa.js"></script>
50.指定在不支持脚本的浏览器显示的HTML:<noscript></noscript>
51.当超链和onCLICK事件都有时,则老版本的浏览器转向a.html,否则转向b.html.例:<a href="a.html" onclick="location.href='b.html';return false">dfsadf</a>
52.JS的內建对象有:Array,Boolean,Date,Error,EvalError,Function,Math,Number,Object,RangeError,ReferenceError,RegExp,String,SyntaxError,TypeError,URIError
53.JS中的换行:\n
54.窗口全屏大小:<script>function fullScreen(){ this.moveTo(0,0);this.outerWidth=screen.availWidth;this.outerHeight=screen.availHeight;}window.maximize=fullScreen;</script>
55.JS中的all代表其下层的全部元素
56.JS中的焦点顺序:document.getElementByid("表单元素").tabIndex = 1
57.innerHTML的值是表单元素的值:如<p id="para">"how are <em>you</em>"</p>,则innerHTML的值就是:how are <em>you</em>
58.innerTEXT的值和上面的一样,只不过不会把<em>这种標记显示出来.
59.contentEditable可设置元素是否可被修改,isContentEditable返回是否可修改的状態.
60.isDisabled判断是否为禁止状態.disabled设置禁止状態
61.length取得长度,返回整型数值
62.addBehavior()是一种JS调用的外部函数文件其扩展名为.htc
63.window.focus()使当前的窗口在所有窗口之前.
64.blur()指失去焦点.与FOCUS()相反.
65.select()指元素为选中状態.
66.防止用户对文本框中输入文本:onfocus="this.blur()"
67.取出该元素在页面中出现的数量:document.all.tags("div(或其它HTML標记符)").length
68.JS中分为两种窗体输出:模態和非模態.window.showModaldialog(),window.showModeless()
69.状態栏文字的设置:window.status='文字',默认的状態栏文字设置:window.defaultStatus = '文字.';
70.添加到收藏夹:external.AddFavorite("http://www.webjx.com";,"webjx");
71.JS中遇到脚本错误时不做任何操作:window.onerror = doNothing; 指定错误句柄的语法为:window.onerror = handleError;
72.JS中指定当前打开窗口的父窗口:window.opener,支持opener.opener...的多重继续.
73.JS中的self指的是当前的窗口
74.JS中状態栏显示內容:window.status="內容"
75.JS中的top指的是框架集中最顶层的框架
76.JS中关闭当前的窗口:window.close();
77.JS中提出是否確认的框:if(confirm("Are you sure?")){alert("ok");}else{alert("Not Ok");}
78.JS中的窗口重定向:window.navigate(
http://www.webjx.com;);
79.JS中的打印:window.print()
80.JS中的提示输入框:window.prompt("message","defaultReply");
81.JS中的窗口滚动条:window.scroll(x,y)
82.JS中的窗口滚动到位置:window.scrollby
83.JS中设置时间间隔:setInterval("expr",msecDelay)或setInterval(funcRef,msecDelay)或setTimeout
84.JS中的模態显示在IE4 行,在NN中不行:showModalDialog("URL"[,arguments][,features]);
85.JS中的退出之前使用的句柄:function verifyClose(){event.returnValue="we really like you and hope you will stay longer.";}} window.=verifyClose;
86.当窗体第一次调用时使用的文件句柄:onload()
87.当窗体关闭时调用的文件句柄:onunload()
88.window.location的属性: protocol(http:),hostname(www.webjx.com),port(80),host(www.example.com:80),pathname("/a/a.html"),hash("#giantGizmo",指跳转到相应的锚记),href(全部的信息)
89.window.location.reload()刷新当前页面.
90.window.history.back()返回上一页,window.history.forward()返回下一页,window.history.go(返回第几页,也可以使用访问过的URL)
91.document.write()不换行的输出,document.writeln()换行输出
92.document.body.noWrap=true;防止链接文字折行.
93.变量名.charAt(第几位),取该变量的第几位的字符.
94."abc".charCodeAt(第几个),返回第几个字符的ASCii码值.
95.字符串连接:string.concat(string2),或用 =进行连接
96.变量.indexOf("字符",起始位置),返回第一个出现的位置(从0开始计算)
97.string.lastIndexOf(searchString[,startIndex])最后一次出现的位置.
98.string.match(regExpression),判断字符是否匹配.
99.string.replace(regExpression,replaceString)替换现有字符串.
100.string.split(分隔符)返回一个数组存储值.
101.string.substr(start[,length])取从第几位到指定长度的字符串.
102.string.toLowerCase()使字符串全部变为小写.
103.string.toUpperCase()使全部字符变为大写.
104.parseInt(string[,radix(代表进制)])强制转换成整型.
105.parseFloat(string[,radix])强制转换成浮点型.
106.isNaN(变量):测试是否为数值型.
107.定义常量的关键字:const,定义变量的关键字:var
posted @
2007-05-26 19:52 xrzp 阅读(280) |
评论 (0) |
编辑 收藏
43 表单构成
1: <form method=”post” action=”target.html” name=”thisForm”>
2: <input type=”text” name=”myText”>
3: <select name=”mySelect”>
4: <option value=”1”>First Choice</option>
5: <option value=”2”>Second Choice</option>
6: </select>
7: <br>
8: <input type=”submit” value=”Submit Me”>
9: </form>
44 访问表单中的文本框内容1: <form name=”myForm”>
2: <input type=”text” name=”myText”>
3: </form>
4: <a href='#' onClick='window.alert(document.myForm.myText.value);'>Check Text Field</a>
45 动态复制文本框内容1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText”><br>
3: Copy Text: <input type=”text” name=”copyText”>
4: </form>
5: <a href=”#” onClick=”document.myForm.copyText.value =
6: document.myForm.myText.value;”>Copy Text Field</a>
46 侦测文本框的变化1: <form name=”myForm”>
2: Enter some Text: <input type=”text” name=”myText” onChange=”alert(this.value);”>
3: </form>
47 访问选中的Select1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: <option value=”Third Choice”>3</option>
6: </select>
7: </form>
8: <a href='#' onClick='alert(document.myForm.mySelect.value);'>Check Selection List</a>
48 动态增加Select项1: <form name=”myForm”>
2: <select name=”mySelect”>
3: <option value=”First Choice”>1</option>
4: <option value=”Second Choice”>2</option>
5: </select>
6: </form>
7: <script language=”JavaScript”>
8: document.myForm.mySelect.length++;
9: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].text = “3”;
10: document.myForm.mySelect.options[document.myForm.mySelect.length - 1].value = “Third Choice”;
11: </script>
49 验证表单字段1: <script language=”JavaScript”>
2: function checkField(field) {
3: if (field.value == “”) {
4: window.alert(“You must enter a value in the field”);
5: field.focus();
6: }
7: }
8: </script>
9: <form name=”myForm” action=”target.html”>
10: Text Field: <input type=”text” name=”myField”onBlur=”checkField(this)”>
11: <br><input type=”submit”>
12: </form>
50 验证Select项1: function checkList(selection) {
2: if (selection.length == 0) {
3: window.alert(“You must make a selection from the list.”);
4: return false;
5: }
6: return true;
7: }
51 动态改变表单的action
1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br>
3: Password: <input type=”password” name=”password”><br>
4: <input type=”button” value=”Login” onClick=”this.form.submit();”>
5: <input type=”button” value=”Register” onClick=”this.form.action = ‘register.html’; this.form.submit();”>
6: <input type=”button” value=”Retrieve Password” onClick=”this.form.action = ‘password.html’; this.form.submit();”>
7: </form>
52 使用图像按钮1: <form name=”myForm” action=”login.html”>
2: Username: <input type=”text” name=”username”><br>
3: Password: <input type=”password”name=”password”><br>
4: <input type=”image” src="/”login.gif"” value=”Login”>
5: </form>
6:
53 表单数据的加密1: <SCRIPT LANGUAGE='JavaScript'>
2: <!--
3: function encrypt(item) {
4: var newItem = '';
5: for (i=0; i < item.length; i++) {
6: newItem += item.charCodeAt(i) + '.';
7: }
8: return newItem;
9: }
10: function encryptForm(myForm) {
11: for (i=0; i < myForm.elements.length; i++) {
12: myForm.elements[i].value = encrypt(myForm.elements[i].value);
13: }
14: }
15:
16: //-->
17: </SCRIPT>
18: <form name='myForm' onSubmit='encryptForm(this); window.alert(this.myField.value);'>
19: Enter Some Text: <input type=text name=myField><input type=submit>
20: </form>
posted @
2007-05-26 19:42 xrzp 阅读(423) |
评论 (2) |
编辑 收藏
36 读取图像属性
1: <img src="/”image1.jpg"” name=”myImage”>
2: <a href=”# ” onClick=”window.alert(document.myImage.width)”>Width</a>
3:
37 动态加载图像1: <script language=”JavaScript”>
2: myImage = new Image;
3: myImage.src = “Tellers1.jpg”;
4: </script>
38 简单的图像替换1: <script language=”JavaScript”>
2: rollImage = new Image;
3: rollImage.src = “rollImage1.jpg”;
4: defaultImage = new Image;
5: defaultImage.src = “image1.jpg”;
6: </script>
7: <a href="/”myUrl"” onMouseOver=”document.myImage.src = rollImage.src;”
8: onMouseOut=”document.myImage.src = defaultImage.src;”>
9: <img src="/”image1.jpg"” name=”myImage” width=100 height=100 border=0>
39 随机显示图像1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var imageChoice = Math.floor(Math.random() * imageList.length);
8: document.write(‘<img src=”’ + imageList[imageChoice] + ‘“>’);
9: </script>
40 函数实现的图像替换1: <script language=”JavaScript”>
2: var source = 0;
3: var replacement = 1;
4: function createRollOver(originalImage,replacementImage) {
5: var imageArray = new Array;
6: imageArray[source] = new Image;
7: imageArray[source].src = originalImage;
8: imageArray[replacement] = new Image;
9: imageArray[replacement].src = replacementImage;
10: return imageArray;
11: }
12: var rollImage1 = createRollOver(“image1.jpg”,”rollImage1.jpg”);
13: </script>
14: <a href=”#” onMouseOver=”document.myImage1.src = rollImage1[replacement].src;”
15: onMouseOut=”document.myImage1.src = rollImage1[source].src;”>
16: <img src="/”image1.jpg"” width=100 name=”myImage1” border=0>
17: </a>
41 创建幻灯片
1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = new Image;
4: imageList[0].src = “image1.jpg”;
5: imageList[1] = new Image;
6: imageList[1].src = “image2.jpg”;
7: imageList[2] = new Image;
8: imageList[2].src = “image3.jpg”;
9: imageList[3] = new Image;
10: imageList[3].src = “image4.jpg”;
11: function slideShow(imageNumber) {
12: document.slideShow.src = imageList[imageNumber].src;
13: imageNumber += 1;
14: if (imageNumber < imageList.length) {
15: window.setTimeout(“slideShow(“ + imageNumber + “)”,3000);
16: }
17: }
18: </script>
19: </head>
20: <body onLoad=”slideShow(0)”>
21: <img src="/”image1.jpg"” width=100 name=”slideShow”>
42 随机广告图片1: <script language=”JavaScript”>
2: var imageList = new Array;
3: imageList[0] = “image1.jpg”;
4: imageList[1] = “image2.jpg”;
5: imageList[2] = “image3.jpg”;
6: imageList[3] = “image4.jpg”;
7: var urlList = new Array;
8: urlList[0] = “
http://some.host/”;
9: urlList[1] = “
http://another.host/”;
10: urlList[2] = “
http://somewhere.else/”;
11: urlList[3] = “
http://right.here/”;
12: var imageChoice = Math.floor(Math.random() * imageList.length);
13: document.write(‘<a href=”’ + urlList[imageChoice] + ‘“><img src=”’ + imageList[imageChoice] + ‘“></a>’);
14: </script>
posted @
2007-05-26 19:31 xrzp 阅读(319) |
评论 (1) |
编辑 收藏
26 访问document对象
1: <script language=”JavaScript”>
2: var myURL = document.URL;
3: window.alert(myURL);
4: </script>
27 动态输出HTML1: <script language=”JavaScript”>
2: document.write(“<p>Here’s some information about this document:</p>”);
3: document.write(“<ul>”);
4: document.write(“<li>Referring Document: “ + document.referrer + “</li>”);
5: document.write(“<li>Domain: “ + document.domain + “</li>”);
6: document.write(“<li>URL: “ + document.URL + “</li>”);
7: document.write(“</ul>”);
8: </script>
28 输出换行1: document.writeln(“<strong>a</strong>”);
2: document.writeln(“b”);
29 输出日期1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: document.write(thisDate.toString());
4: </script>
30 指定日期的时区1: <script language=”JavaScript”>
2: var myOffset = -2;
3: var currentDate = new Date();
4: var userOffset = currentDate.getTimezoneOffset()/60;
5: var timeZoneDifference = userOffset - myOffset;
6: currentDate.setHours(currentDate.getHours() + timeZoneDifference);
7: document.write(“The time and date in Central Europe is: “ + currentDate.toLocaleString());
8: </script>
31 设置日期输出格式
1: <script language=”JavaScript”>
2: var thisDate = new Date();
3: var thisTimeString = thisDate.getHours() + “:” + thisDate.getMinutes();
4: var thisDateString = thisDate.getFullYear() + “/” + thisDate.getMonth() + “/” + thisDate.getDate();
5: document.write(thisTimeString + “ on “ + thisDateString);
6: </script>
32 读取URL参数1: <script language=”JavaScript”>
2: var urlParts = document.URL.split(“?”);
3: var parameterParts = urlParts[1].split(“&”);
4: for (i = 0; i < parameterParts.length; i++) {
5: var pairParts = parameterParts[i].split(“=”);
6: var pairName = pairParts[0];
7: var pairValue = pairParts[1];
8: document.write(pairName + “ :“ +pairValue );
9: }
10: </script>
你还以为HTML是无状态的么?
33 打开一个新的document对象1: <script language=”JavaScript”>
2: function newDocument() {
3: document.open();
4: document.write(“<p>This is a New Document.</p>”);
5: document.close();
6: }
7: </script>
34 页面跳转1: <script language=”JavaScript”>
2: window.location = “
http://www.liu21st.com/”;
3: </script>
35 添加网页加载进度窗口1: <html>
2: <head>
3: <script language='javaScript'>
4: var placeHolder = window.open('holder.html','placeholder','width=200,height=200');
5: </script>
6: <title>The Main Page</title>
7: </head>
8: <body onLoad='placeHolder.close()'>
9: <p>This is the main page</p>
10: </body>
11: </html>
posted @
2007-05-26 19:29 xrzp 阅读(211) |
评论 (0) |
编辑 收藏
1 创建脚本块
1: <script language=”JavaScript”>
2: JavaScript code goes here
3: </script>
2 隐藏脚本代码1: <script language=”JavaScript”>
2: <!--
3: document.write(“Hello”);
4: // -->
5: </script>
在不支持JavaScript的浏览器中将不执行相关代码
3 浏览器不支持的时候显示1: <noscript>
2: Hello to the non-JavaScript browser.
3: </noscript>
4 链接外部脚本文件1: <script language=”JavaScript” src="/”filename.js"”></script>
5 注释脚本
1: // This is a comment
2: document.write(“Hello”); // This is a comment
3: /*
4: All of this
5: is a comment
6: */
6 输出到浏览器
1: document.write(“<strong>Hello</strong>”);
7 定义变量
1: var myVariable = “some value”;
8 字符串相加
1: var myString = “String1” + “String2”;
9 字符串搜索
1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: var therePlace = myVariable.search(“there”);
5: document.write(therePlace);
6: // -->
7: </script>
10 字符串替换
1: thisVar.replace(“Monday”,”Friday”);
11 格式化字串
1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “Hello there”;
4: document.write(myVariable.big() + “<br>”);
5: document.write(myVariable.blink() + “<br>”);
6: document.write(myVariable.bold() + “<br>”);
7: document.write(myVariable.fixed() + “<br>”);
8: document.write(myVariable.fontcolor(“red”) + “<br>”);
9: document.write(myVariable.fontsize(“18pt”) + “<br>”);
10: document.write(myVariable.italics() + “<br>”);
11: document.write(myVariable.small() + “<br>”);
12: document.write(myVariable.strike() + “<br>”);
13: document.write(myVariable.sub() + “<br>”);
14: document.write(myVariable.sup() + “<br>”);
15: document.write(myVariable.toLowerCase() + “<br>”);
16: document.write(myVariable.toUpperCase() + “<br>”);
17:
18: var firstString = “My String”;
19: var finalString = firstString.bold().toLowerCase().fontcolor(“red”);
20: // -->
21: </script>
12 创建数组1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “First Entry”;
5: myArray[1] = “Second Entry”;
6: myArray[2] = “Third Entry”;
7: myArray[3] = “Fourth Entry”;
8: myArray[4] = “Fifth Entry”;
9: var anotherArray = new Array(“First Entry”,”Second Entry”,”Third Entry”,”Fourth Entry”,”Fifth Entry”);
10: // -->
11: </script>
13 数组排序1: <script language=”JavaScript”>
2: <!--
3: var myArray = new Array(5);
4: myArray[0] = “z”;
5: myArray[1] = “c”;
6: myArray[2] = “d”;
7: myArray[3] = “a”;
8: myArray[4] = “q”;
9: document.write(myArray.sort());
10: // -->
11: </script>
14 分割字符串1: <script language=”JavaScript”>
2: <!--
3: var myVariable = “a,b,c,d”;
4: var stringArray = myVariable.split(“,”);
5: document.write(stringArray[0]);
6: document.write(stringArray[1]);
7: document.write(stringArray[2]);
8: document.write(stringArray[3]);
9: // -->
10: </script>
15 弹出警告信息1: <script language=”JavaScript”>
2: <!--
3: window.alert(“Hello”);
4: // -->
5: </script>
16 弹出确认框1: <script language=”JavaScript”>
2: <!--
3: var result = window.confirm(“Click OK to continue”);
4: // -->
5: </script>
17 定义函数1: <script language=”JavaScript”>
2: <!--
3: function multiple(number1,number2) {
4: var result = number1 * number2;
5: return result;
6: }
7: // -->
8: </script>
18 调用JS函数1: <a href=”#” onClick=”functionName()”>Link text</a>
2: <a href="/”javascript:functionName"()”>Link text</a>
19 在页面加载完成后执行函数1: <body onLoad=”functionName();”>
2: Body of the page
3: </body>
20 条件判断1: <script>
2: <!--
3: var userChoice = window.confirm(“Choose OK or Cancel”);
4: var result = (userChoice == true) ? “OK” : “Cancel”;
5: document.write(result);
6: // -->
7: </script>
21 指定次数循环
1: <script>
2: <!--
3: var myArray = new Array(3);
4: myArray[0] = “Item 0”;
5: myArray[1] = “Item 1”;
6: myArray[2] = “Item 2”;
7: for (i = 0; i < myArray.length; i++) {
8: document.write(myArray[i] + “<br>”);
9: }
10: // -->
11: </script>
22 设定将来执行
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: window.setTimeout(“hello()”,5000);
7: // -->
8: </script>
23 定时执行函数
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: window.setTimeout(“hello()”,5000);
6: }
7: window.setTimeout(“hello()”,5000);
8: // -->
9: </script>
24 取消定时执行
1: <script>
2: <!--
3: function hello() {
4: window.alert(“Hello”);
5: }
6: var myTimeout = window.setTimeout(“hello()”,5000);
7: window.clearTimeout(myTimeout);
8: // -->
9: </script>
25 在页面卸载时候执行函数
1: <body onUnload=”functionName();”>
2: Body of the page
3: </body>
posted @
2007-05-26 19:22 xrzp 阅读(600) |
评论 (0) |
编辑 收藏
parent.opener.window.reflash();
parent.window.close();
list页面得要有reflash()这个方法.
posted @
2007-05-25 16:31 xrzp 阅读(894) |
评论 (0) |
编辑 收藏
在进行数据库查询时,有完整查询和模糊查询之分。
一般模糊语句如下:
SELECT 字段 FROM 表 WHERE 某字段 Like 条件
|
其中关于条件,SQL提供了四种匹配模式:
1,%:表示任意0个或多个字符。可匹配任意类型和长度的字符,
有些情况下若是中文,请使用两个百分号(%%)表示。
比如 SELECT * FROM [user] WHERE u_name LIKE '%三%'
将会把u_name为“张三”,“张猫三”、“三脚猫”,“唐三藏”等等有“三”的记录全找出来。
另外,如果需要找出u_name中既有“三”又有“猫”的记录,请使用and条件
SELECT * FROM [user] WHERE u_name LIKE '%三%' AND u_name LIKE '%猫%'
若使用
SELECT * FROM [user] WHERE u_name LIKE '%三%猫%'虽然能搜索出“三脚猫”,但不能搜索出符合条件的“张猫三”。
2,_: 表示任意单个字符。匹配单个任意字符,它常用来限制表达式的字符长度语句:
比如 SELECT * FROM [user] WHERE u_name LIKE '_三_'
只找出“唐三藏”这样u_name为三个字且中间一个字是“三”的;
再比如 SELECT * FROM [user] WHERE u_name LIKE '三__';
只找出“三脚猫”这样name为三个字且第一个字是“三”的;
3,[ ]:表示括号内所列字符中的一个(类似正则表达式)。指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。
比如 SELECT * FROM [user] WHERE u_name LIKE '[张李王]三'
将找出“张三”、“李三”、“王三”(而不是“张李王三”);
如 [ ] 内有一系列字符(01234、abcde之类的)则可略写为“0-4”、“a-e”
SELECT * FROM [user] WHERE u_name LIKE '老[1-9]'
将找出“老1”、“老2”、……、“老9”;
4,[^ ] :表示不在括号所列之内的单个字符。其取值和 [] 相同,但它要求所匹配对象为指定字符以外的任一个字符。
比如 SELECT * FROM [user] WHERE u_name LIKE '[^张李王]三'
将找出不姓“张”、“李”、“王”的“赵三”、“孙三”等;
SELECT * FROM [user] WHERE u_name LIKE '老[^1-4]';
将排除“老1”到“老4”,寻找“老5”、“老6”、……
5,查询内容包含通配符时由于通配符的缘故,导致我们查询特殊字符“%”、“_”、“[”的语句无法正常实现,而把特殊字符用“[ ]”括起便可正常查询。据此我们写出以下函数:
function sqlencode(str) str=replace(str,"[","[[]") '此句一定要在最前 str=replace(str,"_","[_]") str=replace(str,"%","[%]") sqlencode=str end function
|
在查询前将待查字符串先经该函数处理即可。
posted @
2007-04-01 15:55 xrzp 阅读(333) |
评论 (0) |
编辑 收藏
查询:
select
countTotal
,system
from
(
select
tablesystem,
count
(tablesystem)
countTotal
from
s_dic_table
group
by
tablesystem) t1,s_dic_tablesystem t2
where
t2.systemcode
=
t1.tablesystem
更新1:
update b_hr_him_employee
set name = (select insname from TEMPINSname tmp where tmp.sysid = copyid)
where exists
(select insname from TEMPINSname tmp where tmp.sysid = copyid) 更新2:
update b_hr_him_employee set
gender = (select minorcode
from s_sys_code s
inner join TEMPINSgender tmp on s.meaning = tmp.insgender
where tmp.sysid = copyid)
where exists (select minorcode
from s_sys_code s
inner join TEMPINSgender tmp on s.meaning = tmp.insgender
where tmp.sysid = copyid)
posted @
2007-03-30 16:32 xrzp 阅读(256) |
评论 (0) |
编辑 收藏
在工程的目录下建立一个[测试.xls]的EXCEL文件。代码如下:
import java.io.File;
import jxl.*;
public class Test2 {
public static void main(String[] args) {
try {
Workbook book = Workbook.getWorkbook(new File("测试.xls"));
// 获得第一个工作表对象
Sheet sheet = book.getSheet(0);
// 得到单元格
for (int i = 0; i < sheet.getColumns(); i++) {
for (int j = 0; j < sheet.getRows(); j++) {
Cell cell = sheet.getCell(i, j);
System.out.print(cell.getContents() + " ");
}
System.out.println();
}
book.close();
} catch (Exception e) {
System.out.println(e);
}
}
} 最后的结果就会显示excel文件里面的内容了。JXL和POI差不多。POI用的是HSSF开头的,其他都差不多,开始的时候要先用一个 输入流来读取文件。
posted @
2007-03-14 16:09 xrzp 阅读(3172) |
评论 (0) |
编辑 收藏
第三阶段
流行MVC架构和Java对象持久化技术。包括Struts、Spring、Hibernate。
要求:
MVC-------理解MVC设计模式、处理过程。(其实jsp+servlet+javaBean就是一个最基本的MVC框架)
Struts-------理解Struts实现MVC的机制、工作流程。掌握配置Struts应用、(Struts-Config.xml,ActionAction、ActionForm)的运用,Struts应用的国际化(感觉就是标签加配置文件,property那个文件)、Validator验证框架(可以联系下JS)、Struts标签库。
Spring-------掌握控制反转(IoC),也就是DI,然后是面向方面编程(AOP),其他的晃一眼。。。
Hibernate--------理解ORM,掌握映射对象标识符、映射关系(一对多、多对多、一对一)、映射类型、检索策略、检索方式、数据库事务与并发、管理Hibernate的缓存。 (可以和EJB里面的EntityBean对起来看)
学习过程:先学习Struts,再学习Hibernate,最后学Spring,再最后把几个框架结合在一起,注意XML的配置。。。还有注意要积累对一些常见的异常的处理方法。总的来说,我觉得框架就是会使用就行了,平时多去想想它带来的好处,也就是为啥子要用它们,也就是它们的一些思想,比如说spring的DI,使用了框架后的松耦合等等。
有时间的话,看一下ajax,JSF,webwork,有用的东西。对了,还有CVS等一些版本控制工具。(这些都是霸霸说的^_^)
posted @
2007-01-31 00:28 xrzp 阅读(623) |
评论 (1) |
编辑 收藏
第二阶段:
JAVA网络编程(Socket)、HTML、XML、JSP、JavaBean、Servlet(后面3个是重点)。
要求:
Socket--------掌握java.io包中的套接口类和服务器套接口类的使用。
HTML--------了解HTML语言的语法、各种标签。
XML--------掌握XML语言的语法,其他的了解下。
JSP-------掌握JSP2.0语法、五大元素、内置对象、EL、JSTL1.1、JSP自定标签。
JavaBean-------理解JavaBean的特点和事件模型。
Servlet---------掌握HTTP协议、Servlet工作过程、Servlet会话跟踪、Servlet过滤器、Serlvet事件侦听器、配置web.xml。
PS:-------学习过程中学会使用Tomcat、JBoss服务器,学习使用myeclipse、dreamweaver、junit开发工具。
另外,关注一下EJB3.0。
posted @
2007-01-31 00:15 xrzp 阅读(554) |
评论 (0) |
编辑 收藏
自己看了几个月JAVA的体会:框架的东西随时会变,而基础是不变的;所以基础很重要。
第一阶段:
JAVA语言基础知识。包括异常、IO流、多线程、集合类。常见的几个包、几个接口。
要求:
异常------掌握try-catch-finally的使用
IO流------掌握字节流、字符流和对象序列化的处理。熟练使用各种输入、输出流类(InputStream、OutputStream、FileInputStream、FileOutputStream、DataInputStream、DataOutputStream、BufferedInputStream、BufferedOutputStream、Reader、Writer、InputStreamReader、OutputStreamWriter、BufferReader、BufferedWriter、ObjectInputStream、ObjectOutputStream)。
多线程-------掌握多线程实现的两种实现方法,分别是继承Thread类与实现Runnable接口。理解线程间的同步与互斥。
集合类-------掌握Set、Collection、Map、List、Iterator、Enumeration接口的使用,掌握HashSet、ArrayList、Vector、HashMap、HashTable类的使用。
常用的包:java.lang,java.util,java.io,java.net,java.awt,javax.swing
另外-------理解Unicode、GB2132、GBK、UTF-8、ISO8859编码方式。以及怎么处理乱码的方法。
了解javase1.5新增的内容:自动装箱/拆箱,泛型之类的。
posted @
2007-01-31 00:05 xrzp 阅读(432) |
评论 (0) |
编辑 收藏
近日在论坛上看到有人在问星期算法,特别整理了一下,这些算法都是从网上搜索而来。希望对大家有所帮助。
一:常用公式
W = [Y-1] + [(Y-1)/4] - [(Y-1)/100] + [(Y-1)/400] + D
Y是年份数,D是这一天在这一年中的累积天数,也就是这一天在这一年中是第几天。
二:蔡勒(Zeller)公式
w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
公式中的符号含义如下,w:星期;c:世纪;y:年(两位数); m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算);d:日;[ ]代表取整,即只要整数部分。
相比于通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。
三:对蔡勒(Zeller)公式的改进
作者:冯思琮
相比于另外一个通用通用计算公式而言,蔡勒(Zeller)公式大大降低了计算的复杂度。不过,笔者给出的通用计算公式似乎更加简洁(包括运算过程)。现将公式列于其下:
W=[y/4]+r (y/7)-2r(c/4)+m’+d
公式中的符号含义如下,r ( )代表取余,即只要余数部分;m’是m的修正数,现给出1至12月的修正数1’至12’如下:(1’,10’)=6;(2’,3’,11’)=2;(4’,7’)=5;5’=0;6’=3;8’=1;(9’,12’)=4(注意:在笔者给出的公式中,y为润年时1’=5;2’=1)。其他符号与蔡勒(Zeller)公式中的含义相同。
四:基姆拉尔森计算公式
W= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7
在公式中d表示日期中的日数,m表示月份数,y表示年数。
注意:在公式中有个与其他公式不同的地方:
把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
posted @
2007-01-16 23:07 xrzp 阅读(1884) |
评论 (3) |
编辑 收藏
先来个小总结:
yield()使当前线程暂停。但设置了setPriority(Thread.MAX_PRIORITY);时,yield()不咋管用了。
一般只需要重写run()方法的话,实现runnalbe接口比较方便。
如果在进程类里面需要访问同一个变量的话,就实现接口。如果用继承类的话,同一个变量就有几份的拷贝。但是内部类继承类的结和继承接口的效果一样。
启动一个线程
MyThread mt=new MyThread();
new Thread(mt).start();
好多东西都有时间片。时间片是个不确定的东西。
当调用wait(),notify()方法时,应该保证他们是同一个对象sy也要同一个对象。synchronized 中 才能有wait(),notify()方法。
synchronized(Object obj)与synchronized(this)的区别?!(谁能告诉我!!!!!)
下面是生产者与消费者的例子,为了方便,几个类直接写在一起了。
//new 生产者,消费者,队列。并起用生产者,消费者的线程
public class Test {
public static void main(String[] args) {
Queue q = new Queue();
Producer p = new Producer(q);
Consumer c = new Consumer(q);
p.start();
c.start();
}
}
//生产者,每生产好一个东西后,就往队列中放一个
class Producer extends Thread {
Queue q;
Producer(Queue q) {
this.q = q;
}
public void run() {
for (int i = 0; i < 10; i++) {
q.setValue(i);
System.out.println("Producer put:" + i);
}
}
}
//消费者,每当队列中有东西通知时,就从队列去拿
class Consumer extends Thread {
Queue q;
Consumer(Queue q) {
this.q = q;
}
public void run() {
while (true) {
System.out.println("Consumer get:" + q.getValue());
}
}
}
//队列
class Queue {
int value;
boolean flag = false;
//生产者往这放它所生产的东西
public synchronized void setValue(int i) {
//当生产好一个往队列中放了后,放置一个标志。发个通知,告诉说生产好了,并等待消费者来拿
if (!flag) {
value = i;
flag = true;
notify();
}
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//消费者从这获取东西
public synchronized int getValue() {
//消费这先判断队列是否有东西了,有的话,就让其他线程等待,自己取拿,拿好后设置一个标志,发个通告告诉其他线程,我拿好了
if (!flag) {
try {
wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
flag = false;
notify();
return value;
}
}
posted @
2007-01-15 00:27 xrzp 阅读(840) |
评论 (0) |
编辑 收藏
1.
集合框架分为Collection和Map。Collection包括set和List。
2.
Collection:集合层次中的根接口,JDK没有提供这个接口直接的实现类。
Set:不能包含重复的元素。SortedSet是一个按照升序排列元素的Set。
List:是一个有序的集合,可以包含重复的元素。提供了按索引访问的方式。
Map:包含了key-value对。Map不能包含重复的key。SortedMap是一个按照升序排列key的Map。
3.
凡是继承了collection的接口的,都有iterator的方法。
4.
对于没有get的集合类,可以用爹带器。而且爹带器是通用的。
5.
collections是类,都是静态的。里面有几个方法是拿来排序的。(如sort方法)。compared是个比较器。
collection是接口。
6.
Stack里面的pop和push有点像get和set。
Queue和Stack差不多,但是是FIFO。
7.
因为hashset计算出对应的函数值,以这个值作为该结点存储在散列表中的地址,所以对查找的效率非常高。
实现set接口的能不能重复。
hashset通过散列码来存储,而散列码的获得靠hashcode来得到。hashcode根据对象的内存的地址来得到散列码。
8.
hashmap靠put填元素,靠get取元素。HashMap对key进行散列。
三个方法keySet()、values()、entrySet()。
9.
在List的开始处增加元素,或者在List中进行插入和删除操作,应该使用LinkedList。如果单单是为了查询,就用ArrayList。因为ArrayList底层采用数组完成,而LinkedList则是以一般的双向链表(double-linked list)完成,其内每个对象除了数据本身外,还有两个 引用,分别指向前一个元素和后一个元素。
10.
HashSet是基于Hash算法实现的,其性能通常都优于TreeSet。通常都应该使用HashSet,在需要排序的功能时,我们才使用TreeSet。
11.
和Set类似,HashMap的速度通常都比TreeMap快,只有在需要排序的功能的时候,才使用TreeMap。
posted @
2007-01-14 00:40 xrzp 阅读(344) |
评论 (0) |
编辑 收藏
运行的时候,要先运行server,再运行client。
服务器 :
import java.io.DataInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.*;
public class Server {
public static void main(String[] args) throws Exception , IOException{
System.out.println("----Server start-----");
ServerSocket server=new ServerSocket(1234);
Socket socket=server.accept();
InputStream is=socket.getInputStream();
DataInputStream dis=new DataInputStream(is);
System.out.println(dis.readUTF());
dis.close();
is.close();
}
}
客户端:
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.*;
public class Client {
public static void main(String[] args) throws Exception, IOException {
System.out.println("----client is running-----");
Socket socket=new Socket("192.168.1.3",1234);
OutputStream os=socket.getOutputStream();
DataOutputStream dos=new DataOutputStream(os);
dos.writeUTF("哈哈");
dos.close();
os.close();
}
}
posted @
2007-01-14 00:23 xrzp 阅读(1702) |
评论 (2) |
编辑 收藏
JDBC是一个应用程序编程接口API,它描述了标准的JAVA库如何使用结构化查询语言去连接数据源。
我的一个简单模板:(此处用的是mssql数据库)
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JdbcTest {
public void getConnection() throws SQLException, ClassNotFoundException{
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
String url ="jdbc:microsoft:sqlserver://localhost:1433:DatabaseName=pubs" ;
String user="sa";
String psw=null;
String sql="select * from authors";
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver");
conn=DriverManager.getConnection(url,user,psw);
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
if (rs.next()){
System.out.println("connection is ok!");
}
else{
System.out.println("connection is fail!");
}
rs.close();
stmt.close();
conn.close();
}
public static void main(String[] args) throws Exception {
JdbcTest test=new JdbcTest();
test.getConnection();
}
} PS: 因为偷懒,所以直接对有异常的地方采用的是抛出异常,并没捕获。
三大数据库的驱动和URL:
MYSQL:
driver是 org.gjt.mm.mysql.driver
url是 jdbc:mysql://ip:port:databasename ORACLE
driver是 oracle.jdbc.driver.oracledriver
url是 jdbc:oracle:thin@ip:port:sid MSSQL
driver是 com.microsoft.jdbc.sqlserver.SQLServerDriver
url是 jdbc:microsoft:sqlserver://ip:port
posted @
2007-01-12 22:11 xrzp 阅读(528) |
评论 (0) |
编辑 收藏
Java Bean 是可复用的组件,对Java Bean并没有严格的规范,理论上讲,任何一个Java类都可以是一个Bean。但通常情况下,由于Java Bean是被容器所创建(如Tomcat)的,所以Java Bean应具有一个无参的构造器,另外,通常Java Bean还要实现Serializable接口用于实现Bean的持久性。Java Bean实际上相当于微软COM模型中的本地进程内COM组件,它是不能被跨进程访问的。Enterprise Java Bean 相当于DCOM,即分布式组件。它是基于Java的远程方法调用(RMI)技术的,所以EJB可以被远程访问(跨进程、跨计算机)。但EJB必须被布署在诸如Webspere、WebLogic这样的容器中,EJB客户从不直接访问真正的EJB组件,而是通过其容器访问。EJB容器是EJB组件的代理,EJB组件由容器所创建和管理。客户通过容器来访问真正的EJB组件。
3与2的区别:3没有实体Bean(底层用的hibernate),也没有HOME工厂(用的DI机制了,貌似spring就跟它混的)。
用EJB的原因:1:负载均衡 2:对象池 3:单线程
posted @
2007-01-10 00:00 xrzp 阅读(542) |
评论 (0) |
编辑 收藏
很多时候会遇到这样的情况:数据库里面的日期是date型的,而我们从jsp页面获取的日期是String型的,2者之间会有一个转换的问题。转换的方法如下(2种):
1。
Date date=new Date();
DateFormat df =DateFormat.getDateInstance();
try {
df.parse(date2);
} catch (ParseException e) {
e.printStackTrace();
} 2。
Date date=new Date();
SimpleDateFormat sdf =new SimpleDateFormat("yy-MM-dd");
try {
sdf.parse(date);
} catch (ParseException e) {
e.printStackTrace();
} PS:
1。建议在数据库里面将日期也设成String(varchar2)型的,然后在jsp里面有关日期的地方,用js来操作,这样会避免一定的麻烦。
2。一般来说,经过上面的处理后,日期在jsp页面的显示格式是yy-MM-dd 00:00:00。你觉得不好看的话,如果用的是ssh框架,那么可以在相应的hbm.xml中将相应的 <property name="xxxx" type="time">中的type改为type="date"。那么显示的日期格式就只有年月日了。
posted @
2007-01-05 00:44 xrzp 阅读(657) |
评论 (3) |
编辑 收藏
乱码是j2ee中一个比较常见的问题。遇到1,2个情况下,可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决。遇到多的情况下,就最好用过滤器了。
1个过滤器只需要注意2个地方,类和在web.xml上面的发布。
1。在web.xml上面的发布如下:
<filter>
<filter-name>SetCharsetEncodingFilter</filter-name> //这个是类名
<filter-class>org.SetCharacter</filter-class> //这个是类的位置
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>SetCharsetEncodingFilter</filter-name>
<url-pattern> /* </url-pattern> //这个代表所有的文件遇到过滤器都要被拦截
</filter-mapping> 2。过滤的这个类如下:
package org;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class SetCharacter implements Filter {
protected String encoding = null;
protected FilterConfig filterConfig = null;
protected boolean ignore = true;
public void init(FilterConfig arg0) throws ServletException {
this.encoding = arg0.getInitParameter("encoding");
String value = arg0.getInitParameter("imnore");
if(value==null){
this.ignore = true;
}else if (value.equalsIgnoreCase("true")){
this.ignore = true;
}else if(value.equalsIgnoreCase("yes")){
this.ignore = true;
}
}
public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException {
if(ignore||(arg0.getCharacterEncoding() == null)){
String encoding =selectEncoding(arg0);
if(encoding!=null)
arg0.setCharacterEncoding(encoding);
}
arg2.doFilter(arg0,arg1);
}
private String selectEncoding(ServletRequest arg0) {
return (this.encoding);
}
public void destroy() {
this.encoding = null;
this.filterConfig = null;
}
}
posted @
2007-01-04 23:00 xrzp 阅读(1358) |
评论 (2) |
编辑 收藏
JAVA把存储器分为5种:
1.寄存器Register
2.栈Stack:栈在RAM中,CPU可通过栈指针直接访问数据,栈指针向上则建立新的存储区,向下则释放存储区。栈中的数据必须有确切的大小和生命期(什么时候建立数据,什么时候撤消数据),不然指针如何知道该移动多少呢?通常对象的引用放在栈中,但是对象本身不在这里。由于栈在RAM中,因此速度比寄存器慢。基本数据类型也在栈中,因为其大小和生命期是确定的。
3.堆Heap:堆在RAM中,JAVA对象就放在这里。堆的好处是其中的数据的大小和生命期都可以不确定。每当用new关键字创建对象时,编译程序就会在堆中分配响应的存储区给对象。
4.静态存储区Static:静态存储区也在RAM中,看到Static,就可以猜测,那些加在static关键字的数据和方法都放在这里,确实这样。不过对象即便是静态的也不放在这儿。
5.常量存储区Constant:常量存储区在RAM中,与静态存储区类似,程序中的常量(由final关键字修饰)都放在这里。
posted @
2007-01-03 23:38 xrzp 阅读(786) |
评论 (1) |
编辑 收藏