data guard

常用命令:

1.查看主库/备库 归档日志的同步。

select name,dest_id,sequence#,archived,applied from v$archived_log;

2.改变dataguard的保护模式

SQL> alter database set standby database to maximize availability|performance|protection;

 SQL>select name,resetlogs_time,log_mode,open_mode,protection_mode,remote_archive,database_role,switchover_status ,force_logging from v$database;

3.

Date Guard

alter database flashback on ; 要不然dataguard 在failover以后,主库只能重新创建了。

select name,dest_id,sequence#,archived,applied from v$archived_log

Describe your new note here.

三种保护模式:

1.最大可用性保护模式:

要求提交之前redo至少写到一个standby的database,

否则:把最大可用性切换到最大性能,等可以把redo写到sandby的时候再切换回来

2.最大性能模式:

1.提交的redo,可以异步的写到standby。

3.最大保护

1.提交之前一定要把redo写到standby database,

否则数据库shutdown。不提供服务。

orapwd file='/u01/app/oracle/product/11.2.0/dbhome_1/dbs/orapwsales' password=julia033 entries=5 把主库的copy到备库,或者创建一模一样的。

linux和window下passwd文件的命名格式不一样,而且任何权限的修改都需要重新创建密码文件


UNIX and Linux
orapwORACLE_SID
ORACLE_HOME/dbs


Windows
PWDORACLE_SID.ora
ORACLE_HOME\database


============搭建data guard steps

确保.compatible='11.2.0.0.0'  两边是一致的。

修改初始话参数文件,主服务器端。

*.db_name='sales'

*.db_unique_name=sales

*.log_archive_config='DG_CONFIG=(sales,dupdb)'

*.log_archive_dest_1='LOCATION=+DG1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sales'

*.log_archive_dest_2='SERVICE=dupdb async VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dupdb'

*.db_recovery_file_dest='+DG1'

*.log_archive_dest_state_1='enable'

*.log_archive_dest_state_2='enable'

*.remote_login_passwordfile='EXCLUSIVE'

*.standby_file_management='auto'

##====standby role initialization parameter=========

fal_server=dupdb

db_file_name_convert='+DATA/dupdb','+DATA/sales'

log_file_name_convert='+DATA/dupdb/','+DATA/sales/','+DG1/dupdb/','+DG1/sales/'

修改初始话参数,备用服务器端

*.control_files='+DATA/dupdb','+DG1/dupdb/'#Restore Controlfile

*.db_name='sales'

*.db_unique_name='dupdb'

*.log_archive_config='DG_CONFIG=(sales,dupdb)'

*.log_archive_dest_1='LOCATION=+DG1 VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dupdb'

*.log_archive_dest_2='SERVICE=sales async VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sales'

*.log_archive_dest_state_1='enable'

*.log_archive_dest_state_2='enable'

*.log_archive_format='%t_%s_%r.arc'

*.db_file_name_convert='+DATA/sales','+DATA/dupdb'

*.log_file_name_convert='+DATA/sales/','+DATA/dupdb/','+DG1/sales/','+DG1/dupdb/'

*.remote_login_passwordfile='EXCLUSIVE'

*.fal_server='sales'

*.standby_file_management='auto'

=====确保上面适用的网络服务名称全部有效

=====创建pfile,control file , db file

create pfile='/u01/backup/initdupdb.ora' from spfile; 

startup mount ;

rman >backup full database format '/u01/backup/full%u_%s_%p' tag 'full' ----先backup ,然后再创建controlfile。

sql>alter database create standby controlfile  as '/u01/backup/dupdb.ctl'

把以上所有的文件都拷贝到备份服务器, 注意拷贝到相同的目录下/u01/backup/


在备份服务器端,

先用修改好的初始话文件启动数据库, 然后使用

rman >  restore controlfile from '/u01/backup/dupdb.ctl';

startup mount;

rman > list backup ===要能发现之前的备份。

rman> restore database;

rman >recover database;

