首页 > 数据库 >Oracle数据库主从复制

Oracle数据库主从复制

时间:2022-10-28 16:01:18浏览次数:75  
标签:主从复制 log database 数据库 oracle orcl SQL Oracle

主从复制​


  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数据库主从复制_oracle


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数据库主从复制_数据库_04



创建standby redolog日志组:​

执行SQL语句:​

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


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数据库主从复制_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数据库主从复制_数据库_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数据库主从复制_sql语句_11




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

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


停止日志应用的密令:​

alter database recover managed standby database cancel;​

Oracle数据库主从复制_oracle_12



23. 查看日志应用情况:​

执行SQL语句:set pagesize 100​

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

Oracle数据库主从复制_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数据库主从复制_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数据库主从复制_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​


标签:主从复制,log,database,数据库,oracle,orcl,SQL,Oracle
From: https://blog.51cto.com/u_14355475/5804928

相关文章

  • Oracle数据库主从切换
    Oracle主从切换​主从查看打开状态:[root@odb1~]#su-oracleexportNLS_LANG="AMERICAN_AMERICA.ZHS16GBK"[oracle@odb1~]$source.bash_profile[oracle@odb1~]$sql......
  • Oracle数据库备份恢复
    ORACLE数据库备份恢复​一.​1.备份生产数据库​在线备份:​采用ARCHIVELOGmode方式备份,可以脱机或联机备份。需要备份数据库和归档日志​$.oraenvORACLE_SID=[prim]?......
  • Oracle安装示例数据库(Linux)
    前言数据库示例(OracleDatabaseExamples)包含了一系列的示例脚本和产品功能演示的Schema信息,在学习Oracle数据库的过程中可以通过这些示例更好的掌握数据库相关的选项和......
  • 10月28日Mybatis结果与数据库结果不一致
    Mybatis结果与数据库结果不一致1数据库有结果,而mybatis无结果2数据库1条结果,而mtbatis三条结果报错情况:点击查看代码CreatinganewSqlSessionSqlSession[org.apa......
  • sqllite (2) - c# .net 使用 sqllite 增删改查操作数据库
    sqllite(2)-c#.net使用sqllite增删改查操作数据库环境配置:开发环境:vs2013运行时版本:framework4.0 sqllite版本:非混合模式的静态链......
  • mysql的主从复制原理
    MySQL主从复制面试和原理1.什么事是主从赋值主从复制是用来建立一个主数据库master和一个一样的从数据库,主数据库一般是准实时update,inster,delete从数据库一般都是进行......
  • 经典数据库面试题
      题目和答案来源:https://www.cnblogs.com/pythonxiaohu/p/5749864.html3、查询平均成绩大于60分的同学的学号和平均成绩;思路:根据学生分组,使用avg获取平均值,通过havin......
  • Linux环境下mysql数据库备份操作说明
    如下:一、 编写数据库备份shell脚本1、登录服务器,进入mysql安装目录。例:cd/usr/local/mysql2、创建目录dbBakShell和dbbak,用于放置数据备份脚本及备份文件mkdir d......
  • 关系数据库标准语言sql(练习题)
    学生选课数据库中表结构如下:学生(学号,姓名,年龄,性别,所在系);课程(课程号,课程名,学分,先行课);选课(学号,课程号,成绩);在学生选课数据库中运用SQL语言实现下面的数据查询操作。求选修......
  • Oracle RAC调整网卡MTU值
    ---原文https://cloud.tencent.com/developer/article/1658019在OracleRAC的环境中,如果我们发现OSW监控数据显示包重组失败率过高,就需要引起足够的重视,因为这很可能会引......