前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >数据同步软件 Shareplex 异常重建详细步骤(Oracle 数据库)

数据同步软件 Shareplex 异常重建详细步骤(Oracle 数据库)

作者头像
Lucifer三思而后行
发布于 2021-08-31 09:50:20
发布于 2021-08-31 09:50:20
90800
代码可运行
举报
运行总次数:0
代码可运行

目录

前言

最近有客户的 shareplex 因为一些稀奇古怪的原因又挂了,由于邮件告警问题,没有及时通知到,并且归档已经被删除,备份也追溯不回丢失的归档日志。

经过与客户确认repo库没有历史数据需保留,直接重建修复!

准备

确认以下条件均已具备:

  • 有可用备份;
  • 磁盘空间足够;
  • 由于使用 networker 备份,需要提前安装备份恢复所需客户端;

本次重建目标端使用 rman 进行全库恢复。

重建过程

确认数据库大小

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select sum(bytes/1024/1024/1024) from dba_segments;
select sum(bytes/1024/1024/1024) from dba_data_files;

确认目标端磁盘空间足够!

确认备份可用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
--查询备份
set line222
set pagesize100
col status for a10
col input_type for a20
col INPUT_BYTES_DISPLAY for a10
col OUTPUT_BYTES_DISPLAY for a10 
col TIME_TAKEN_DISPLAY for a10

select input_type,
       status,
       to_char(start_time,
               'yyyy-mm-dd hh24:mi:ss'),
       to_char(end_time,
               'yyyy-mm-dd hh24:mi:ss'),
       input_bytes_display,
       output_bytes_display,
       time_taken_display,
       COMPRESSION_RATIO
  from v$rman_backup_job_details
 where start_time > date '2021-08-10'
 order by 3 desc;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list backup of controlfile;

ctrl_mesdbtj_65271_1_1081487814

确认最新的有效备份,记录控制文件。

安装 networker 客户端

安装包上传目标端安装

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
lgtoclnt-9.2.1.4-1.x86_64.rpm
lgtonmda-9.2.1.4-1.x86_64.rpm

建议使用 yum install 进行安装,防止依赖包缺失,前提是 yum 源已配置。

按顺序安装:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
yum install -y lgtoclnt-9.2.1.4-1.x86_64.rpm
systemctl start networker
systemctl start networker
yum install -y lgtonmda-9.2.1.4-1.x86_64.rpm

lgtoclnt 安装完成后,确保服务正常运行,再安装 lgtonmda

配置解析

必须将目标端和源端,networker 服务端的ip和主机名解析全部写入 /etc/hosts 文件。

目标端链接 NMO 库文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd $ORACLE_HOME/lib
ln –s /usr/lib/libnwora.so libobk.so

至此,networker 目标端已安装完成。

清理 shareplex 旧环境

源端和目标端关闭 shareplex

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp_ctrl
shutdown

源端和目标端执行清理脚本

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/quest/bin/ora_cleansp splex2300/splex2300
/data/quest/bin/ora_cleansp splex2300/splex2300

源端和目标端重新开启 shareplex 环境

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp_cop -u2300&

本文 shareplex 使用端口为 2300,读者需根据实际情况更换,如 2400、2500 等。

目标端停止 post 进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
stop post

最后全部恢复完毕之后再开启。

开始 rman 恢复

确保目标端数据库已开启到 nomount 状态。

恢复控制文件

连接 rman 客户端后执行恢复控制文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
run {
allocate channel c1 type 'SBT_TAPE';
send 'NSR_ENV=(NSR_SERVER=这里填写 networker 服务端主机名,NSR_CLIENT=这里填写源端备份主机名)';
restore controlfile from '这里填写最新备份控制文件名称';
release channel c1;
}
``

恢复完之后开启目标端数据库到 mount 状态。

### 恢复数据

由于数据库大概有 1-2 T 的大小,恢复时间很长,因此建议将恢复脚本放在后台进行执行,脚本如下:

```bash
#!/bin/bash
source ~/.bash_profile
backtime=`date +"20%y%m%d%H%M%S"`
rman target / log=/home/oracle/rman_repo_$backtime.log<<EOF
run {
allocate channel c1 type 'SBT_TAPE';
allocate channel c2 type 'SBT_TAPE';
allocate channel c3 type 'SBT_TAPE';
allocate channel c4 type 'SBT_TAPE';
send 'NSR_ENV=(NSR_SERVER=这里填写 networker 服务端主机名,NSR_CLIENT=这里填写源端备份主机名)';
set newname for database to '/data/mesdb/%b';
restore database;
switch datafile all;
recover database;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
}
exit;
EOF

执行 sh rman_sp.sh & 进行后台恢复。

???? 注意: 通道根据实际情况进行修改,由于源端是 rac 环境,目标端是单机环境,因此数据文件路径需要 set newname 进行转换,最后执行初次 recover database

备份恢复完之后,由于缺少归档,所以需要追归档。

追归档日志

由于备份时间与当前时间存在较大时差,在获取当前源端的 scn 进行 recover 时,必然需要追大量的归档日志文件,为了减少 shareplex 积压,因此提前追归档日志到当前时间。

源端备份归档日志到当前最新:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
backup archivelog from sequence 71457 until sequence 71986 thread 1;
backup archivelog from sequence 65247 until sequence 65780 thread 2;

备份成功后拷贝至目标端,注册目录后执行 recover

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
catalog start with '/data/archivelog/';
recover database;

追完归档之后,激活源端 shareplex 的 config 文件。

激活源端 config 配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
list config
activate config ORA_config_20210825 nolock
show config

激活成功后,检查源端数据库中是否存在 长事务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
select start_time from gv$transaction;

如果有长事务,可以确实是否可以杀掉,杀掉后才能继续操作。

根据以下 SQL 可以获取到事务的详细情况:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
set linesize 260 pagesize 10000
column sess       format a21 heading "SESSION"
column program    format a18
column clnt_pid   format a8
column machine    format a25
column username   format a12
column osuser     format a13
column event      format a32
column waitsec    format 999999
column start_time format a18
column sql_id     format a15
column clnt_user  format a10
column svr_ospid  format a10

ALTER SESSION SET NLS_DATE_FORMAT = 'yyyy/mm/dd hh24:mi:ss';

set feedback off
set echo off

set head off
select chr(9) from dual;
select 'Waiting Transactions'||chr(10)||'====================' from dual;
set head on
select /*+ rule */
       lpad(nvl(s.username,' '),8)||'('||s.sid||','||s.serial#||')' as sess,
       p.spid as svr_ospid,
       nvl(osuser,' ') as clnt_user,
       s.process as clnt_pid,
       substr((case instr(s.PROGRAM, '@')
                 when 0 then
                   s.program
                 else
                   case instr(s.PROGRAM, '(TNS V1-V3)')
                     when 0 then
                       substr(s.program, 1, instr(s.PROGRAM, '@') - 1) || substr(s.program, instr(s.PROGRAM, '(') - 1)
                     else
                       substr(s.program, 1, instr(s.PROGRAM, '@') - 1)
                   end
                                                         end),
              1, 18) as program,
       (case 
            when length(s.MACHINE) > 8 then substr(s.machine,1,8)||'~'
            else s.machine
        end
       ) || '('||nvl(s.client_info, 'Unknown IP')||')' as machine, s.sql_id,
       substr(s.event, 1, 32) as event,
       s.seconds_in_wait      as waitsec
  from v$transaction t,v$session s,v$process p
 where t.ses_addr=s.saddr and s.paddr=p.addr
 order by s.seconds_in_wait, s.program, s.machine;

可以通过 SESSION 字段来杀掉事务:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter system kill session '1841,44697';

如果杀不掉,则使用 svr_ospid 系统层进行 kill:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kill -9 27353

确认没有长事务后,继续下一步操作。

源端获取 scn 号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
col current_scn format 9999999999999999
select current_scn from v$database;

记录获取到的 SCN 号:72863106548

目标端 rman 恢复至指定 scn

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
recover database until scn 72863106548;

因为源端一直在运行,激活期间到SCN号必然会有新的归档产生,提示缺少归档日志,因此需要去源端拷贝缺少的归档日志,再次进行 recover。

目标端开启 resetlogs 状态

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter database open resetlogs;

确认 recover 完成恢复之后,基本恢复结束,可以开启目标端到 resetlogs 状态。

rman 恢复后收尾

目标端 reconcile 至指定SCN号

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
reconcile queue q1 for o.mesdb2-o.mesdb scn 72863106548
reconcile queue q2 for o.mesdb2-o.mesdb scn 72863106548
reconcile queue q3 for o.mesdb2-o.mesdb scn 72863106548
reconcile queue q4 for o.mesdb2-o.mesdb scn 72863106548
reconcile queue q5 for o.mesdb2-o.mesdb scn 72863106548

非必须操作,如果出现 hang 住的情况,需要在源端 shareplex 执行 flush 操作疏通通道:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
flush o.mesdb2 to mes-repo queue q1
flush o.mesdb2 to mes-repo queue q2
flush o.mesdb2 to mes-repo queue q3
flush o.mesdb2 to mes-repo queue q4
flush o.mesdb2 to mes-repo queue q5

???? 注意: 源端执行过 flush 的通道,目标端 start post 之后需要再次执行 start post queue 指定队列名 ,否则无法开启 post。

目标端运行 cleanup.sql 来清空内部表信息

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
cd /data/quest/bin/
sqlplus splex用户账号/splex账户密码
@cleanup.sql

该步骤用于清理源端 splex 用户相关数据。

目标端禁用所有 trigger

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 'alter trigger ' || owner || '.' || trigger_name || ' disable;'
  from dba_triggers
 where owner in (需要同步的用户);

将输出结果复制执行即可!

目标端禁用所有约束

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 'alter table '||owner||'.'||table_name||' disable constraint '||constraint_name||';' from dba_constraints
where constraint_type='R' and owner in (需要同步的用户);

将输出结果复制执行即可!

禁用job

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
alter system set job_queue_processes=0;

确保 job 任务不会运行!

目标端开启 post 进程

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
sp_ctrl
start post

确保所有队列均已处于正常 running 状态。

由于目标端执行 reconcile 时 2,4 队列 hang 住,因此需要单独 start post queue 指定队列名 来开启:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start post queue q2
start post queue q4

状态已全部正常 running。

重建后检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
qstatus
show post queue q2
show log reverse

通过命令查看同步是否正常,以及同步速度是否正常。再次确认邮件告警是否恢复正常。

写在最后

shareplex 重建恢复的流程还算复杂,因此需要做好必备的告警措施,防止遇到停止导致问题发生,无法及时补救的情况。

分享两个告警脚本:

1、监控 shareplex 进程是否正常运行:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
if [ -f ~/.bash_profile ];
then
  . ~/.bash_profile
fi
  count=`ps -ef|grep sp_cop|wc -l`
  if [ "${count}" -ne 2 ]; 
    then
      ps -ef|grep sp_cop > /tmp/sp_cop.log
      mail -s "Shareplex sp_cop process shutdown" 邮箱地址 < /tmp/sp_cop.log
  fi

2、监控 shareplex 队列是否存在异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#!/bin/bash
if [ -f ~/.bash_profile ];
then
  . ~/.bash_profile
fi
rm -rf /data/quest/error.log
echo "show "|sp_ctrl|grep "Idle"     >> /data/quest/error.log
echo "show "|sp_ctrl|grep "Stopped"  >> /data/quest/error.log

# -s 文件大小非0时为真
if  [ ! -s /data/quest/error.log ]
then
    rm -rf /data/quest/error.log   #文件大小为0 删除
fi

if  [ -s /data/quest/error.log ]
  then
mail -s "Shareplex error" 邮箱地址 < /data/quest/error.log
fi

???? 如有问题,请及时指正,谢谢!


本次分享到此结束啦~

如果觉得文章对你有帮助,点赞、收藏、关注、评论,一键四连支持,你的支持就是我创作最大的动力。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
google scholar_google
DOI全称为Digital Object Unique Identifier,即数字对象唯一标识符,通俗一点来讲,DOI就是一篇文献的身份证
全栈程序员站长
2022/11/10
6680
论文人必看!Deepseek保姆级指令
在撰写论文的过程中,规范的格式和清晰的结构是保证论文质量的关键。今天将为大家分享一份高效且专业的论文撰写指令模板,帮助你更好地组织论文内容,确保格式规范,从而提升论文的整体质量和学术水平。
用户11203141
2025/03/24
2010
论文人必看!Deepseek保姆级指令
导师:顶尖学者都在用的ChatGPT论文选题指令!让你的研究主题脱颖而出
接下来,我将详细阐述这一模型的各个组成部分,并提供具体的ChatGPT指令示例,以便您能直接应用于自己的研究实践中。
用户11203141
2025/03/06
1300
导师:顶尖学者都在用的ChatGPT论文选题指令!让你的研究主题脱颖而出
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
一教授为了抗议三流科学杂志发送垃圾邮件,回复了一篇全文只重复七个脏话字眼的论文,可没想到的是,它竟然还被 出!版!了!
zenRRan
2023/01/07
5660
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
自己一些思考 | 人工智能学硕 研究生阶段的学习规划
不断提高自己信息检索与利用,独立解决问题能力: 学术搜索:谷歌学术、AMiner、PubMed、Semantic Scholar、百度学术、SCI-Hub等 arXiv、The latest in Machine Learning | Papers With Code,DBLP、Web of Science 、领研、以及经典论文的 related work & cited by 搜索引擎:谷歌、必应、SearXNG以及一些聚合搜索等 学校买了的一些专业数据库,以及专业方向有关的好的期刊、会议。公众号媒体等
叶庭云
2022/06/05
8370
导师:利用ChatGPT这样写文献综述,轻松发SCI
研究问题是文献综述的核心,它不仅指导研究方向,还决定了需要从文献中提取的关键信息。定义研究问题时,应力求明确、具体,并涵盖您所关注的主题。
用户11203141
2025/03/06
1060
导师:利用ChatGPT这样写文献综述,轻松发SCI
拯救Sci-Hub的「最后行动」:把77TB论文,转化成850个BT种子传播下去
在出版商的重重压力之下,「知识开源领域」的著名网站 Sci-Hub 停更已有半年了。
机器之心
2021/06/08
1.4K0
免费下载中英文文献,这些强大的方法不容错过
(很多文章中都推荐各种杂七杂八的网站,但就小编的个人经验,最好是2~3个功能强大的途径就行了,毕竟科研狗平时也没有那么多的脑子用在记各种网址上......)
百味科研芝士
2019/05/23
3.1K0
如何有效提高你的科研工作效率
工欲善其事,必先利其器。充分发挥每个工具的优势可以显著提高我们的工作效率。为了更好的工作和科研,今天给大家介绍一些提高效率的工具。
郭好奇同学
2023/02/15
1.7K1
如何有效提高你的科研工作效率
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
科研猫后台回复「期刊名称」便可获得想要查询的期刊详情,含影响因子、JCR/中科院分区、出版周期、发文量、预警等级、自引率等。
用户6317549
2022/10/31
4380
惊呆了!这篇论文全文都是脏话,可编辑部居然对它评价极佳并发表了!
分享一些实用的在线网站(免费)
该图片由Coffee Bean在Pixabay上发布 受到公众号「曾少贤」的启发,自己也整理了一些我在生活中经常使用到的在线网站,涉及的领域有图片、设计、文档、编程、学习等方面,这里分享出来,希望可以
出其东门
2019/07/19
4.9K0
分享一些实用的在线网站(免费)
分享几种论文写作神器,提高你的写作效率
Zotero作为一款协助科研工作者收集、管理以及引用研究资源的免费软件,如今已被广泛使用。此篇使用说明主要分享引用研究资源功能,其中研究资源可以包括期刊、书籍等各类文献和网页、图片等。欢迎所有共同学习使用的朋友提供批评意见或补充使用经验。
黄博的机器学习圈子
2020/04/21
2.6K0
分享几种论文写作神器,提高你的写作效率
分享一些做课题调查的方法
拿到一个新的研究课题时,可以先去知网之类的地方搜索一些国内硕博士的毕业论文,通过他们的论文可以先对课题有一个初步的认知。但是再往后就建议选择在google scholar上搜索一些外文论文了,当然这里不是随便乱搜索,而是要找领域内的知名期刊、会议论文来看,那么如何知道什么样的期刊、会议是优秀的期刊、会议呢?有两种途径:
灰度五十
2022/03/08
5950
分享一些做课题调查的方法
写综述的用词云真的不香吗?python词云图制做
在综述文章里,难道不要统计文献情况吗?统计的文献情况关键词那么多,难道用词云它不香吗!!!!!!!!!?
一个有趣的灵魂W
2020/09/15
1.1K0
写综述的用词云真的不香吗?python词云图制做
为全人类知识平等,她缔造了学术圈小黄网,6000万种子免费下
“世有不公之法,我们是要安于循守,还是且改且守、待其功成?或是即刻起而破之?” —— 梭罗 1849 2017年6月,美国纽约地方法院宣判了一起版权侵权案件,原告是全世界最大的学术出版集团爱思唯尔(Elsevier),被告则是一家名为 Sci-hub(以下简称 Sci) 的网站。 起诉事由非常简单:Sci 盗取原告以及其他多家出版商的付费论文资源,放在网上供人免费下载。 法院最终判决 Sci 需支付出版商 Elsevier 集团1500万美元赔偿,同时要求网络服务商封杀 Sci的域名。 看起来这是一个很
企鹅号小编
2018/01/12
3.1K0
为全人类知识平等,她缔造了学术圈小黄网,6000万种子免费下
10万引大佬分享「写论文10大技巧」,连怎么沟通审稿人都提到了 | 科研党福利
一位堪称“NS论文收割机”的学术大牛,为各位奉上了10点关于写、发论文的锦囊妙计。
量子位
2022/12/09
3440
10万引大佬分享「写论文10大技巧」,连怎么沟通审稿人都提到了 | 科研党福利
在印度展开全球文献数据挖掘,美国专家的大胆做法登上Nature
Carl Malamud 站在服务器前,他的团队准备对 7300 万篇论文进行数据挖掘。
机器之心
2019/07/19
5560
在印度展开全球文献数据挖掘,美国专家的大胆做法登上Nature
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
这几天在搞论文图,唉说实话抠图这种东西真能逼死人。坐在电脑前抠上一天越看越丑,最后把自己丑哭了……
短短的路走走停停
2019/11/19
6.1K0
干货 | 画论文折线图、曲线图?几个代码模板轻松搞定!
【数学建模】——【新手小白到国奖选手】——【学习路线】
掌握Python基础是进行数学建模的第一步。Python的易用性和丰富的库使其成为数据科学和数学建模的理想选择。
小李很执着
2024/06/21
1.1K0
【数学建模】——【新手小白到国奖选手】——【学习路线】
Nature评选2016年十大杰出科学人物
大数据文摘作品,转载要求见文末 编译团队|廖远舒,王婷 在追寻世界真相之路上,可能是寂寞的,但不是孤单的。Nature此次评选出2016年度十大杰出人物,他们或来自信息互联网、物理、生物研究等各样不同领域,不过他们却都在做着一件事——用自己的专业知识,探寻心中欲求得的真相。 GABRIELA GONZALEZ:引力间谍 物理学家, 帮助捕获寻求已久的引力波的第一个直接迹象 一年前,Gabriela Gonzalez正在努力保守她生命中最大的秘密。在美国的两个巨型探测器已经捕获到引力波的迹象 ——由爱因斯坦
大数据文摘
2018/05/22
6300
推荐阅读
相关推荐
google scholar_google
更多 >
LV.1
这个人很懒,什么都没有留下~
目录
  • 目录
  • 前言
  • 准备
  • 重建过程
    • 确认数据库大小
    • 确认备份可用
    • 安装 networker 客户端
      • 安装包上传目标端安装
      • 配置解析
      • 目标端链接 NMO 库文件
    • 清理 shareplex 旧环境
      • 源端和目标端关闭 shareplex
      • 源端和目标端执行清理脚本
      • 源端和目标端重新开启 shareplex 环境
      • 目标端停止 post 进程
    • 开始 rman 恢复
      • 恢复控制文件
      • 追归档日志
      • 激活源端 config 配置文件
      • 源端获取 scn 号
      • 目标端 rman 恢复至指定 scn
      • 目标端开启 resetlogs 状态
    • rman 恢复后收尾
      • 目标端 reconcile 至指定SCN号
      • 目标端运行 cleanup.sql 来清空内部表信息
      • 目标端禁用所有 trigger
      • 目标端禁用所有约束
      • 禁用job
      • 目标端开启 post 进程
    • 重建后检查
  • 写在最后
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文