当前位置: 首页 > 编程日记 > 正文

linux下出现重定义,Oracle Online Redefinition在线重定义

在线重定义特性进行数据表Online的结构变动操作。本篇我们从一个较复杂的案例出发,讨论复杂变化情况下如何进行Online Redefinition,以及dbms_redefinition包各个关键方法的作用。

3、一个分区表的重定义动作

我们定义一个数据表T。

SQL> create table t as select object_id, object_name, created from dba_objects;

Table created

SQL> desc t;

NameTypeNullable Default Comments

----------- ------------- -------- ------- --------

OBJECT_IDNUMBERY

OBJECT_NAME VARCHAR2(128) Y

CREATEDDATEY

SQL> alter table t add constraint pk_t primary key (object_id);

Table altered

SQL> select count(*) from t;

COUNT(*)

----------

75192

期望的重定义目标有几个:首先使用object_id进行分区、created字段从date类型变为timestamp类型。另外object_name字段改名为object_name_2。中间定义表如下:

(分区,created变类型,object_name字段改名)

SQL> create table t_interim

2(object_id number,

3object_name_2 varchar2(128),

4created timestamp

5)

6partition by range(object_id)

7(

8partition p1 values less than (10000),

9partition p2 values less than (50000),

10partition p3 values less than (maxvalue)

11)

12;

Table created

首先,判断是否可以进行重定义操作。

SQL> set serveroutput on;

