0
点赞
收藏
分享

微信扫一扫

Oracle数据库主从复制

小飞侠熙熙 2022-10-28 阅读 189

主从复制


  1. 主从复制简介:

主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库,从数据库的作用和使用场合一般有几个:

一、作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;

二、可在从数据库作备份、数据统计等工作,这样不影响主数据库的性能;

三、实现读写分离;



  1. 环境介绍操作系统版本:CentOS release 7.4 (64位)
    数据库版本:ORACLE 11GR2 11.2.0.4.0 (64位)
    主数据库10.15.138.201 odb1
    SID:orcl
    db_name:orcl
    db_unique_name:odb1
    备份数据库: 10.15.138.201 odb1
    SID:orcl
    db_name:orcl
    db_unique_name:odb2
    配置参数查看:show parameter name

使用:SQL> select name from v$database; 查看数据库名

Oracle数据库主从复制_sql语句


a1.数据库名

如果数据库有域名,则数据库服务名就是全局数据库名;否则,数据库服务名与数据库名相同

a2.数据库实例名:(instance_name)

数据库实例名是用于和操作系统进行联系的标识,就是说数据库和操作系统之间的交互用的是数据库实例名.

在一般情况下,数据库名和实例名是一对一的关系,但如果在oracle并行服务器架构(即oracle实时应用集群)中,数据库名和实例名是一对多的关系。

select instance_name from v$instance;--查询当前数据库实例名

a3.数据库实例名与ORACLE_SID

虽然两者都是oracle实例,但两者是有区别的:

instance_name是oracle数据库参数,而ORACLE_SID是操作系统的环境变

ORACLD_SID用于与操作系统交互,从操作系统的角度访问实例名,必须通过ORACLE_SID

ORACLE_SID必须与instance_name的值一致.

  1. 主数据库安装:

按照linux中安装oracle步骤进行操作,安装oracle软件、开启监听程序、创建数据库实例。


  1. 从数据库安装

按照linux中安装oracle步骤进行操作,安装oracle软件、开启监听程序。不要创建数据库实例。



6. 主数据库改为强制日志模式:

查看强制日志模式状态:

SQL> select name,log_mode,force_logging from v$database;


Oracle数据库主从复制_oracle_02


修改为强制日志模式:

SQL语句:alter database force logging;

Oracle数据库主从复制_oracle_03




7.主服务器上创建主数据库密码文件:

在oracle用户下,并执行过source /home/oracle/.bash_profile后

执行命令:

[oracle@odb1 dbs]$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=DZHadmin1 force=y

说明:password值为主数据库sys用户的密码,执行命令后会在$ORACLE_HOME/dbs文件夹内生成密码文件:orapworcl(本人主库SID为:orcl)


8.主数据库创建 standby redolog 日志组:

1)standby redo log的文件大小与primary 数据库online redo log文件大小相同

(2)standby redo log日志文件组的个数依照下面的原则进行计算:

Standby redo log组数公式>=(每个instance日志组个数+1)*instance个数。假如只有一个节点,这个节点有三组redolog,所以Standby redo log组数>=(3+1)*1 == 4所以至少需要创建4组Standby redo log由于已经存在group1-3,,所以group号只能从4开始。

查看当前线程与日志组的对应关系及日志组的大小:


SQL语句:select thread#,group#,bytes/1024/1024 from v$log;

Oracle数据库主从复制_oracle_04



创建standby redolog日志组:

执行SQL语句:

SQL> alter database add standby logfile group 21('/u02/oradata/orcl/standbyredo01.log') size 50m;


Oracle数据库主从复制_oracle_05





9. 主数据库创建pfile参数文件:

执行SQL语句:create pfile from spfile;

创建的pfile为:$ORACLE_HOME/dbs/init$ORACLE_SID.ora文件



10. 修改主数据库的pfile参数文件:

增加如下配置:

[oracle@odb1 dbs]$ vim initorcl.ora


orcl.__db_cache_size=12851347456

orcl.__java_pool_size=67108864

orcl.__large_pool_size=100663296

orcl.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

orcl.__pga_aggregate_target=5033164800

