基本概念
ORACLE数据库被划分成称作为表空间的逻辑区域——形成ORACLE数据库的逻辑结构。一
个ORACLE数据库能够有一个或多个表空间,而一个表空间则对应着一个或多个物理的数据库
文件。表空间是ORACLE数据库恢复的最小单位,容纳着许多数据库实体,如表、视图、索引
、聚簇、回退段和临时段等。
每个ORACLE数据库均有SYSTEM表空间,这是数据库创建时自动创建的。SYSTEM表空间
必须总要保持联机,因为其包含着数据库运行所要求的基本信息(关于整个数据库的数据字
典、联机求助机制、所有回退段、临时段和自举段、所有的用户数据库实体、其它ORACLE
软件产品要求的表)。
一个小型应用的ORACLE数据库通常仅包括SYSTEM表空间,然而一个稍大型应用的ORACL
E数据库采用多个表空间会对数据库的使用带来更大的方便。
作用
表空间的作用能帮助DBA用户完成以下工作:
1.决定数据库实体的空间分配;
2.设置数据库用户的空间份额;
3.控制数据库部分数据的可用性;
4.分布数据于不同的设备之间以改善性能;
5.备份和恢复数据。
用户创建其数据库实体时其必须于给定的表空间中具有相应的权力,所以对一个用户来
说,其要操纵一个ORACLE数据库中的数据,应该:
1.被授予关于一个或多个表空间中的RESOURCE特权;
2.被指定缺省表空间;
3.被分配指定表空间的存储空间使用份额;
4.被指定缺省临时段表空间。
维护
表空间的维护是由ORACLE数据库系统管理员DBA通过SQL*PLUS语句实现的,其中表空间
创建与修改中的文件名是不能带路径的,因此DBA必须在ORACLE/DBS目录中操作。
1.新表空间的创建
语法格式:CREATE TABLESPACE 表空间名
DATAFILE 文件标识符[,文件标识符]...
[DEFAULT STORAGE(存储配置参数)]
[ONLINE\OFFLINE];
其中:文件标识符=’文件名’[SIZE整数[K\M][REUSE]
2.修改表空间配置
语法格式:ALTER TABLESPCE 表空间名
(ADD DATAFILE 文件标识符[,文件标识符]...
\RENAME DATAFILE ’文件名’[,’文件名’]...
TO ’文件名’[,’文件名’]...
\DEFAULT STORAGE(存储配置参数)
\ONLINE\OFFLINE[NORMAL\IMMEDIATE]
\(BEGIN\END)BACKUP);
3.取消表空间
语法格式:DROP TABLESPACE表空间名[INCLUDING CONTENTS];
4.检查表空间使用情况
(1)检查当前用户空间分配情况
SELECT tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM user_segments
GROUP BY tablespace_name
(2)a.检查各用户空间分配情况
SELECT owner,tablespace_;
(2)b.检查各用户空间分配情况
SELECT owner,tablespace_name,SUM(extents),SUM(blocks),SUM(bytes)
FROM dba_segments
GROUP BY owner,tablespace_name;
(3) 检查当前用户数据库实体空间使用情况
SELECT tablespace_name,segment_name,segment_type,
COUNT(extent_id),SUM(blocks),SUM(bytes)
FROM user_extents
GROUP BY tablespace_name,segment_name,segment_type;
(4)检查各用户空间使用情况
SELECT owner,tablespace_name,COUNT(extent_id),SUM(blocks),
SUM(bytes) FROM user_extents
GROUP BY owner,tablespace_name;
(5)检查数据库空间使用情况
SELECT tablespace_name,COUNT(extent_id),SUM(blocks),SUM(bytes)
FROM user_extents
GROUP BY tablespace_name;
(6)检查当前用户自由空间情况
SELECT tablespace_name,COUNT(block_id),SUM(blocks),SUM(bytes)
FROM user_free_space
GROUP BY tablespace_name;
(7)检查数据库自由空间情况
SELECT tablespace_name,COUNT(block_id),SUM(blocks),SUM(bytes)
FROM dba_free_space
GROUP BY tablespace_name;
四、结论
表空间是ORACLE数据库系统维护的主要对象,通过本文能详细了解它的基本概念与作用
,并掌握其日常维护知识,从而保证ORACLE数据库系统的正常运行。
建立表空间
CREATE TABLESPACE data01
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE 128k;              #指定区尺寸为128k,如不指定,区尺寸默认为64k
删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;

一、建立表空间
CREATE TABLESPACE data01
DATAFILE '/oracle/oradata/db/DATA01.dbf' SIZE 500M
UNIFORM SIZE 128k;              #指定区尺寸为128k,如不指定,区尺寸默认为64k
二、建立UNDO表空间
CREATE UNDO TABLESPACE UNDOTBS02
DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M
#注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:
ALTER SYSTEM SET undo_tablespace=UNDOTBS02;
三、建立临时表空间
CREATE TEMPORARY TABLESPACE temp_data
TEMPFILE '/oracle/oradata/db/TEMP_DATA.dbf' SIZE 50M
四、改变表空间状态
1.使表空间脱机
ALTER TABLESPACE game OFFLINE;
如果是意外删除了数据文件,则必须带有RECOVER选项
ALTER TABLESPACE game OFFLINE FOR RECOVER;
2.使表空间联机
ALTER TABLESPACE game ONLINE;

3.使数据文件脱机
ALTER DATABASE DATAFILE 3 OFFLINE;
4.使数据文件联机
ALTER DATABASE DATAFILE 3 ONLINE;
5.使表空间只读
ALTER TABLESPACE game READ ONLY;
6.使表空间可读写
ALTER TABLESPACE game READ WRITE;
五、删除表空间
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
六、扩展表空间
首先查看表空间的名字和所属文件
select tablespace_name, file_id, file_name,
round(bytes/(1024*1024),0) total_space
from dba_data_files
order by tablespace_name;
1.增加数据文件
   ALTER TABLESPACE game
   ADD DATAFILE '/oracle/oradata/db/GAME02.dbf' SIZE 1000M;
2.手动增加数据文件尺寸
   ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf'
   RESIZE 4000M;
3.设定数据文件自动扩展
   ALTER DATABASE DATAFILE '/oracle/oradata/db/GAME.dbf
   AUTOEXTEND ON NEXT 100M
   MAXSIZE 10000M;
设定后查看表空间信息
   SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
   (B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
   FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
   WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;

-----------------------------------------------------------------------
--------------------------------------------------------------------------------
------------------------------------------------------------------------------------------
解决办法:
Oracle工程师建议安装Oracle补丁p3949307_9206_SOLARIS64,经过测试,安装步骤如下: (注意,首先shutdown数据库)
1,解压补丁文件
unzip p3949307_9206_SOLARIS64.zip
解开后的目录是:4060756
2,修改oraclehomeproperties.xml文件,该文件在$ORACLE_HOME/inventory/ContentsXML目录下。
cp oraclehomeproperties.xml oraclehomeproperties.xmlb.bak
vi oraclehomeproperties.xml
更改数字453 ->23,存盘退出
3,修改PATH路径为
PATH=$ORACLE_HOME/bin:/usr/ccs/bin:${PATH}
4,执行opatch apply命令
cd 4060756
$ORACLE_HOME/OPatch/opatch apply
5,安装成功后会出现如下结果
Updating inventory...
/oracle92/app/oracle/product/9.2.0.1/OPatch/opatch.pl version: 1.0.0.0.51
Copyright (c) 2001-2004 Oracle Corporation. All Rights Reserved.
OPatch succeeded.
 
2 查看Oracle表空间大小及利用率的SQL语句-非常实用的语句
set linesize 300
col 表空间名 for a30
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",
D.TOT_GROOTTE_MB "表空间大小(M)",
D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES) / D.TOT_GROOTTE_MB * 100,
2),
'990.99') "使用比",
F.TOTAL_BYTES "空闲空间(M)",
F.MAX_BYTES "最大块(M)"
FROM (SELECT TABLESPACE_NAME,
ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
FROM SYS.DBA_FREE_SPACE
GROUP BY TABLESPACE_NAME) F,
(SELECT DD.TABLESPACE_NAME,
ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
FROM SYS.DBA_DATA_FILES DD
GROUP BY DD.TABLESPACE_NAME) D
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
ORDER BY 4 DESC;
3 XX网Oracle数据库SYSTEM表空间文件坏块的解决办法
故障现象:
NetBackup备份出错,日志如下:
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ch01 channel at 06/15/2005 02:28:44
ORA-19566: 超出损坏块限制 0 (文件 /u01/app/oradata/unicom/system01.dbf)

