oracle11g dataguard

136 阅读4分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

  1. 主库必须处于 归档模式 必须设置数据库强制归档,否则复制到备库有块损坏

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

  1. 确定数据库25是否处于归档模式
SQL> select name,log_mode from v$database;

NAME      LOG_MODE
--------- ------------
ORCL      ARCHIVELOG
  1. 查看数据库是否强制记录日志

SQL> SELECT FORCE_LOGGING FROM V$DATABASE;

FOR
---
NO

强制主库写日志
ALTER DATABASE FORCE LOGGING;

--强制不写日志
ALTER DATABASE no force logging;

  1. 修改主库和备库 监听
--主库
[root@centos7db1 admin]# more listener.ora 
# listener.ora Network Configuration File: /home/oracle/database/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER=
   (SID_LIST=
    (SID_DESC=
          (GLOBAL_DBNAME=orcl)  
          (SID_NAME=orcl)            
          (ORACLE_HOME=/home/oracle/database/product/11.2.0/db_1)
     )
    )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.25)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /home/oracle/database


--备库

[oracle@centos7db2 admin]$ more listener.ora
# listener.ora Network Configuration File: /home/oracle/database/product/11.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

SID_LIST_LISTENER=
   (SID_LIST=
    (SID_DESC=
          (GLOBAL_DBNAME=orcl2)  
          (SID_NAME=orcl)            
          (ORACLE_HOME=/home/oracle/database/product/11.2.0/db_1)
     )
    )

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.26)(PORT = 1521))
    )
  )

ADR_BASE_LISTENER = /home/oracle/database

  1. 修改tns
[root@centos7db1 admin]# more tnsnames.ora 
# tnsnames.ora Network Configuration File: /home/oracle/database/product/11.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))


ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.25)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
  
ORCL2 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 172.16.10.26)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl2)
    )
  )  
  1. 修改主库参数

修改在线日志文件大小,防止在复制的时候日志文件频繁切换


alter database add logfile group 4 '/home/oracle/database/oradata/orcl/redo04.log' size 1024M;
alter database add logfile group 5 '/home/oracle/database/oradata/orcl/redo05.log' size 1024M;

alter system switch logfile;            
alter system checkpoint;     
       
select group#, status from v$log;

alter database drop logfile group 1; 
alter database drop logfile group 2; 
alter database drop logfile group 3; 


alter database add logfile group 1 '/home/oracle/database/oradata/orcl/redo01.log' size 1024M;
alter database add logfile group 2 '/home/oracle/database/oradata/orcl/redo02.log' size 1024M;
alter database add logfile group 3 '/home/oracle/database/oradata/orcl/redo03.log' size 1024M;

alter database drop logfile group 4; 
alter database drop logfile group 5; 
=======================主库操作====================================================================

关闭主库
sqlplus / as sysdba
shutdown immediate;
emctl stop dbconsole
lsnrctl stop

全部物理备份
--仅打包,不压缩
tar -cvf /home/oracle/database20160601.tar /home/oracle/database 


--启动数据库修改参数
sqlplus / as sysdba
startup;

下边开始配置DG


-- log_archive_max_processes默认为2 修改为4
--查询数据库发现已经是4 了就不修改了
SQL> show parameter log_archive_max_processes;

NAME                     TYPE     VALUE
------------------------------------ ----------- ------------------------------
log_archive_max_processes         integer     4
--------------------------------------------------
--alter system set log_archive_max_processes=4;
--------------------------------------------------

--修改db_unique_name
alter system set db_unique_name='orcl' scope=spfile;
--修改 日志归档配置
alter system set log_archive_config='DG_CONFIG=(orcl,orcl2)'; 
--修改 备用数据库模式 :同步复制 确认
alter system set log_archive_dest_2='SERVICE=orcl2 LGWR SYNC REOPEN=30 NET_TIMEOUT=20 valid_for=(online_logfile,primary_role) db_unique_name=orcl2' ;  
--fetch archive log client
alter system set fal_client='orcl';
--fetch archive log server
alter system set fal_server='orcl2';
--文件管理方式
alter system set standby_file_management=auto;
-- 备用日志文件组 比在线日志多一组
alter database add standby logfile group 7  '/home/oracle/database/oradata/orcl/standby07.log'  size 1024M;
alter database add standby logfile group 8  '/home/oracle/database/oradata/orcl/standby08.log'  size 1024M;   
alter database add standby logfile group 9  '/home/oracle/database/oradata/orcl/standby09.log'  size 1024M;   
alter database add standby logfile group 10 '/home/oracle/database/oradata/orcl/standby10.log'  size 1024M;   
--关闭
shutdown immediate  
--重启
startup   