sql>alter database open ; 不用resetlogs因为数据库在mount的情况下备份的。干净备份。(如果住库的备份不是在mount下备份的,需要resetlogs)

会自动创建和住库名称一样的online log ,如果主库有standby log, 同样也会在恢复过程中自动创建standby log。


如果备库没有,则需要手动添加。

sql>alter database add standby logfile size 50M ; 要和主库一样大小,个数要比主库的至少多一个,每一个实例都多一个。

也要创建online log ,以防切换的时候用。


在主库也要创建standby log ,以防切换的时候用。


SQL> alter database add standby logfile '+DATA' size 50M;

Database altered.

SQL> alter database add standby logfile member '+DG1' to group 7;

============redo appy的状况

select sequence#,archived,applied,status from v$archived_log

===========发现redo gap

在redo传输有中断的情况下,redogap就会产生。

一般情况下,当redo 传输恢复后,oracle会自动检测gap并自行解决。修复缺口需要的时间,直接取决于gap的尺寸。和redo源的数据库和redo目的地数据库之间的网络状况。如果经常出现gap,则可以考虑如下的优化办法:
    1、用compression方式传送,可以再log_archive_dest_n参数中,加入compression参数。
    2、启用日志传输的并行方式,在log_archive_dest_n参数中,设置max_connections参数,使之大于1。

在主库不可用的情况下,可能需要手工干预,修复redo gap,步骤如下:
对于物理备库:
执行如下的语句,确定备库是否存在redogap:
 SELECT * FROM V$ARCHIVE_GAP;
假设结果如下:
THREAD#   LOW_SEQUENCE#   HIGH_SEQUENCE#
-----------    -------------        --------------
1                     7                      10
结果表明,线程1的7-10号redo,是一个缺口,在主库上执行如下查询,确定需要的归档日志:
SQL> SELECT NAME FROM V$ARCHIVED_LOG WHERE THREAD#=1 AND -
> DEST_ID=1 AND SEQUENCE# BETWEEN 7 AND 10;
NAME
--------------------------------------------------------------------------------
/primary/thread1_dest/arcr_1_7.arc
/primary/thread1_dest/arcr_1_8.arc
/primary/thread1_dest/arcr_1_9.arc
这里,假设主库的dest_1是本地归档路径。
将查到的这些文件,拷贝至备库的适当位置,并使之属主为oracle:oinstall,备库执行如下命令,将这些归档日志注册:
 ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_7.arc';
 ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_8.arc';
 ALTER DATABASE REGISTER LOGFILE '/physical_standby1/thread1_dest/arcr_1_9.arc';
执行这些语句后,重新执行语句:
SQL> SELECT * FROM V$ARCHIVE_GAP;
看是否有别地gap存在,如果有,重复上面的步骤,直到没有gap存在。


SQL> SELECT * FROM V$ARCHIVE_GAP;

SQL> SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2; --在主机上看是否,第二个备份路径有效,文件传输是否有缺。

Copy these log files to the physical standby database and register them using the ALTER DATABASE REGISTER LOGFILE. For example:

 ALTER DATABASE REGISTER LOGFILE  '/physical_standby1/thread1_dest/arcr_1_7.arc';

在连续恢复模式下工作之前,需要保证之前所有的归档日志己经应用到备用库上。因为在连续恢复模式的情况下,oracle不会应用之前的

归档日志,而只会应用后面陆续到来的归档日志。

ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE

================================================================================================================================

SQL> alter database clear unarchived logfile group 5;

SQL> alter database add standby logfile group 5 '+DATA' size 50M;

============standby redo log

The synchronous and asynchronous redo transport modes require that a redo transport destination have a standby redo log. 。

如果没有standby redo log,主库的 redo 将被直接写到standby archive dest指定的目录。

Redo received by a standby database is written directly to an archived redo log file if a standby redo log group is not available or if the redo was sent to resolve a redo gap

实时 apply redo

非实时:等到standby log 被archived 后,才用 recover database( 仅限phyical standby database)的apply redo。

实时:利用standby log 进行恢复。

If the real-time apply feature is enabled, apply services can apply redo data as it is received, without waiting for the current standby redo log file to be archived

    To start real-time apply, include the USING CURRENT LOGFILE clause on the SQL statement. For example:

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION

starting redo apply

You can specify that Redo Apply runs as a foreground session or as a background process, and enable it with real-time apply.

    To start Redo Apply in the foreground, issue the following SQL statement:

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE;

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;

11.2 phyical standby 支持在open的状态下apply redo

To stop Redo Apply, issue the following SQL statement:

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;

data guard log 产生的message

SELECT MESSAGE FROM V$DATAGUARD_STATUS;

switch

Step 1   Verify that the primary database can be switched to the standby role.

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

Step 2   Initiate the switchover on the primary database.

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH  SESSION SHUTDOWN;

Step 3   Shut down and then mount the former primary database.

SQL> SHUTDOWN ABORT;

SQL> STARTUP MOUNT;

Step 4   Verify that the switchover target is ready to be switched to the primary role.

SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;

SWITCHOVER_STATUS

-----------------

TO_PRIMARY

1 row selected

Step 5   Switch the target physical standby database role to the primary role.

SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;

Step 6   Open the new primary database.

    SQL> ALTER DATABASE OPEN;

Step 7   Start Redo Apply on the new physical standby database.

    For example:

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE -

    > DISCONNECT FROM SESSION;

=============================================================================================================

===========检查data guard状态

SQL> select max(sequence#) from v$archived_log;

STATUS      ERROR

--------- -----------------------------------------------------------------

VALID

status为valid,并且error为空,则表示主库向备用数据库传递日志状态正常,否则可能存在问题。

常见故障:1.网络故障。2.密码问题,主备库必须保持sys用户密码的一致性。如果密码不同,可能造成传输失败。

$ORACLE_HOME/dbs 目录下的orapwd<SID>文件必须存在,而且,主,备库sys用户密码必须一致。

===========failover

1.select name,flashback_on,resetlogs_time,log_mode,open_mode,protection_mode,remote_archive,database_role,switchover_status ,force_logging from v$database;

2. 停止日志应用

    alter database recover managed standby database cancel;  

3. 关闭standby日志传输

    alter database recover managed standby database finish ; or

    alter database recover managed standby database finish force;  

4. 切换到primary

    alter database commit to switchover to primary with session shutdown;  

做这一步的时候,若存在gap,则会报ORA-16139    :Switchover: Media recovery required - standby not in limbo 错误。做测试的时候,若先起主库再起备库,且未等待备库相关日志传输完毕,就会出现这个问题。此时需要强制切换

    alter database activate physical standby database;  

5. 重启数据库到open状态

对于老的primary 数据库需要转化为standby 有两种情况:

 

A.对于打开flashback 功能的数据库比较简单,现在新的primary数据库上执行这个命令

 

select standby_became_primary_scn from v$database;

接着在新的standby的数据库上执行

 

flashback database to scn nnnnnn

alter database convert to physical standby;

alter datbase recover managed standby database using current logfile disconnect from session;

在primary数据库上做日志切换,查看新的standby数据库日志是否正常。

select applied from v$archived_log;

B.如果没有开启flashback功能的话,重新创建dataguard

=============当前scn

SQL>  select CHECKPOINT_CHANGE# from v$database;

CHECKPOINT_CHANGE#

------------------

       5369056

SQL>  select current_scn from v$database;       

CURRENT_SCN

-----------

    5368486

===============switch over 和fail over的区别

 Failover和Switchover的区别为:

当Failover发生,备用数据库切换为主数据库之后,它丢失了备用数据库的所有能力,也就是说,不能再返回到备用模式;而Switchover可以,备用数据库可切换为主数据库,也可从主数据库再切换回备用数据库。

注意事项:

1、如果在主库执行 alter database clear unarchived logfile或alter database open resetlogs ,则dataguard要重建。

 

2、在连续恢复模式下工作之前,需要保证之前所有的归档日志己经应用到备用库上。因为在连续恢复模式的情况下,oracle不会应用之前的

 

归档日志,而只会应用后面陆续到来的归档日志。

 

3、出现归档日志gap时,需要找出相应的归档日志, 然后将这些归档日志copy到备用节点的standby_archive_dest和

 

log_archive_dest目录下面。需要注意的是log_archive_dest目录下也需要copy。然后ALTER DATABASE RECOVER AUTOMATIC STANDBY DATABASE;

 

4、新建表、表空间、datafile都能通过日志应用到备库,但新建一个临时表空间,rename datafile 均不能应用到备库上.

create temporary tablespace temp2 tempfile '+DG1' size 50m  autoextend on next 50m maxsize 2048m extent management local; 传过去的时候是普通表空间。

 

5、应当实时察看standby库的alert文件,就能清晰明了地知道主备更新的情况。这也是排错的重要方法,切记!!

 

 failover和switchover

 

Failover : 将主数据库offline,备用数据库online,这种操作由系统和软件失败引起。 即使在备用数据库上应用重做日志,也可能出现数

 

据丢失的现象,除非备用数据库运行在 guaranteed protection 模式。 原主数据库重新使用时必须重新启动实例。 其它的备用数据库也

 

需重新启动实例。

 

Switchover : 故意将主数据库offline,而将另一备用数据库online,它能够切换到备用数据库而不需同步操作。如:可使用 Switchover

 

完成系统的平滑升级。 即使在备用数据库上不应用重做日志,也不会造成数据的丢失。 数据库不需重新启动实例。这使主数据库几乎能立即

 

在备用数据库上恢复它的功能,因此可经常进行定期维护而不需中断操作。   Failover和Switchover的区别为:当Failover发生,备用

 

数据库切换为主数据库之后,它丢失了备用数据库的所有能力,也就是说,不能再返回到备用模式;而Switchover可以,备用数据库可切换

 

为主数据库,也可从主数据库再切换回备用数据库。

===============================================

Example 25-5 Duplicating from ASM to ASM (Active)

DUPLICATE TARGET DATABASE

  TO dupdb

  FROM ACTIVE DATABASE

  SPFILE PARAMETER_VALUE_CONVERT '+DISK1','+DISK2'

     SET DB_RECOVERY_FILE_DEST_SIZE='750G';

======================

With backup-based duplication you must copy the password file used on the primary to the standby, for Data Guard to ship logs.

=======================

asm to asm

需要指定的三个参数:

DB_CREATE_FILE_DEST:

DB_CREATE_ONLINE_LOG_DEST_n

DB_RECOVERY_FILE_DEST

需要注释掉的三个参数:

CONTROL_FILES

DB_FILE_NAME_CONVERT

LOG_FILE_NAME_CONVERT

=============================================

Assume that the source database prod is on host1 and stores its data files in ASM disk group +DISK1. You want to duplicate the target to database dupdb on remote host host2. You want to store the data files for dupdb in ASM. Specifically, you want to store the data files and control files in disk group +DISK2.

In the DUPLICATE command, set PARAMETER_VALUE_CONVERT to convert all directory locations from +DISK1 to +DISK2. The new file names in +DISK2 are generated by ASM and do not match the original file names in disk group +DISK1.

DUPLICATE TARGET DATABASE

  TO dupdb

  FROM ACTIVE DATABASE

  SPFILE PARAMETER_VALUE_CONVERT '+DISK1','+DISK2'

     SET DB_RECOVERY_FILE_DEST_SIZE='750G';

=========================================================

SQL> conn /as sysasm

Connected.

SQL> create diskgroup DG1 external redundancy

  2  disk

  3  'ORCL:DISK2'

  4  ;

Diskgroup created.

============================================================

静态注册

静态注册就是实例启动时读取listener.ora文件的配置,将实例和服务注册到监听程序。无论何时启动一个数据库,默认地都有

两条信息注册到监听器中:数据库服务器对应的实例和服务。

SID_LIST_LISTENER =

 (SID_LIST =

 (SID_DESC =

 (SID_NAME = sales)

 (ORACLE_HOME = /u01/app/grid/product/11.2.0/grid)

 )

 )

格式很重要, 第二行,空一个space。天啊

查询了一下METALINK,发现这个问题从9i到11g,任何一个版本都可能会出现。造成这个问题的原因是,实例虽然启动,但是没有注册到监听。实例是通过PMON进程注册到监听上的,而PMON进程需要在MOUNT状态下才会启动。因此造成了上面的错误。

Oracle给出了两种解决方案,一种方法是对AUXILIARY数据库直接使用/,对TARGET数据库通过网络访问。

[oracle@yangtk2 ~]$ rman target sys/test@172.25.4.127/ORA11G_P.ytk-thinkpad auxiliary /

Recovery Manager: Release 11.1.0.6.0 - Production on Thu Nov 29 13:58:38 2007

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: ORA11G (DBID=4026820313)

connected to auxiliary database: ORA11G (not mounted)

RMAN>

第二种方法为AUXILIARY数据库设置静态监听,在$ORACLE_HOME/network/admin目录下的listener.ora中添加下面的内容:

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(SID_NAME = ora11g)

(ORACLE_HOME = /data/oracle/product/11.1)

)

)