故障分析:
由于事前发生过别的表空间(cookdbs:/u01/app/oradata/unicom/cokdbs.dbf)也有坏块的情况,根据李智他们的建议,使用迁移数据后删除表空间的办法解决(仅适用于普通表空间)。
这是查询该表空间上的表和索引对象的一个脚本:
 
GXdb% more query.sql
conn /as sysdba
col owner for a25
col segment_name for a40
spool table.log
select distinct OWNER,SEGMENT_NAME from dba_extents
where TABLESPACE_NAME='COOKDB'
and SEGMENT_TYPE='TABLE';
spool off
spool index.log
select distinct OWNER,SEGMENT_NAME from dba_extents
where TABLESPACE_NAME='COOKDB'
and SEGMENT_TYPE='INDEX';
spool off
exit
查询完毕后,使用一个迁移的脚本迁移到新的表空间:
 
GXdb% more move.sh
#!/bin/ksh
sqlplus /nolog @query.sql
NEWTBS="cookdbs1"
echo "conn /as sysdba" > move.sql
for TNAME in `cat table.log | awk '
                        /^COOKDB/ {print $2}
                        '`
do
     echo "alter table cookdb.$TNAME move tablespace $NEWTBS;" >>move.sql
done
for INAME in `cat index.log | awk '
                        /^COOKDB/ {print $2}
                        '`