SQL> exec dbms_redefinition.can_redef_table( 'SCOTT','T',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

启动重定义动作。

SQL> exec dbms_redefinition.start_redef_table('SCOTT','T','T_INTERIM',col_mapping => 'object_id object_id, object_name object_name_2, to_timestamp(created) created',options_flag => dbms_redefinition.cons_use_pk);

PL/SQL procedure successfully completed

SQL> set timing on;

注意这个col_mapping映射关系设置,如果存在列名转换,就在这里将列关系映射说明出来。如果需要进行字段类型转换,要书写函数关系将映射计算规则定义出来。

Oracle在线重定义的基础是物化视图技术。此时,我们检查试图user_mviews,可以看到有一个新的物化视图生成,并且存在对应的物化视图日志。

SQL> col query for a20;

SQL> select mview_name, container_name, query, REFRESH_METHOD from user_mviews;

MVIEW_NAME CONTAINER_NAMEQUERYREFRESH_METHOD

---------- -------------------- -------------------- --------------

T_INTERIMT_INTERIMselect object_id obj FAST

ect_id, object_name

object_name_2, to_ti

mestamp(created) cre

ated from "SCOTT"."T

""T"

Executed in 0.031 seconds

SQL> select master, log_table from user_mview_logs;

MASTERLOG_TABLE

------------------------------ ------------------------------

TMLOG$_T

Executed in 0.016 seconds

Start方法创建了一个Fast刷新模式的物化视图对象t_interim。物化视图中最重要的物化视图日志,名称为MLOG$_T。

此时,数据表数据情况如下。

--源数据表和中间数据表已经实现同步

SQL> select count(*) from t;

COUNT(*)

----------

75192

Executed in 0.016 seconds

SQL> select count(*) from t_interim;

COUNT(*)

----------

75192

Executed in 0.031 seconds

--没有DML语句过程,物化视图日志尚空

SQL> select count(*) from mlog$_t;

COUNT(*)

----------

0

Executed in 0.015 seconds

综合上述内容,说明start_redef_table的作用是下面几个方面:

ü以Interim数据表为名称,创建一个Fast刷新模式的物化视图对象;

ü从源数据表中将数据加载到Interim中;

ü创建物化视图日志;

如果在这个过程中,发生DML操作,也就是说在start过程和之后有DML操作,有新数据插入到其中。

SQL> select max(object_id) from t;

MAX(OBJECT_ID)

--------------

76847

Executed in 0 seconds

SQL> insert into t select object_id+76847, object_name, created from dba_objects;

75199 rows inserted

Executed in 7.297 seconds

SQL> select count(*) from t;

COUNT(*)

----------

150391

Executed in 0.016 seconds

中间表的数据内容保持不变,并且物化视图日志积累了需要刷新的数据条目。

SQL> select count(*) from t_interim;

COUNT(*)

----------

75192

Executed in 0.016 seconds

SQL> select count(*) from mlog$_t;

COUNT(*)

----------

75199

Executed in 0.016 seconds

此时存在数据的不一致和不统一。Oracle推荐要求使用sysnc_interim_table方法将重定义过程中出现的变化数据刷新。

SQL> exec dbms_redefinition.sync_interim_table('SCOTT','T','T_INTERIM');

PL/SQL procedure successfully completed

Executed in 195.937 seconds

刷新7万左右数据,使用了超过三分钟时间。在这个过程中,我们可以看到刷新物化视图过程。

SQL> select * from v$mvrefresh;

SIDSERIAL# CURRMVOWNERCURRMVNAME

---------- ---------- ------------------------------- -------------------------------

4713 SCOTTT_INTERIM

刷新开始和结束过程,我们可以看到物化视图刷新过程中的时间变化。

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAMELAST_REFRESH

---------- --------------------

T_INTERIM2013-9-10 9:07:01

SQL> select name, LAST_REFRESH from user_mview_refresh_times;

NAMELAST_REFRESH

---------- --------------------

T_INTERIM 2013-9-10 9:15:28

结束后,我们发现interim表和mlog$_t日志表数据的变化。

SQL> select count(*) from t_interim;

COUNT(*)

----------

150391

Executed in 0.016 seconds

--无变化数据需要刷新了

SQL> select count(*) from mlog$_t;

COUNT(*)

----------

0

Executed in 0.016 seconds

综合上面的实验,我们知道方法sync_interim_table的实质是进行一次物化视图快速刷新。这个方法持续的时间根据不同数据量和物化视图刷新算法来决定,这个过程中,并不会引起很多锁定动作。而且,在在线重定义过程中,这个方法是可以重复执行多次的。

下面,需要将原有数据表中的约束关系刷新到目标结构上。

SQL> set serveroutput on;

SQL> declare

2error_count number:=0;

3begin

4dbms_redefinition.copy_table_dependents(uname => 'SCOTT',orig_table => 'T',int_table => 'T_INTERIM',

5copy_indexes => dbms_redefinition.cons_orig_params,

6num_errors => error_count);

7dbms_output.put_line(to_char(error_count));

8end;

9/

0

PL/SQL procedure successfully completed

Finish过程主要完成六个步骤操作:

ü执行sysnc_interim_table命令,将中间表数据尽可能靠近源数据表;

ü锁定源数据表T,使之后不能有任何变化发生在这个数据表上;

ü再次执行sysnc_interim_table命令,这个时候执行的时间不会很长;

ü将源数据表和Interim数据表表名进行置换;

ü注销unregistered物化视图,并且删除掉物化视图日志;

ü释放开在中间表上的锁定;

SQL> exec dbms_redefinition.finish_redef_table('SCOTT','T','T_INTERIM');

PL/SQL procedure successfully completed

Executed in 1.953 seconds

SQL> select count(*) from mlog$_t;

select count(*) from mlog$_t

ORA-00942:表或视图不存在

检查处理结果。

--按照原定计划,数据表变化成功;

SQL> desc t;

NameTypeNullable Default Comments

------------- ------------- -------- ------- --------

OBJECT_IDNUMBERY

OBJECT_NAME_2 VARCHAR2(128) Y

CREATEDTIMESTAMP(6)Y

SQL> exec dbms_stats.gather_table_stats(user,'T',cascade => true);

PL/SQL procedure successfully completed

Executed in 2.719 seconds

分区和主键对象实现成功。

SQL> select partition_name from user_tab_partitions where table_name='T';

PARTITION_NAME

------------------------------

P1

P2

P3

Executed in 0.062 seconds

SQL> select constraint_name, constraint_type from user_constraints where table_name='T';

CONSTRAINT_NAMECONSTRAINT_TYPE

------------------------------ ---------------

PK_TP

Executed in 0.062 seconds

我们之前讨论的都是单表情况下的处理,如果是涉及到多表关系,例如外键关系表下的重定义,是怎么处理呢?

0b1331709591d260c1c78e86d0c51c18.png

相关文章:

Lr IP欺骗设置

IP欺骗设置IP工具:IP Wizard 开启IP欺骗时会关闭DHCP(也就是关闭IP自动获取 更改为手动设置IP) 注:添加IP欺骗,和释放IP,都要重启机器后才会生效,IP Wizard要管理员身份运行; 在con…

2022-2028年中国异戊二烯橡胶产业竞争现状及发展规模预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国异戊二烯橡胶行业市场行业相关概述、中国异戊二烯橡胶行业市场行业运行环境、分析了中国异…

Mysql新安装服务启动失败

#备注如果新安装的mysql启动报错,请检查my.cnf文件的innodb_buffer_pool_size设置的值,最好为内存的总大小的70%。转载于:https://blog.51cto.com/azhuang/1553167

js实现图片上传本地预览

演示地址&#xff1a;https://xibushijie.github.io/static/uploadImg.html <!DOCTYPE> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><title>图片上传本地预览</title><style…

Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity

Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity MP4 |视频:h264&#xff0c;1280720 &#xff08;部分1920X1080&#xff09; |音频:AAC&#xff0c;44100 Hz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&a…

c语言中变量有什么作用是什么,C语言里面局部变量和临时变量有什么区别?

typedefexternstatic_Thread_localregister其中&#xff0c;除了 typedef (放在这里仅仅是为了描述语法方便)&#xff0c;其它几个(配合变量声明的位置)描述了的变量的 linkage 和 storage duration。但是 storage class specifier 跟 linkage / storage duration 并不是一一对…

Android Acitivity 生命周期

Fragment 的生命周期&#xff1a; Android Fragment 生命周期及其API使用&#xff08;建议使用自定义View替换Fragment&#xff09; Activity的生命周期&#xff1a; (1)启动Activity&#xff1a;系统会先调用onCreate方法&#xff0c;然后调用onStart方法&#xff0c;最后调用…

Docker入门六部曲——基本引导

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8733 预备知识 虽然我们接下来还是会介绍很多概念&#xff0c;但是最好还是提前了解什么是Docker&#xff0c;和为什么你会使用Docker。 我们假设你对下面这些知识比较熟悉&#xff1a; IP地址和端口虚拟机编辑配置…

fragment切换事件

2019独角兽企业重金招聘Python工程师标准>>> 我使用fragment fragmenttabhost的时候&#xff0c;如果切换tab&#xff0c;对应的Fragment就会执行onDestroyView &#xff0c;再切换回来又会执行onCreateView()&#xff0c;如此反反复复。destroyView &#xff0c;c…

quartz关闭DBUG日志

使用quartz调度任务&#xff0c;每次启动产生大量debug日志&#xff0c;机器都要被累死了。 试过很多方法都不好使&#xff0c;包括在log4j.properties里配置 quartz源代码&#xff0c;发现它的日志输出用的是slf4j&#xff0c;而不是log4j,所以想到用logback.xml来控制。 把他…

UE卡通风格游戏场景制作视频教程

UE卡通风格游戏场景制作视频教程 UE卡通风格游戏场景制作视频教程 教程大小&#xff1a;4.53G 含项目文件 3840X2160 mp4 语言&#xff1a;英语中英字幕&#xff08;机译&#xff09; 本教程是关于UE4卡通渲染游戏环境场景制作训练视频教程&#xff0c;时长&#xff1a;4小时…

c语言顺序表有效元素长度,用C语言描述的顺序表类型

2.2.1 顺序表用C语言描述的顺序表类型如下所示&#xff1a;// 存储结构const int MAXLISTSIZE80; // 预设的存储空间最大容量typedef struct {ElemType *elem;    // 存储空间基址int length;      // 当前长度int listsize;     //允许的最大存储容量(以sizeof(E…

css样式之边框和内外边距

1、css样式之边框&#xff1a;border 实心的边框&#xff1a; <!DOCTYPE html><html> <head> <meta http-equiv"content-type" content"text/html;charsetutf-8"> <title>页面一</title> </head> <body>…

2022-2028年中国乙烷行业投资分析及前景预测报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙烷行业市场行业相关概述、中国乙烷行业市场行业运行环境、分析了中国乙烷行业市场行业的…

SQL Server 中master..spt_values的应用

今天在做数据分析报表的时候遇到一个这样的问题。表结构如下。部门编码、部门名称、部门人员ID&#xff08;中间用逗号分割&#xff09;我想通过和人员表链接&#xff0c;查询出一个新的数据集&#xff0c;查询出的结果集格式如下&#xff1a;人员信息&#xff08;ID或者姓名&a…

ora-1031解决一例

今天建立了一个测试环境&#xff0c;打算再次测试logical standby的建制。在建制物理standby时&#xff0c;发现archive log无法传递到standby,手工可以。察看log,发现如下错误&#xff1a; Errors in file c:\oracle\product\10.2.0\admin\it\bdump\it_arcp_2116.trc: ORA-010…

Revit:概念建模环境技能学习 Revit: Conceptual Modeling Environment

Revit:概念建模环境技能学习 Revit: Conceptual Modeling Environment MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 云桥网络 平台huo取 教程 技能水平:高级|语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&…

1 23 456c语言,2014年计算机二级考试C语言模拟题(1)

2014年计算机二级考试C语言模拟题(1)21.下列程序的运行结果为(  )。#includemain(){struct date{int year&#xff0c;month&#xff0c;day;}today;printf("%d\n"&#xff0c;sizeof(struct date));}A.8B.6C.10D.1222.有以下程序&#xff1a;#include<struct s…

屏蔽浏览器默认样式 user agent stylesheet

user agent stylesheet <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> table{border-collapse: collapse;border-spacing: 0;} 转载于:https://www.cnblogs.com/jxk…

Docker入门六部曲——服务

原文链接&#xff1a;http://www.dubby.cn/detail.html?id8735 准备 已经安装好Docker 1.13或者以上的版本。安装好Docker Compose。如果你是用的是Docker for Mac和Docker for Windows&#xff0c;那么不用担心&#xff0c;这是自带的。如果是Linux&#xff0c;那么需要你去…

AngularJs学习笔记--Forms

控件&#xff08;input、select、textarea&#xff09;是用户输入数据的一种方式。Form&#xff08;表单&#xff09;是这些控件的集合&#xff0c;目的是将相关的控件进行分组。 表单和控件提供了验证服务&#xff0c;所以用户可以收到无效输入的提示。这提供了更好的用户体验…

天秤座的爱情(转)

若不是秤子们爱上了爱情&#xff0c;或许&#xff0c;也就不用独自承受那么多。他们的爱情就像在上演的一部电影&#xff0c;他们就在这出戏里&#xff0c;眼看着它从开始到结束。落幕并不可怕&#xff0c;秤子们在乎的是他们成就了一部电影。 秤子们不喜欢落入俗套中的爱情。与…

虚幻引擎C++终极射手教程 Unreal Engine C++ The Ultimate Shooter Course

虚幻引擎C终极射手教程 Unreal Engine C The Ultimate Shooter Course MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:55节课(8小时53分钟)|大小…

Nio得知3——该示范基地:多路复用器模式

Reactor模式和NIO 本文可以看作是Doug Lea Scalable IO in Java一文的翻译。当前分布式计算 Web Services盛行天下&#xff0c;这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构&#xff1a; 1. Read request 2. Decode request 3. Process service 4. Enco…

c语言随机数生成0 99函数,C语言生成随机数的函数、延时函数

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼下面C语言代码使用了生成随机数的函数、延时函数。请大家仔细观察其显示效果。从以下代码&#xff0c;我们可以得出一个重要的结论&#xff1a;当上述两类函数被放入循环时&#xff0c;应作出一定修改。同时还应关注其参数的定义位…

2022-2028年中国乙酸钴行业发展现状调研及市场前景规划报告

【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新&#xff08;交付时间约3个工作日&#xff09; 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙酸钴行业市场行业相关概述、中国乙酸钴行业市场行业运行环境、分析了中国乙酸钴行业市场…

MS UI Automation Introduction

MS UI Automation Introduction 2014-09-17 MS UI Automation是什么 UIA架构 UI自动化模型 UI自动化树概述 UI自动化控件模式概述 UI 自动化属性概述 UI 自动化事件概述 示例 使用UISpy工具 UI自动化提供者 常见问题分析解决 控件无法识别 Timing issue 本地化问题 自动化技术和…

spring+mybatis事务的readonly属性无效

在Spring配置事务中设置的read-only"true"不起作用&#xff0c;仍可以执行写操作&#xff1b;但是其他的正常。查看了一下DataSourceTransactionManager这个类的doBegin方法中没有判断read-only。HibernateTransactionManager.doBegain方法中则有一判断 if(!definiti…

ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course

ue5新手零基础学习教程 Unreal Engine 5 Beginner Tutorial - UE5 Starter Course! 教程大小解压后&#xff1a;4.96G 语言&#xff1a;英语中英文字幕&#xff08;机译&#xff09;时长&#xff1a;4小时56分 1920X1080 mp4 虚幻引擎5新手教程&#xff01;在这个教程中&…

C语言科学计算器思路,大神教你如何用C语言实现科学计算器

i;*leni;return temp;}/*功能&#xff1a;翻译操作数* 如果运算符非法&#xff0c;则返回0&#xff0c;合法则返回非零标志*/int translateopt(char *p,int *len){char fu[NUM_OPT][LEN_OPT]{"","-","*","/","^","(&qu…