模拟利用MV进行数据迁移

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介:

利用MV的数据迁移最大的特点是比较灵活,可以实现跨平台,跨数据库版本迁移,而且能够实现数据的重组优化。该方式的实现原理要求在源表对象有一个主键,用于MV刷新。在源表上创建MV日志,再在目标数据库创建结构一样的表,然后在目标数据库上采用prebuilt方式创建MV,第一次采用完全刷新,然后一直采用增量刷新,等到要切换的时候,只要刷新增量的日志,删除MV,保留目标表即可。

--创建源表

SQL> create table from_table(id number,num number);

Table created.

--添加主键

SQL> alter table from_table add constraint pk_from primary key(id);

Table altered.

--创建目标表
。然后在该表上创建主键或者非空的唯一约束。

SQL> create table to_table(id number,num number);

Table created.

SQL> alter table to_table add constraint pk_to primary key(id);

Table altered.

SQL> insert into from_table select rownum,rownum*100 from dba_objects where rownum <=10;

10 rows created.

SQL> commit;

Commit complete.

--在源表创建MV日志

SQL> create materialized view log on from_table;

Materialized view log created.

--在目标表上采用prebuilt方式创建MV

SQL> create materialized view to_table on prebuilt table refresh fast as select * from from_table;

Materialized view created.

SQL> select count(*) from to_table;

COUNT(*)
----------
0

--执行完全刷新
SQL> exec dbms_mview.refresh('TO_TABLE',method =>'Complete');

PL/SQL procedure successfully completed.

SQL> select count(*) from to_table;

COUNT(*)
----------
10

--执行一次增量刷新。增量刷新之前一定要保证源表和目标表上都存在主键,否则无法完成增量刷新

SQL> exec dbms_mview.refresh('TO_TABLE');

PL/SQL procedure successfully completed.

SQL> select * from to_table;

ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000

10 rows selected.

--创建自动刷新的作业,每30秒同步一次增量日志。

SQL> @create_program
附:cat create_program.sql 
begin
dbms_scheduler.create_program
(
program_name =>'refresh_to_table',
program_type =>'PLSQL_BLOCK',
program_action =>'begin dbms_mview.refresh(''TO_TABLE'');end;',
enabled =>TRUE
);
end;
/


PL/SQL procedure successfully completed.

SQL> @create_scheduler
附:cat create_scheduler.sql 
begin
dbms_scheduler.create_schedule
(
schedule_name =>'every_30_seconds',
start_date =>systimestamp,
repeat_interval =>'FREQ=SECONDLY;INTERVAL=30'
);
end;
/


PL/SQL procedure successfully completed.

SQL> @create_job
附:cat create_job.sql 
begin
dbms_scheduler.create_job
(
job_name =>'secondly_refresh',
program_name =>'refresh_to_table',
schedule_name =>'every_30_seconds',
enabled =>TRUE
);
end;
/


PL/SQL procedure successfully completed.

--运行作业

SQL> exec dbms_scheduler.run_job('secondly_refresh');

PL/SQL procedure successfully completed.

--对源表继续操作

SQL> insert into from_table values (11,1);

1 row created.

SQL> commit; 

Commit complete.

SQL> select count(*) from to_table; 

COUNT(*)
----------
11

SQL> insert into from_table select rownum+11,rownum*1000 from dba_objects where rownum <=9; 

9 rows created.

SQL> commit;

Commit complete.

SQL> select count(*) from to_table;

COUNT(*)
----------
20

SQL> select * from to_table;

ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1

ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000

20 rows selected.

SQL> update from_table set num = 1500 where id = 11;

1 row updated.

SQL> commit;

Commit complete.

SQL> select * from to_table;

ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500

ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000

20 rows selected.

SQL> exec dbms_scheduler.drop_job('secondly_refresh');

PL/SQL procedure successfully completed.

SQL> delete from to_table where rownum = 1;
delete from to_table where rownum = 1
*
ERROR at line 1:
ORA-01732: data manipulation operation not legal on this view

--等刷新完成,删除MV log与MV。在目标数据库上,删除MV后,表和数据仍然存在

