set serveroutput on
EXEC DBMS_MVIEW.REFRESH('MV_TEST', 'C');
exit;
EOF
date
-- 4.2、后台执行脚本
chmod 744 /home/oracle/tmp_test1.sh
nohup /home/oracle/worksh/tmp_test1.sh > /tmp/tmp_test1.log 2>&1 &
-- 4.3、全量刷新的脚本执行完成时间大概1个小时。完成后检查日志:
cat /tmp/tmp_test1.log
-- 确认OK,才进行后续的操作。
-- 5、创建增量刷新存储过程
CREATE OR REPLACE PROCEDURE SP_REFRESH_MV AS
BEGIN
DBMS_MVIEW.REFRESH('MV_TEST');
END;
/
-- 6、手工跑一下增量刷新存储过程
EXEC SP_REFRESH_MV;
-- 7、创建JOB,用于定时增量刷新
variable jobno number;
variable instno number;
begin
select instance_number into :instno from v$instance;
dbms_job.submit(:jobno, 'SP_REFRESH_MV;', sysdate, 'sysdate+5/1440', TRUE, :instno);
commit;
end;
/
-- 8、创建MV_TEST索引(IND_前缀改成IDX_前缀),需要事先检查TBS_IND表空间大小。
-- Create/Recreate indexes
...
create index IDX_TEST1 on MV_TEST (column 1) tablespace TBS_IND parallel 6 online compute statistics;
alter index IDX_TEST1 noparallel;
...
########################################################################################################
变更二:
变更原因:
(1) 前面变更一已经完成表的物化视图全量刷新,和定时的增量刷新。接下来需要进行最后的rename操作。
变更步骤:
(1) 备份表TEST的全部统计信息,用于MV_TEST表rename后导入统计信息。
(2) 暂停增量刷新JOB。进行多次手动增量刷新。
(3) 删除物化视图。
(4) rename表和rename索引。
(5) 导入统计信息到rename后的TEST
(6) 给需要的用户授权。
(7) 清除job和增量刷新存储过程。
(8) 观察运行情况。
变更风险:
(1) rename过程,会有短暂时间应用访问会有问题,需要放在业务低峰期做。
(2) 变更完成后,出现SQL走错执行计划,修改统计信息?
########################################################################################################
-- 9、备份TEST表的统计信息,用于MV_TEST表rename后导入统计信息。
-- 创建临时统计信息表
exec dbms_stats.create_stat_table(ownname => user,stattab => 'tmp_stats_table');
-- 导出表的统计信息(默认包含列和索引的统计信息),statid=>'tmp_201202';
--This procedure retrieves statistics for a particular table and stores them in the user stat table. Cascade results in all index and column stats associated with the specified table being exported as well.
exec dbms_stats.export_table_stats(ownname => user, stattab => 'tmp_stats_table', tabname => 'TEST',cascade => true,statid=>'tmp_201202');
-- 10、查看job号,停job,进行手工刷新
--根据上面的job_no,用于暂停job
exec dbms_job.broken(XX,true);
commit;
-- 11、手动增量刷物化视图,多刷几次,直到跑增量刷新时候很快。
exec SP_REFRESH_MV;
-- 12、删除物化视图,和对应原表的物化视图日志
exec SP_REFRESH_MV;
DROP MATERIALIZED VIEW MV_TEST;
-- 检查MV_TEST表是否存在
desc MV_TEST
--删除对应原表的物化视图日志
drop MATERIALIZED VIEW LOG on TEST;
-- 13、rename操作
-- rename table
alter table TEST rename to TEST3;
alter table MV_TEST rename to TEST;
-- rename index
-- rename TEST3(原TEST表)的索引
...
-- rename 新TEST(原MV_TEST表)的索引,有些SQL有使用到HINT,所以索引名和原来一样
...
-- 14、导入统计信息(不包含索引的统计信息)到rename后的TEST,默认cascade => true
--This procedure retrieves statistics for a particular table from the user stat table identified by stattab and stores them in the dictionary. Cascade results in all index and column stats associated with the specified table being imported as well.
exec dbms_stats.import_table_stats(ownname => user, stattab => 'tmp_stats_table', tabname => 'TEST',cascade => false,statid=>'tmp_201202');
-- 15、grant授权
-- 15.1、检查这个表TEST是否给其他用户授权过?
select 'grant ' || tt.privilege || ' on ' || owner || '.' || table_name ||
' to ' || tt.grantee || ';'
from dba_tab_privs tt
where grantor = 'user_name'
and table_name = 'TEST';
-- 15.2、没有的话授权
grant SELECT on test.test to another_username;
-- 16、清除job和增量刷新存储过程
-- 根据上面的job_no,用于暂停job
exec dbms_job.remove(xx);
-- 删除增量刷新存储过程
drop PROCEDURE SP_REFRESH_MV;
-- 17、观察运行情况。