orcl.__sga_target=15065939968

orcl.__shared_io_pool_size=0

orcl.__shared_pool_size=1912602624

orcl.__streams_pool_size=33554432

*.audit_file_dest='/u01/app/oracle/admin/orcl/adump'

*.audit_trail='db','EXTENDED'

*.compatible='11.2.0.4.0'

*.control_files='/u02/oradata/orcl/control01.ctl','/u02/fast_recovery_area/orcl/control02.ctl'


#*.control_files='/u02/oradata/orcl/control01.ctl','/u02/oradata/orcl/control02.ctl'#Restore Controlfile

*.db_block_size=8192

*.db_domain=''

*.db_name='orcl'

*.db_recovery_file_dest='/u02/fast_recovery_area'

*.db_recovery_file_dest_size=4294967296

*.diagnostic_dest='/u01/app/oracle'

*.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'

#*.log_archive_dest_1='LOCATION=/u02/arch1'

#*.log_archive_format='%t_%s_%r.dbf'

*.open_cursors=300

*.pga_aggregate_target=5017436160

*.processes=300

*.remote_login_passwordfile='EXCLUSIVE'

*.sessinotallow=335

*.sga_target=15054405632

*.undo_tablespace='UNDOTBS1'

###新增加如下配置:

*._adg_parselock_timeout=550

*._optimizer_ads_use_result_cache=FALSE

*.audit_sys_operatinotallow=TRUE

*.db_file_name_cnotallow='/u02/oradata/orcl/','/u02/oradata/orcl/'

*.db_unique_name='odb1'

*.diagnostic_dest='/u01/app/oracle'

*.fal_client='odb1'

*.fal_server='odb2'

*.log_archive_cnotallow='dg_cnotallow=(odb1,odb2)'

*.log_archive_dest_1='LOCATION=/u02/arch1/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

DB_UNIQUE_NAME=odb1'

*.log_archive_dest_2='service=odb2 lgwr async affirm valid_for=(online_logfiles,primary_role) db_unique_name=odb2'

*.log_archive_dest_state_1='enable'

*.log_archive_dest_state_2='ENABLE'

*.log_file_name_cnotallow='/u02/oradata/orcl/','/u02/oradata/orcl/'

*.memory_max_target=18719476730

*.memory_target=18719476730

*.pre_page_sga=FALSE

*.sga_max_size=11539607550

*.shared_pool_size=1048576000

*.standby_file_management='auto'


# log_archive_dest_1 string locatinotallow=/u02/arch1/ valid_for=(online_logfiles,primary_role) db_unique_name=WGQDB1 ####目前它的role是备库,所以无法起到作用。请设置为: VALID_FOR=(ALL_LOGFILES,ALL_ROLES)



注意:*.log_archive_dest_1参数中location为自己指定的一个新的路径,目的是为了确认主库后面重启确实是利用了修改后的pfile参数文件。

注意:详情见汇总整理参数文件夹中文件,修改的pfile参数文件中不允许有中文汉字、中文字符等一切中文内容,否则无法用pfile创建spfile。

memory_target是oracle11g用于自动内存管理的,它与memory_max_target是成对出现的,是11g内存管理上的新特 性,这一特性的出现使得pga+sga做为整体内存使用被一致的纳入自动管理范畴。简而言之memory_target就是整个实例所能使用的内存大小, 包括PGA和SGA的整体大小,在MEMORY_TARGET的内存大小之内,PGA和SGA所用的内存可以根据当前负载情况自动相互转换。

如果当初始设定的MEMORY_TARGET的内存不够当前数据库使用的时候,Oracle11g还提供了另外一个初始化参数 MEMORY_MAX_TARGET,当原始设定的内存不够使用的时候,可以手工来动态 调节MEMORY_TARGET的大小,但是不允许超过MEMORY_MAX_TARGET的值。

由此可见sga的尺寸是不能大于memory_target的。所以我们要调整memory_target和memory_max_target的值高于sga_max_size。

若虚拟机中出现tmpfs 太小的情况,导致实例无法启动。我们现在通过以下方法,临时修改和永久修改