======================================

RMAN> connect target sys/julia033@sales

connected to target database: SALES (DBID=673340940)

RMAN> connect auxiliary /

connected to auxiliary database: SALES (not mounted)

RMAN>

RMAN> duplicate target database to sales;

如果副本数据库与目标库不在同一台机器上,并且副本数据库的在线日志文件路径与目标库相同,NOFILENAMECHECK

则运行duplicate命令时必须指定NOFILENAMECHECK参数以避免冲突提示。此处oracle表现的很傻,它不知道你要恢复的路径是在另一台机器上,它只是认为要恢复到的路径怎么跟目标数据库表现的一样呢?会不会是要覆盖目标数据库啊,为了避免这种情形,于是它就报错。所以一旦异机恢复,并且路径相同,那么你必须通过指定NOFILENAMECHECK来避免oracle的自动识别。 这里NOFILENAMECHECK不是必须的

 ===========================================

修改前一定要保证数据库是正常关闭的,shutdown normal/shutdown immediate.

修改DBID

查看数据库的dbid和name:

sql>select dbid,name from v$database;

必须以mount模式,干净的关闭和重新启动将要更改其名称和dbid的数据库:

sql>shutdown immediate;

sql>startup mount;

sql>quit;

在linux命令下运行nid命令:

$nid target=system/syspass@dw

然后用resetlogs选项打开数据库:

sql>startup mount;

sql>alter database open resetlogs;

此时再查看dbid已经更改。

nid用法:

只修改dbid:

nid target=system/syspass@dw

只修改数据库名:

nid target=system/syspass@dw dbname=dbnewname setname=y

同时修改dbid和数据库名:

nid target=system/syspass@dw dbname=dbnewname

=====================================

SQL> alter database drop logfile group 3;

Database altered.

SQL> alter database add logfile group 3 '+DATA' size 50m;

Database altered.

SQL> alter database add logfile member '+DG1' to group 3;

Database altered.

alter system archive log current;

 alter system checkpoint;

SELECT GROUP#, BYTES FROM V$STANDBY_LOG;----查看standby redo log

===========================

Note that the password file must be re-copied each time the SYSDBA or SYSOPER privilege is granted or revoked and whenever the login password of a user with these privileges is changed.

===========================

SQL> select sequence#,first_time,next_time from v$archived_log order by sequence#;

SELECT SEQUENCE#,APPLIED FROM v$ARCHIVED_LOG ORDER BY SEQUENCE#;

==========================

select dest_id,sequence#,applied,status from v$archived_log;

select sequence#,archived ,status from v$standby_log;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值