主从复制
- 主从复制简介:
主从复制,是用来建立一个和主数据库完全一样的数据库环境,称为从数据库;主数据库一般是实时的业务数据库,从数据库的作用和使用场合一般有几个:
一、作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作;
二、可在从数据库作备份、数据统计等工作,这样不影响主数据库的性能;
三、实现读写分离;
- 环境介绍操作系统版本: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; 查看数据库名
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的值一致.
- 主数据库安装:
按照linux中安装oracle步骤进行操作,安装oracle软件、开启监听程序、创建数据库实例。
- 从数据库安装
按照linux中安装oracle步骤进行操作,安装oracle软件、开启监听程序。不要创建数据库实例。
6. 主数据库改为强制日志模式:
查看强制日志模式状态:
SQL> select name,log_mode,force_logging from v$database;
修改为强制日志模式:
SQL语句:alter database force logging;
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;
创建standby redolog日志组:
执行SQL语句:
SQL> alter database add standby logfile group 21('/u02/oradata/orcl/standbyredo01.log') size 50m;
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文件
- 主数据库更改监听,重启监听:
[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;
如上,归档路径已经改为/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:适合数据量小的情况
[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; }
方法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@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@odb2 u01]$ rman target /
RMAN>
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
restore database;
release channel c1;
release channel c2;
}
附加:若数据库在归档模式下要导入归档日志:
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;
22. 备数据库启动日志应用:
执行SQL语句:alter database recover managed standby database disconnect from session;
停止日志应用的密令:
alter database recover managed standby database cancel;
23. 查看日志应用情况:
执行SQL语句:set pagesize 100
执行SQL语句:select sequence#,applied from v$archived_log order by 1;
如上,如果发现有个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也是可以的。
若出现乱码,设置语言变量
export NLS_LANG="AMERICAN_AMERICA.ZHS16GBK" ###英文显示
export NLS_LANG="SIMPLIFIED CHINESE_CHINA.UTF8" ##中文显示
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;
- 主从复制验证:
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;
查看日志应用情况
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@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
- 主从复制数据库关闭启动:
主从复制数据库关闭:
主库关闭:
关闭数据库:
执行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