资料编码 HBMDS 产品名称 业务与软件产品
使用对象 ORACLE技术支持、研发、生产 产品版本
编写部门 数据库DB组 资料版本
Oracle 11g 日常操作与维护手册
拟 制: 数据库MDS 日 期:
审 核: 日 期:
批 准: 日 期:
修 订 记 录
日 期 修订版本 作 者 描 述
2015/01/01 V1.0 xxx 初稿
目 录
第01章 文档说明 5
第02章 CRS的管理 5
2.1 RAC状态检查 5
2.1.1 检查守护进程状态 5
2.1.2 检查资源状态 5
2.2 手工启动与关闭RAC 6
2.3 OCR的管理 6
2.4 VOTING DISK的管理 8
2.5 CSS管理 9
2.6 管理工具SRVCTL 9
2.6.1 管理实例 9
2.6.2 管理监听程序 9
2.6.3 管理ASM 10
2.6.4 管理service 10
2.7 修改RAC的IP及VIP 11
2.7.1 修改外网IP及心跳IP 11
2.7.2 修改VIP 11
2.7.3 查看与删除IP 12
第03章 ASM的管理 13
3.1 管理DG 13
3.1.1 建立与扩充disk group 13
3.1.2 mount与unmount的命令 14
3.1.3 删除disk group 14
3.1.4 增加DISK的total_mb 14
3.1.5 DG的属性-AU大小 14
3.1.6 DG的属性-离线删除时间 15
3.1.7 DG的属性-兼容版本 15
3.1.8 向ASM中添加disk的完整步骤 16
3.2 ASMCMD 17
3.2.1 ASMCMD常用命令 17
3.2.2 复制ASM文件 18
3.2.3 命令lsdg 18
3.2.4 元数据备份与恢复 18
3.3 ASM磁盘头信息备份与恢复 19
3.4 ASM常用视图 20
3.4.1 视图V$ASM_DISKGROUP 20
3.4.2 视图V$ASM_DISK 21
3.5 常用方法 22
3.5.1 如何确定ASM实例的编号 22
3.5.2 查询DG-RAW-磁盘的对应关系 22
第04章 数据库管理 24
4.1 参数文件管理 24
4.2 表空间管理 25
4.2.1 表空间自动扩张 25
4.2.2 查看表空间使用率
4.2.2 表空间更名 26
4.2.3 表空间的数据文件更名 26
4.2.4 缺省表空间 26
4.2.5 表空间删除 27
4.2.6 UNDO表空间 27
4.2.7 TEMP表空间 27
4.3 重做日志文件管理 27
4.3.1 增加REDO日志组 27
4.3.2 删除日志组 28
4.3.3 日志切换 28
4.3.4 日志清理 28
4.3.5 重做日志切换次数查询 28
4.4 归档模式 29
4.4.1 单实例数据库修改为归档模式的方法 29
4.4.2 RAC数据库修改为归档模式的方法 29
4.4.3 归档路径 30
4.5 重建控制文件 31
4.6 内存参数管理 32
4.6.1 Oracle内存管理发展阶段 32
4.6.2 自动内存管理AMM 32
4.6.3 自动共享内存管理ASMM 33
4.6.4 自动PGA管理 33
4.7 其他管理内容 33
4.7.1 数据库版本查看 33
4.7.2 字符集 34
4.7.3 创建密码文件 34
4.7.4 关闭审计功能 34
4.7.5 帐号管理 34
4.7.6 profile管理 35
4.8 用户权限管理
4.8.1查询用户权限
4.8.2用户授权
4.8.3权限回收
4.9 session管理
4.9.1 session锁管理
4.9.1 redo异常SQL分析
第05章 备份与恢复
5.1 逻辑备份和恢复
5.1.1 exp导出备份
5.1.2 imp导出恢复
5.2 物理备份与恢复
5.2.1 rman备份与校验
5.2.2 rman恢复
5.3.1 其他备份方式与恢复
第06章 OGG管理
6.1 OGG进程监控
6.1.1脚本监控
info all查看ogg进程的状态
6.1.2 OGG日志查看
第07章 AWR、ASH、ADDM报告
7.1报告收集
7.2报告分析
7.2.1
第08章 oracle 11g 新特性
8.1 oracle 11g自动共享内存管理(ASMM)
8.1.1SGA自动调整
8.1.2自动调整参数构成
8.1.3相关视图
8.2 oracle 11g 日志管理
8.2.1 oracle 11g 日志描述
8.2.2 oracle 11g 日志路径
8.2.3 ADR Command Interpreter(ADRCL)介绍与使用
8.3 oracle 11g Flashback特性
8.3.1闪回版本
8.3.2闪回事物
8.3.3闪回丢弃
8.3.4闪回表
8.3.5闪回数据库
8.3.6闪回数据存档
第09章 oracle 12C
9.1 12c 新特性
9.2 12c 插件管理
第10章 生产脚本汇总清单
10.1 exp备份脚本
10.2 imp恢复脚本
10.3 expdp备份脚本
10.4 impdp恢复脚本
10.5 rman 全备脚本
10.6 rman 增量脚本
10.7 ocr 备份脚本
10.8 ctl 备份脚本
10.9 arch 备份脚本
10.10 arch 删除脚本
10.11 ogg 监控脚本
10.12 weblogic监控脚本
第11章监控平台访问
湖北平台MDS访问地址:
湖北接口程序访问地址:
湖北监控天兔访问地址:
湖北存储访问平台地址:
湖北负载均衡访问地址
湖北precise访问地址
湖北SVN访问地址
湖北测试MDS访问地址
第12章 其他脚本
12.1 表自动分区脚本
12.2 自动查看执行计划脚本
12.3 自动收集
附件:参考脚本
第13章 故障处理
13.1数据库坏块的处理
13.2 redo异常处理
13.3 死锁处理
第14章 补丁升级
14.1 升级前评估
14.2 升级过程
14.3 升级后验证检测
第01章 文档说明
本文档描述了Oracle11g中常见的维护和管理方法,包括CRS、ASM、数据库等。
文档中斜体部分表示需要用环境变量的值做替换。
第02章 CRS的管理
2.1 RAC状态检查
2.1.1 检查守护进程状态
守护进程是由/etc/inittab文件中如下三行内容拉起并管理:
h1:35:respawn:/etc/init.d/init.evmd run >/dev/null 2>&1 </dev/null
h2:35:respawn:/etc/init.d/init.cssd fatal >/dev/null 2>&1 </dev/null
h3:35:respawn:/etc/init.d/init.crsd run >/dev/null 2>&1 </dev/null
如果这三行内容错误或没有,则守护进程可能会受到影响。
三个守护进程如下:
/bin/sh /etc/init.d/init.cssd fatal
/bin/sh /etc/init.d/init.crsd run
/bin/sh /etc/init.d/init.evmd run
通过ps –ef |grep 可以检查他们是否存在。
2.1.2 检查资源状态
检查RAC所有资源的状态:
# $ORA_CRS_HOME/bin/crs_stat –t
检查CRS的状态:
# $ORA_CRS_HOME/bin/crsctl check crs
单独检查CSS的状态:
# $ORA_CRS_HOME/bin/crsctl check css
2.2 手工启动与关闭RAC
使用init.crs start启动RAC,使用init.crs stop关闭RAC。该命令可以将整个RAC的所有资源(不包括三个守护进程)启动或停止。
不同操作系统上,ini.crs文件的位置不同:
SUSE: /etc/init.d/init.crs
HP: /sbin/init.d/init.crs
AIX: /etc/init.crs
SUN: /etc/init.d/init.crs
说明:
不建议使用crsctl start/stop来启动或关闭RAC,因为这个命令并不校验各资源间的依赖关系,不是很可靠。
2.3 OCR的管理
OCR盘状态查看:
命令ocrcheck检查OCR存储的情况,执行结果类似于:
midware01% ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 513652
Used space (kbytes) : 2792
Available space (kbytes) : 510860
ID : 1054294748
Device/File Name : /dev/rdsk/c3t12d0s4
Device/File integrity check succeeded
Device/File not configured
Cluster registry integrity check succeeded
备份与恢复:
默认地,OCR会被自动备份,使用命令ocrconfig -showbackup查看OCR进行的自动备份:
linux1:~ # /oracle/crs/bin/ocrconfig -showbackup
linux2 2008/12/05 07:06:09 /oracle/crs/cdata/RAC/backup00.ocr
linux2 2008/12/05 03:06:09 /oracle/crs/cdata/RAC/backup01.ocr
linux2 2008/12/04 23:06:09 /oracle/crs/cdata/RAC/backup02.ocr
linux2 2008/12/04 07:06:08 /oracle/crs/cdata/RAC/day.ocr
linux2 2008/11/19 19:06:08 /oracle/crs/cdata/RAC/week.ocr
如果要手工备份,可执行下面的命令:
# $ORA_CRS_HOME/bin/ocrconfig –export /oracle/db/ocrbak.ocr
恢复OCR的方法如下:
先关闭两个节点上的RAC,分别执行以下命令:
# /etc/init.d/init.crs stop
然后执行恢复:
如果是一个空的OCR盘则用如下命令导入:
# $ORA_CRS_HOME/bin/ocrconfig –import /oracle/db/ocrbak.ocr
如果OCR盘已经有信息了,那么应使用如下命令做恢复:
# $ORA_CRS_HOME/bin/ocrconfig –restore /oracle/db/ocrbak.ocr
OCR内容查看:
将OCR的内容用ocrdump导出后,可以用vi打开来查看:
# ocrdump /home/oracle/ocr.txt
OCR盘的指定:
OCR使用哪个磁盘或文件是在/etc/oracle/ocr.loc文件中指定的。此文件包含两行内容,例如:
ocrconfig_loc=/oracle/app/product/11g/db/cdata/localhost/local.trc
local_only=TRUE
这里,ocrconfig_loc指定的是OCR所用的磁盘名称或者文件名。如果是RAC环境,则这里应为磁盘名,如果是单实例的环境,则这里为一个绝对路径及文件名。local_only表示CRS的二进制文件是安装在本地还是多个节点共享的存储上,单实例环境中该参数为TRUE,RAC中二进制文件装在各自本地盘上则为FALSE。
增加OCR盘:
一个RAC环境中,可以有两个OCR,一个为OCR,另外一个为OCRMIRROR。
可以增加OCRMIRROR盘,命令如下:
# ocrconfig -replace ocrmirror /dev/raw/raw3
增加以后,执行ocrcheck将看到两个OCR盘了:
# /oracle/crs/bin/ocrcheck
Status of Oracle Cluster Registry is as follows :
Version : 2
Total space (kbytes) : 296940
Used space (kbytes) : 3948
Available space (kbytes) : 292992
ID : 938694221
Device/File Name : /dev/raw/raw1
Device/File integrity check succeeded
Device/File Name : /dev/raw/raw3
Device/File integrity check succeeded
Cluster registry integrity check succeeded
Logical corruption check succeeded
删除OCR盘:
以下命令将删除OCR盘,原来的OCRMIRROR变成OCR:
# ocrconfig -replace ocr
删除OCRMIRROR:
# ocrconfig -replace ocrmirror
2.4 VOTING DISK的管理
检查Voting Disl盘:
$ORA_CRS_HOME/bin/crsctl query css votedisk
备份与恢复:
备份命令如下:
dd if=/dev/raw/raw2 of=/oracle/db/voting.bak
备份时间会比较长,备份文件与VOTING DISK盘的大小接近。
恢复命令如下:
dd if=/oracle/db/voting.bak of=/dev/raw/raw2
恢复前不需要先关闭RAC。
添加VOTING DISK盘:
可以添加一个盘为voting disk,命令如下:
crsctl add css votedisk /dev/raw/raw3
删除VOTING DISK盘:
crsctl delete css votedisk /dev/raw/raw3 -force
2.5 CSS管理
CSS的作用是协调ASM实例与数据库实例之间的通信。因此要使用ASM管理存储,无论是单实例还是RAC环境,都必须先配置CSS。
查看CSS进程是否正常,以oracle用户执行以下命令:
crsctl check cssd
如果CSS正常,那么显示如下信息:
Cluster Synchronization Services appears healthy
如果显示CSS未启动,则执行如下命令:
/etc/init.d/init.cssd start
2.6 管理工具SRVCTL
在RAC中,可以使用srvctl(service control tool)工具来管理CRS的各类资源。SRVCTL的有些命令会修改OCR的信息,例如添加service。有些命令则是通过发送指令给CRSD(oracle clusterware process),然后由CRSD去执行,例如启动数据库。
可以使用-h查看命令的帮助信息,例如,要查看srvctl add asm的用法,可以执行如下命令:
srvctl add asm –h
2.6.1 管理实例
启动数据库实例:
srvctl start instance -d db_name -i instance_name -o open;
检查数据库实例的状态:
srvctl status database -d db_name
2.6.2 管理监听程序
添加监听程序:
srvctl add listener –n hostname -o $ORACLE_HOME
删除监听程序:
srvctl remove listener –n hostname
如果要指定删除一个资源,例如一个节点上有两个lsnr资源,一个为LISTENER3_HOST1,另外一个为LISTENER_HOST1,现在需要将不正确的LISTENER3_HOST1删除:
srvctl remove listener -n hostname -l LISTENER3_HOST1
启动监听程序:
srvctl start listener –n hostname
停止监听程序:
srvctl stop listener –n hostname
检查监听程序是否存在
srvctl config listener –n hostname
2.6.3 管理ASM
添加ASM实例:
srvctl add asm –n hostname –i ASM_ORACLE_SID -o $ORACLE_HOME
删除ASM实例:
srvctl add asm –n hostname –f [-i ASM_ORACLE_SID]
其中-f表示如果删除失败,则强制删除
启动ASM实例:
srvctl start asm –n hostname [-i ASM_ORACLE_SID]
停止ASM实例:
srvctl stop asm –n hostname [-i ASM_ORACLE_SID]
检查ASM实例是否存在
srvctl config asm –n hostname
2.6.4 管理service
增加service:
srvctl add service -d db_name -s service_name -r 主节点的ORACLE_SID -a 备节点A的ORACLE_SID,备节点B的ORACLE_SID
删除service:
srvctl remove service -d db_name -s service_name
启动service:
srvctl start service -d db_name -s service_name
停止service:
srvctl stop service -d db_name -s service_name
2.7 修改RAC的IP及VIP
2.7.1 修改外网IP及心跳IP
当外网IP修改并重新绑定到网卡上以后,需要修改RAC中记录的外网IP。修改方法如下:
关闭两个节点上的RAC;
修改/etc/hosts文件,用新的IP替换旧IP值
启动RAC,在两个节点上分别执行:
# /etc/init.d/init.crs start
假设我们要修改节点1的外网IP:
# cd $ORA_CRS_HOM/bin
# ./oifcfg setif -global eth0/192.168.1.10:public
请根据实际情况替换eth0、192.168.1.10
然后删除旧的外网IP信息:
# ./oifcfg delif -global eth0/192.168.0.11
修改 $ORACLE_HOME/network/admin/listener.ora 文件中HOST等于的外网IP值
假设我们要修改节点1的心跳IP,旧IP为10.10.10.0,新IP为10.10.20.0:
# cd $ORA_CRS_HOM/bin
# ./oifcfg setif -global eth1:/10.1.0.20:cluster_interconnect
# ./oifcfg delif -global eth1/10.10.10.0
可以查看现在RAC中IP的值:
# ./oifcfg getif –global
最后在两个节点上关闭并重启RAC。
2.7.2 修改VIP
查看当前的VIP设置:
# /oracle/crs/bin/srvctl config nodeapps -a -n linux1
RAC安装完以后,可以修改两个节点的VIP。前提是修改后的VIP必须没有被其他系统使用掉。正确的修改方法如下:
步骤1:使用srvctl修改VIP
进入/crs/bin目录下执行如下命令:
# ./srvctl modify nodeapps -n rac2 -A 10.71.99.112/255.255.255.0
其中rac2为节点2的hostname,10.71.99.112为新的VIP
如果两个节点的VIP都需要修改,则两个节点上都需要执行该步骤
步骤2:停止CRS的所有资源
# /etc/init.d/init.crs stop
步骤3:卸掉旧的VIP网卡
假定旧的VIP是绑定在eth3:1上,那么执行命令:
# ifconfig eth3:1 down
两个节点上都需要执行该步骤
步骤4:修改/etc/host文件
修改该文件,将旧的VIP改为新的VIP值. 两个节点上都需要执行该步骤
步骤5:启动CRS资源
在任意一个节点上执行以下命令:
# /etc/init.d/init.crs start
步骤6:修改客户端或应用程序连接服务器所使用的VIP值
2.7.3 查看与删除IP
查看与管理OCR中IP的配置信息:
查看IP配置信息:
# oifcfg getif
返回结果例如:
linux1:~ # /oracle/crs/bin/oifcfg getif
bond0 10.71.99.0 global public
bond1 192.168.128.0 global cluster_interconnect
# oifcfg iflist
返回结果例如:
linux1:~ # /oracle/crs/bin/oifcfg iflist
bond0 10.71.99.0
bond1 192.168.128.0
即使两个节点的VIP都漂到一个节点上,那么此命令的执行结果也仍只有两行。
删除网卡信息:
# oifcfg delif -global ce0
这里,-global表示删除RAC中所有节点上的网卡ce0。如果只想删除一个节点的,则用- n nodename
第03章 ASM的管理
3.1 管理DG
3.1.1 建立与扩充disk group
建立外部冗余的DG:
SQL>create diskgroup dg_name external redundancy disk ‘/dev/raw/raw5’;
冗余度:normal(2-way镜像),high(3-way镜像),external(不做镜像)
建立normal冗余的DG:
SQL> CREATE DISKGROUP dg_name NORMAL REDUNDANCY
FAILGROUP FGROUP1 DISK
'D:MYRAWSRAW1' NAME DISKn,
' ... other disk ... '
FAILGROUP FGROUP2 DISK
'D:MYRAWSRAW3' NAME DISKn,
' ... other disk ... ' ;
向一个disk group中增加一个裸盘的方法:
SQL>alter diskgroup dg_name add disk '/dev/raw/raw6';
从disk group中去掉disk:
SQL> alter diskgroup dg_name drop disk disk在diskgroup中的名称
(可从v$asm_disk中查询获得,也可在添加disk到group时加name disk名称来指定)
3.1.2 mount与unmount的命令
SQL>alter diskgroup dg_name dismount;
SQL>alter diskgroup dg_name mount;
3.1.3 删除disk group
要在节点1上执行DG的删除动作,则节点1上DG应为MOUNT,节点2上此DG的状态应为DISMOUNT。如果不是,则要先调整。
删除DG的命令如下:
SQL>DROP DISKGROUP dg_name (including contents);
如果DG为DISMOUNT状态,则可以强制删除:
SQL> drop diskgroup dg_name force including contents;
3.1.4 增加DISK的total_mb
当包含在DG中的RAW被扩大后,应在ASM中执行以下命令来扩张ASM可见此RAW的total_mb:
SQL> alter diskgroup dg_name resize all size 19085M;
如果DG中有多个RAW,每个RAW的大小不同,则这里应指定具体的DISK名称:
SQL> alter diskgroup dg_name resize disk disk_name size 19085M;
3.1.5 DG的属性-AU大小
在11G中,默认每个DG的AU大小为1M,可以为每个DG设置不同的AU大小。在建立DG时加上如下子句即可:… attribute 'au_size' = '2M'
AU_SIZE 的值应为 1M、2M、4M、8M、16M、32M 或 64M。
可以修改已有DG的AU值:
SQL> alter diskgroup dg_name set attribute 'au_size'='2M';
3.1.6 DG的属性-离线删除时间
ASM会删除离线时间超过3.6小时的磁盘,可以通过修改DISK_REPAIR_TIME(单位可以是分钟,M或m,或小时,H或h)参数设置磁盘组默认时间限制。
以小时为单位进行设置:
SQL> ALTER DISKGROUP dg_name SET ATTRIBUTE 'disk_repair_time' = '4.5h';
以分钟为单位进行设置
SQL> ALTER DISKGROUP dg_name SET ATTRIBUTE 'disk_repair_time' = '300m';
ALTER DISKGROUP命令的DROP AFTER子句用于废除DISK_REPAIR_TIME参数设置的默认时间。
使用默认的DISK_REPAIR_TIME:
SQL> ALTER DISKGROUP dg_name OFFLINE DISK D1_0001;
废除默认的DISK_REPAIR_TIME:
SQL> ALTER DISKGROUP dg_name OFFLINE DISK D1_0001 DROP AFTER 30m;
如果磁盘在滚动升级期间离线,直到滚动升级完成,计时器才会启动。
3.1.7 DG的属性-兼容版本
ASM 是一个适用于从 10g 到当前版本的 Oracle 数据库的存储平台。因此,11g 上的 ASM 实例可以保存 10g 第 1 版、10g 第 2 版以及 11g 第 1 版(以及更高版本)的数据库。只要 ASM 版本与 RDBMS 的版本相同或者更高,就可以在该 ASM 实例上创建数据库。如果 ASM 和 RDBMS 实例的版本不同,它们将如何通信呢?很简单:ASM将消息转换成适合RDBMS的版本。
默认情况下,ASM 实例可以支持10g数据库。但如果您希望在该 ASM 实例上仅放置 11g RDBMS,该怎么办?无需进行消息转换来支持版本差异。但如果可以告诉 ASM 实例唯一支持的数据库是11g第 1版该怎么办?这将消除,至少可以减少消息转换。在Oracle数据库11g中,
可以使用ASM兼容性和RDBMS兼容性磁盘组属性实现。
首先,我们将检查磁盘组的当前属性:
SQL> select name, compatibility, database_compatibility from v$asm_diskgroup;
返回结果例如:
NAME COMPATIBILITY DATABASE_COMPATIBILI
-------------------- -------------------- --------------------
DG_ARCH 10.1.0.0.0 10.1.0.0.0
DG_DATA 10.1.0.0.0 10.1.0.0.0
DG_DBFILE 10.1.0.0.0 10.1.0.0.0
DG_INDEX 10.1.0.0.0 10.1.0.0.0
这里,ASM 兼容性(由COMPATIBILITY显示)设置为 10.1.0.0.0,这意味着该磁盘组最高可支持10.1 ASM 结构。因此,该磁盘组可以具有任意RDBMS结构。另一列DATABASE_COMPATIBILITY显示RDBMS兼容性设置为10.1.这意味着,ASM 磁盘组可用于10.1版的任何RDBMS
由于数据库为11g,并只希望创建11g ASM 和RDBMS结构,因此无需拥有10g元素。要将该磁盘组的 ASM 兼容性属性设置为 11.1,可以执行以下语句(在ASM实例中):
SQL> alter diskgroup dg_name set attribute 'compatible.asm'='11.1';
现在ASM 兼容性设置为 11.1;但 RDBMS 兼容性仍然设置为 10.1.要将它也更改为 11.1,命令如下:
SQL> alter diskgroup dg_name set attribute 'compatible.rdbms'='11.1';
注意:兼容性是针对磁盘组设置的,而不是针对整个 ASM 实例。使用该特性,您只需使用一个 ASM 实例即可满足所有数据库版本类型的需要。根据所使用的版本,您可以相应地设置属性,从而减少版本间的通信。
3.1.8 向ASM中添加disk的完整步骤
1.划好磁盘分区,例如sdd6
2.查看现有的RAW:
# raw –qa
确定下一个RAW的编码,例如此时最大的RAW编码为RAW11,那么下面将使用RAW12
3.将RAW12添加到文件/etc/raw中,使它永久生效:
添加的内容请参考该文件中的其他行
4.修改RAW12的权限
# chown oracle:dba /dev/raw/raw12
5.将sdd6绑定为裸设备,如raw12:
# raw /dev/raw/raw12 /dev/sdd6
6.将raw12添加到要扩充的dg中,例如dg_dbfile中:
确定diskstring当前的值,以oracle用户登录节点1:
#export ORACLE_SID=+ASM1
#sqlplus / as sysdba
SQL>show parameter asm_diskstring;
例如该参数的值为/dev/raw/raw1,/dev/raw/raw2
登录节点1,然后执行如下步骤:
#export ORACLE_SID=+ASM1
#sqlplus / as sysdba
修改参数asm_diskstring:
SQL> alter system set asm_diskstring='/dev/raw/raw1’,’/dev/raw/raw2’,’/dev/raw/raw12';
登录节点2,然后执行如下步骤:
#export ORACLE_SID=+ASM2
#sqlplus / as sysdba
修改参数asm_diskstring:
SQL> alter system set asm_diskstring='/dev/raw/raw1’,’/dev/raw/raw2’,’/dev/raw/raw12';
增加raw12到dg中:
SQL>alter diskgroup dg_dbfile add disk '/dev/raw/raw12';
查看该dg的状态:
SQL>select name,state from v$asm_diskgroup where name=’DG_DBFILE’;
如果状态为DISMOUNT,则执行下面的命令将它MOUNT起来:
SQL>alter diskgroup dg_dbfile mount;
回到节点1,执行如下步骤:
查看该dg的状态:
SQL>select name,state from v$asm_diskgroup where name=’DG_DBFILE’;
如果状态为DISMOUNT,则执行下面的命令将它MOUNT起来:
SQL>alter diskgroup dg_dbfile mount;
7.修改init文件
在节点1和节点2上,分别修改文件$ORACLE_BASE/admin/+ASM/pfile/init.ora ,将原来设置参数asm_diskstring的行注销掉,然后添加一行,内容如下:
asm_diskstring=/dev/raw/raw1,/dev/raw/raw2,/dev/raw/raw12
其中,红色部分为步骤4中看到的值,粉红色的内容为本次新增加的裸设备。
3.2 ASMCMD
3.2.1 ASMCMD常用命令
在节点1上,以oracle用户登录,然后设置为+ASM1实例:
# su – oracle
# export $ORACLE_SID=+ASM1
# asmcmd
asmcmd命令清单如下:
命令 用途 说明
ls 显示现有的diskgroup名称
ll 显示所有可用的命令
cd Cd +diskgroup名 作用等同于进入普通目录
mkdir 完全和普通目录的管理方法一致 ...
rm 删除文件或目录
pwd 查看当前目录
cp 拷贝文件 可在两个DG间拷贝,也可从DG拷贝到文件系统,但不能从文件系统拷贝到DG
3.2.2 复制ASM文件
拷贝ASM文件到文件系统下:
ASMCMD>cd +DG_1
ASMCMD>cp sp1.ora /opt/oracle/tst.ora
如果不指定文件系统的具体目录,那么默认为$ORACLE_HOME/dbs
拷贝ASM文件到ASM的DG上:
ASMCMD>cd +DG_1
ASMCMD>cp sp1.ora +DG_1/tst.ora
这样就将DG_1下的sp1.ora做了个复制文件tst.ora,并存放在DG_1中
注意:cp命令不能将文件系统中的文件拷贝到DG上。
3.2.3 命令lsdg
命令lsdg可以查看DG的各个属性,返回结果例如:
lASMCMD>lsdg
State Type Rebal Sector Block AU Total_MB Free_MB Req_mir_free_MB Usable_file_MB Offline_disks Name
MOUNTED EXTERN N 512 4096 1048576 19085 18990 0 18990 0 DGB/
MOUNTED EXTERN N 512 4096 1048576 28615 28498 0 28498 0 DG_ARCH/
MOUNTED EXTERN N 512 4096 1048576 19085 3936 0 3936 0 DG_DBFILE/
MOUNTED EXTERN N 512 4096 1048576 28615 13159 0 13159 0 DG_INDEX/
ASMCMD>
3.2.4 元数据备份与恢复
可以在asmcmd中对ASM的DG元数据进行备份与恢复。可以将备份的DG恢复其元数据,也可恢复成一个新名称的DG。
备份元数据:
ASMCMD> md_backup -b /oracle/db/dg2_bk -g dg2
其中,-b表示备份文件的路标路径,如果不指定,则会备份到当前目录。-g表示要备份的DG名,如有多个,则用多个-g来开始,例如:-g dg1 –g dg2,如果不带此参数,则默认备份所有的DG。
恢复元数据:
恢复dg_data的元数据,并生成新名称dg2:
ASMCMD> md_restore -t newdg -o 'dg_data:dg2' -b /oracle/db/dg_data_bk
其中,-b表示使用哪个备份文件来做恢复。-g表示要恢复的DG名称。-t后面有三个选项,一是full,表示创建DG并恢复其元数据,一是nodg,表示仅仅恢复元数据,另外一个是newdg,表示建立一个新名称的dg并恢复其元数据。如果是newdg,那么后面必须跟上-o,来指定旧名称和新名称。也可以在恢复的时候执行一个脚本,如下:
ASMCMD> md_restore –t newdg –of override.txt –i backup_file
特别说明:
1.DG上存放的数据库中建立的对象,如数据文件,以及由此生成的目录,都不属于元数据
2.进入ASMCMD后mkdir建立的目录等属于元数据,可以被备份出来
3.3 ASM磁盘头信息备份与恢复
使用dd备份头信息:
# dd if=/dev/raw/raw201 bs=4096 count=1 of=/oracle/db/raw201bak
这里,只需要备份第一个块的内容即可,即count=1。参数of出去的文件可以放在本地盘上。这个备份文件只能使用dd命令来查看其内容。
使用dd做头信息恢复:
如果头信息被破坏,ASM将看不到此盘,即在v$asm_disk中看不到此raw文件。只要用之前备份的头信息文件恢复一下即可。
# dd if=/oracle/db/raw204bak of=/dev/raw/raw204 bs=4096 count=1
使用kfed备份头信息:
# kfed read /dev/raw/raw204 aunum=0 >/oracle/db/raw204au0
这样备份出来的文件可以使用vi或more命令查看其内容。
使用kfed恢复头信息:
# kfed merge /dev/raw/raw208 text=/wch/raw208au
这里文件/wch/raw208au是可以用vi编辑的。
3.4 ASM常用视图
3.4.1 视图V$ASM_DISKGROUP
字段名称 字段含义
GROUP_NUMBER DG组编号,主键
NAME DG名称
SECTOR_SIZE Physical block size (in bytes)。我们库中为512(block size为8K),磁盘扇区的大小
BLOCK_SIZE Automatic Storage Management metadata block size (in bytes)。ASM固定它为4096
ALLOCATION_UNIT_SIZE Size of the allocation unit (in bytes)。即AU的大小,一般为1M。建立DG时可以指定
STATE MOUNTED:可以被使用,但此时未被数据库实例连接使用
CONNECTED:DG正在被数据库使用
DISMOUNTED:DG被干净地关闭了
BROKEN:ASM已MOUNT了DG,但数据库实例看不到它
UNKNOWN:ASM都没有试图去MOUNT过它
TYPE 冗余方式,EXTERN、NORMAL、HIGH
TOTAL_MB 总容量
FREE_MB 未被使用的容量
REQUIRED_MIRROR_FREE_MB 如果做了冗余,则需要保留一些空间以便失败时保留当时的信息
USABLE_FILE_MB Amount of free space that can be safely utilized taking mirroring into
account, and yet be able to restore redundancy after a disk failure
OFFLINE_DISKS 此DG中有多少个disk处于offline状态
COMPATIBILITY ASM所要求的最低版本
DATABASE_COMPATIBILITY 要使用此ASM的数据库要求的最低版本
3.4.2 视图V$ASM_DISK
字段名称 字段含义
GROUP_NUMBER DG组编号,主键。如果为0,表示不归属于任何DG
DISK_NUMBER
DISK在所属DG内的编号。从0开始
COMPOUND_INDEX
A 32-bit number consisting of a disk group number in the high-order 8
bits and a disk number in the low-order 24 bits (for efficient access to the
view)
INCARNATION Incarnation number for the disk
MOUNT_STATUS
CACHED:此disk永久存在于ASM中,并已加入了DG
OPENED:此disk永久存在于ASM中,并已加入了DG,并有数据库实例正在使用它
IGNORED:它存在于
CLOSED:存在于ASM中但并未被ASM使用
CLOSING:ASM正在关闭此DISK
MISSING:ASM参数里设置了
HEADER_STATUS MEMBER:此盘已属于一个DG。除非使用force,否则不可将它加入其他DG中
UNKNOWN:ASM无法读该磁盘的头信息
CANDIDATE:此盘不属于任何一个DG,可被add到一个DG中
INCOMPATIBLE:头信息中记录的版本号与ASM的版本不一致
PROVISIONED - Disk is not part of a disk group and may be added to
a disk group with the ALTER DISKGROUP statement. The
PROVISIONED header status is different from the CANDIDATE header
status in that PROVISIONED implies that an additional
platform-specific action has been taken by an administrator to make
the disk available for Automatic Storage Management.
FORMER:此盘曾经属于一个DG,现可被加到其他DG中
CONFLICT:由于冲突,ASM没有MOUNT它
FOREIGN:此盘中包含了文件系统上建立的文件
3.5 常用方法
3.5.1 如何确定ASM实例的编号
一般来说,节点1上的ASM实例为ASM1,节点2的为ASM2。但是有时因安装顺序以及安装磁次数不同,导致节点上的实例号码不同。
确定ASM实例的编号方法是,以oracle用户登录,进入$ORACLE_HOME/dbs目录下,执行ll命令查看,返回结果例如:
oracle@linux1:/oracle/db/product/11.1.0/db_1/dbs> ll
total 18132
-rw-rw---- 1 oracle oinstall 3327 Feb 12 15:40 ab_+ASM1.dat
-rw-rw---- 1 oracle oinstall 1552 Feb 12 15:40 hc_+ASM1.dat
-rw-rw---- 1 oracle oinstall 1552 Feb 12 15:42 hc_ora11g1.dat
lrwxrwxrwx 1 oracle oinstall 36 Nov 26 11:49 init+ASM1.ora -> /oracle/db/admin/+ASM/pfile/init.ora
-rw-r--r-- 1 oracle oinstall 2774 Sep 11 2007 init.ora
-rw-r--r-- 1 oracle oinstall 12920 May 3 2001 initdw.ora
-rw-r----- 1 oracle oinstall 38 Feb 11 15:37 initora11g1.ora
-rw-r----- 1 oracle oinstall 1536 Nov 26 11:49 orapw+ASM1
-rw-r----- 1 oracle oinstall 1536 Jan 23 16:34 orapwora11g1
-rw-r----- 1 oracle oinstall 18497536 Jan 24 16:00 snapcf_ora11g1.f
从以上表格中可以看到有几个名称中带ASM字符的文件,这里ASM后面的编号即节点上ASM的编号。这里就是ASM1。
3.5.2 查询DG-RAW-磁盘的对应关系
查看DG与RAW的对应关系:
SQL>select a.group_number,b.name,a.path from v$asm_disk a,v$asm_diskgroup b where a.group_number=b.group_number;
返回结果例如:
SQL> select a.group_number,b.name,a.path from v$asm_disk a,v$asm_diskgroup b where a.group_number=b.group_number;
GROUP_NUMBER NAME PATH
------------ ------------------------------ --------------------
3 DG_DBFILE /dev/raw/raw201
1 DG_ARCH /dev/raw/raw202
2 DG_DATA /dev/raw/raw203
4 DG_INDEX /dev/raw/raw204
这里,以查询DG_DBFILE的信息为例。它对应于raw201
查看RAW与磁盘或磁盘分区的对应关系:
以root用户执行以下命令:
# raw -qa
可以看到每个raw的主次设备号,返回结果例如:
linux1:~ # raw -qa
/dev/raw/raw1: bound to major 8, minor 33
/dev/raw/raw2: bound to major 8, minor 49
/dev/raw/raw201: bound to major 8, minor 37
/dev/raw/raw202: bound to major 8, minor 38
/dev/raw/raw203: bound to major 8, minor 53
/dev/raw/raw204: bound to major 8, minor 54
/dev/raw/raw208: bound to major 8, minor 55
记下raw201的设备号:8,37
查询磁盘信息:
# ll /dev/sd*
返回结果例如:
linux1:~ # ll /dev/sd*
brw-r----- 1 root disk 8, 0 Dec 24 16:56 /dev/sda
brw-r----- 1 root disk 8, 1 Dec 24 16:56 /dev/sda1
brw-r----- 1 root disk 8, 2 Dec 24 16:56 /dev/sda2
brw-r----- 1 root disk 8, 3 Dec 24 16:56 /dev/sda3
brw-r----- 1 root disk 8, 16 Dec 24 16:56 /dev/sdb
brw-r----- 1 root disk 8, 17 Dec 24 16:56 /dev/sdb1
brw-r----- 1 root disk 8, 18 Dec 24 16:56 /dev/sdb2
brw-r----- 1 root disk 8, 19 Dec 24 16:56 /dev/sdb3
brw-r----- 1 root disk 8, 32 Dec 24 16:56 /dev/sdc
brw-r----- 1 root disk 8, 33 Dec 24 16:56 /dev/sdc1
brw-r----- 1 root disk 8, 34 Dec 24 16:56 /dev/sdc2
brw-r----- 1 root disk 8, 35 Dec 24 16:56 /dev/sdc3
brw-r----- 1 root disk 8, 37 Dec 24 16:56 /dev/sdc5
brw-r----- 1 root disk 8, 38 Dec 24 16:56 /dev/sdc6
brw-r----- 1 root disk 8, 48 Dec 24 16:56 /dev/sdd
brw-r----- 1 root disk 8, 49 Dec 24 16:56 /dev/sdd1
brw-r----- 1 root disk 8, 50 Dec 24 16:56 /dev/sdd2
brw-r----- 1 root disk 8, 51 Dec 24 16:56 /dev/sdd3
brw-r----- 1 root disk 8, 53 Dec 24 16:56 /dev/sdd5
brw-r----- 1 root disk 8, 54 Dec 24 16:56 /dev/sdd6
brw-r----- 1 root disk 8, 55 Dec 24 16:56 /dev/sdd7
在这里找设备号为8,37的盘,应是sdc5。
以上可说明对应关系为:DG_DBFILE -> RAW201 -> sdc5
第04章 数据库管理
4.1 参数文件管理
查看一个参数的值:
SQL> show parameter parameter_name
检查数据库是否以spfile启动的:
SQL> show parameter spfile
如果返回的value为空,说明是以pfile文件启动。否则value的值就是spfile文件。
Pfile文件与spfile文件互相生成:
以spfile启动的数据库,则可由SPFILE生成PFILE:
SQL> create pfile =’path/filename.ora’ from spfile;
不是以spfile启动的数据库,也可由SPFILE生成PFILE:
SQL> create pfile =’path/filename.ora’ from spfile=’spfile文件的路径及名称’;
注意:
如果不指定pfile文件的路径及名称,则它会替换现有$ORACLE_HOME/dbs/initORACLE_SID.ora文件的内容。
从pfile文件生成spfile:
SQL>create spfile from pfile=’path/filename.ora’
动态修改参数的值:
SQL>alter system set 参数名=新值 scope=both/memory/spfile [sid=INSTANCE_NAME]
注意:
1.如果both为scope子句的默认值,表示同时修改内存和SPFILE文件中此参数的值
2.如果SCOPE为memory,则修改会马上生效,但下次启动数据库后就失效了
3.如果SCOPE为spfile,则只有重启数据库后修改才能生效
4.如果数据库是以pfile文件启动的,那么scope只能等于memory
5.在RAC中,如果仅想修改一个实例的值,那么需要加子句sid
4.2 表空间管理
4.2.1 表空间大小
查询表空间的总大小:
SELECT tablespace_name, SUM(bytes) / 1024 / 1024 / 1024 jg
FROM dba_data_files
GROUP BY tablespace_name
其中字段jg的单位为G
查询表空间当前可用大小:
SELECT tablespace_name, SUM(bytes) / 1024 / 1024 / 1024 jg
FROM dba_free_space
GROUP BY tablespace_name
注意:
1.普通表空间中,如果数据库大小为8K,那么每个数据文件最大不能超过32G
2.大表空间中数据文件大小几乎不受限制。建立大表空间的语法为create bigfile tablespace …
查看表空间使用率
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 1
4.2.2 表空间自动扩张
修改表空间下的文件为不可自动扩张:
SQL> alter database datafile ‘文件路径/文件名.dbf’ autoextend off
修改表空间下的文件为不可自动扩张:
SQL> alter database datafile ‘文件路径/文件名.dbf’ autoextend on
4.2.3 表空间更名
可以在线修改表空间的名称:
SQL> alter tablespace 表空间名称 rename to 新名称;
改名后,其他使用到该表空间的地方也自动被修改,无需用户再手工逐一修改
4.2.4 表空间的数据文件更名
将数据文件从一个地方挪到另外一个地方后,需要在数据库中修改一下数据文件的名称(含文件的绝对路径)。修改方法如下:
SQL>shutdown immediate;
SQL>startup mount;
SQL> alter database rename file '/old path/old_filename.dbf' to '/new path/new_filename.dbf';
SQL> recover database;
SQL> alter database open;
4.2.5 缺省表空间
查看实例的缺省UNDO表空间:
SQL>show parameter undo_tablespace;
修改默认的UNDO表空间:
SQL>alter system set undo_tablespace=新UNDO名称;
修改默认的临时表空间:
SQL> alter database default temporary tablespace 新临时表空间名;
修改数据库中所有用户默认的表空间:
SQL> alter database default tablespace 新表空间名
查看用户默认的表空间:
SQL>Select DEFAULT_TABLESPACE from dba_users where username='ORACLE';
新建用户时如不指定默认表空间,则使用默认表空间:
SQL>create user 用户名 identified by 密码 [default tablespace 表空间名]
修改用户默认的表空间:
SQL>alter user oracle default tablespace新表空间名;
4.2.6 表空间删除
可以使用如下命令删除表空间,其中如果没有including contents and datafile,则表空间的内容及
数据文件需要手工删除:
SQL>alter database drop tablespace 表空间名 including contents and datafile;
不能删除数据库的默认表空间和默认临时表空间
不能删除SYSTEM表空间和SYSAUX表空间
4.2.7 UNDO表空间
在RAC类数据库中,每个节点上都有一个UNDO表空间,在使用ASM管理存储的模式下,系统在创建数据库时会生成两个(两节点的RAC)UNDO表空间,他们都存放在同一个disk group中,单会被分别指定给不同的实例。修改UNDO表空间的大小:
SQL>alter database datafile ‘文件路径/文件名.dbf’ resize 10G;
4.2.7 undo找回误删除的数据
从undo里面找回刚刚删除的数据
INSERT INTO d_meter SELECT * from d_meter AS OF TIMESTAMP
TO_TIMESTAMP('2015-10-14 15:36:50','YYYY-MM-DD HH24:MI:SS')
where arrive_batch_no='2614101437270174';
4.2.8 TEMP表空间
修改UNDO表空间的大小:
SQL>alter database tempfile '+DG_DBFILE/ora11g/temp01.dbf' resize 10G;
4.3 重做日志文件管理
每个节点有各自的redo log文件,他们都存放在同一个disk group中,
REDO大小查询
SET LINE 1000
COL MEMBER FORMAT A66
SELECT A.GROUP#,A.BYTES/1024/1024,B.MEMBER
FROM V$LOG A,V$LOGFILE B
WHERE A.GROUP#=B.GROUP#;
REDO LOG状态
SELECT B.MEMBER,B.STATUS,A.STATUS
FROM V$LOG A,V$LOGFILE B
WHERE A.GROUP#=B.GROUP#;
修改REDO文件的大小:不能直接修改重做日志文件的大小,只能先增加新size的日志组,然后切换到新组上,再把旧size的日志组drop。
4.3.1 增加REDO日志组
SQL> alter database add logfile thread 1 group 11 '+DG_DBFILE/ora11g/redo1_11.log' size 200M
这里,thread 1表示在RAC环境中,将为节点1增加日志组,如果是单实例数据库,则不需要该子句。另外,及时目前节点1已经down,也可以在节点2上执行上面的语句来为节点1增加日志组。该日志组中的日志文件大小为200M。
4.3.2 删除日志组
SQL> alter database drop logfile group 1;
注意,只有状态为inactive和unused的日志组才可被drop。如果状态为active,则需要反复做多次日志切换才可将状态调整为inactive
4.3.3 日志切换
在RAC环境中,进入各个实例,执行如下语句:
SQL> alter system switch logfile;
4.3.4 日志清理
如果因redo日志损坏或不能归档导致数据库不能启动,可以先清理日志文件。
查看每个日志组是否已经归档:
SQL> select group#,status,SEQUENCE#,ARCHIVED from v$log;
清除未归档的日志组:
SQL>alter database clear unarchived logfile group group_number;
清除已归档的日志组:
SQL>alter database clear logfile group group_number;
清理日志文件并不会使日志中的内容丢失。
4.3.5 重做日志切换次数查询
可以使用如下SQL语句来查询过去30天中每天每小时的日志切换次数:
SELECT to_char(first_time, 'yyyy-mm-dd') DAY,
COUNT(*) switch_times,
SUM(decode(to_char(first_time, 'hh24'), '00', 1, 0)) h00,
SUM(decode(to_char(first_time, 'hh24'), '01', 1, 0)) h01,
SUM(decode(to_char(first_time, 'hh24'), '02', 1, 0)) h02,
SUM(decode(to_char(first_time, 'hh24'), '03', 1, 0)) h03,
SUM(decode(to_char(first_time, 'hh24'), '04', 1, 0)) h04,
SUM(decode(to_char(first_time, 'hh24'), '05', 1, 0)) h05,
SUM(decode(to_char(first_time, 'hh24'), '06', 1, 0)) h06,
SUM(decode(to_char(first_time, 'hh24'), '07', 1, 0)) h07,
SUM(decode(to_char(first_time, 'hh24'), '08', 1, 0)) h08,
SUM(decode(to_char(first_time, 'hh24'), '09', 1, 0)) h09,
SUM(decode(to_char(first_time, 'hh24'), '10', 1, 0)) h10,
SUM(decode(to_char(first_time, 'hh24'), '11', 1, 0)) h11,
SUM(decode(to_char(first_time, 'hh24'), '12', 1, 0)) h12,
SUM(decode(to_char(first_time, 'hh24'), '13', 1, 0)) h13,
SUM(decode(to_char(first_time, 'hh24'), '14', 1, 0)) h14,
SUM(decode(to_char(first_time, 'hh24'), '15', 1, 0)) h15,
SUM(decode(to_char(first_time, 'hh24'), '16', 1, 0)) h16,
SUM(decode(to_char(first_time, 'hh24'), '17', 1, 0)) h17,
SUM(decode(to_char(first_time, 'hh24'), '18', 1, 0)) h18,
SUM(decode(to_char(first_time, 'hh24'), '19', 1, 0)) h19,
SUM(decode(to_char(first_time, 'hh24'), '20', 1, 0)) h20,
SUM(decode(to_char(first_time, 'hh24'), '21', 1, 0)) h21,
SUM(decode(to_char(first_time, 'hh24'), '22', 1, 0)) h22,
SUM(decode(to_char(first_time, 'hh24'), '23', 1, 0)) h23
FROM v$log_history
WHERE first_time > trunc(SYSDATE - 30)
GROUP BY ROLLUP(to_char(first_time, 'yyyy-mm-dd'));
其中h**表示小时。
4.4 归档模式
4.4.1 单实例数据库修改为归档模式的方法
正常关闭数据库:
SQL>shutdown immediate;
注意,这里不能使用abort或断电方式关闭数据库。
启动到MOUNT状态:
SQL>startup mount;
设置归档参数:
SQL> alter system set db_recovery_file_dest='';
SQL> alter system set log_archive_dest_1=’LOCATION=path’;
修改为归档模式:
SQL> alter database archivelog;
启动数据库:
SQL> alter database open;
4.4.2 RAC数据库修改为归档模式的方法
在两个节点上,分别正常关闭数据库:
SQL>shutdown immediate;
注意,这里不能使用abort或断电方式关闭数据库。
启动节点1上的数据库到MOUNT状态:
SQL>startup mount;
修改为非RAC模式:
SQL> alter system set cluster_database=false scope=spfile;
关闭并重新启动节点1上的数据库到MOUNT状态
设置归档参数:
SQL> alter system set db_recovery_file_dest='path';
SQL> alter system set db_recovery_file_dest_size=2G;
注意,如果参数log_archive_dest_1有设置,则清空。
修改为归档模式:
SQL> alter database archivelog;
修改为RAC模式:
SQL> alter system set cluster_database=true scope=spfile;
关闭节点1上的数据库。然后重新启动两个节点上的数据库。
4.4.3 归档路径
可以使用flash recory area来作为归档目标路径,需要同时设置参数db_recovery_file_dest和db_recovery_file_dest_size两个参数。如果归档文件的总大小超过了db_recovery_file_dest_size的值,将发生因归档失败而无法启动数据库的现象。该参数默认值为2G。
也可以使用log_archive_dest_n 来执行归档目标路径。默认地,log_archive_dest_1如果为空,则表示归档时会在log_archive_dest_1默认的$ORACLE_HOME/dbs目录下生成一份归档文件。这会导致$ORACLE_HOME目录爆涨而发生严重的空间问题。
参数log_archive_dest与log_archive_dest_n不能同时使用,参数log_archive_dest_1的值如果没有设,则默认为$ORACLE_HOME/dbs目录。在11g中,参数log_archive_dest就不要再使用了!
设置log_archive_dest_1的语法如下,这里引号中的LOCATION=是必不可少的:
SQL> alter system set log_archive_dest_1='LOCATION=dest_path ';
注意:
1.如果db_recovery_file_dest与log_archive_dest_1设置了不同的值,那么归档文件将在两个路径下同时生成(文件内容一致,文件名称可能不同)
2.即使log_archive_dest_1为空,与将它设置为$ORACLE_HOME/dbs目录的实际效果是一样的
4.5 重建控制文件
当数据库因重做日志文件或者数据文件丢失或不一致,或者要修改数据库名称时,一般就可通过重建控制文件来实现。
步骤1:备份控制文件成脚本文件
SQL> alter database backup controlfile to trace;
注意:数据库必须为MOUNT或OPEN状态。
步骤2:找到刚生成的脚本文件
在目录$ORACLE_BASE/oradb/diag/rdbms/db_name/instance_name/trace中找到最新生成的trc文件,该文件中应包含CREATE CONTROLFILE语句。
步骤3:重整建控制文件的SQL语句
从该文件中取出最核心的内容,例如:
CREATE CONTROLFILE REUSE DATABASE "INOMC" NORESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/dev/vx/dsk/i2kdgtest/redo1_1_vol' SIZE 50M,
GROUP 2 '/dev/vx/dsk/i2kdgtest/redo2_1_vol' SIZE 50M,
GROUP 3 '/dev/vx/dsk/i2kdgtest/redo3_1_vol' SIZE 50M,
GROUP 4 '/dev/vx/dsk/i2kdgtest/redo4_1_vol' SIZE 50M,
GROUP 12 '/dev/vx/dsk/i2kdgtest/redo12_1_vol' SIZE 100M
-- STANDBY LOGFILE
DATAFILE
'/dev/vx/dsk/i2kdgtest/system_vol',
'/dev/vx/dsk/i2kdgtest/sysaux_vol',
'/dev/vx/dsk/i2kdgtest/undotbs1_vol',
'/dev/vx/dsk/i2kdgtest/users_vol'
CHARACTER SET ZHS16GBK
然后修改为:
CREATE CONTROLFILE set DATABASE 'INOMC' RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/dev/vx/dsk/i2kdgtest/redo1_1_vol' SIZE 50M,
GROUP 2 '/dev/vx/dsk/i2kdgtest/redo2_1_vol' SIZE 50M,
GROUP 3 '/dev/vx/dsk/i2kdgtest/redo3_1_vol' SIZE 50M,
GROUP 4 '/dev/vx/dsk/i2kdgtest/redo4_1_vol' SIZE 50M
DATAFILE
'/dev/vx/dsk/i2kdgtest/system_vol',
'/dev/vx/dsk/i2kdgtest/sysaux_vol',
'/dev/vx/dsk/i2kdgtest/undotbs1_vol',
'/dev/vx/dsk/i2kdgtest/users_vol'
CHARACTER SET ZHS16GBK;
这个例子中,我们是要去掉group为12的日志文件
注意:如果已经有控制文件存在,则仍使用reuse,如果控制文件没有了,那么使用set
步骤4:将数据库启动到nomount状态
SQL>shutdown immediate;
SQL>startup nomount;
步骤5:执行修改后的CREATE CONTROLFILE语句
步骤6:打开数据库
SQL> ALTER DATABASE OPEN RESETLOGS;
4.6 内存参数管理
4.6.1 Oracle内存管理发展阶段
9i:通过PGA_AGGREGATE_TARGET参数实现PGA自动管理
10g:通过SGA_TARGET参数实现了SGA的自动管理
11g:通过MEMORY_TARGET参数实现了所有内存块的自动管理
可以通过视图V$MEMORY_DYNAMIC_COMPONENTS和V$MEMORY_RESIZE_OPS来查询各个内存部分的大小。
下面分别介绍这三个管理方式的设置方法。但在11g中,建议使用AMM。
4.6.2 自动内存管理AMM
AMM是Automatic Memory Management的缩写,表示自动内存管理。有两个参数memory_max_target和memory_target,参数memory_max_target表示可用的最大内存值,memory_target表示在memory_max_target的范围内,有多少内存是可用于动态分配的,它应小于等于memory_max_target的值。
设置方法如下:
SQL> alter system set memory_max_target=3200M scope=spfile;
SQL> alter system set memory_target=3200M scope=spfile;
SQL> shutdown immediate;
SQL> startup;
其他内存参数如pga_aggregate_target、sga_max_size等,在自动内存管理的情况下是不需要设置的,等于0即可,oracle在运行期间会根据每个部分的实际需求分配相应大小的内存。但是如果设置了这些参数为非0值,那么这个值将是该参数的最小值,实际运行中的值应是大于等于它的。
注意:如果初始化参数 LOCK_SGA = true ,则 AMM 是不可用的。
4.6.3 自动共享内存管理ASMM
ASMM是Automatic Shared Memory Management的缩写,表示共享内存(SGA)的自动管理。要使用这种方式,需要设置初始化参数 MEMORY_TARGET=0 ,然后显式的指定 SGA_TARGET 的值。
SQL> alter system set memory_target=0 scope=both;
SQL> alter system set sga_target=1024m scope=both;
这两个参数的修改是有严格顺序的,如果不遵守倒也没问题--Oracle 会报告错误。
4.6.4 自动PGA管理
如果使用AMM,则对PGA不用操心。如果要做到精细控制而切换到自动PGA内存管理模式,需要设定WORKAREA_SIZE_POLICY=AUTO(默认为AUTO),然后需要指定 PGA_AGGREGATE_TARGET 的值。如需要精确控制PGA,则WORKAREA_SIZE_POLICY=MANUAL,然后对PGA的各个部分的大小进行设置。
4.7 其他管理内容
4.7.1 数据库版本查看
有两种方法可以查看数据库的版本信息。一是执行sqlplus / as sysdba,在输出内容中有版本及包含的关键特征:
oracle@linux2:~> sqlplus / as sysdba
SQL*Plus: Release 11.1.0.6.0 - Production on Tue Sep 2 08:59:07 2008
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production --说明是11g的企业版,64位的
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options --这里说明包含了哪些特别功能
SQL>
如果是标准版,那么输出的结果如下:
oracle@linux1:~> sqlplus / as sysdba
SQL*Plus: Release 11.1.0.6.0 - Production on Tue Sep 2 09:57:48 2008
Copyright (c) 1982, 2007, Oracle. All rights reserved.
Connected to:
Oracle Database 11g Release 11.1.0.6.0 - 64bit Production --说明是11g的标准版,64位的
方法二是查看v$version视图。或者查看SELECT * FROM PRODUCT_COMPONENT_VERSION;
4.7.2 字符集
数据库服务器端字符集可通过视图V$NLS_PARAMETERS中的NLS_CHARACTERSET的值查看。
本地设置环境变量NLS_LANG(我的电脑,右键,属性,高级,环境变量),如设置为SIMPLIFIED CHINESE_CHINA.ZHS16GBK。
数据库的字符集在安装时指定后,不可修改。如一定要修改字符集,那么建议重新建库。
4.7.3 创建密码文件
以oracle用户执行以下命令,建立密码文件,如果此文件已有,则需要先删除后建立:
orapwd file=$ORACLE_HOME/dbs/orapwORACLE_SID password=mima entries=6
4.7.4 关闭审计功能
安装完成后,默认为数据库级的审计,即audit_trail的值为DB。这样每次有用户登录到数据库时都会在系统表空间中记录一行,并且在/opt/app/admin/ora11g/adump目录下生成一个.aud文件。一段时间后,系统表空间不断增大,磁盘文件也不断增大。应该定期清理。
因为此审计功能并无太多意义,建议关闭。命令如下:
SQL> alter system set audit_trail='NONE' scope=spfile;
清理打开审计时遗留的一些信息:
SQL> truncate table SYS.AUD$;
4.7.5 帐号管理
建立账户
create user mpac identified by mpac123 default tablespace MPAC;
给帐号解锁:
SQL> ALTER USER XDJ ACCOUNT UNLOCK;
4.7.6 profile管理
修改profile中的设置:
SQL> alter profile DEFAULT limit idle_time 60;
创建profile的样例:
SQL> create profile TEST_PROFILE limit FAILED_LOGIN_ATTEMPTS 3;
4.8 权限管理
4.8.1查询用户权限
1)系统所有权限
select * from dba_sys_privs t where t.grantee ='&DBA';
2)用户对象权限
select * from dba_tab_privs;
3)用户拥有的角色
select * from dba_role_privs;
4.8.2用户授权
grant select any table to mpac;
grant select,insert,drop,update to mpac;
grant dba to mpac;
grant create table to mpac;
grant create view,job to mpac;
grant create database linke to mpac;
grant connect to mpac;
.........
4.8.3权限回收
revoke dba from mpac;
revoke ....
第05章 备份与恢复
5.1 逻辑备份和恢复
5.1.1 exp导出备份
5.1.2 imp导出恢复
5.2 物理备份与恢复
5.2.1 rman备份与校验
5.2.2 rman恢复
5.3.1 其他备份方式与恢复
第06章 OGG管理
6.1 OGG进程监控
6.1.1脚本监控
info all查看ogg进程的状态
6.1.2 OGG日志查看
[oracle@mdsdb02 OGG]$ tail -f ggserr.log
第07章 AWR、ASH、ADDM报告
7.1 报告收集
awr报告收集
脚本报告收集
Snapshots(快照)
1. 创建快照 如果你想在需要的时候获取统计信息可以手工执行存储过程 CREATE_SNAPSHOT
创建快照: BEGIN
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
END; /
查询视图DBA_HIST_SNAPSHOT查询出当前存在的快照ID
例如要删除快照ID从22到32之间的快照数据
BEGIN
DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE
(low_snap_id => 22,
high_snap_id => 32,
dbid => 3310949047);
7.2基线管理
7.3 报告分析
第08章 oracle 11g新特性
8.1 oracle 11g自动共享内存管理(ASMM)
8.1.1SGA自动调整
ALTER SYSTEM SET MEMORY_MAX_TARGET = nM SCOPE = SPFILE;
ALTER SYSTEM SET MEMORY_TARGET = nM;
ALTER SYSTEM SET SGA_TARGET = 0;
ALTER SYSTEM SET PGA_AGGREGATE_TARGET = 0;
说明:在设置自动内存管理时,如果db_cache_size、shared_pool_size等不为0,则表示该参数的最小值。
8.1.2自动调整参数构成
8.1.3相关视图
8.2 oracle 11g 日志管理
8.2.1 oracle 11g 日志描述
Oracle11g日志文件有两种格式:
1)与以前一样为文本格式 ;
2)为xml格式,使用adrci查看。 警告日志文件: 警告日志文件记录了数据库运行中的一些操作命令和主要事件结果
它被用来诊断日常数据库运行错误信息.
每条都对应有时间戳信息.
后台跟踪文件: 后台跟踪文件记录有被后台进程检测到的错误信息.
当后台进程遇到错误时才被创建
用户跟踪文件: 用户跟踪文件当用户进程通过服务器进程连接到Oracle服务器时产生。一个用户跟踪文件包含跟踪到的SQL执行语句或用户通讯错误信息. 当用户会话过程中遇到错误信息时产生.
它的大小定义在 MAX_DUMP_FILE_SIZE中 ,缺省为10M.
8.2.2 oracle 11g 日志路径
可以通过查询V$DIAG_INFO视图获取相关日志路径:
select * from v$DIAG_INFO;
NAME VALUE ------------------------------------------------------------------ Diag Enabled TRUE
ADR Base /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1
Diag Trace /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/trace
Diag Alert /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/alert
Diag Incident /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/incident
Diag Cdump /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/cdump
Health Monitor /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/hm
Default Trace File /u01/app/oracle/diag/rdbms/pmcpdp/pmcpdp1/trace/pmcpdp1_ora_xxx.trc
日志路径比较:
诊断数据 以前的位置 ADR 位置
前台进程跟踪 USER_DUMP_DEST $ADR_HOME/trace
后台进程跟踪 BACKGROUND_DUMP_DEST $ADR_HOME/trace
预警日志数据 BACKGROUND_DUMP_DEST $ADR_HOME/alert&trace
核心转储 CORE_DUMP_DEST $ADR_HOME/cdump
意外事件转储 USER|BACKGROUND_DUMP_DEST $ADR_HOME/incident/incdir_n
8.2.3 ADR Command Interpreter(ADRCL)介绍与使用
Automatic Diagnostic Repository (ADR): 一个存放数据库诊断日志、跟踪文件的目录,称作ADR base,对应初始化参数DIAGNOSTIC_DEST,如果设置了ORACLE_BASE环境变量,DIAGNOSTIC_DEST等于ORACLE_BASE,如果没有设置ORACLE_BASE,则等与ORACLE_HOME/log。 ADRCI Command-Line Utility 命令行工具,使用该工具查看ADR中的日志和跟踪信息,查看健康报告;还可以将相关错误日志和信息打包成zip文件,以便提供给oracle support分析。
8.2.3.1使用ADRCI查看Oracle数据库后台报警日志(alert_sid.log)
1)、查看完整alert信息:
adrci>>SHOW ALERT
2)、 查看最新alert信息:
adrci>> SHOW ALERT –TAIL
3)、查看最新20条alert信息:
adrci>> SHOW ALERT -TAIL 20
4)、只查看600的错误
adrci>>SHOW ALERT -P "MESSAGE_TEXT LIKE '%ORA-600%'" 查看ORA-错误信息
5)、用以下命令获取adrci下命令的帮助: 代码: HELP command
adrci>>help show alert
8.2.3.2跟踪文件
查看跟踪文件常用的有:
1) 、列出所有跟踪文件: SHOW TRACEFILE
2) 、模糊查询跟踪文件,比如某个进程的,注意这里区分大小写 SHOW TRACEFILE %mmon%
3)、可以指定某个路径 SHOW TRACEFILE %mmon% -PATH /home/steve/temp
4) 、象ls那样按时间排序 SHOW TRACEFILE -RT
8.3 oracle 11g Flashback特性
oracle数据库10g提供了五个新的闪回功能:闪回版本,闪回事务,闪回丢弃,闪回表和闪回数据库。
Oracle数据库11gR1提供了闪回数据存档,它允许一个Oracle数据据库管理员维护一个记录,对指定时间范围内对所有表的的改变情况进行记录。
8.3.1闪回版本
8.3.2闪回事物
8.3.3闪回丢弃
8.3.4闪回表
8.3.5闪回数据库
8.3.6闪回数据存档
第09章 oracle 12C
9.1 12c 新特性
数据库容器(CDB)承载多个可插拔数据库(PDB)
1)连接到CDB数据库
sqlplus / as sysdba
2)查看数据库是否为CDB
SELECT NAME,
DECODE(CDB,
'YES',
'MULTITENANT OPTION ENABLED',
'REGULAR 12C DATABASE: ') "MULTITENANT OPTION",
OPEN_MODE,
CON_ID
FROM V$DATABASE;
3)查看当前容器(Container)
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select sys_context('userenv', 'con_name') "Container DB" from dual;
Container DB
----------------------------------------------------
CDB$ROOT
SQL>
4)查看CDB容器中的PDBS信息
查看CDB中有多少个pluggable database
select con_id, dbid, guid, name , open_mode from v$pdbs;
CON_ID DBID GUID NAME OPEN_MODE
---------- ---------- -------------------------------- ------------------------------ ---------
2 4071321146 E89E8DA2866E3157E043DE07A8C09238 PDB$SEED READ ONLY 3 1930201447 E89E9418B882350CE043DE07A8C092B6 PDBEPPS MOUNTED
SQL>
9.2 12c 插件管理
第10章 生产脚本汇总清单
10.1 exp备份脚本
10.2 imp恢复脚本
10.3 expdp备份脚本
1、导出单个表:
directory=dump_dir1
dumpfile=data.dmp
tables=表名(多表用逗号分隔)
logfile=dump_dir1:expdp.log
2、导入表:
directory=dump_dir
dumpfile=data.dmp
tables=scott.a
logfile=dump_dir:impdp.log
REMAP_TABLE=scott.a:b --导入时可以把表重命名,表a重命名为b
REMAP_TABLESPACE=ABCTBS:DEFTBS --导出时的表空间和导入时的表空间不同时使用,导出时表空间为abctbs,导入到新的表空间deftbs
directory=dump_dir1
dumpfile=onlinegame.dmp
EXCLUDE=TABLE:"IN ('DICT_CALLBACK_LOG','DICT_CHARGE_LOG')"
content=ALL
logfile=dump_dir1:onlinegame.log
3、创建目录:
Create or replace directory dump_dir as '/data/backup';
4、授权用户的读或者写:
grant read, write on directory dump_dir to scott;
expdp ami/ami directory=my_dmp dumpfile=table.dmp CONTENT=METADATA_ONLY logfile =a.log
10.4 impdp恢复脚本
基本语法结构
impdp ami/ami directory=my_dmp dumpfile=table.dmp logfile =a.log
导入重命名表只导入数据
impdp ami/ami directory=my_dmp dumpfile=table.dmp REMAP_TABLE=ami.s_data_2:s_data_bak content=data_only logfile =a.log
只导入表结构
impdp ami/ami directory=my_dmp dumpfile=table.dmp CONTENT=METADATA_ONLY logfile =a.log
映射到不同的用户/不同的表空间/不同的表(但相同的表结构)使用REMAP_SCHEMA/REMAP_TABLESPACE/REMAP_TABLE =
REMAP_SCHEMA/REMAP_TABLESPACE/REMAP_TABLE
10.5 rman 全备脚本
10.6 rman 增量脚本
10.7 ocr 备份脚本
10.8 ctl 备份脚本
10.9 arch 备份脚本
10.10 arch 删除脚本
10.11 ogg 监控脚本
10.12 weblogic监控脚本
第11章 监控平台访问
湖北平台MDS访问地址:
湖北接口程序访问地址:
湖北监控天兔访问地址:
湖北存储访问平台地址:
湖北负载均衡访问地址
湖北precise访问地址
湖北SVN访问地址
湖北测试MDS访问地址
第12章 其他脚本
表自动分区脚本
自动查看执行计划脚本
自动收集
第13章 故障处理
13.1数据库坏块的处理
数据库出现坏块时,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数据库出现坏块。在排除了数据库以外的原因后,再对发生坏块的数据库对象进行处理。
13.1.1 确定发生坏块的数据库对象
SELECT tablespace_name, segment_type, owner, segment_name
FROM dba_extents
WHERE file_id = AND between block_id AND block_id+blocks-1;
13.1.2.决定修复方法
如果发生坏块的对象是一个索引,那么可以直接把索引DROP掉后,再根据表里的记录进行重建; 如果发生坏块的表的记录可以根据其它表的记录生成的话,那么可以直接把这个表DROP掉后重建; 如果有数据库的备份,则恢复数据库的方法来进行修复; 如果表里的记录没有其它办法恢复,那么坏块上的记录就丢失了,只能把表中其它数据块上的记录取出来,然后对这个表进行重建。
13.1.3 用Oracle提供的DBMS_REPAIR包标记出坏块
exec DBMS_REPAIR.SKIP_CORRUPT_BLOCKS(",");
13.1.4 使用Create table as select命令将表中其它块上的记录保存到另一张表上
create table corrupt_table_bak
as select * from corrupt_table;
13.1.5 用DROP TABLE命令删除有坏块的表
drop table corrup_tatble;
13.1.6 用alter table rename命令恢复原来的表
alter table corrupt_table_bak rename to corrupt_table;
13.1.7 如果表上存在索引,则要重建表上的索引
13.2 redo异常处理
13.3 死锁处理
锁查询
SELECT /*+ choose */
bs.username "Blocking User", bs.username "DB User",
ws.username "Waiting User", bs.sid "SID", ws.sid "WSID",
bs.serial# "Serial#", bs.sql_address "address",
bs.sql_hash_value "Sql hash", bs.program "Blocking App",
ws.program "Waiting App", bs.machine "Blocking Machine",
ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
ws.osuser "Waiting OS User", bs.serial# "Serial#",
ws.serial# "WSerial#",
DECODE (
wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE
) lock_type,
DECODE (
hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (hk.lmode)
) mode_held,
DECODE (
wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (wk.request)
) mode_requested,
TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
DECODE (
hk.BLOCK,
0, 'NOT Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */
TO_CHAR (hk.BLOCK)
)
blocking_others
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.BLOCK = 1
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.sid = bs.sid(+)
AND wk.sid = ws.sid(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;
锁管理:
单节点锁--
select /*+no_merge(a) no_merge(b) */
(select username from v$session where sid=a.sid) blocker,
a.sid, 'is blocking',
(select username from v$session where sid=b.sid) blockee,
b.sid
from v$lock a,v$lock b
where a.block=1 and b.request>0
and a.id1=b.id1
and a.id2=b.id2;
这里的BLOCK=1代表锁住了其他的会话,而request>0就是请求会话
SELECT S.SID,
S.USERNAME,
S.SERIAL#,
O.OWNER || '.' || O.OBJECT_NAME,
O.OBJECT_TYPE
FROM V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHERE L.SID = S.SID
AND L.ID1 = O.OBJECT_ID
AND S.USERNAME IS NOT NULL
ORDER BY 1;
查找到SPID通过KILL 方式杀死
SELECT S.SID,
S.USERNAME,
S.SERIAL#,
A.spid,
O.OWNER || '.' || O.OBJECT_NAME,
O.OBJECT_TYPE,
S.OSUSER
FROM v$process A, V$LOCK L, SYS.DBA_OBJECTS O, V$SESSION S
WHERE L.SID = S.SID
AND L.ID1 = O.OBJECT_ID
AND A.addr = S.paddr
AND S.USERNAME IS NOT NULL
ORDER BY 1;
select spid from v$process a,v$session b where b.sid=410 and b.SERIAL#=817 and a.addr=b.paddr;
select a.spid, b.sid, b.serial# from v$process a,v$session b where a.addr=b.paddr ORDER BY 2;
查询谁锁定了谁
SELECT /*+ choose */
bs.username "Blocking User", bs.username "DB User",
ws.username "Waiting User", bs.sid "SID", ws.sid "WSID",
bs.serial# "Serial#", bs.sql_address "address",
bs.sql_hash_value "Sql hash", bs.program "Blocking App",
ws.program "Waiting App", bs.machine "Blocking Machine",
ws.machine "Waiting Machine", bs.osuser "Blocking OS User",
ws.osuser "Waiting OS User", bs.serial# "Serial#",
ws.serial# "WSerial#",
DECODE (
wk.TYPE,
'MR', 'Media Recovery',
'RT', 'Redo Thread',
'UN', 'USER Name',
'TX', 'Transaction',
'TM', 'DML',
'UL', 'PL/SQL USER LOCK',
'DX', 'Distributed Xaction',
'CF', 'Control FILE',
'IS', 'Instance State',
'FS', 'FILE SET',
'IR', 'Instance Recovery',
'ST', 'Disk SPACE Transaction',
'TS', 'Temp Segment',
'IV', 'Library Cache Invalidation',
'LS', 'LOG START OR Switch',
'RW', 'ROW Wait',
'SQ', 'Sequence Number',
'TE', 'Extend TABLE',
'TT', 'Temp TABLE',
wk.TYPE
) lock_type,
DECODE (
hk.lmode,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (hk.lmode)
) mode_held,
DECODE (
wk.request,
0, 'None',
1, 'NULL',
2, 'ROW-S (SS)',
3, 'ROW-X (SX)',
4, 'SHARE',
5, 'S/ROW-X (SSX)',
6, 'EXCLUSIVE',
TO_CHAR (wk.request)
) mode_requested,
TO_CHAR (hk.id1) lock_id1, TO_CHAR (hk.id2) lock_id2,
DECODE (
hk.BLOCK,
0, 'NOT Blocking', /* Not blocking any other processes */
1, 'Blocking', /* This lock blocks other processes */
2, 'Global', /* This lock is global, so we can't tell */
TO_CHAR (hk.BLOCK)
)
blocking_others
FROM v$lock hk, v$session bs, v$lock wk, v$session ws
WHERE hk.BLOCK = 2
AND hk.lmode != 0
AND hk.lmode != 1
AND wk.request != 0
AND wk.TYPE(+) = hk.TYPE
AND wk.id1(+) = hk.id1
AND wk.id2(+) = hk.id2
AND hk.sid = bs.sid(+)
AND wk.sid = ws.sid(+)
AND (bs.username IS NOT NULL)
AND (bs.username <> 'SYSTEM')
AND (bs.username <> 'SYS')
ORDER BY 1;
同上
select a.sid blocker_sid,a.serial#,a.username as blocker_username,b.type,
decode(b.lmode,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') lock_mode,
b.ctime as time_held,c.sid as waiter_sid,
decode(c.request,0,'None',1,'Null',2,'Row share',3,'Row Exclusive',4,'Share',5,'Share Row Exclusive',6,'Exclusive') request_mode,
c.ctime time_waited
from v$lock b, v$enqueue_lock c, v$session a
where a.sid = b.sid and b.id1= c.id1(+) and b.id2 = c.id2(+) and c.type(+) = 'TX' and b.type = 'TX' and b.block = 1
order by time_held, time_waited;
SELECT 'alter system kill session ''' || c.sid || '' || ',' || c.serial# ||
# ''';' sql_text,
a.object_id,
a.session_id,
b.object_name,
c.*
FROM v$locked_object a, dba_objects b, v$session c
WHERE a.object_id = b.object_id
AND a.SESSION_ID = c.sid(+)
AND schemaname = 'WLGL'
ORDER BY logon_time;注意这里的TEST,Unmi在不同环境下要做变化
sql''使用示例
select 'alter '||a.empno||'' from scott.emp a;
select a.SID,a.TYPE,b.OBJECT_ID,a.BLOCK,a.REQUEST,b.ORACLE_USERNAME,s.SID,s.SERIAL#,b.OBJECT_ID,c.OBJECT_NAME
from v$lock a,v$locked_object b,v$session s,dba_objects c
where a.SID=b.SESSION_ID
and s.sid=b.SESSION_ID
and a.TYPE='TX'
and c.OBJECT_ID=b.OBJECT_ID
普通堵塞
select c.username,a.sid,c.serial#,' is blocking ',d.username,b.sid,d.serial#
from
(select sid,id1,id2 from v$lock where block =1) a,
(select sid,id1,id2 from v$lock where request > 0) b,
(select sid,serial#,username from v$session ) c,
(select sid,serial#,username from v$session ) d
where a.id1=b.id1
and a.id2=b.id2
and a.sid=c.sid
and b.sid=d.sid;
第14章 补丁升级
14.1 升级前评估
14.2 升级过程
14.3 升级后验证检测
附件:参考脚本
jdbc.url=jdbc:mysql://127.0.0.1:3306/oneapm_si?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull