数据库管理-第119期 记一次迁移和性能优化(202301130)

数据库管理-第119期 记一次迁移和性能优化(202301130)

1 迁移

之前因为DV组件没有迁移成功的那个PDB,后来想着在目标端安装DV组件迁移,结果目标端装不上,而且开了SR也没看出个所以然来。只能换一个方向,尝试在源端PDB中删除DV组件,而DV组件的删除从12cR2开始就是一个老大难问题。最终根据How To Enable/Install/Uninstall Database Vault in oracle database ? (Doc ID 2112167.1),发现:

从12.2-19c,DV组件无法在CDB中被卸载
20c中也仅仅只能在PDB中卸载DV组件
注意:现在提供Patch 29890347补丁包允许在PDB中卸载DV组件

有了这个消息,即可开始查看Patch 29890347: ADW18.1CDB: DV UNINSTALL SHOULD BE ALLOWED FROM WITHIN PDBS,这个补丁包比较和一般One-off patch有一点不一样,一般补丁需要关闭数据库应用,因为大多数会去影响数据库的一些运行库文件,而这个补丁包仅仅只包含了替换SQL脚本文件:
在这里插入图片描述
对应README文件里面也没有需要关闭数据库的操作,因此直接应用补丁即可(其实就是个备份、删除、复制的操作系统层面的操作):

unzip p29890347_1913000DBRU_Generic.zip
cd 29890347
$ORACLE_HOME/OPatch/opatch apply

在这里插入图片描述
然后再在需要操作的PDB中卸载DV组件即可:

@?/rdbms/admin/dvremove.sql

脚本运行完成后检查,DV组件已被卸载:
在这里插入图片描述
到这里后续在目标端的PDB克隆迁移操作就可以一股脑的整出来了(其实以前文章有):

create pluggable database pdb_xxx from pdb_xxx@xxx_LINK;
alter pluggable database pdb_xxx open upgrade;
$ORACLE_HOME/OPatch/datapatch -verbose
@?/rdbms/admin/utl32k.sql
@?/rdbms/admin/utlrp.sql
alter pluggable database close immediate
srvctl add service -db xxdbaas -pdb PDB_XXX -service XXXDB -preferred xxdbaas1,xxdbaas2
srvctl start service -db xxdbaas -s xxxdb

2 性能优化

3点过弄完盯了一会儿就睡觉,然后9点过早上另一个业务系统打电话说他们有个需要至少每10分钟跑一次存储过程突然变慢了,之前监控是从1分钟慢慢延长到了5分钟左右,今天突然来到25-30分钟才能完成,虽然对业务本身运行影响不大,但是也带来了一些时效性的问题。没办法,强制开机,顶着沉重的眼皮开始优化。
首先检查了存储过程中涉及的3个基表的情况,统计信息没啥问题,count(*)了一下来把数据刷入Exadata存储缓存,性能没有明显提升;其次EMCC上盯一下这个存储过程,发现主要时间耗费在一个CTAS语句中,单独拎出来跑其中的select语句也很慢,因此在EMCC上把SQL Monitor弄出来并检查执行计划,从最耗时的地方开始查看:
在这里插入图片描述
而且从下面的执行计划中还多次看到在这张FM_xxx_ALL_TEMP表的耗时,与业务方沟通理清了逻辑脉络:

  1. 先用delete命令删除多张临时表,其中包含FM_xxx_ALL_TEMP
  2. 用insert select的方式向这张表插入数据
  3. 在用CTAS新建一张表(就是慢在这个地方,后续做了啥就没必要操心)

这中间就会有2个问题:

  1. delete对表操作可能会引起该表产生大量碎片,且这是个累积的过程,操作实践前面是1->5分钟的缓慢增加当达到一定量后就造成了较大的性能下降,因此建议用truncate来替代delete来清理全表数据
  2. 中间表清理重新插入数据后,统计信息大概率是异常的,因此建议在此操作步骤后添加对这张表的统计信息收集操作