do
    echo "ALTER INDEX cookdb.$INAME REBUILD TABLESPACE $NEWTBS;" >>move.sql
done
echo "exit" >>move.sql
sqlplus /nolog @move.sql
本次经过检查,发现包括有System在内的四个表空间的四个数据文件有坏块。为了能使用NetBackup备份,对NetBackup脚本做以下修改(对相应的数据文件设置maxcorrupt):
 
run {
allocate channel ch00 type 'sbt_tape';
set maxcorrupt for datafile 1,27,28,44 to 10;
backup 。。。。。。
release channel ch00;
}
如果有归档日志没有丢失,都备份过,可以使用rman的blockrecover来修复文件的坏块,例如:
 
run {
allocate channel ch00 type 'sbt_tape';
blockrecover datafile 27 block 302089,302090,332823,332824,332825,332826;
blockrecover datafile 28 block 340846,340847,340848,340849;
blockrecover datafile 44 block 380381,380382,380383,380384,380405,380406,380407,380408;
blockrecover datafile 1 block 1703064,1703065,1703066,1703067,1703088,1703089,1703090,1703091;
release channel ch00;
}

但是中间由于备份失败,本地维护删除过归档日志。此方法不适用。
本次由于有SYSTEM表空间,不同于普通用户表空间,它有自己的特殊性。所以有些问题的解决方法也不尽相同。经多方探讨协商(Oracle India engineer、项目经理、本地维护、开发部门和系统工程部经理),总结了以下处理办法:
解决SYSTEM表空间文件坏块的方法是导出全库数据,删除数据库,重建数据库,导入全库数据。具体的操纵步骤,经过讨论,见如下:主要是考虑到优化可以在线进行,也需要在线进行,还考虑到优化的万一出错性,既便出错至少还可以恢复到原始状态,如果优化没有成功,再做导出导入也不能恢复到初始状态。所以就先做导出导入工作再做优化处理。步骤是:
1. 导出整个数据库(数据库在线),参考命令:exp system/manager file=/oraclebak/unicomdbfull.dmp full=Y log=/oraclebak/unicomfull.log
2. 备份配置文件 cp $ORACLE_HOME/dbs/* /Oraclebak,记录数据库名及实例名,参考字典视图V$DATABASE,V$INSTANCE
3. 删除数据库DBCA(/u02/app/oracle/product/9.2.0.1/bin/dbca)图形化配置工具。注意:建议不要删除数据文件、重做日志文件和控制文件以及归档日志文件,处理方法是:一)就数据文件、重做日志文件和控制文件分别改名为xxx.bak.xxx文件,例如mv datafile001.dbf datafile001.bak.dbf ;二)就归档日志文件,只改名归档日志文件所在的目录名即可,例如mv archivedir archivedirbak。要参考的数据字典视图有V$DATAFILE、V$LOGFILE、V$CONTROLFILE和archive log list 参数
4. 重建数据库DBCA(/u02/app/oracle/product/9.2.0.1/bin/dbca)图形化配置工具,
5. 导入整个数据库,imp system/unicom@unicom full=y ignore=y file=xxx.dmp log=yyy.log
6. 启动数据库,严格测试。
dbv file= /u02/app/oracle/oradata/unicom/system01.dbf blocksize=8192检查还有没有坏块。
7. 使用3.2SQL脚本检查表空间情况.
4 一个使用Oracle归档日志恢复数据库的案例
案例环境:XX网Oracle 816数据库,。
需求描述:
备份主机(装有oracle)上备份了7月13日的数据,但是主数据库服务器当前日期是7月15日。为了把备份主机上的库跟主数据库服务器同步,使用归档日志把7月13日的库前滚到7月15日。
处理步骤:
a) 备份备份主机上的控制文件,然后把主用数据库的最新控制文件备份并拷贝到备份主机相应目录
备份控制文件的方法:
 
sqlplus /nolog<<EOF
    connect internal
    alter database backup controlfile to '${BACKUP_DIR}/controlfile.bkp';
    alter database backup controlfile to trace;
EOF
b) 拷贝主库的归档日志到备份数据库的归档日志目录(这个前滚操作需要从13号到15号的归档日志完整,若备份数据库的归档日志目录不知道,可以从参数文件中看
c) 启动数据库到mount状态,使用recover database前滚数据库
 
SQL> startup restrict mount  pfile="${ORACLE_BASE}/admin/sdh21/pfile/init${service_names}.ora"
SQL> recover database using backup controlfile;
选择AUTO模式
d) 如果到了最后一个日志它还需要前滚,此时可以在主库上把当前redolog切换,然后把产生的归档继续拷贝到备份主机,继续前滚。
e) 前滚完成之后,它可能还继续要求下一个归档日志,此时可以CANCEL
f) 使用reselogs选项打开数据库
SQL> alter database open resetlogs;注意:如果打开时报错可能是还需要把日志继续前滚,可重复使用recover database命令
5 Oracle 补丁p3948480_9206_SOLARIS64.zip的安装步骤
升级说明:
是从Oracle 9.2.0.1.0升级到9.2.0.6.0,解决一系列bug问题。
安装步骤:
解压文件包
%unzip p3948480_9206_SOLARIS64.zip
%cd Disk1
停掉数据库
sql>shutdown immediate
启动安装程序
%./runInstaller
执行catpatch.sql脚本
%sqlplus /nolog
SQL>conn / as sysdba
SQL> SPOOL patch.log
SQL> startup migrate;
SQL>@?/rdbms/admin/catpatch.sql //执行catpatch.sql脚本
SQL> SPOOL OFF
执行utlrp.sql脚本
SQL> shutdown
SQL>startup
SQL>@?/rdbms/admin/utlrp.sql //执行utlrp.sql脚本
验证
select comp_name,version from dba_registry;
注意事项:
若不是在本地安装,指定X应用程序的所在主机。
? Bourne, Bash, or Korn shell:
? $ DISPLAY=local_host:0.0 ; export DISPLAY
? C shell:
? % setenv DISPLAY local_host:0.0
6 在VM维护的裸设备上添加表空间的过程
创建裸设备,大小是2G
#/usr/sbin/vxassist -g datadg make vol183 2G
修改指定裸设备的权限
#vxedit -g datadg set user=oracle group=oinstall mode=600 vol182
创建连接
#ln -s /dev/vx/rdsk/datadg/vol182 pre_ln2_182.dbf
添加到指定的表空间,例如UNDOTBS1
SQL> alter tablespace UNDOTBS1
  2  add datafile '/usr5/linkdata/pre/pre_ln2_182.dbf' size 2000M;
7 在SUN DiskSuit维护的裸设备上添加表空间的过程
1,创建裸设备
metainit -s cqcdg d6049 -p /dev/did/rdsk/d4s0 2g
2,创建连接文件
ln -s /dev/md/cqcdg/rdsk/d6049 pre_ln2_63.dbf
3,修改权限
chown oracle:dba pre_ln2_63.dbf
4,添加表空间
alter tablespace PERFDBS add datafile '/usr5/linkdata/pre/pre_ln2_63.dbf' SIZE 2000M;
8 在Oracle数据库中从文件系统迁移到裸设备的处理过程
故障现象:
C网数据库/文件系统空间使用率突然达到99%,检查发现原来是因为本地维护给数据库添加了数据文件,但是该数据文件添加到文件系统上导致根文件系统使用率突然增大。
将文件系统上的数据文件迁移到裸设备,裸设备在文件系统上只存在一个链接,几乎不占空间。
处理步骤:
1) 检查发现C网已没有已建好的可用裸设备,有一个建好的30G的裸设备没有使用,首先需要添加适合适用的裸设备。
2) 删除这个没有使用的30G的soft partition:
metaclear -s cqcdg -r d6042
3) 在删除的空间上建立一个2G的裸设备:
metainit -s cqcdg d6044 -p /dev/did/rdsk/d4s0 2g:
4) 在文件系统上建立到裸设备的链接
ln -s /dev/md/cqcdg/rdsk/d6044 pre_ln2_57.dbf
5) 更改链接文件的所有者
chown oracle:dba pre_ln2_57.dbf
6) 以sysdba身份登录并关闭数据库
sqlplus “/as sysdba”
SQL>shutdown immediate
7) 将文件系统文件上的数据导到裸设备文件上
dd if=/usr5/linkdata/sys/pre_ln2_61.dbf of=/usr5/linkdata/pre/pre_ln2_57.
dbf bs=134217728
if 文件系统文件名
of 新建裸设备链接名
bs dd时的blocksize,单位为byte,如果不设此项,dd的速度非常慢
8) 启动数据库到mount状态
SQL>startup mount
9) 更改数据文件名
SQL>ALTER DATABASE RENAME FILE '/usr5/linkdata/sys/pre_ln2_61.dbf' TO '/usr5/linkdata/pre/pre_ln2_57.dbf';
10) 打开数据库
SQL〉alter database open;
11) 验证更改
9 解决在Oracle Open状态下shutdown immediate不能关闭数据库问题
故障现象:
XX网数据库使用shutdown immediate不能关闭,日志中不断输出以下内容:
 
Shutting down instance: further logons disabled
Shutting down instance (immediate)
License high water mark = 215
All dispatchers and shared servers shutdown
Fri Aug 12 21:52:34 2005
ALTER DATABASE CLOSE NORMAL
Fri Aug 12 21:52:38 2005
Thread 1 advanced to log sequence 69953
  Current log# 2 seq# 69953 mem# 0: /ora_sys/cqgdb/redo02.log
Thread 1 advanced to log sequence 69954
  Current log# 4 seq# 69954 mem# 0: /ora_sys/cqgdb/redo04.log
... ... ..
  Current log# 3 seq# 69966 mem# 0: /ora_sys/cqgdb/redo03.log
Thread 1 advanced to log sequence 69967
  Current log# 1 seq# 69967 mem# 0: /ora_sys/cqgdb/redo01.log
解决办法:
Oracle工程师首先怀疑是临时表空间空间不足导致,经检查临时表空间没有空间不足的情况,仔细观察日志发现重做日志文件不断切换,分析应该是有较多的事务没有完成提交或者有较多没有提交的事务完成回滚。现在面临的问题是我们没有很多时间去等待所有的事务去完成回滚或提交。解决问题的思路就是如何尽快结束这些事务的回滚或提交。
1) 查看spfile文件中是否有fast_start_parallel_rollback参数的设置,检查结果G网数据库没有设置该参数。如果没有显式设置,则该参数的默认值为low。修改该参数值为false
2) 将数据库启动到nomount状态:startup nomount
3) 修改改参数值:alter system set fast_start_parallel_rollback = FALSE scope=spfile
4) shutdown immediate关闭数据库
5) startup启动
6) 查看该参数是否生效:show parameter fast_start_parallel_rollback
7) 等待一段时间
8) shutdown immediate数据库可以关闭
分析:FAST_START_PARALLEL_ROLLBACK是用来控制事务并行回滚最大进程数的参数。该参数有三个可设值,low,high,false。当设置为false时并行回滚被禁止,由于禁止了并行回滚,在数据库关闭时,需要回滚的事务将被取消。
 
10 数据库服务器字符集更改步骤
问题描述:
在客户端插入字符“咪咪”,从数据库中查询显示时出现乱码
处理步骤:
10.1 对数据库做全库导出,备份全库数据,以防故障发生
首先设定客户端的字符集,必须以ZHS16GBK的字符集导出,然后才能在更改失败后顺利倒入新建的库。
#setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK";
#stty -istrip -parity cs8;
#setenv LANG zh
拟在/sybdata(磁盘阵列)下建立一个目录orabak,用于存放dmp文件。
#mkdir /sybdata/orabak
#chown oracle:oinstall /sybdata/orabak
#su – oracle
#cd /sybdata/orabak
%exp system/manager@hnsdh file=hnsdh_2005-8-17 log=hnsdh_exp_2005-8-17 full=y
(此处命名为示例,以实施当日日期为准)
察看日志结尾,以判定导出是否成功。
#cat hnsdh_2005-8-17.dmp | od -x | head
看第二和第三个字节组成的十六进制数是多少可判断导出文件的字符集。
示例如下
#cat example.dmp | od -x | head
0000000 0303 5445 5850 4f52 543a 5630 392e 3032
。。。
0000220 646d 7000 0000 0000 0000 0000 0000 0000
十六进制的0354化为十进制为852,参造下表
NLS_CHARSET_ID NLS_CHARSET_NAME HEX_ID
-------------- ------------------------------ -------------
1 US7ASCII 1
2 WE8DEC 2
3 WE8HP 3
4 US8PC437 4
5 WE8EBCDIC37 5
6 WE8EBCDIC500 6
7 WE8EBCDIC1140 7
8 WE8EBCDIC285 8
...................
850 ZHS16CGB231280 352
851 ZHS16MACCGB231280 353
852 ZHS16GBK 354
853 ZHS16DBCS 355
860 ZHT32EUC 35c
861 ZHT32SOPS 35d
862 ZHT16DBT 35e
863 ZHT32TRIS 35f
864 ZHT16DBCS 360
865 ZHT16BIG5 361
866 ZHT16CCDC 362
867 ZHT16MSWIN950 363
868 ZHT16HKSCS 364
870 AL24UTFFSS 366
871 UTF8 367
872 UTFE 368
即可得出这个dmp文件的字符集为ZHS16GBK。
10.2 在数据库中直接更改字符集参数
操作步骤如下:
SQL> shutdown immediate
SQL> startup mount
SQL> ALTER SYSTEM ENABLE RESTRICTED SESSION;
SQL> ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
SQL> ALTER SYSTEM SET AQ_TM_PROCESSES=0;
SQL> ALTER DATABASE OPEN;
SQL> alter session set events '10046 trace name context forever,level 12';
SQL> alter database character set INTERNAL_USE ZHS16GBK;
SQL> shutdown immediate
SQL> startup
察看系统字符集
SQL> SELECT * FROM NLS_DATABASE_PARAMETERS;
看NLS_CHARACTERSET的值为多少,如果为ZHS16GBK则说明改动成功。
如果执行正常,则按照下一节进行测试操作。
10.3 更改成功后的测试
测试1,在数据库服务器端下测试
%setenv NLS_LANG "SIMPLIFIED CHINESE_CHINA.ZHS16GBK";
%stty -istrip -parity cs8;
%setenv LANG zh
%sqlplus /nolog
SQL〉conn / as sysdba
SQL〉create table test_tq (a char(20));
SQL〉insert into test_tq
1>(a)
2>values ('洣洣');
SQL〉select * from test_tq;
如显示为
A
--------------------
洣洣
则成功。
测试2,Windows客户端环境下测试
运 行REGEDIT,第一步选HKEY_LOCAL_MACHINE,第二步选择SOFTWARE, 第三步选择 ORACLE, 第四步选择 NLS_LANG, 键 入 与服 务 器 端 相 同 的 字 符 集(本例为:AMERICAN_AMERICAN.US7ASCII)。
右击我的电脑,然后点击属性,“高级”页面下,点击“环境变量”,在系统变量中添加:
变量名:NLS_LANG
变量值:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
运行cmd,输入echo %NLS_LANG%,查看系统变量设置时否成功
然后运行:
$sqlplus system/manager@hnsdh
SQL〉conn / as sysdba
SQL〉create table test_tq (a char(20));
SQL〉insert into test_tq
1>(a)
2>values ('洣洣');
SQL〉select * from test_tq;
如显示为
A
--------------------
洣洣
则成功。
10.4 更改不成功时的措施
新建数据库,设定字符集为ZHS16GBK,其他参数先照搬原来的,并倒入数据。建库时所需的具体参数在重建之前要搜集。注意在配置控制文件时设定最大数据文件数。
建好数据库以后,执行以下命令即可恢复数据库
%cd /sybdata/orabak
%imp system/manager@hnsdh full=y ignore=y file=hnsdh_2005-8-17 log=hnsdh_imp_2005 -8-17
11 Oracle数据库归档目录usr5满的解决办法
故障现象:
C网数据库的逻辑日志增长很快,有时候每分钟就产生150M的日志文件,导致归档目录不到一天的时间就满了。我们的备份策略是每天的晚上0点执行,也就是说还没来得及备份归档目录就满了。
导致的结果:
数据库挂起不能工作。
问题分析及解决办法:
解决办法有3种: 1,增加归档目录的空间 2,增加备份频度 3,删除归档日志文件
每一种办法都会存在一些问题或产生一些负面影响:
1,增加归档目录的空间,这个已经不可行,因为已经没有可用空间
2,增加备份频度,会影响部分系统性能,后来观察影响不大,远远排在了oracle进程后面。
3,删除归档日志文件,这只是权宜之计,会带来控制文件和日志文件的不同步从而影响下一次的数据库备份失败,以及万一数据文件损坏从而因影响恢复的问题。
经过分析和权衡,初步采用了每天办法2次的办法。除了原来夜里零点备份的1次之外,又安排在白天2点备份一次,至于为什么定到2点,主要是想均衡一下业务量,考虑到凌晨业务量较小可能产生较少的日志(相对白天而言)。 结果很见效。
后来讨论,又发现了一下新的问题。 问题是: 万一备份失败或者在12小时之内usr5空间满怎么办? 于是又添加了一个执行脚本fs_monitor.sh,每小时执行一次,
若发现usr5空间达到80% 就自动删除归档日志文件然后自动数据库同步
以下是自动自动清楚自动同步的脚本(由左亮撰写)
#!/bin/sh
#Please change the ARCHIVE_FS to your actual filesystem that your archive log storaged
ARCHIVE_FS=/usr5
#Please change the ARCHIVE_DIR to your actual directory that your archive log storaged
ARCHIVE_DIR=/usr5/oracle/bjdb/arch_2
#Defined the location of log file
LOG=/usr5/oracle/bjdb/${0}.`date +%m%d`.log
#Obtain the usage of filesystem at that time
DFK=`df -k|grep $ARCHIVE_FS|awk '{USAGE=substr($5,1,length($5) - 1)
print USAGE}'`
START_RMAN="
setenv ORACLE_SID rman
sqlplus /nolog << EOF
connect /as sysdba
startup
exit
EOF"
STOP_RMAN="
setenv ORACLE_SID rman
sqlplus /nolog << EOF
connect /as sysdba
shutdown immediate
exit
EOF
"
#Defined the command of archivelog crosscheck
CMD_STR="
setenv ORACLE_SID bjdb
rman target sys/sys catalog rman/rman@rman<<EOF
crosscheck archivelog all;
exit
EOF
"
#Check the usage of ARCHIVE_FS
if [ $DFK -gt 80 ]
then
TIME=`date`
echo "At the time: "$TIME", Usage of " $ARCHIVE_FS "filesystem is beyond 80%. The used rate is :"$DFK"% now">>$LOG
cd $ARCHIVE_DIR
#Obtain file list that need to be remove
FILE_LIST=`ls -lt|tail -600|awk '{print $9}'`
for FILE in $FILE_LIST
do
rm $FILE 2>>$LOG
done
#Start rman database
su - oracle -c "$START_RMAN">>$LOG
#Run the crosscheck operation
su - oracle -c "$CMD_STR">>$LOG
#Stop rman database
su - oracle -c "$STOP_RMAN">>$LOG
echo "……">>$LOG
else
exit 0
fi

12 判断oracle版本位数的方法
有2种方法,详情如下:
1) file $ORACLE_HOME/bin/oracle
/oracle92/app/oracle/product/9.2.0.1/bin/oracle: ELF 64-bit MSB executable SPARCV9 Version 1, dynamically linked, not stripped
2)SQL> select * from v$version;
BANNER
--------------------------------------------------------------------------------
Oracle9i Enterprise Edition Release 9.2.0.6.0 - 64bit Production
PL/SQL Release 9.2.0.6.0 - Production
CORE 9.2.0.6.0 Production
TNS for Solaris: Version 9.2.0.6.0 - Production
NLSRTL Version 9.2.0.6.0 – Production
13 XX网有非正常数据文件的情况下的数据库rman恢复
背景:
XX网数据库在阿联重建控制文件的时候出现问题,决定使用rman的备份进行恢复,但是XX网数据库以前由于我们部门员工的误操作产生了一些非正常的数据文件,主要有以下情况:
1. 数据文件被非正常添加,然后被在操作系统内删除
2. 数据文件被非正常添加,然后由于影响双机应用被强制离线
这样在备份的时候会把这些文件跳过,而且rman也明确提示,会影响到他们相关表空间的恢复。
操作办法:
正常的控制文件和redolog还在,所以此时如果正常使用rman的restore database,系统会提示找不到备份的时候跳过的数据文件的备份,因此采用逐个恢复数据文件的方式:
restore datafile XXX;这样恢复所有的可用数据文件。
然后使用rman进行recover database时,系统会提示需要对跳过的数据文件进行恢复,此时无法恢复,因此使用如下办法解决:
1. 切换到sqlplus,进行recover database
2. 查看提示需要的归档日志文件
3. 使用rman把需要的归档日志恢复出来,由于空间的问题,所以采用每次恢复只恢复出来100个
restore archivelog from sequence 1_xxxxx.dbf to sequence 1_xxxxx.dbf;4. 然后在sqlplus中recover database,观察到快要需要下一个100个归档日志的时候,再使用rman恢复下100个
5. 一直恢复到最后一个归档日志,recover会退出,但是此时还未恢复完毕,可以查看一下现有的redolog中未归档的组
6. 在sqlplus里使用以下命令,并指定未归档的redolog的文件位置来恢复:
recover database using backup controlfile until cancel7. 此时恢复完成,可以使用alter database open resetlogs打开数据库。
8. 打开之后需要做的事情包括:1)建立恢复临时表空间的数据文件;2)连接到rman的catalog数据库,并reset database重置当前数据库;
 ================================================================================================================================================================================================================
========================================================================================================================
针对oracle日常维护
上一篇 / 下一篇  2010-08-19 09:43:30 / 个人分类:数据库管理
查看( 82 ) / 评论( 0 ) / 评分( 0 / 0 )
针对dba日常维护
这里主要针对运行日志及表空间的使用情况进行监控
一、Oracle警告日志文件监控
jlyb01:/opt/app/oracle/admin/JLSIMIS/bdump$tail -500f alert_JLSIMIS1.log
Oracle在运行过程中,会在警告日志文件(alert_SID.log)中记录数据库的一些运行情况:
●数据库的启动、关闭,启动时的非缺省参数;
●数据库的重做日志切换情况,记录每次切换的时间,及如果因为检查点(checkpoint)操作没有执行完成造成不能切换,会记录不能切换的原因;
●对数据库进行的某些操作,如创建或删除表空间、增加数据文件;
●数据库发生的错误,如表空间不够、出现坏块、数据库内部错误(ORA-600)
DBA应该定期检查日志文件,根据日志中发现的问题及时进行处理。
问题处理:
启动参数不对检查初始化参数文件
因为检查点操作或归档操作没有完成造成重做日志不能切换如果经常发生这样的情况,可以考虑增加重做日志文件组;想办法提高检查点或归档操作的效率;
有人未经授权删除了表空间检查数据库的安全问题,是否密码太简单;如有必要,撤消某些用户的系统权限
出现坏块检查是否是硬件问题(如磁盘本生有坏块),如果不是,检查是那个数据库对象出现了坏块,对这个对象进行重建
表空间不够增加数据文件到相应的表空间
出现ORA-600根据日志文件的内容查看相应的TRC文件,如果是Oracle的bug,要及时打上相应的补丁
二、数据库表空间使用情况监控(字典管理表空间)
 
 
数据库运行了一段时间后,由于不断的在表空间上创建和删除对象,会在表空间上产生大量的碎片,
DBA应该及时了解表空间的碎片和可用空间情况,以决定是否要对碎片进行整理或为表空间增加数据文件。
/* Formatted on 2010/08/19 09:18 (Formatter Plus v4.8.8) */
SELECT   tablespace_name, COUNT (*) chunks,
         MAX (BYTES / 1024 / 1024) max_chunk
    FROM dba_free_space
GROUP BY tablespace_name;
其中,CHUNKS列表示表空间中有多少可用的空闲块(每个空闲块是由一些连续的Oracle数据块组成),
如果这样的空闲块过多,比如平均到每个数据文件上超过了100个,那么该表空间的碎片状况就比较严重了,
可以尝试用以下的SQL命令进行表空间相邻碎片的接合:
alter tablespace 表空间名 coalesce;
 
然后再执行查看表空间碎片的SQL语句,看表空间的碎片有没有减少。如果没有效果,
并且表空间的碎片已经严重影响到了数据库的运行,则考虑对该表空间进行重建。

MAX_CHUNK列的结果是表空间上最大的可用块大小,
如果该表空间上的对象所需分配的空间(NEXT值)大于可用块的大小的话,
就会提示ORA-1652、ORA-1653、ORA-1654的错误信息,DBA应该及时对表空间的空间进行扩充,以避免这些错误发生。
对表空间的扩充对表空间的数据文件大小进行扩展,
或向表空间增加数据文件,具体操作见“存储管理”部份。
三、查看数据库的连接情况
DBA要定时对数据库的连接情况进行检查,看与数据库建立的会话数目是不是正常,
如果建立了过多的连接,会消耗数据库的资源。
同时,对一些“挂死”的连接,可能会需要DBA手工进行清理。
以下的SQL语句列出当前数据库建立的会话情况:
select sid,serial#,username,program,machine,status
from v$session;
其中,SID为 会话(session)的ID号; SERIAL# 会话的序列号,和SID一起用来唯一标识一个会话;
USERNAME 建立该会话的用户名; PROGRAM 这个会话是用什么工具连接到数据库的; STATUS 当前这个会话的状态,
ACTIVE表示会话正在执行某些任务,INACTIVE表示当前会话没有执行任何操作; 如果DBA要手工kill掉某个会话,则执行:
alter system kill session 'SID,SERIAL#';
注意,上例中SID为1到7(USERNAME列为空)的会话,是Oracle的后台进程,不要对这些会话进行任何操作。
select sid,serial#,username,program,machine,status
from v$session;
四、控制文件的备份
在数据库结构发生变化时,如增加了表空间,增加了数据文件或重做日志文件这些操作,都会造成Oracle数据库控制文件的变化,
DBA应及进行控制文件的备份,备份方法是:

执行SQL语句:
alter database
backup controlfile to '/home/backup/control.bak';
或执行如下语句:
alter database
backup controlfile to trace;
 
这样,会在USER_DUMP_DEST(初始化参数文件中指定)目录下生成创建控制文件的SQL命令。
五、检查数据库文件的状态
DBA要及时查看数据库中数据文件的状态(如被误删除),根据实际情况决定如何进行处理,检查数据文件的状态的SQL如下:
select file_name,status
from dba_data_files;

如果数据文件的STATUS列不是AVAILABLE,那么就要采取相应的措施,如对该数据文件进行恢复操作,或重建该数据文件所在的表空间。
六、检查数据库定时作业的完成情况
如果数据库使用了Oracle的JOB来完成一些定时作业,要对这些JOB的运行情况进行检查:
select job,log_user,last_date,failures
from dba_jobs;

如果FAILURES列是一个大于0的数的话,说明JOB运行失败,要进一步的检查。
七、数据库坏块的处理
当Oracle数据库出现坏块时,Oracle会在警告日志文件(alert_SID.log)中记录坏块的信息:
ORA-01578: ORACLE data block corrupted (file # 7, block # )
ORA-01110: data file : '/oracle1/oradata/V920/oradata/V816/users01.dbf'
 
其中, 代表坏块所在数据文件的绝对文件号, 代表坏块是数据文件上的第几个数据块。
出现这种情况时,应该首先检查是否是硬件及操作系统上的故障导致Oracle数据库出现坏块。
在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。

1.确定发生坏块的数据库对象
SELECT tablespace_name,
segment_type,
owner,
segment_name
FROM dba_extents
WHERE file_id =
AND
between block_id AND block_id+blocks-1;
 
2.决定修复方法
如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建;
如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建;
如果有数据库的备份,则恢复数据库的方法来进行修复;
如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据块上的记录取出来,然后对这个表进行重建。
3.用Oracle提供的DBMS_REPAIR包标记出坏块
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(' ','');
4.使用Create table as select命令将表中其它块上的记录保存到另一张表上
create table corrupt_table_bak
as
select * from corrupt_table;
 
5.用DROP TABLE命令删除有坏块的表
drop table corrup_tatble;
6.用alter table rename命令恢复原来的表
alter table corrupt_table_bak
rename to corrupt_table;
7.如果表上存在索引,则要重建表上的索引
八、操作系统相关维护
DBA要注意对操作系统的监控:
●文件系统的空间使用情况(df -k),必要时对Oracle的警告日志及TRC文件进行清理
●如果Oracle提供网络服务,检查网络连接是否正常

●检查操作系统的资源使用情况是否正常

●检查数据库服务器有没有硬件故障,如磁盘、内存报错