数据库日常维护手册
1.1 数据库的安装
1.1.1 操作系统的准备工作
Oracle 数据库的基本软件安装在oradb1和oradb2上。数据文件,日志文件,控制文件通过手工建库时,指定在共享的阵列上。Oradb1与Oradb2的安装配置方法相同,以Oradb1为例说明。
1. 内核参数的修改
编辑修改/etc/system 文件
setshmsys:shminfo_shmmax= 0x200000000
set shmsys:shminfo_shmmin=1
set shmsys:shminfo_shmmni=100
set shmsys:shminfo_shmseg=10
set semsys:seminfo_semmni=100
set semsys:seminfo_semmsl=600
set semsys:seminfo_semmns=1200
set semsys:seminfo_semopm=100
set semsys:seminfo_semvmx=32767
扩大共享内存和信号量参数。
2. 检查需要的操作系统patch
通过sunsolve.sun.com 上下载特定版本(Solaris 8)的patch集并安装,可以满足Oracle 的安装需要。
3. 操作系统用户/组的添加
l groupadd dba
l groupadd oinstall
l useradd -c "Oracle DBA" -d/home/oracle -g oinstall -G dba
l 修改/etc/passwd文件 ,更改用户登陆shell 或其他信息
oracle:x:102:101::/export/home/oracle:/bin/ksh
4. Oracle用户环境变量的设定
在oracle 用户的初始化环境变量文件中(/export/home/oracle/.profile),增加如下内容。
ORACLE_BASE=/opt/app/oracle
ORACLE_HOME=/opt/app/oracle/product/8.1.7
ORACLE_TERM=vt100
ORACLE_OWNER=oracle
NLS_LANG="SIMPLIFIEDCHINESE_china".ZHS16CGB231280
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
ORACLE_SID=actdb
TMP=/tmp
PATH=$ORACLE_HOME/bin:/usr/ccs/bin:$PATH
LD_LIBRARY_PATH=/opt/oracle/app/oracle/product/8.1.7/lib:/usr/lib
export ORACLE_BASE ORACLE_HOME ORACLE_TERM ORACLE_OWNERNLS_LANG ORA_NLS33 ORACLE_SID TMP PATH LD_LIBRARY_PATH
LANG=zh
export LANG
umask 022
stty erase ^H
EDITOR=vi
export EDITOR
文件主要设定数据库的基本目录,数据库的SID名称和数据库的中文语言环境。增加可执行文件的路径和操作系统的语言环境设置。最后设置vi为常用编辑器。
1.1.2 数据库的安装
1. 用root用户取消显示设置#xhost +
2. 将Oracle安装光盘插入光驱。通过df –k 察看光驱是否已mount上。
3. 以下由Oracle用户执行 $ cd cdrom/cdrom0 ,$./runInstaller。出现 ORACLE Universal Installer的安装窗口,按Next键继续。
4. 在Unix user/group对话框中填入 oracle/dba,点击Next按钮。
5. Destination框输入将要安装oracle的目录($ORACLE_HOME),接着出现弹出窗口要求用root运行orainstRoot.sh (它创建oraInventory的安装目录) 接着选择要安装的产品ORACLE8I 8.1.7 Enterprise Edition。
6. 选择Customer安装方式,将来可以手工建库。
7. 选择安装产品对话框中,建议选择所有产品。
8. 点击确认安装的按钮,安装正式开始。
9. 安装成功100%后又回到开始的选项菜单,建议察看安装日志。
10. 由于使用双机做HA,因此数据库的基本软件需要安装在两台服务器上,而数据库在阵列上创建。数据库基本软件在两台服务器安装完成后。通过dbassist手工建库。指定数据文件,控制文件,日志文件的路径为共享阵列。
11. 建库完成后通过oracle用户执行svrmgrl,启动数据库。 并检查数据库基本信息。
$svrmgrl
SVRMGR>connect internal
SVRMGR>startup
SVRMGR>select * fromv$version;
SVRMGR>select * fromv$database;
执行 $ lsnrctl start 启动监听程序。
1.1.3 数据库patch 安装
1. Patch 下载:Oracle 数据库的patch 从Oracle的metalink网站下载,登录成功后,在patch页面中的Product Family下拉框中选择”Oracle Databse”,Product 下拉框中选择”RDBMS Server”;Release 下拉框中 选择”Oracle 8.1.7.4”;Platform 下拉框中选择”Sun Solaris OS( SPARC) 64-bit”,Language下拉框中选择”American English (US)” ,Limit Search to下拉框中选择”Latest Product Patches or Minipacks”,点击Submit提交。在随后出现的页面中点击Download下载patch。
2. Patch 安装:Patch 下载后首先需要解压缩, 安装与数据库安装方法类似,启动runInstaller安装程序,选择解压缩完成后patch目录下的product文件进行安装。特别注意patch安装时,数据库必须处于正常关闭状态。
3. 安装完成后检查:select * from v$version; 检查各个产品的版本号是否从8.1.7.0升级成为8.1.7.4。
1.2 现场数据库工作方法
1.2.1 现场表空间的规划
ACT01,ACTX01是 enus用户的数据表空间以及索引表空间。
ACT02,ACTX02是 page,race用户的数据表空间以及索引表空间。
ACT03,ACT04,ACTX03,ACTX04是rap 用户的数据表空间以及索引表空间。
1.2.2 现场数据文件的添加
1) 数据库磁盘规划
表空间名称 | 磁盘数据文件规划 |
ACT01 | /disk/data1 |
ACTX01 | /disk/index1 |
ACT02 | /disk/data2 |
ACTX02 | /disk/index2 |
ACT03 | /disk/data3 disk/data4 |
ACTX03 | /disk/index3 disk/index4 |
ACT04 | /disk/data4 |
ACTX04 | /disk/index4 |
2) 添加数据文件
A. 添加规则
现场建议每次出帐前,为表空间使用率接近80%的表空间添加数据文件。原则上现场不要存在超过80%的表空间。
目前建议每次添加的数据文件大小为4096M.
B. 添加前,检查表空间原有数据文件(保证数据文件命名的连续性)
例如:准备为ACTX04添加表空间
select file_name from dba_data_files wheretablespace_name=’ACTX04’
/disk/index4/actx04_01.dbf
/disk/index4/actx04_02.dbf
/disk/index4/actx04_03.dbf
/disk/index4/actx04_04.dbf
C. 添加数据文件
现场添加数据文件,目前原则上大小为4096M.
以为actx04添加表空间为例
alter tablespace actx04 add datafile ‘/disk/index4/actx04_05.dbf’size 4096M;
1.2.3 现场索引的添加
1) 索引添加规则
enus用户索引: ACTX01表空间
rap用户索引: ACTX03,ACTX04表空间
blues用户索引:ACTX02表空间
race用户索引: ACTX02表空间
2) 常规表索引的建立
CREATEINDEX I_ACCOUNT_FEE_PHONE ON
ACCOUNT_T(FEE_PHONE)
TABLESPACE ACTX03 nologging;
3) 分区表索引的建立
u 注意事项:现场针对分区建立的索引必须都是local类型的索引。
u 建立脚本:(针对enus的time_t分区表为例)
CREATE INDEXI_TIME__ACCTIDNEW ON TIME_T(ACCOUNT_ID) LOCAL TABLESPACE ACTX01 nologging;
4) 察看索引对应的表空间
user_indexes;
5) 创建索引的用途以及维护要点
n 考虑用nologging创建索引
可以在create index语句中指定nologging来创建索引并产生最少的重作日志记录.
注意: 因为用nologging 创建索引时不存档,建议现场添加索引在凌晨左右进行,便于创建索引后,数据库尽快完成备份.
用nologging 创建索引有如下好处:
a) 节省了重作日志文件的空间
b) 缩短了创建索引的时间
c) 改善了并行创建大索引时的性能
1.2.4 数据库用户的建立
注:以建立rap用户为例
create user rap identified by rap;
grant resource, connect to rap;
alter user rap default tablespace act03;
alter user rap temporary tablespace temp;
1.2.5 数据库数据的导入方法(探讨,针对测试环境数据的搭建)
1) exp要进行测试的用户数据
2) 删除原先表数据(truncate)
select 'truncate table '||table_name||' ;' from tabs;
形成文件,批truncate表
3) 删除表
select 'drop table '||table_name||' cascadeconstraints ;' from tabs;
形成文件,批删除
4) 导入数据
imp rap/rap parfile=li.txt
li.txt文件的内容
buffer=409600
file=expdat_rap_0630.dmp
IGNORE=y
grants=y
indexes=y
rows=y
commit=y
CONSTRAINTS=y
log=likqrap.log
1.2.6 把数据库设置成为非归档模式的方法(针对traffic上面的数据库)
startup mount;
alter database noarchivelog;
alter database open;
1.2.7 检查表的创建模式
select degree from user_tables;
1.3 数据库优化及主要参数调整
1.3.1 调整原则
Oracle数据库在启动时会读取命名规则为init<sid>.ora的初始化参数文件。这个配置文件中的各个参数设定对整个Oracle数据库性能起决定作用,先简单介绍各个参数的含义,然后给出建议配置。除特殊说明外,介绍参数的更改都需进行数据库的重启操作。根据数据库系统规模,Oracle提供小,中,大(small,medium,large)三个建议建议配置档,配置时做为参考。通过在sqlplus中输入 SQL>show parameterparameter_name显示参数名称和相应的值。
l db_block_size: 实际值:4096。数据块大小,数据存储的最小单位,这个参数在Oracle9i以前各个版本中,数据库创建完成后是不可改变的。可选范围是2K,4K,8K,16k,32k单位是byte。应用系统中,部分数据表字段较多,db_block_size设定偏小造成记录不能在单一数据块中存储,因此访问一条用户记录不能在一次物理I/O操作中完成,需要多次I/O,导致性能下降;另外较多的 varchar2类型字段和数据更新可能造成行链接和行迁移,除设定pctfree较大外,db_block_size也要设定大一些。,创建数据库时指定。
l db_block_buffers: 实际值:1000000。数据高速块的多少,存放从硬盘中读出的数据块。db_block_buffers决定内存中可存放的大小为db_block_size的Oracle数据块的数量。应用程序第一次访问数据时从硬盘中读取,然后数据存储在内存中,直到数据长时间不被访问,同时内存中不能容纳更多数据时,数据被写回硬盘,下次需要访问时,再从硬盘中读取。该参数越大,Oracle在内存中找到所需数据的可能性就越大。相同数据内存读取速度要比硬盘快几十倍,因此响应速度也会大大提高。db_block_size与db_block_buffers乘积确定Oracle数据库所占内存的90%左右。 如果服务器专用运行数据库,建议两个参数的乘积占服务器物理内存的40%,通过对数据缓存的命中率进行监控后,做进一步调整。
l shared_pool_size:实际值:500000000。内存中存放sql语句访问路径,相关访问权限,表结构信息的位置,单位是字节。 建议在内存允许的情况下配置的大一些,但通常不超过500m。通过sql语句监控生产机缓存命中率后进行相应调整。
l sort_area_size :实际值:4000000。可在内存中进行排序的最大字节数。应用程序向数据库发出类似orderby,groupby 或创建索引时,需要进行排序操作。排序在内存中完成的速度同样快于硬盘中速度。sort_area_size越大,排序完成在内存中的可能也越大。通过对动态视图的监控进行进一步的调整。
l log_buffer:实际值:8388608。日志缓存大小,对于数据库的dml/ddl 等语句首先写入log_buffer,然后写入日志文件。建议初始配置为512k,如果日志缓存等待明显,再加大,一般不超过为1M。
l processes:实际值:500。同时访问Oracle数据库的进程数,包括后台进程(dbwr,lgwr,chpt)和Enus,Cnus,Rap 各个模块建立的到数据库的长连接数,设定大一点不会造成负面影响,如果偏小则会造成不能进行数据库连接的错误。
l dml_locks: 实际值:988。它表示任何时间所有用户在所有表中放置锁定的最大数量。缺省值是事务最大数量的四倍。同样可以设定较大一点,不会有负面影响。
l open_cursors: 实际值:2500。用户可以同时打开的游标数。设定大一点不会造成负面影响,如果偏小则会出现不能打开游表的错误。
l db_files: 实际值:200。数据库数据文件的数目。
l rollback_segments:实际值:ACTROLL00~ACTROLL29,共30个回滚段。回滚段的名称,用户自己创建完回滚段后将名称添加在此处。在OLTP环境下,回滚段的数目为最大并发交易数的1/3~1/4。
l db_file_multiblock_read_count:实际值:32。数据库一次从硬盘中读取的数据块的数目。设定DB_FILE_MULTIBLOCK_READ_COUNT可以在进行全表扫描时减少I/O的次数。
l log_checkpoints_to_alert:实际值:true。设置成true的时候,每次检查点的信息写入alert.log文件。
l log_archive_start/ log_archive_dest_1:实际值:true/ disk/archive/arch决定数据库采用归档方式,指定归档日志存放的路径。
l log_archive_max_processes:实际值:1,确定后台归档进程(ArcN)的启动数目。目前100M日志文件在交易高峰期,每8分钟就切换一次。建议将此值扩大。
1.3.2 现场数据库参数设置-配置文件initactdb.ora
db_name ="actdb"
instance_name =actdb
service_names =actdb
control_files =("/disk/data4/system/control01.ctl","/disk/data3/system/control02.ctl", "/disk/data
2/system/control03.ctl")
open_cursors = 2500
max_enabled_roles =20
db_block_buffers =1000000
shared_pool_size =367001600
large_pool_size =12582912
java_pool_size =10485760
db_file_multiblock_read_count= 32
log_checkpoint_interval= 819200
log_checkpoint_timeout= 4800
cpu_count = 8
processes = 500
log_buffer = 1048576
log_archive_start =true
log_archive_dest_1 ="location=/disk/archive/arch"
log_archive_format =arch_%t_%s.arc
log_checkpoints_to_alert= TRUE
rollback_segments =(ACTROLL00 ACTROLL01 ACTROLL02 ACTROLL03 ACTROLL04 ACTROLL05 ACTROLL06ACTROLL07
ACTROLL08 ACTROLL09 ACTROLL10 ACTROLL11ACTROLL12 ACTROLL13 ACTROLL14 ACTROLL15 ACTROLL16 ACTROLL17
ACTROLL18 ACTROLL19 ACTROLL20 ACTROLL21ACTROLL22 ACTROLL23 ACTROLL24 ACTROLL25 ACTROLL26 ACTROLL27
ACTROLL28 ACTROLL29)
background_dump_dest= opt/app/oracle/admin/actdb/bdump
core_dump_dest =/opt/app/oracle/admin/actdb/cdump
user_dump_dest =/opt/app/oracle/admin/actdb/udump
db_block_size = 4096
remote_login_passwordfile= exclusive
os_authent_prefix =""
job_queue_processes= 4
job_queue_interval =60
distributed_transactions= 10
open_links = 4
optimizer_mode =CHOOSE
dml_locks = 988
compatible = "8.1.0"
sort_area_size =4000000
sort_area_retained_size= 4000000
#db_writer_processes= 4
#db_block_lru_latches= 36 #cpu*2*3
1.3.3 数据库用户信息
用户是数据库的使用和访问者。同一用户名(通常也就是schema名称)下的表共同完成相同的功能,如:在我们系统中的Enus用户下的表完成接入功能,Rap用户下的表完成计费,帐务功能。
l 用户名称,临时/默认表空间。用户创建日期。检查是否有用户的默认或临时表空间为system 表空间。
SQL>col username format a12;
SQL>col "Default TBS"format a12
SQL>col "Temporary TBS"format a12
SQL> col "CreateDate"format a12
SQL>select substr(username,1,12) UserName,
substr(DEFAULT_TABLESPACE,1,12)"Default TBS",
substr(TEMPORARY_TABLESPACE,1,12)"Temporary TBS",
to_char(CREATED,’yyyy/mm/dd’) "CreateDate"
from sys.dba_users order by username;
USERNAME Default TBS Temporary TBCreateDate
------------ ------------ --------------------------------
DBSNMP SYSTEM SYSTEM 2002/08/17
ENUS ACT01 TEMP 2002/08/17
OUTLN SYSTEM SYSTEM 2002/07/01
PAGE ACT02 TEMP 2002/07/04
RACE ACT02 SYSTEM 2003/05/06
RAP ACT03 TEMP 2002/08/17
RAP00 RAP00 TEMP 2002/10/22
RAPTEST ACTTEST TEMP 2002/09/10
SPOTLIGHT USERS TEMP 2003/04/24
SSPOT USERS TEMP 2002/07/01
SYS SYSTEM TEMP 2002/07/01
SYSTEM TOOLS TEMP 2002/07/01
TRACESVR SYSTEM SYSTEM 2002/07/01
l 察看数据库用户的权限/角色。创建用户时,会给用户用户一些权限/角色,使用户可以进行相应的操作。
SQL>col grantee format a20;
SQL>select GRANTEE , GRANTED_ROLE , ADMIN_OPTION fromdba_role_privs where grantee in (‘ENUS’,’RAP’,’RACE’);
GRANTEE GRANTED_ROLE ADMIN_
-------------------- -------------------- -----------
ENUS CONNECT NO
ENUS RESOURCE NO
RACE CONNECT NO
RACE RESOURCE NO
RAP CONNECT NO
RAP RESOURCE NO
我们可以看到enus,rap,race三个用户都只有connect,resource权限,同时他们不能把connect,resource权限赋予其他用户。
1.4 数据库的备份/恢复
1.4.1 备份/恢复软件基本介绍
此次河南宽带网计费项目Oracle数据库使用的备份/恢复软件是Veritas公司的Netbackup。Netbackup 建立在Oracle自身提供的备份工具Rman之上。同时有Rman的功能,但又克服Rman 操作复杂的缺点。Netbackup是一个功能强大的企业级数据备份管理软件,它为Windows NT、UNIX和NetWare环境提供了完整的数据保护机制,具有保护从工作组到企业级服务器的所有的数据的能力. NetBackup的数据中心级介质管理使企业具有了包括带库共享在内的管理介质的各方面能力,并且NetBackup的Java界面提供了对所有备份和恢复操作的完整的实时和历史情况分析。该套装软件共由NetBackup Client,NetBackupServer,Catalog DB, MediaManager组成。
1.4.2 软件功能分布介绍
正常情况下,oradb1运行数据库 netbackup client,oradb2运行rap、netbackup server ,同时oradb2通过VCS与oradb1实现数据库的HA。
服务器/ip | 安装软件 | 完成功能 |
Oradb1/ | Netbackup Client | NetBackup Server的一个Client。Client不管理任何磁带库设备。需要=进行备份时,它仅仅提供Oracle需要备份的数据给Server。Server和Client之间的通过TCP/IP的sockets通讯。
|
Oradb2/
| Netbackup Server(Master Server, Media Server) Media Manager Catalog DB | Master Server管理制定全网的备份策略,控制所有的备份作业。 Media Server只连接存储设备,提供数据分流。 Media Manage:针对磁带设备。在备份或归档时调度磁带,并控制上带/卸带动作。 Catalog DB:由Rman控制,记录对数据库进行的备份恢复操作。
|
STK L20 磁带库设备 | STK L20的机械手与主备份服务器(oradb2)直接相连,所有的光纤磁带机直接连接到光线交换机上,所以每台备份服务器都能看到所有的光纤磁带机 |
1.4.3 系统备份策略/实施
备份策略定义一台或几台服务器的备份方法。它包括哪些服务器需要备份、备份哪些目录或文件、在什么时间备份、采用什么方式进行备份等。配置NBU主要指定义备份策略。一个备份策略由四部分组成:
l General Attributes:策略的总体属性,包括策略类型,状态,使用的Storage Unit和Volume Pool。
l Client List :需要备份的服务器,如Oracle Server: Oradb1。
l File List (文件列表):定义需要备份的文件列表。
l Schedules(备份日程表):定义进行各种备份的时间。
Class | 类型 | Schedule | Type | 开始时间 | 要备份的主机 | 保存期限 | 备份文件 |
oraclewholebackup | oracle | Days (除每月21号) | Auto_full | 3:00:00--6:00 | Orabk | 1月 | /opt/openv/netbackup/scripts/hot_database_backup.sh |
oraclearchivebackup | oracle | 每月21号 | Auto_Full | Orabk | 1月 | /opt/openv/netbackup/scripts/hot_archive_backup.sh |
目前对数据库的备份分成两类,一类是数据库的全备份,第二类是对生成的归档日志的备份。备份时netbackup分别调用相应的” /opt/openv/netbackup/scripts/hot_database_backup.sh”和”/opt/openv/netbackup/scripts/hot_archive_backup.sh”两个脚本。目前每天早上3点(除21日)进行全备份到带库,保留一个月。每月的21日进行归档日志的备份。
1.4.4 备份脚本的内容
1.4.4.1全备份脚本
位于: /opt/openv/netbackup/scripts/hot_database_backup.sh
#!/bin/sh
CUSER=`id |cut-d"(" -f2 | cut -d ")" -f1`
RMAN_LOG_FILE=${0}.out
#then
# rm -f "$RMAN_LOG_FILE"
#fi
echo >>$RMAN_LOG_FILE
chmod 666 $RMAN_LOG_FILE
echo Script $0 >>$RMAN_LOG_FILE
echo ==== started on`date` ==== >> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
ORACLE_HOME=/opt/app/oracle/product/8.1.7
export ORACLE_HOME
ORACLE_SID=actdb
export ORACLE_SID
ORACLE_USER=oracle
TARGET_CONNECT_STR=system/hnadm
RMAN=$ORACLE_HOME/bin/rman
echo >>$RMAN_LOG_FILE
echo "RMAN: $RMAN" >>$RMAN_LOG_FILE
echo "ORACLE_SID: $ORACLE_SID" >>$RMAN_LOG_FILE
echo "ORACLE_USER: $ORACLE_USER">> $RMAN_LOG_FILE
echo "ORACLE_HOME: $ORACLE_HOME">> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
echo "NB_ORA_FULL: $NB_ORA_FULL">> $RMAN_LOG_FILE
echo "NB_ORA_INCR: $NB_ORA_INCR">> $RMAN_LOG_FILE
echo "NB_ORA_CINC: $NB_ORA_CINC">> $RMAN_LOG_FILE
echo "NB_ORA_SERV: $NB_ORA_SERV">> $RMAN_LOG_FILE
echo "NB_ORA_POLICY: $NB_ORA_POLICY">> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
if ["$NB_ORA_FULL" = "1" ]
then
echo "Full backup requested">> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=0"
elif ["$NB_ORA_INCR" = "1" ]
then
echo "Differential incrementalbackup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=1"
elif ["$NB_ORA_CINC" = "1" ]
then
echo "Cumulative incrementalbackup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1CUMULATIVE"
elif ["$BACKUP_TYPE" = "" ]
then
echo "Default - Full backuprequested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=0"
fi
CMD_STR="
ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
$RMAN target$TARGET_CONNECT_STR catalog rman/rman@catadb msglog $RMAN_LOG_FILE append<< EOF
RUN {
ALLOCATE CHANNEL ch00TYPE 'SBT_TAPE';
ALLOCATE CHANNEL ch01TYPE 'SBT_TAPE';
BACKUP
$BACKUP_TYPE
SKIP INACCESSIBLE
TAG hot_db_bk_level0
FILESPERSET 5
# recommended format
FORMAT 'bk_%s_%p_%t'
DATABASE;
sql 'alter system archive log current';
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
# backup all archive logs
ALLOCATE CHANNEL ch00TYPE 'SBT_TAPE';
ALLOCATE CHANNEL ch01TYPE 'SBT_TAPE';
BACKUP
filesperset 20
FORMAT 'al_%s_%p_%t'
ARCHIVELOG ALL DELETE INPUT;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
ALLOCATE CHANNEL ch00TYPE 'SBT_TAPE';
BACKUP
# recommended format
FORMAT 'cntrl_%s_%p_%t'
CURRENT CONTROLFILE;
RELEASE CHANNEL ch00;
}
EOF
"
# Initiate the commandstring
if [ "$CUSER" ="root" ]
then
su - $ORACLE_USER -c "$CMD_STR">> $RMAN_LOG_FILE
RSTAT=$?
else
/usr/bin/sh -c "$CMD_STR">> $RMAN_LOG_FILE
RSTAT=$?
fi
# ---------------------------------------------------------------------------
# Log the completion ofthis script.
#---------------------------------------------------------------------------
if [ "$RSTAT" ="0" ]
then
LOGMSG="ended successfully"
else
LOGMSG="ended in error"
fi
echo >>$RMAN_LOG_FILE
echo Script $0 >>$RMAN_LOG_FILE
echo ==== $LOGMSG on`date` ==== >> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
exit$RSTAT
1.4.4.2增量备份脚本
位于: /opt/openv/netbackup/scripts/hot_archive_backup.sh
内容:
#!/bin/sh
CUSER=`id |cut-d"(" -f2 | cut -d ")" -f1`
RMAN_LOG_FILE=${0}.out
#then
# rm -f "$RMAN_LOG_FILE"
#fi
echo >>$RMAN_LOG_FILE
chmod 666 $RMAN_LOG_FILE
echo Script $0 >>$RMAN_LOG_FILE
echo ==== started on`date` ==== >> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
ORACLE_HOME=/opt/app/oracle/product/8.1.7
export ORACLE_HOME
ORACLE_SID=actdb
export ORACLE_SID
ORACLE_USER=oracle
TARGET_CONNECT_STR=system/hnadm
RMAN=$ORACLE_HOME/bin/rman
echo >>$RMAN_LOG_FILE
echo "RMAN: $RMAN" >>$RMAN_LOG_FILE
echo "ORACLE_SID: $ORACLE_SID" >>$RMAN_LOG_FILE
echo "ORACLE_USER: $ORACLE_USER">> $RMAN_LOG_FILE
echo "ORACLE_HOME: $ORACLE_HOME">> $RMAN_LOG_FILE
echo >> $RMAN_LOG_FILE
echo "NB_ORA_FULL: $NB_ORA_FULL">> $RMAN_LOG_FILE
echo "NB_ORA_INCR: $NB_ORA_INCR">> $RMAN_LOG_FILE
echo "NB_ORA_CINC: $NB_ORA_CINC">> $RMAN_LOG_FILE
echo "NB_ORA_SERV: $NB_ORA_SERV">> $RMAN_LOG_FILE
echo "NB_ORA_POLICY: $NB_ORA_POLICY">> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
if ["$NB_ORA_FULL" = "1" ]
then
echo "Full backup requested">> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=0"
elif ["$NB_ORA_INCR" = "1" ]
then
echo "Differential incrementalbackup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=1"
elif ["$NB_ORA_CINC" = "1" ]
then
echo "Cumulative incrementalbackup requested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTAL LEVEL=1CUMULATIVE"
elif ["$BACKUP_TYPE" = "" ]
then
echo "Default - Full backuprequested" >> $RMAN_LOG_FILE
BACKUP_TYPE="INCREMENTALLEVEL=0"
fi
CMD_STR="
ORACLE_HOME=$ORACLE_HOME
export ORACLE_HOME
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
$RMAN target$TARGET_CONNECT_STR catalog rman/rman@catadb msglog $RMAN_LOG_FILE append<< EOF
RUN {
# backup all archive logs
ALLOCATE CHANNEL ch00TYPE 'SBT_TAPE';
ALLOCATE CHANNEL ch01TYPE 'SBT_TAPE';
sql 'alter system archivelog current';
BACKUP
filesperset 20
FORMAT 'al_%s_%p_%t'
ARCHIVELOG ALL DELETE INPUT;
RELEASE CHANNEL ch00;
RELEASE CHANNEL ch01;
ALLOCATE CHANNEL ch00TYPE 'SBT_TAPE';
BACKUP
# recommended format
FORMAT 'cntrl_%s_%p_%t'
CURRENT CONTROLFILE;
RELEASE CHANNEL ch00;
}
EOF
"
# Initiate the commandstring
if [ "$CUSER" ="root" ]
then
su - $ORACLE_USER -c "$CMD_STR">> $RMAN_LOG_FILE
RSTAT=$?
else
/usr/bin/sh -c "$CMD_STR">> $RMAN_LOG_FILE
RSTAT=$?
fi
#---------------------------------------------------------------------------
# Log the completion ofthis script.
#---------------------------------------------------------------------------
if [ "$RSTAT" ="0" ]
then
LOGMSG="ended successfully"
else
LOGMSG="ended in error"
fi
echo >>$RMAN_LOG_FILE
echo Script $0 >>$RMAN_LOG_FILE
echo ==== $LOGMSG on`date` ==== >> $RMAN_LOG_FILE
echo >>$RMAN_LOG_FILE
exit $RSTAT
1.4.5 数据库备份完成情况检查
1) 检查备份输出文件
脚本位置:orabd1: /opt/openv/netbackup/scripts/hot_database_backup.sh.out
检查:tail –f /opt/openv/netbackup/scripts/hot_database_backup.sh.out
正确结果:Script /opt/openv/netbackup/scripts/hot_database_backup.sh
==== endedsuccessfully on Thu Jul 3 07:30:27 CST 2003 ====
2) 通过netbackup命令行方式检查
oradb2:bpadm
status=0表示备份完成正常。
1.4.6 数据库的恢复
下面只考虑数据库所有数据文件(包括控制文件)均损坏这一最复杂的情况下的恢复。
1) 备份现有的数据库数据文件(如果还有的话)
2) 恢复控制文件
将数据库置于nomount状态
在svrmgrl下,执行:
startup nomount
在数据库所在的服务器上以oracle身份执行
rman target /catalog rman/rman@catadb cmdfilerestorecontrol
其中restorecontrol的内容如下:
run {
# exec:rman target / catalog rman/rman@catadbcmdfile restorecontrol
#set until time ='';
allocate channel ch1type 'sbt_tape';
restore controlfile;
alter databasemount;
}
3) 执行数据库的全恢复:
$RMAN target /catalog rman/rman@catadb cmdfile restorewho
其中restorewho为下:
RUN {
ALLOCATE CHANNELch00 TYPE 'SBT_TAPE';
ALLOCATE CHANNELch01 TYPE 'SBT_TAPE';
RESTORE
DATABASE;
#RECOVER DATABASE;
RELEASE CHANNELch00;
RELEASE CHANNELch01;
}
4) 恢复archive log
然后根据控制文件的信息:
select * from v$log(v$logfile)
来确定archive log的sequence,恢复archive log:
%rman target /rcvcat rman/rman@catadb cmdfile recarchive
# cmd line:rmantarget / rcvcat rman/rman@catadb cmdfile recarchive
run {
allocate channel d1 TYPE 'SBT_TAPE';
set archivelog destination to'/disk/archive/arch';
restore archivelog from logseq 6 untillogseq 10;
release channel d1;
}
5) 最后执行oracle的recover,在svrmgrl下:
recover databaseusing backup controlfile until cancel
当执行到合适的archivelog时,键入cancel
alter database openresetlogs
注:如果盘阵上的控制文件、redolog均未丢失,也可是使用当前的控制文件将数据库恢复当当前,这时候recover的时候只要
recover database就可以了,不要使用recover database using backupcontrolfile until console.
6) 打开数据库后,reset database
rman target / catalog rman/rman@catadb
rman>reset database
然后对数据库进行全备份。
1.4.7 针对catalog数据的备份
实现方法:每天上午7:50把catalog数据库rman用户exp出来.
脚本部署:oradb2服务器
50 7 * * * /export/home/oracle/catalog/expuser.sh>/export/home/oracle/catalog/logfile/log.log2>&1
脚本expuser.sh的内容:
#!/bin/ksh
ORACLE_BASE=/opt/app/oracle
ORACLE_HOME=/opt/app/oracle/product/8.1.7
ORACLE_TERM=vt100
ORACLE_OWNER=oracle
NLS_LANG="american_america.utf8"
ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
ORACLE_SID=catadb
TMP=/tmp
PATH=$ORACLE_HOME/bin:/usr/ccs/bin:$PATH
LD_LIBRARY_PATH=/opt/oracle/app/oracle/product/8.1.7/lib:/usr/lib
export ORACLE_BASE ORACLE_HOME ORACLE_TERMORACLE_OWNER NLS_LANG ORA_NLS33 ORACLE_SID TMP PATH LD_LI
BRAR
Y_PATH
FILEDIR=/export/home/oracle/catalog
logfile=$FILEDIR/logfile/`date'+%y%m%d%H%M%S'`.log
dumpfile=$FILEDIR/dumpfile/`date'+%y%m%d%H%M%S'`.dmp
exp rman/rman@catadb buffer=4096000OWNER=rman GRANTS=y ROWS=y COMPRESS=y file=$dumpfile log=$logfile
1.4.8 使用Rman备份数据库的另外一种方法(using controlfile)
1.4.8.1全备份脚本
1) 脚本:wholeback.sh
#!/bin/sh
OUTF=${0}.out
#---------------------------------------------------------------------------
# You may want to delete the output file sothat backup information does
# not accumulate. If not, delete the following lines.
#---------------------------------------------------------------------------
{ # output block
echo "`date` ----------------Beginningof Script------------\n"
echo "Script name: $0"
ORACLE_HOME=/opt/app/oracle/product/8.1.7
export ORACLE_HOME
ORACLE_SID=actdb
export ORACLE_SID
ORACLE_USER=oracle
RMAN=rman
CMDFILE=/opt/app/oracle/rman/wholeback.rcv
#---------------------------------------------------------------------------
# Print out the value of the variables setby this script.
#---------------------------------------------------------------------------
# must be set and exported within the switch user (su) command.
#---------------------------------------------------------------------------
echo
echo "% ${ORACLE_HOME}/bin/$RMANnocatalog cmdfile '$CMDFILE'\n"
echo
#touch /disk/data2/backup/test.file
#su - $ORACLE_USER -c "
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
${ORACLE_HOME}/bin/$RMAN nocatalog cmdfile"$CMDFILE"
#"
RETURN_STATUS=$?
echo
echo "`date` ----------------End ofScript------------------\n"
echo
echo "exit $RETURN_STATUS"
#exit $RETURN_STATUS
echo "Backup control file:alterdatabase backup controlfile to ......\n"
tm=`date '+%y%m%d%H%M%S'`
filename=control.$tm
svrmgrl <<EOF
connect internal
alter database backup controlfile to'/disk/data2/backup/$filename';
exit
EOF
echo "\nBackup controlfilesuccess!\n"
exit $RETURN_STATUS
} >> $OUTF
2) 脚本wholeback.rcv
connect target 'system/hnadm'
run{
allocate channel d1 type disk;
backup
filesperset 5
database include current controlfile
format '/disk/data2/backup/%d_%s_%p';
backup current controlfile tag = 'database backup';
sql'ALTER SYSTEM ARCHIVE LOG CURRENT';
backup
format '/disk/data2/backup/arch/arch_%s_%p_%t'
archivelog all delete input; #
release channel d1;
}
1.4.8.2增量备份脚本
1) arcbak.sh脚本
#!/bin/sh
OUTF=${0}.out
#---------------------------------------------------------------------------
# You may want to delete the output file sothat backup information does
# not accumulate. If not, delete the following lines.
#---------------------------------------------------------------------------
{ # output block
echo "`date` ----------------Beginningof Script------------\n"
echo "Script name: $0"
ORACLE_HOME=/opt/app/oracle/product/8.1.7
export ORACLE_HOME
ORACLE_SID=actdb
export ORACLE_SID
#touch /disk/data2/backup/newfile
ORACLE_USER=oracle
RMAN=rman
CMDFILE=/opt/app/oracle/rman/arcbak.rcv
#---------------------------------------------------------------------------
# Print out the value of the variables setby this script.
#---------------------------------------------------------------------------
# must be set and exported within the switch user (su) command.
#---------------------------------------------------------------------------
echo
echo "% ${ORACLE_HOME}/bin/$RMANnocatalog cmdfile '$CMDFILE'\n"
echo
#su - $ORACLE_USER -c "
ORACLE_SID=$ORACLE_SID
export ORACLE_SID
#svrmgrl <<EOF
#connect internal
#alter system switch logfile;
#exit
#EOF
${ORACLE_HOME}/bin/$RMAN nocatalog cmdfile"$CMDFILE"
#"
RETURN_STATUS=$?
echo
echo "`date` ----------------End ofScript------------------\n"
echo
echo "exit $RETURN_STATUS"
#exit $RETURN_STATUS
echo "Backup control file:alterdatabase backup controlfile to ......\n"
tm=`date '+%y%m%d%H%M%S'`
filename=control.$tm
svrmgrl <<EOF
connect internal
alter database backup controlfile to'/disk/data2/backup/$filename';
exit
EOF
echo "Backup controlfilesuccess!\n"
exit $RETURN_STATUS
} >> $OUTF
2) arcbak.rcv脚本内容
connect target 'system/hnadm'
run {
allocate channel d1 type disk;
sql'alter system archive log current';
backup
format '/disk/data2/backup/arch/arch_%s_%p_%t'
(archivelog all delete input);
release channel d1;
}
1.5 数据库的监控/维护
1.5.1 推荐使用的监控方法
Statspack 的介绍:Statspack 是Oracle公司针对Oracle Enterprise Edition 8.1.6及以上版本推出的性能监控工具包。用于替代原有的UTLBSTAT/UTLESTAT。比UTLBSTAT/UTLESTAT能够收集更多的数据,包括耗资源多的SQL。同时预先计算了许多对性能调优很有用的比值(ratios)。可以更加全面的监控数据的整体运行情况。同时可将生成的report文件发送给Oracle公司进行协助分析。
监控的范围主要是:
l 主要内存参数的大小(db_block_buffers, db_block_size, log_buffer, shared_pool_size)。
l 系统负载情况:每秒钟的生成的日志量,数据库的逻辑读,物理读,交易数量等。
l 各类缓存命中率。如库缓存命中率,字典缓存命中率,db block buffer命中率,排序在内存中进行的比率等。
l 造成系统响应时间慢的几类事件,通过优化这几类事件提高系统响应速度。
l 按照各类消耗资源排序的SQL语句。通常系统响应速度慢除与参数设置有关外,还与书写不规范的SQL语句有关。通过优化捕捉到的SQL语句,提高响应速度。
l 各个表空间及组成表空间各个文件的I/O负载情况。通过这部分内容判断各个文件I/O是否均衡。
l 回滚段信息:反映是否有回滚段的竞争,是否有回滚段的过分扩展。
l 所有没有按缺省设置的参数。
Statspack软件包的创建:
l 安装文件:Unix 操作系统下,安装文件存放在$ORACLE_HOME/rdbms/admin 目录下。
l 创建时的执行的用户和执行的文件
SQL>connect internal ;
SQL>@?/rdbms/admin/spcreate.sql;
l 安装过程中的主要动作:
1安装生成一个用户perfstat/perfstat =>spcusr.sql,
安装时输入:DEFAULT TABLESPACE/ TEMPORARYTABLESPACE
2建立需要的Table =>spctab.sql
3生成dbms_shared_pool和dbms_job PL/SQL 程序包=>spcpkg.sql
Statspack软件包的执行/数据采集
当系统响应速度出现明显下降的时候,可通过statspack进行系统运行数据采集,并生成报告文件,进行分析。
l 初始准备:在init<sid>.ora中设置timed_statistics=true,并让其生效。或使用alter systemset timed_statistics=true;
l 使用创建的perfstat用户连接
SQL>CONNECT PERFSTAT/PERFSTAT;
l 执行第一次采集程序:
SQL>EXECUTE STATSPACK.SNAP;
l 系统运行一段时间后进行第二次采集。
SQL>EXECUTE STATSPACK.SNAP;
生成报告:当执行了二次以上数据采集后,就可以生成系统运行报告,执行系统运行报告时,需要提供起始数据采集点的起始点和结束点,可生成任意两点间的性能报告。数据采集点之间数据库关闭过生成的报告无效。
Enter beginning Snap Id: 1
Enter ending Snap Id: 2
Enter name of output file [st_1_2] :<press return or enter a new name>
输入起始和结束的快照ID,并定义输出文件名。生成的文件存放在Oracle用户的home目录下。
1.5.2 监控/维护脚本
运行系统的大多数信息可通过statspack反映,下面提供的脚本主要做为statspack的补充信息。
1.5.2.1系统日志监控
系统在运行过程中,smon后台进程会将出现的各类错误信息写入alert<sid>.log文件中。通过morealert<sid>.log |grep -i ora- 来检查出现的各类”ora-“错误。同时alert<sid>.log 文件还记录了数据库的开启和关闭的时间。从数据库的background_dump_dest 参数中找出alert_actdb.log的实际路径。
SQL>set linesize200
SQL> showparameter background_dump_dest
NAME TYPE VALUE
--------------------------------------------------------------
background_dump_deststring /opt/app/oracle/admin/actdb/bdump
$ cd /opt/app/oracle/admin/actdb/bdump
$ morealert_acdb.log |grep –i ora-

学到了吗?有收获吗?
欢迎大家留言噢~
记得置顶公众号或设为星标
第一时间浏览精彩内容噢~