在业务方根据建议完成操作后,涉及存储过程的执行时间立即从25-30分钟下降至了40秒不到,比以前“正常”时候速度还要快一些。至此优化完成。(这里还要感谢Oracle RWP团队的董志平老师的支持)

总结

老规矩,知道写了些啥。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/235783.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚假IP地址攻击的溯源方法

随着网络技术的迅速发展,网络攻击行为也日益猖獗。其中,虚假IP地址攻击是一种较为常见的网络攻击方式,它利用虚假的IP地址,通过互联网对目标进行攻击和入侵。这种攻击方式不仅难以追踪,而且往往会给企业和个人带来巨大…

迭代实现二叉树的遍历

关卡名 理解树的前中后序遍历, 以及如何基于迭代方式实现 我会了✔️ 内容 1.迭代实现二叉树树的前序遍历 ✔️ 2.迭代实现二叉树的中序遍历 ✔️ 3.迭代实现二叉树的后序遍历 ✔️ 理论上,递归能做的迭代一定能做,但可能会比较复杂。上…

CentOS7.5搭建Hadoop-3.3.6集群的详细操作流程-实操版本

一、准备工作 1、安装 VMware,已安装的,跳过此步骤即可 官方正版VMware下载(16 pro):https://www.aliyundrive.com/s/wF66w8kW9ac 安装:选一下安装地址,一直下一步即可。(可能会要…

MIT_线性代数笔记:第 10 讲 四个基本子空间

目录 四个子空间 Four subspaces基和维数 Basis& Dimension新向量空间 New vector space 本讲讨论矩阵的四个基本子空间以及他们之间的关系。 四个子空间 Four subspaces 任意的 m x n 矩阵 A 都定义了四个子空间。 列空间 Column space C(A) 矩阵 A 的列空间是 A 的列向…

深度学习(三):pytorch搭建卷积神经网络

1.常用函数介绍 0 设备准备 device torch.device("cuda:0" if torch.cuda.is_available() else "cpu")这行代码是用来选择设备的,根据是否有可用的 CUDA 设备来选择使用 GPU 还是 CPU 进行计算。 更详细的解释如下: torch.cuda.…

3.Ansible的file模块,我最常用的文件操作

1.file 模块的用法 1.1 官方概念 Set attributes of files, symlinks or directories. Alternatively, remove files, symlinks or directories. Many other modules support the same options as the file’ module - including [copy], [template], and [assemble]. For Wi…

机械臂仿真之vrep如添加视觉传感器

基于视觉的机械臂作业任务,如何在vrep中加入视觉传感器,并获取画面?

Linux常用命令——pwd命令

文章目录 简介pwd命令的参数常见用法及实例1. 基本用法2. 使用 -P 参数3. 使用 -L 参数注意事项 结论 简介 pwd(Print Working Directory)是Linux和Unix系统中的一个常用命令,用于显示当前工作目录的完整路径。这个命令对于定位用户当前所在…

centos7下执行yum命令报错

前言 在Linux系统中,安装nginx时候,需要先安装环境。 Nginx是使用C语言开发,安装nginx需要先从官网上将源码下载,然后编译,编译需要gcc环境,但是在安装gcc环境的时候,执行命令报错。 yum install –y gcc-…

【驱动】串口驱动分析(一)-软件架构

区分不同的终端类型 串行端口终端(/dev/ttySn) 串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。 有段时间这些串行端口设备通常被称为终端设备&#xff0…

快速了解ChatGPT(大语言模型)

目录 GPT原理:文字接龙,输入一个字,后面会接最有可能出现的文字。 GPT4 学会提问:发挥语言模型的最大能力 参考李宏毅老师的课快速了解大语言模型做的笔记: Lee老师幽默的开场: GPT:chat Ge…

利用MCMC 获得泊松分布

写出概率流方程如下 if state 0: if np.random.random() < min([Lambda/2, 1]):state 1else:passelif state 1:if choose_prob_state[i] < 0.5:#选择 1 -> 0&#xff0c;此时的接受概率为min[2/Lambda, 1]if np.random.random() < min([2/Lambda, 1]…