--创建初始化参数文件
create pfile='/home/oracle/database/product/11.2.0/db_1/dbs/initorcl.ora' from spfile;


  

--查看主库 保护模式
select db_unique_name,protection_mode,protection_level from v$database;
--设置主库 为最大可用性模式
alter database set standby database to maximize availability; 


======================================备库操作=======================================
见 本机 dataguard 目录

sqlplus / as sysdba
shutdown immediate;
lsnrctl stop;
emctl stop dbconsole;

解压文件从服务器备份的安装后文件,但是不需要数据

--删除日志文件和数据文件 因为要用rman 来备份数据库

rm -rf /home/oracle/database/admin/orcl/adump/
rm -rf /home/oracle/database/admin/orcl/pfile
rm -rf /home/oracle/database/admin/orcl/dpdump
rm -rf /home/oracle/database/oradata/orcl/
rm -rf /home/oracle/database/fast_recovery_area/orcl/
rm -rf /home/oracle/database/fast_recovery_area/ORCL/

rm -rf /home/oracle/database/product/11.2.0/db_1/dbs

--重建库的时候需要删除之前的归档
rm -rf  /home/oracle/database/fast_recovery_area/ORCL2/archivelog
rm -rf  /home/oracle/database/fast_recovery_area/ORCL2/onlinelog
--------------------------------------------------

修改主库的initORCL.ora 文件  注意不要修改db_name


![image.png](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2db40d83a9b444308d9c9a4e8c267ce2~tplv-k3u1fbpfcp-watermark.image?)

 出现 是因为目录不存在

image.png

必须保证 oradata/orcl 目录存在

fast_recovery_area/orcl 也必须存在

启动监听

lsnrctl start;
--创建密码文件 否则rman 无法登录
orapwd file=$ORACLE_HOME/dbs/orapworcl password='password' entries=5   


sqlplus /nolog
conn /as sysdba 
--启动到nomount
startup nomount   

--进入rman  orcl2 是备库 ,orcl 是主库
--在出现 PLS-00201:identifier 'DBMS_RCVCAT.GETDBID' must be declared 这个错误时加上  nocatalog 参数
rman target sys/'password'@orcl  auxiliary sys/'password'@orcl2  nocatalog
--rman 复制数据库,得关闭防火墙 否则可能连接不上
duplicate target database for standby nofilenamecheck  from active database;

复制完成后 设置备库开始应用日志
conn /as sysdba
--打开数据库
alter database open; 
--开始应用日志  如果没有复制数据 请启动数据复制
alter database recover managed standby database using current logfile disconnect from session;    

--查看备用日志文件
select status from v$standby_log;

dataguard 日常维护技巧 wenku.baidu.com/link?url=Si…

------------------------------------------20161223-故障排除 不复制---------------- 密码过期造成的 权限不足 而且备库空间不足

主库到备库的redo传输需要通过密码文件中的sys用户密码来进行认证,如果在主库配置了其它的sysdba用户也可以,但问题是主库的redo传输是通过密码文件像sys一样的用户来作为认证基础的,一旦主库加密后的密码和备库不一致,那么redo传输就会有麻烦。

如果需要保证dataguard的可持续性,如果主库存在任何密码文件的变更,我们必须从主库拷贝密码文件到备库

SELECT * FROM V$DATAGUARD_STATUS ORDER BY TIMESTAMP desc

主库 错误 PING[ARC2]: Heartbeat failed to connect to standby 'orcl2'. Error is 1031.

ora 1031 错误是权限不足

登录备库的时候

image.png

image.png

备库错误:

image.png

主库密码

image.png

备库

image.png

直接修改备库的过期策略是修改不了的