SQL> drop materialized view to_table;

Materialized view dropped.

SQL> drop materialized view log on from_table;

Materialized view log dropped.

SQL> select * from to_table;

ID NUM
---------- ----------
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
11 1500

ID NUM
---------- ----------
13 2000
14 3000
20 9000
17 6000
18 7000
12 1000
15 4000
16 5000
19 8000

20 rows selected.

--最后创建与表有依赖关系的对象

本文转自MIKE老毕 51CTO博客,原文链接:http://blog.51cto.com/boylook/1298617,如需转载请自行联系原作者

相关实践学习
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
【涂鸦即艺术】基于云应用开发平台CAP部署AI实时生图绘板
相关文章
MySQL8.0新特性之公用表表达式学习
公用表表达式(或通用表表达式)简称为CTE(Common Table Expressions)。CTE是一个命名的临时结果集,作用范围是当前语句。CTE可以理解成一个可以复用的子查询,当然跟子查询还是有点区别的,CTE可以引用其他CTE,但子查询不能引用其他子查询。所以,可以考虑代替子查询。
356 0
|
JSON Java 数据格式
【Java反序列化】@JsonAlias字段别名
 @JsonAlias 是 Jackson 库提供的一个注解,用于在反序列化 JSON 数据时,为字段或方法指定多个可接受的名称或别名。
1234 0
|
机器学习/深度学习 数据采集 供应链
使用Python实现智能食品库存管理的深度学习模型
使用Python实现智能食品库存管理的深度学习模型
557 63
【题解】—— LeetCode一周小结39
LeetCode每日一道一周小结39
64 7
|
Java 关系型数据库 MySQL
一文彻底搞懂Mybatis系列(六)之在WEB应用中使用Mybatis
一文彻底搞懂Mybatis系列(六)之在WEB应用中使用Mybatis
246 0
|
负载均衡 算法 前端开发
Keepalived + Nginx 实现高可用 Web 负载均衡
Keepalived + Nginx 实现高可用 Web 负载均衡
Keepalived + Nginx 实现高可用 Web 负载均衡
|
缓存 NoSQL Redis
Redis经典问题:数据并发竞争
在大流量系统中,数据并发竞争可能导致系统性能下降和崩溃。为解决此问题,可以采取加写回操作和互斥锁,确保数据一致性并减少写操作对缓存的影响。另外,保持缓存数据多个备份能降低并发竞争概率。通过实例展示了如何在电商网站中应用这些策略,从而提高系统稳定性和性能。关注微信公众号“软件求生”获取更多技术分享。
608 1
|
存储 缓存 测试技术
读《淘宝技术这10年》:从进化中感受技术的美与挑战
小米,一位29岁的程序员,分享了阅读《淘宝技术这10年》的感悟。书中学到,好的架构和功能是通过不断实践和进化而来的,而非一开始就能设计完美。强调了回归测试、数据存储与访问优化、慎用新技术、用户体验和成本控制的重要性。同时,提倡借鉴优秀案例,追求高性能、高可用和低成本,并鼓励主动解决问题和担当。书中理念对架构设计和开发工作提供了有价值的启示。
146 0
|
数据采集 JavaScript 前端开发
深入网页分析:利用scrapy_selenium获取地图信息
网页爬虫是一种自动获取网页内容的技术,它可以用于数据采集、信息分析、网站监测等多种场景。然而,有些网页的内容并不是静态的,而是通过JavaScript动态生成的,例如图表、地图等复杂元素。这些元素往往需要用户的交互才能显示出来,或者需要等待一定时间才能加载完成。如果使用传统的爬虫技术,如requests或urllib,就无法获取到这些元素的内容,因为它们只能请求网页的源代码,而不能执行JavaScript代码。我们可以使用scrapy_selenium这个工具,它结合了scrapy和selenium两个强大的库,可以实现对动态网页的爬取。
300 0
深入网页分析:利用scrapy_selenium获取地图信息
|
网络协议 算法
HTTP/1.1和HTTP/2.0有什么区别
HTTP/1.1和HTTP/2.0有什么区别