[root@odb1 ~]# mount -o size=16G -o nr_inodes=1000000 -o noatime,nodiratime -o remount /dev/shm ##临时

永久生效

[root@odb1 ~]# vim /etc/fstab

tmpfs /dev/shm tmpfs default,size=16G 0 0


11. 主数据库关闭并用修改后的pfile创建spfile

执行SQL语句:shutdown immediate;

执行SQL语句:create spfile from pfile;

创建的spfile为:$ORACLE_HOME/dbs/spfile$ORACLE_SID.ora文件


  1. 主数据库更改监听,重启监听:

[oracle@odb2 admin]$ cd /u01/app/oracle/product/11.2.0/db/network/admin

[oracle@odb1 admin]$ vim listener.ora


# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/listener.ora

# Generated by Oracle configuration tools.

LISTENER =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = odb1)(PORT = 1521))

)

SID_LIST_LISTENER =

(SID_LIST =

(SID_DESC =

(GLOBAL_DBNAME = orcl)

(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db)

(SID_NAME = orcl)

)

)

ADR_BASE_LISTENER = /u01/app/oracle


[oracle@odb1 admin]$ lsnrctl stop

[oracle@odb1 admin]$ lsnrctl start


13. 主数据库启动归档模式并开启数据库:

将数据库启动为mount 状态:

执行SQL语句:startup mount;

启用归档模式:

执行SQL语句:alter database archivelog;

数据库打开:

执行SQL语句:alter database open;

查看是否启用归档模式:

执行SQL语句: archive log list;



Oracle数据库主从复制_数据库_06


如上,归档路径已经改为/u02/arch1(网上截图的路径),只要与自己修改的pfile路径一致,那就证明对pfile的修改已生效。


14.主数据库修改网络服务配置文件:tnsnames.ora

[oracle@odb2 admin]$ cd /u01/app/oracle/product/11.2.0/db/network/admin

[oracle@odb1 admin]$ vim tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

## 添加主库网络服务名


odb1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = odb1)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)


# 添加访问备库网络服务名

odb2 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = odb2)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

tnsping测试主、备库网络服务名:

执行命令:tnsping odb1

执行命令:tnsping odb2

[Oracle@localhost ~]$ lsnrctl status




15. 主数据库服务器拷贝文件到备数据库服务器

将主数据库密码文件拷贝到备数据库对应位置:

$ORACLE_HOME/dbs/orapw$ORACLE_SID

[oracle@odb1 dbs]$ scp orapworcl oracle@odb2:/u01/app/oracle/product/11.2.0/db/dbs

将主数据库中pfile文件拷贝到备数据库对应位置:

$ORACLE_HOME/dbs/init$ORACLE_SID.ora

[oracle@odb1 dbs]$ scp initorcl.ora oracle@odb2:/u01/app/oracle/product/11.2.0/db/dbs

将主数据库中tnsnames.ora网络服务配置文件拷贝到备数据库对应位置:

$ORACLE_HOME/network/admin/tnsnames.ora

[oracle@odb1 admin]$ scp tnsnames.ora oracle@odb2:/u01/app/oracle/product/11.2.0/db/network/admin

16. 备服务器上创建数据库密码文件:

在oracle用户下,并执行过source /home/oracle/.bash_profile后

执行命令:

[oracle@odb2 dbs]$ orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=DZHadmin1 force=y

说明:password值为主数据库sys用户的密码,执行命令后会在$ORACLE_HOME/dbs文件夹内生成密码文件:orapworcl(本人从库SID为:orcl)

将从主库拷贝到备库上的tnsnames.ora中红线圈出位置修改为备库对应的信息:

备数据库更改网络服务文件:

[oracle@odb2 admin]$ cd /u01/app/oracle/product/11.2.0/db/network/admin

[oracle@odb2 admin]$ vim tnsnames.ora

odb1 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = odb1)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

odb2 =

(DESCRIPTION =

(ADDRESS = (PROTOCOL = TCP)(HOST = odb2)(PORT = 1521))

(CONNECT_DATA =

(SERVER = DEDICATED)

(SERVICE_NAME = orcl)

)

)

# LISTENER_ORCL =