解决方法 把主库的密码文件 拷贝到备库 /home/oracle/database/product/11.2.0/db_1/dbs

orapworcl


dgmgrl dataguard 管理

tnsping orcl2 --查看tns 是否通

ora 19809 错误 归档日志满

备库

image.png

备库的归档日志满

image.png

--查询备库 归档日志

SELECT * FROM v$recovery_file_dest;

在备库上 rman target/ DELETE NOPROMPT ARCHIVELOG UNTIL TIME "TO_DATE('2017-05-01','YYYY-MM-DD')"; 删除后必须要验证 然后删除否则数据库中占用记录不会修改 2)命令>crosscheck archivelog all; 3)命令>delete NOPROMPT expired archivelog all;

一定要注意主库的归档日志不能满 否则也不能复制到备库,原因不明


--备库 standby archive log 满

验证复制时候正确

dbv file='/home/oracle/database/oradata/orcl/bworg01.dbf'

dbv file='/home/oracle/database/oradata/orcl/CHECKROLL01'

在dbv 验证备库文件的时候,发现数据库老有以下错误,备库的块损坏

image.png

原因: DBV-00201: Block, DBA number, marked corrupt for invalid redo application Cause: The block was marked corrupt by the Oracle database server for invalid redo application, ex: media recovery of a NOLOGGING object or direct loaded data. Action: If the block is not currently allocated to a database object, then no action is required. If the block is allocated, then the object will need to be rebuilt, or data to be reloaded. 仔细想了下:日志应用?咦?这不是只用在dataguard等软件才需要么,进一步询问。 果然是在搭建dataguard,在上面的Cause信息中NOLOGGING关键字中,并且在网上查找了下信息。 明白了是他没有开启force logging。之后开启数据库的force logging就好了。

alter database force logging ;

查询主库25,发现确实没有强制归档,最好主备库 都开启强制归档

image.png

下面将oracle数据库设置为30分钟内没进行归档的话,就强制其归档:

alter system set archive_lag_target=1800;

备库的归档日志也会满

重做传输服务 Redo Transport Service 主数据库的LGWR 将重做数据写入到自己的 ORL(online redo log)中一个独立的DataGruard进程从SGA的重做缓存区读取信息,交由OracleNet服务传输到 备份数据库 这个进程叫 Log Network Server (LNS),有3个备库就有3个LNS

在备库端 由LNS 传输的重做记录在备用数据库由另一个进程 Remote File Server (RFS) 接收,RFS 在备用数据库上接收重做数据,然后写入备用重做 日志(Standy Redo log SRL)文件中。 备库端:介质恢复协调器(Media Recovery Coordinator)MRP0 管理恢复会话按SCN 顺序合并来自多个实例的重做数据(在使用RAC的情况下),然后应用进程 (pr00 pr01...)读取数据块 组装数据

image.png

image.png

dataguard 维护

--查看恢复和错误信息

SELECT * FROM V$DATAGUARD_STATUS ORDER BY TIMESTAMP desc

创建dblink
create public database link
to_25 connect to BWORG identified by "password" using 'BWIE_25';


--备库查看RFS接收日志和MRP应用日志同步主库情况
select process, sequence#, status, delay_mins from v$managed_standby;
--查看日志接收状态
select REGISTRAR,CREATOR,THREAD#,APPLIED,sequence#,first_change#,next_change#, COMPLETION_TIME from v$archived_log;


--备库查看已经应用的redo
select thread#,sequence#,first_change#,next_change# from v$log_history;

主、备库查看是否有gap

select status,gap_status from v$archive_dest_status where dest_id=2;
--备库查看
select * from v$archive_gap;


查看备库 接收的最大日志
select sequence#
     from v$archived_log
    where recid = (select max(recid) from v$archived_log);
查看主库的日志

select sequence#,status from v$log;


查看恢复区大小 
select name,space_limit,space_used,number_of_files from v$recovery_file_dest;
alter system set db_recovery_file_dest_size=200G scope=both;

