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
我们之前讨论的都是单表情况下的处理,如果是涉及到多表关系,例如外键关系表下的重定义,是怎么处理呢?
相关文章:

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实现图片上传本地预览
演示地址: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,1280720 (部分1920X1080) |音频:AAC,44100 Hz 语言:英语中英文字幕(根据原英文字幕机译更准确&a…

c语言中变量有什么作用是什么,C语言里面局部变量和临时变量有什么区别?
typedefexternstatic_Thread_localregister其中,除了 typedef (放在这里仅仅是为了描述语法方便),其它几个(配合变量声明的位置)描述了的变量的 linkage 和 storage duration。但是 storage class specifier 跟 linkage / storage duration 并不是一一对…

Android Acitivity 生命周期
Fragment 的生命周期: Android Fragment 生命周期及其API使用(建议使用自定义View替换Fragment) Activity的生命周期: (1)启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用…

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

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

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

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

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

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

2022-2028年中国乙烷行业投资分析及前景预测报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】PDF版 本报告介绍了中国乙烷行业市场行业相关概述、中国乙烷行业市场行业运行环境、分析了中国乙烷行业市场行业的…

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

ora-1031解决一例
今天建立了一个测试环境,打算再次测试logical standby的建制。在建制物理standby时,发现archive log无法传递到standby,手工可以。察看log,发现如下错误: 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,1280720 |音频:AAC,44.1 KHz,2 Ch 云桥网络 平台huo取 教程 技能水平:高级|语言:英语中英文字幕(根据原英文字幕机译更准确&…

1 23 456c语言,2014年计算机二级考试C语言模拟题(1)
2014年计算机二级考试C语言模拟题(1)21.下列程序的运行结果为( )。#includemain(){struct date{int year,month,day;}today;printf("%d\n",sizeof(struct date));}A.8B.6C.10D.1222.有以下程序:#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入门六部曲——服务
原文链接:http://www.dubby.cn/detail.html?id8735 准备 已经安装好Docker 1.13或者以上的版本。安装好Docker Compose。如果你是用的是Docker for Mac和Docker for Windows,那么不用担心,这是自带的。如果是Linux,那么需要你去…

AngularJs学习笔记--Forms
控件(input、select、textarea)是用户输入数据的一种方式。Form(表单)是这些控件的集合,目的是将相关的控件进行分组。 表单和控件提供了验证服务,所以用户可以收到无效输入的提示。这提供了更好的用户体验…

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

虚幻引擎C++终极射手教程 Unreal Engine C++ The Ultimate Shooter Course
虚幻引擎C终极射手教程 Unreal Engine C The Ultimate Shooter Course MP4 |视频:h264,1280720 |音频:AAC,44.1 KHz,2 Ch 语言:英语中英文字幕(根据原英文字幕机译更准确) |时长:55节课(8小时53分钟)|大小…
Nio得知3——该示范基地:多路复用器模式
Reactor模式和NIO 本文可以看作是Doug Lea Scalable IO in Java一文的翻译。当前分布式计算 Web Services盛行天下,这些网络服务的底层都离不开对socket的操作。他们都有一个共同的结构: 1. Read request 2. Decode request 3. Process service 4. Enco…

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

2022-2028年中国乙酸钴行业发展现状调研及市场前景规划报告
【报告类型】产业研究 【报告价格】4500起 【出版时间】即时更新(交付时间约3个工作日) 【发布机构】智研瞻产业研究院 【报告格式】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"不起作用,仍可以执行写操作;但是其他的正常。查看了一下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! 教程大小解压后:4.96G 语言:英语中英文字幕(机译)时长:4小时56分 1920X1080 mp4 虚幻引擎5新手教程!在这个教程中&…

C语言科学计算器思路,大神教你如何用C语言实现科学计算器
i;*leni;return temp;}/*功能:翻译操作数* 如果运算符非法,则返回0,合法则返回非零标志*/int translateopt(char *p,int *len){char fu[NUM_OPT][LEN_OPT]{"","-","*","/","^","(&qu…