# (ADDRESS = (PROTOCOL = TCP)(HOST = odb2)(PORT = 1521))

# 名称就是:LISTENER_$ORACLE_SID(本人从库SID为:orcl,即:LISTENER_ORCL)。IP就是备数据库所在服务器IP地址。


17. 备数据库修改pfile参数文件:

将从主库拷贝到备库上的pfile参数文件重命名,修改为init$ORACLE_SID(本人从库SID为orcl,即:initorcl)。

[oracle@odb2 dbs]$ cd /u01/app/oracle/product/11.2.0/db/dbs

[oracle@odb1 dbs]$ vim initorcl.ora


将从库拷贝到备库上的pfile参数文件内参数,设计到主库上SID名称的地方全部修改为备库的SID,将备库SID名称的地方全部修改为主库的SID。


18. 备数据库用修改后的pfile创建spfile:

将修改好的pfile放到对应的位置:$ORACLE_HOME/dbs文件夹中。

执行SQL语句:create spfile from pfile;

若乱码,更改语言变量:

[oracle@odb2 admin]$ LANG="SIMPLIFIED CHINESE_CHINA.ZHS16GBK"

[oracle@odb2 admin]$ echo $LANG


[oracle@odb2 admin]$ sqlplus / as sysdba

SQL> create spfile from pfile;


注释:测试环境若内存小,占用了大量共享内存导致无法登录数据库:

为了快速登录oracle,好迅速启动oracle,这里提供一种超暴力的方法

1.使用Linux的kill命令杀死所有与oracle有关的进程

$ ps -ef |grep $ORACLE_SID|grep -v grep|awk '{print $2}' | xargs kill -9

2.使用Linux的ipcs和ipcsrm命令释放oracle占用的共享内存

$ ipcs -m | grep oracle | awk '{print $2}' | xargs ipcrm shm


19 备数据包启动到 nomount状态:同步主数据库

执行SQL语句:startup nomount;

SQL> startup nomount;


ORA-09925: Unable to create audit trail file

启动数据库报错处理:

导致这个错误的原因要么是dump目录不存在,要么是没有写权限,要么就是oracle文件权限不对。

查看/u01/app/oracle/admin/目录,果然发现orcl/adump目录不存在,创建目录

[oracle@odb2 db]$ mkdir -p /u01/app/oracle/admin/orcl/adump

[oracle@odb2 db]$ sqlplus / as sysdba

SQL> shutdown immediate;

SQL> startup nomount;

备库创建相应的目录

[oracle@odb2 ]$ mkdir -p /u02/fast_recovery_area/orcl/

[oracle@odb2 backup]$ mkdir -p /u02/oradata/orcl/



拷贝主库相应的控制文件到备库对应位置:

[oracle@odb1 orcl]$ scp control02.ctl oracle@odb2:/u02/fast_recovery_area/orcl/

[oracle@odb1 orcl]$ scp control01.ctl oracle@odb2:/u02/oradata/orcl/


  1. 恢复主库数据到备库:

方法1:适合数据量小的情况

[oracle@odb2 admin]$ rman target sys/DZHadmin1@odb1 auxiliary sys/DZHadmin1@odb2

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

run { duplicate target database for standby from active database nofilenamecheck; }

Oracle数据库主从复制_数据库_07


方法2:数据库完全备份恢复

导入主库备份文件:主库先使用rman备份

[oracle@odb1 u01]$ rman target /

RMAN> backup as compressed backupset incremental level 0 database tag 'fullbackup' format '/u01/backup/full_%d_%T_%s_%p';


RMAN> backup current controlfile for standby format '/u01/backup/control.ctl'

Oracle数据库主从复制_sql语句_08


拷贝备份后的文件到备库:

[oracle@odb1 backup]$ scp /u01/backup/* oracle@odb2:/u01/backup


备库恢复数据

[oracle@odb2 u01]$ rman target /

RMAN> restore standby controlfile from '/u01/backup/control.ctl';

RMAN> alter database mount;

[oracle@odb2 backup]$ mkdir rman

[oracle@odb2 backup]$ mv full_ORCL_20211228_* rman/

[oracle@odb2 u01]$ rman target /

RMAN> catalog start with '/u01/backup/rman';

输入yes



Oracle数据库主从复制_数据库_09




恢复数据:

[oracle@odb2 u01]$ rman target /

RMAN>

run {

allocate channel c1 type disk;

allocate channel c2 type disk;

restore database;

release channel c1;

release channel c2;

}


Oracle数据库主从复制_sql语句_10




附加:若数据库在归档模式下要导入归档日志:

RMAN> backup archivelog all format '/tmp/rest_of_arc_%U.bks;

RMAN> catalog backuppiece '/tmp/rest_of_arc';

RMAN> run {# change the date and time to suit
SET UNTIL TIME "to_date('01 SEP 2011 12:04:00','DD MON YYYY hh24:mi:ss')";
recover database;
}



21. 查看备数据库状态:同步数据后,备库直接为MOUNT状态

执行SQL:select status from v$instance;


Oracle数据库主从复制_数据库_11




22. 备数据库启动日志应用:

执行SQL语句:alter database recover managed standby database disconnect from session;


停止日志应用的密令:

alter database recover managed standby database cancel;

Oracle数据库主从复制_数据库_12



23. 查看日志应用情况:

执行SQL语句:set pagesize 100

执行SQL语句:select sequence#,applied from v$archived_log order by 1;

Oracle数据库主从复制_数据库_13



如上,如果发现有个NO的,也是正常的,说明该日志在主库上还没有归档,可以在主库上运行alter system switch logfile;命令来进行日志切换,再到备库查看日志应用情况。




24. 查看主数据库和备数据库归档序列号是否一致:

主库查看归档序列号:

执行SQL语句:alter system switch logfile;

执行SQL语句:archive log list;

备库查看归档序列号:

执行SQL语句: archive log list;

主要是current log sequence参数,有时候current log sequence差1也是可以的。

Oracle数据库主从复制_sql语句_14


若出现乱码,设置语言变量

export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK" ###英文显示

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8" ##中文显示


Oracle数据库主从复制_oracle_15



25. 备数据库打开:

执行SQL语句:shutdown immediate;

执行SQL语句:startup nomount;

执行SQL语句:alter database mount standby database;

执行SQL语句:alter system set STANDBY_ARCHIVE_DEST='/u02/arch1';

执行SQL语句:alter database open read only;

执行SQL语句:alter database recover managed standby database using current logfile disconnect from session;


26. 主从复制测试:

在主数据库上进行操作,然后在从数据库上看看主库上操作结果数据是否同步过去,正常是可以同步过去的。

例如主库创建用户:

SQL> create user test1 identified by 123456;

SQL> select * from all_users;

Oracle数据库主从复制_oracle_16




  1. 主从复制验证:
    SQL> col current_scn for 9999999999999999
    SQL> select scn_to_timestamp(current_scn),current_scn from v$database;

查看主库和从库打开状态:

SQL> select open_mode from v$database;

Oracle数据库主从复制_数据库_17


查看日志应用情况

SQL> select thread#,max(sequence#) from v$archived_log group by thread#;

SQL> select thread#,max(sequence#) from v$archived_log where applied='YES' group by thread#;

Oracle数据库主从复制_数据库_18


  1. 在主备库添加定期备份脚本在主数据库:
    [oracle@wgqdbm ~]$ crontab -l
    00 01 * * * /u02/rmans/rman_compressed.sh
    [oracle@wgqdbm rmans]$ vim /u02/rmans/rman_compressed.sh
    #!/bin/sh
    source /home/oracle/.bash_profile
    cd $ORACLE_HOME/bin
    ./rman target / msglog=/backup/rmanbak/compress_rmanlog_`date '+%Y%m%d%H%M%S'`.log <<EOF
    run
    {
    allocate channel t1 type disk;
    allocate channel t2 type disk;
    allocate channel t3 type disk;
    backup as compressed backupset full database format'/backup/rmanbak/compress_ora_%d_%I_%s_%p_%t.bak';
    release channel t1;
    release channel t2;
    }
    run {
    allocate channel t1 type disk;
    allocate channel t2 type disk;
    sql 'alter system archive log CURRENT';
    sql 'alter system archive log CURRENT';
    sql 'alter system archive log CURRENT';
    backup as compressed backupset filesperset 10 archivelog all format'/backup/rmanbak/compress_arch_%d_%I_%s_%p_%t_%e.bak';
    release channel t1;
    release channel t2;
    }
    run
    {
    allocate channel t1 type disk;
    backup as compressed backupset current controlfile format'/backup/rmanbak/compress_ctl_%s_%p_%t.bak';
    release channel t1;
    }
    run
    {
    crosscheck archivelog all;
    delete noprompt obsolete;
    }
    exit;
    EOF

    在备库:添加归档定期删除脚本:
    [oracle@wgqdbm ~]$ crontab -l
    00 02 * * * /u02/rmans/rm_adump.sh
    00 03 * * * /u02/rmans/del_arch.sh
    vim /u02/rmans/rm_adump.sh
    #!/bin/bash
    cd /u01/app/oracle/admin/orcl/adump
    find ./ -type f -name "*.aud" -mtime +30 |xargs -n 1000 rm -r



    vim /u02/rmans/del_arch.sh
    #!/bin/bash
    . ~/.bash_profile
    ORACLE_SID=orcl
    rman target / nocatalog log /u02/rmans/rman_delete.log append<<EOF
    run{
    crosscheck archivelog all;
    delete noprompt force archivelog all completed before 'sysdate-7';
    }
    EOF
  2. 主从复制数据库关闭启动:


主从复制数据库关闭:

主库关闭:

关闭数据库:

执行SQL语句:shutdown immediate;

关闭监听服务:

执行命令:lsnrctl stop;


从库关闭:

关闭数据库:

执行SQL语句:shutdown immediate;

关闭监听服务:

执行命令:lsnrctl stop;


主从复制数据库启动:先起从库

主库启动:

启动监听服务:

执行命令:lsnrctl start;

启动数据库:

执行SQL语句:startup;

日志手动切换:

执行SQL语句:alter system switch logfile;


从库启动:

启动监听服务:

执行命令:lsnrctl start;

启动数据库:

执行SQL语句:startup; (开启read-only模式的数据库)

查看开启模式SQL语句:select open_mode from v$database;

执行SQL语句:recover managed standby database using current logfile disconnect from session;(开启实施日志应用)



29. 主从复制中间数据同步失败:

如果主从复制数据库中间数据同步失败了,先检查从库上是否开启实施日志应用的SQL语句,然后在主库上执行日志手动切换SQL:alter system switch logfile,然后再看看数据是否同步成功。如果数据同步还是不成功,那么就需要在从库上,按照上面步骤从21条,就是在备库上利用RMAN恢复主数据库开始重新进行操作,直到26条,被数据库打开。这样就主从复制应该就正常可以同步数据了。


30.主从复制备库意外中断
ORA-01153: an incompatible media recovery is active

从字面意思理解应该是“存在一个不兼容的介质恢复”。

仔细检查发现上面已经执行过一次

SQL> alter database recover managed standby database disconnect from session;

猜想应该是重复启用日志应用所致。故取消应用

SQL> alter database recover managed standby database cancel;

重新开启应用

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

若出现乱码,设置语言变量

export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK" ###英文显示

export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8" ##中文显示


注意事项:

主从复制过程中,从库和主库无法实时同步

发现一套1一主二从的Oracle 11.2.0.2主从库的一个active standby无法实时同步。

查询异常库的v$standby_log,注意标黄的列。此处DBID是没有有价值的数据的。

select * from v$standby_log;

select * from v$logfile;


推测是之前建从库加的standby redo log加的有问题,导致无法支持主从实时同步。因此考虑删除现有的standby redo log,重新增加。

首先要退出日志应用,否则无法删除:

recover managed standby database cancel;

alter database drop logfile group 21;

alter database drop logfile group 22;

alter database drop logfile group 23;

.........................................

alter database drop logfile group 33;


重新添加日志组:

alter database add standby logfile group 21 '/u02/oradata/orcl/st_redo21.log' size 1000M;

..........................................................................

alter database add standby logfile group 33 '/u02/oradata/orcl/st_redo33.log' size 1000M;


查询异常库的v$standby_log,注意标黄的列。此处DBID依然是没有有价值的数据的。

恢复日志应用:

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;


主库做一下日志切换,看有什么结果

sqlplus "/as sysdba"

alter system switch logfile;

查询异常库的v$standby_log,注意标黄的行,这个时候,有数据产生了。

select * from v$standby_log;

再次碰到该问题,发现是主库的redo log 比从库的standby redo log物理大小大引起的。将从库redo log改为和主库最大的redo log物理大小一样即可

​​https://blog.csdn.net/wanglpz/article/details/50549648​​





问题的原因是备库比主库多出了一个

但主库在当时除了

可能在操作其他

从库意外收到

To implement the solution, please execute the following steps:

把发生问题的

SQL> startup mount

$ rman target /


RMAN> list incarnation;

RMAN> reset database to incarnation 1;

RMAN> list incarnation;


SQL> recover managed standby database using current logfile disconnect from session;

SQL> alter database open;


standby 需要一段时间来重新应用之前 incarnation 的 redo,追平后方可 open。

这样即可避免问题。







如果您删除了尚未传送到备库的归档日志,可能导致无法正常同步。

在主库设置归档日志的


RMAN>CONFIGURE ARCHIVELOG DELETION POLICY TO SHIPPED TO ALL STANDBY;

这样,当您在主库执行删除归档命令时,哪些没有传递到备库的归档日志,
不会被删除

若要该回去,您可以执行:
RMAN>CONFIGURE ARCHIVELOG DELETION POLICY TO NONE;

备库没有归档日志的现象:

您是通过哪个目录、视图观察到的,请给出具体的信息。

也请分别在主库、备库收集归档日志信息:
set linesize 400
col thread# for 999
col sequence# for 999999999
col name for a80
col deleted for a5
col blocks for 999999999
col block_size for 999999999
col first_time for a20
col next_time for a20
col completion_time for a20
col first_change# for 999999999999
col next_change# for 999999999999


select thread#,sequence#, name,deleted, blocks, block_size,to_char(first_time,'YYYY-MM-DD_HH24:MI:SS') as first_time ,first_change#,
to_char(next_time,'YYYY-MM-DD_HH24:MI:SS') as next_time, next_change#, to_char(completion_time,'YYYY-MM-DD_HH24:MI:SS') as completion_time
from v$archived_log
where RESETLOGS_CHANGE# = (select max(RESETLOGS_CHANGE#) from v$database) and deleted !='YES'
order by thread#,sequence#;





SQL> select thread#,dest_id,dest_name,destination,target,gvi.status instance_status,gvad.status archive_status,process, mountid,valid_now,valid_type,valid_role,db_unique_name,error
2 from gv$archive_dest gvad join gv$instance gvi
3 using (inst_id) where gvad.status='VALID' and destination is NOT NULL order by thread#, dest_id;


麻烦您查看如下的本地归档目录:

/u01/app/oracle/product/11.2.0/db/dbs/arch
/u02/arch1/


SQL> SELECT name, time, unit, count, TO_DATE(last_time_updated, 'MM/DD/YYYY HH24:MI:SS')
FROM v$standby_event_histogram ORDER BY unit DESC, time;


关于归档日志的路径,您可以修改:
目前,
您可以修改:
alter system set STANDBY_ARCHIVE_DEST='您指定的新路径';

为进一步分析,请您在主库和备库,分别执行如下查询:

SELECT thread#, group#, sequence#, bytes, archived ,l.status, blocksize, member
FROM v$log l join v$logfile f using (GROUP#) ORDER BY thread#, group#;
Select thread#, group#, sequence#, bytes, archived, s.status , blocksize, member
FROM v$standby_log s join v$logfile using (GROUP#) order by thread#, group#;


2. 请分别收集出现问题的备库、以及正常同步的备库的 parameter 。
例:
spool standby.txt <<<< 各备库的参数文件,请分别改名
show parameter
spool off


举报

相关推荐

0 条评论