2.RDBMS管理维护
(1).spfile以及相关参数说明
最普遍情况,节点共用同一个spfile文件,放置在共享存储上,而每个节点上,相应目录下有一个pfile文件,而这个pfile文件指向共享存储上的spfile。
当我们需要修改某一节点上的paremeter的时候,需要显示的指定sid,比如:
SQL>alter system set sga_target=1024M scope=spfile sid=’rac1’;
System Altered.
这样,节点rac1上的sga_target参数被修改,不会影响其余节点上的参数设置。假设不加sid,默认为sid=’*’,也就是对所有节点生效。
RAC下,有一些不同与单实例的参数,列举如下:
① cluster_database
一般情况下,该参数在rac各实例下应该设置为true。在一些特别情况下,例如upgrade等,需要将该参数设置成false。
② db_name/db_unique_name/instance_name
各节点db_name需要一致,db_unique_name也需要一致(这与standby是不同的)。而instance_name配置成各个节点的实例名称。
③ instance_number
该参数表示节点上实例的实例号。
④ thread
该参数用来标示实例使用的redo线程。线程号与节点号/实例号没有直接关联。
⑤ local_listener
该参数用来手工注册监听。为解决ORA-12514错误,可以设置该参数。
⑥ remote_listener
该参数用来进行服务器端负载均衡配置。
⑦ cluster_interconnects
该参数用来指定集群中IPC通信的网络。假设集群中有多种网络用于高速互联,需要配置该参数。对于多个IP地址,用冒号将其隔开。对于集群中当前使用的互联地址,可以查询视图gv$cluster_interconnects或着oradebug ipc来查看。
⑧ max_commit_propagation_delay
该参数用于配置SCN的产生机制。在rac下,SCN的同步有2种模式:(1) LamportScheme.该模式下,由GES管理SCN的传播同步,max_commit_propagation_delay表示SCN同步所允许的最大时间。在该模式下,全局SCN并非完全同步,这在高并发的OLTP系统中,可能会对应用造成一定的影响。(2) Broadcast on Commitscheme. 该模式下,一旦任何一个实例上事务发布commit,都立即同步SCN到全局。
在10g R1下,该参数默认数值为700,即采用Lamport Scheme模式。而在10gR2下,该参数默认数值为0,采用Broadcast on Commit scheme模式 (设置小于700的某一值,都将采用该模式)。采用何种方式,可以从alert.log中获知。该参数值需要每个节点保持一致。
(2). Redo/Undo管理
?RAC下的Redo管理
同单实例的系统一样,每个节点实例都需要至少2组logfile。各节点实例有自己独立的重做日志线程(由初始化参数thread定义),比如:
SQL> selectb.THREAD#,a.GROUP#,a.STATUS,a.MEMBER,b.BYTES,b.ARCHIVED,b.STATUS fromv$logfile a,v$log b where a.GROUP#=b.GROUP#;
THREAD# GROUP# STATUS MEMBER BYTES ARCHIVED STATUS
------------------- ------- --------------------------------------------------
1 1 STALE +DATA/demo/onlinelog/group_1.257.660614753 52428800 YES INACTIVE
1 2 +DATA/demo/onlinelog/group_2.258.660614755 52428800 NO CURRENT
2 3 +DATA/demo/onlinelog/group_3.265.660615545 52428800 NO CURRENT
2 4 STALE +DATA/demo/onlinelog/group_4.266.660615543 52428800 YES INACTIVE
重做日志需要部署到共享存储中,必须保证可被所有的集群内的节点实例访问。当某个节点实例进行实例/介质恢复的时候,该节点上的实例将可以应用集群下所有节点实例上的重做日志文件(假设需要),从而保证恢复可以在任意可用节点进行。
?RAC下alter system switch logfile 与alter system archive log current 区别
alter system switch logfile仅对当前发布节点上的对应redo thread进行日志切换并归档。
alter system archive log current对集群内所有节点实例上的redo thread进行切换并归档(在节点实例可用情况下,分别归档到各节点主机的归档目的地,当节点不可用时候,该线程日志归档到命令发布节点的归档目的地)
?RAC下的Undo管理
RAC下的每个节点实例,也需要有自己单独的撤销表空间。由初始化参数*.Undo_tablespace指定。同REDO一样,UNDO表空间也需要部署到共享存储,虽然每个节点上UNDO的使用是独立的,但需要保证集群内其他节点实例对其访问,以完成构造读一致性等要求。
SQL>alter system set undo_tablespace=undo1 sid=’demo1’;
SQL>alter system set undo_tablespace=undo2 sid=’demo2’;
(3).Archivelog/flashback配置管理
在RAC下,Archivelog可以放置到本地磁盘,也可以放置到共享存储。需要对Archivelog的放置有合理的部署,假设放置到本地磁盘,会增加备份恢复的复杂程度。
闪回区必须部署到共享存储上,开启前,需要配置db_recovery_file_dest、db_recovery_file_dest_size、db_flashback_retention_target等参数。
下面在一个非归档非闪回的database上,开始归档与闪回。
?更改相关参数
SQL>alter system set log_archive_dest_1='location=/archive/demo1' sid='demo1';
System altered
SQL> alter system set log_archive_dest_1='location=/archive/demo2' sid='demo2';
System altered
SQL> alter system set db_recovery_file_dest_size=512M;
System altered
SQL> alter system set db_recovery_file_dest='+DG1';
System altered
?停掉所有节点实例.开启过程在一个实例上完成。
rac1-> srvctl stop instance -d demo -i demo1
rac1-> srvctl stop instance -d demo -i demo2
rac1-> sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Sun Aug 3 22:06:50 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup mount;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 100665588 bytes
Database Buffers 62914560 bytes
Redo Buffers 2973696 bytes
Database mounted.
SQL> alter database archivelog;
Database altered.
SQL> alter database flashback on;
Database altered.
SQL> alter database open;
Database altered.
SQL> select NAME,LOG_MODE,FLASHBACK_ON from v$database;
NAME LOG_MODE FLASHBACK_ON
--------- ------------ ------------------
DEMO ARCHIVELOG YES
10G下,开启归档和闪回并不需要像9i那样,设置初始化参数cluster_database=false.这无疑简化了操作。
(4).ASM下的RAC管理
?ASM下的参数文件
RAC下,每个节点上有运行有一个ASM实例,而rdbms instance就运行在这个asm实例上。Asm实例是本地的。同rdbms实例一样,他需要有参数文件,参数文件在每个节点的相应目录下。
下面是我的ASM实例下的pfile文件:
cluster_database=true
background_dump_dest=/opt/oracle/admin/+ASM/bdump
core_dump_dest=/opt/oracle/admin/+ASM/cdump
user_dump_dest=/opt/oracle/admin/+ASM/udump
instance_type=asm
large_pool_size=12M
remote_login_passwordfile=exclusive
asm_diskgroups='DG1'
+ASM2.instance_number=2
+ASM1.instance_number=1
简单介绍几个asm实例中比较重要的参数:
instance_type:用来说明实例是ASM 还是RDBMS 类型
asm_diskgroups:ASM磁盘组,asm实例启动的时候会自动mount
asm_diskstring:该参数用来说明能够创建diskgroup的磁盘设备,默认值是NULL
asm_power_limit:该参数用来设置进程 ARBx 的数量,负责控制负载平衡操作的速度。取值 从 0 到 11。默认值为1。
?用于记录ASM实例信息的数据字典。
V$ASM_DISK/ V$ASM_DISK_STAT:记录可以被ASM实例识别的磁盘信息,但这些磁盘并不一定是正在被实例使用的。
V$ASM_DISKGROUP/ V$ASM_DISKGROUP_STAT:记录asm下的diskgroup信息。
V$ASM_ALIAS:记录diskgroup文件的别名信息。
V$ASM_FILE:记录diskgroup中的文件信息。
V$ASM_OPERATION:记录ASM实例中当前运行的一个长时间操作信息。
V$ASM_TEMPLATE:记录diskgroup模板。
V$ASM_CLIENT:记录使用该asm实例下的diskgroup的rdbms实例信息。
?RAC下ASM磁盘组/文件管理操作
<1>.RAC下在线添加、删除磁盘组
在一个节点上添加diskgroup,集群上另外的节点并不会自动mount新添加的diskgroup,需要手动执行。
节点1:
SQL> show parameter asm_diskgroups
NAME TYPE VALUE
------------------------------------ -----------
asm_diskgroups string DATA, DG1
SQL>CREATE DISKGROUP DATA2 NORMAL REDUNDANCY
FAILGROUP DATA2_gp1 DISK '/dev/raw/raw6'
FAILGROUP DATA2_gp2 DISK '/dev/raw/raw7';
Diskgroup created.
SQL> show parameter asm_diskgroups
NAME TYPE VALUE
------------------------------------ -----------
asm_diskgroups string DATA, DG1, DATA2
此时观察节点2,新加的磁盘组没有被mount。
SQL> show parameter asm_diskgroups
NAME TYPE VALUE
-----------------------------------------------
asm_diskgroups string DATA, DG1
SQL>select group_number,type,state,type,total_mb,free_mb from v$asm_diskgroup_stat;
GROUP_NUMBER STATE TYPE TOTAL_MB FREE_MB
--------------- --------------- ------------------------
1 CONNECTED EXTERN 5726 4217
2 CONNECTED EXTERN 415 297
0 DISMOUNTED 0 0
SQL>alter diskgroup DATA2 mount;
删除diskgroup时,保留一个节点diskgroup为mount状态,将其余节点上的diskgroup dismount,然后执行删除命令。
<2>.在线添加、删除磁盘
RAC下在线添加磁盘与删除磁盘与单实例并不差别。需要注意该操作会引起磁盘组的重新平衡,并确保删除磁盘的时候该磁盘组有足够的剩余空间。
节点1:
SQL> alter diskgroup dg6 add disk '/dev/raw/raw7' name dg6_disk7;
Diskgroup altered.
节点2上查询:
SQL>select GROUP_NUMBER,path,NAME,MOUNT_STATUS,HEADER_STATUS,MODE_STATUS,
STATE from v$asm_disk_stat where NAME is not null;
GROUP_NUMBER PATH NAME MOUNT_S HEADER_STATU MODE_ST STATE
------------ ---------------- ---------- ------- ------------ -------
1 /dev/raw/raw3 DATA_0000 CACHED MEMBER ONLINE NORMAL
2 /dev/raw/raw4 DG1_0000 CACHED MEMBER ONLINE NORMAL
3 /dev/raw/raw6 DG6_0001 CACHED MEMBER ONLINE NORMAL
3 /dev/raw/raw7 DG6_DISK7 CACHED MEMBER ONLINE NORMAL
删除磁盘在某一节点操作即可,不做举例验证。
关于ASM的更多管理命令,就不多列举了。
3.Database备份/恢复
RAC下的备份恢复跟单实例的备份恢复实质上没有太大的差别,需要注意的是备份/恢复的时候当前节点对所有数据文件/归档日志的可见。在一个数据文件和归档日志全部放在共享存储上的RAC系统,备份与恢复过程与单实例下的几乎一样。而归档日志假设采用的是本地磁盘,就需要另加注意。下面分别来模拟这个备份恢复过程。
(1).Archivelog对各节点可见的备份/恢复
在这种模式下,备份恢复可以在任意一个可用节点执行即可,跟单实例并不太大区别。
?对database进行备份
RMAN>run
{allocate channel orademo type disk;
backup database format '/backup/database/db_%s_%p_%t' plus archivelog format '/backup/database/arch_%s_%p_%t' delete input;
backup current controlfile format '/backup/database/contr_%s_%p_%t';}
allocated channel: orademo
channel orademo: sid=130 instance=demo2 devtype=DISK
Starting backup at 03-MAY-08
current log archived
channel orademo: starting archive log backupset
channel orademo: specifying archive log(s) in backup set
input archive log thread=1 sequence=5 recid=70 stamp=661823848
input archive log thread=1 sequence=6 recid=72 stamp=661823865
……………………………………..
Finished backup at 03-MAY-08
released channel: orademo
?添加数据,用于测试恢复效果
SQL> create table kevinyuan.test_b as select * from dba_data_files;
Table created
SQL> alter system switch logfile;
System altered
SQL> insert into kevinyuan.test_b select * from dba_data_files;
6 rows inserted
SQL> commit;
Commit complete
SQL> select count(*) from kevinyuan.test_b;
COUNT(*)
----------
12
?模拟故障/恢复
RMAN> run
{restore controlfile from '/backup/database/contr_16_1_661823935';
sql 'alter database mount';
restore database;
recover database;
sql 'alter database open resetlogs'; }
Starting restore at 04-MAY-08
allocated channel: ORA_DISK_1
…………………………………………………………………………..
archive log filename=+DATA/demo/onlinelog/group_4.266.660615543 thread=2 sequence=11
archive log filename=+DATA/demo/onlinelog/group_3.265.660615545 thread=2 sequence=12
media recovery complete, elapsed time: 00:00:00
Finished recover at 04-MAY-08
sql statement: alter database open resetlogs
?恢复完毕,来看一下验证数据:
SQL> select count(*) from kevinyuan.test_b;
COUNT(*)
----------
12
(2). Archivelog对各节点不可见的备份/恢复
假设arhivelog采用本地磁盘,归档日志并不是对任意节点可见。备份archivelog的时候,假设采用和上述类似的备份方案,必然会导致一些归档日志因为无法access而抛出异常。可以采取如下的备份方式,目的就是使得备份通道能够access所有的数据字典中记录的归档日志信息。
恢复的时候,copy所有节点产生的相关备份片/集和归档日志文件到待恢复节点,在一个节点上执行restore/recover操作即可。
模拟一下这个操作。
SQL> alter system set log_archive_dest_1='location=/archive/demo1/' sid='demo1';
System
altered
SQL> alter system set log_archive_dest_1='location=/archive/demo2/' sid='demo2';
System altered
(1)备份数据库
RMAN>run
{allocate channel orademo1 type disk connect
sys/kevinyuan@demo1;
allocate channel orademo2 type disk connect
sys/kevinyuan@demo2;
backup database format '/backup/database/db_%s_%p_%t'
plus archivelog format '/backup/database/arch_%s_%p_%t' delete
input;
backup current controlfile format
'/backup/database/contr_%s_%p_%t;}
allocated channel:
orademo1
channel orademo1: sid=133 instance=demo1 devtype=DISK
allocated
channel: orademo2
channel orademo2: sid=151 instance=demo2
devtype=DISK
Starting backup at 04-MAY-08
current log archived
channel
orademo2: starting archive log backupset
channel orademo2: specifying archive
log(s) in backup set
input archive log thread=2 sequence=4 recid=89
stamp=661826286
………………………………………………………………….
channel orademo1: finished
piece 1 at 04-MAY-08
piece handle=/backup/database/contr_28_1_661826504
tag=TAG20080504T004130 comment=NONE
channel orademo1: backup set complete,
elapsed time: 00:00:09
Finished backup at 04-MAY-08
released channel:
orademo1
released channel:
orademo2
(2)COPY节点2上的备份文件/归档日志文件到节点1相应目录下。
rac2-> scp /backup/database/* rac1:/backup/database/
rac2-> scp /archive/demo2/* rac1:/archive/demo1
(3)恢复database
RMAN>run
{restore controlfile from '/backup/database/contr_28_1_661826504';
sql 'alter database mount';
restore database;
recover database;
sql 'alter database open resetlogs';}
starting restore at 04-MAY-08
using target database
control file instead of recovery catalog
allocated channel:
ORA_DISK_1
channel ORA_DISK_1: sid=147 instance=demo1 devtype=DISK
channel
ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete,
elapsed time: 00:00:20
…………………………………………………………………………………
archive log
filename=+DATA/demo/onlinelog/group_3.265.660615545 thread=2
sequence=7
archive log filename=+DATA/demo/onlinelog/group_4.266.660615543
thread=2 sequence=8
media recovery complete, elapsed time:
00:00:06
Finished recover at 04-MAY-08
sql statement: alter database open
resetlogs
至此,恢复完成。
生产库的备份需要缜密部署与模拟测试,不同的数据库类型也需要制定不同的方案实现。对DATABASE来说,备份重于泰山,不能抱有任何侥幸心理。 |