物理DG要实现实时同步:在最大性能的模式下,是可以的。
先停用日志同步: 
alter database recover managed standby database cancel;
实时同步:  每次断电重启后  需要 现在备库执行恢复数据同步 然后在主库  执行 alter system switch logfile;  
启用备库同步
alter database recover managed standby database using current logfile disconnect from session;

日志同步:只有在主库日志文件切换后才同步
alter databse recover managed standby databse disconnect from session;
日志同步的模式,就是要把日志传动DG后,才能更新数据,日志不归档时,数据是不同步到物理DG的。

搜索 使用图形化界面管理GridControl和DataGuard - Secooler.pdf

oracle db_name,sid20150810.docx

data Guard可以以只读的方式打开数据库,但此时Media Recovery利用日志进行数据同步的过程就停止了,如果物理备用数据库处于恢复的过程中数据库就不能打开查询,也就是说日志应用和只读打开两个状态是互斥的。 Oracle 11g 中推出的Active Data Guard功能解决了这个矛盾,在利用日志恢复数据的同时可以用只读的方式打开数据库,用户可以在备用数据库上进行查询、报表等操作,这类似逻辑Data Guard备用数据库的功能(查询功能方面),但是,数据同步的效率更高、对硬件的资源要求更低。这样可以更大程度地发挥物理备用数据库的硬件资源的效能。 ylw6006.blog.51cto.com/470441/8418…

  1. DB_NAME 表示数据库名称,DB_NAME 会保持在数据文件头、控制文件、REDO文件里,所以更改DB_NAME不能仅仅修改spfile ,还需要用nid 来进行更改,并且更改后还需要手工做些工作,使其生效。 DB_NAME 最长 8 个字符。

  2. 在 DG下,主库和物理从库的 DB_NAME 是一致的,主库和物理从库的DB_UNIQUE_NAME 不同,DB_UNIQUE_NAME 用于标识主从库。

修改 DB_UNIQUE_NAME 需要修改 spfile 并重启数据库; 由于 DB_NAME 记录在数据文件头、控制文件、REDO文件里,所以修改 DB_NAME 一般有两种方式: (1)备份控制文件到trace,修改 spfile,重启数据库,resetlogs 打开数据库 (2)或者通过 nid 命令修改

DB_NAME 数据库名称,也就是数据库的名字标示。这里,数据库里可能有多个实例,比如RAC里的多节点,这多个节点是不同的实例 ,但是却有相同的名字,他们的 DB_NAME是相同的但是Instance_name是不同的。DB_NAME会保持在数据文件头里 ,所以更改DB_NAME不能仅仅修改parameter,还需要用nid 来进行更改,并且更改后还需要手工做些工作,是其生效。

  1. SID:System Identifier

The SID identifies the instance's shared memory on a host, but may not uniquely distinguish this instance from other instances

doc上把sid解释为在host上用sid来标示实例的共享内存的,可见sid主要是和os打交道的。

sid可以通过如下语句在库中查询: select instance_name from v$instance;


主库

alter database force logging;
alter system set db_unique_name='orcl1' scope=spfile;
alter system set log_archive_config='DG_CONFIG=(orcl1,orcl2)'; 
alter system set log_archive_dest_2='SERVICE=orcl2 lgwr sync valid_for=(online_logfile,primary_role) db_unique_name=orcl2'; 
alter system set fal_client='orcl1';
alter system set fal_server='orcl2';

alter system set standby_file_management=auto;  

alter database add standby logfile group 4 '/home/oracle/database/oradata/orcl/standby04.log' size 50M;  
alter database add standby logfile group 5 '/home/oracle/database/oradata/orcl/standby05.log' size 50M;  
alter database add standby logfile group 6 '/home/oracle/database/oradata/orcl/standby06.log' size 50M;  
alter database add standby logfile group 7 '/home/oracle/database/oradata/orcl/standby07.log' size 50M;  
shutdown immediate;
startup;

create pfile from spfile; 

备库

[oracle@bogon1 admin]$ rman target sys/123456@orcl1 auxiliary sys/123456@orcl2

Recovery Manager: Release 11.2.0.3.0 - Production on Tue May 10 20:48:22 2016

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (DBID=1439208389)
connected to auxiliary database: ORCL (not mounted)

RMAN> duplicate target database for standby nofilenamecheck from active database;