测试Oracle统计信息的导出导入
背景:有时我们会希望可以对Oracle的统计信息整体进行导出导入。比如在数据库迁移前后,希望统计信息保持不变;又比如想对统计信息重新进行收集,但是担心重新收集的结果反而引发性能问题,想先保存当前的统计信息,这样即使重新收集后效果不好还可以导入之前的统计信息。
Oracle提供给我们一些方法,比较常用的粒度有两种:
schema级别统计信息的导出导入
通过调用DBMS_STATS.EXPORT_SCHEMA_STATS和DBMS_STATS.IMPORT_SCHEMA_STATS来进行。database级别统计信息的导出导入
通过调用DBMS_STATS.EXPORT_DATABASE_STATS和DBMS_STATS.IMPORT_DATABASE_STATS来进行。
统计信息存放的表可以通过DBMS_STATS.CREATE_STAT_TABLE和DBMS_STATS.DROP_STAT_TABLE来进行创建或是删除。
1.示例schema级别统计信息的导出导入
比如我将JINGYU这个schema下所有的统计信息进行导出导入:
--源端统计信息导出:
begin
DBMS_STATS.CREATE_STAT_TABLE('SYSTEM','JINGYU_STATS_20181217');
DBMS_STATS.EXPORT_SCHEMA_STATS(OWNNAME => 'JINGYU', STATTAB => 'JINGYU_STATS_20181217', STATOWN => 'SYSTEM');
end;
/
expdp \'/ as sysdba\' directory=xtts dumpfile=stats_jingyu.dmp logfile=stats_jingyu.log tables=system.jingyu_stats_20181217
--目标端统计信息导入:
impdp \'/ as sysdba\' directory=xtts dumpfile=stats_jingyu.dmp logfile=stats_jingyu.log cluster=n
exec DBMS_STATS.IMPORT_SCHEMA_STATS (OWNNAME => 'JINGYU', STATTAB => 'JINGYU_STATS_20181217', STATOWN => 'SYSTEM');
--删除存放统计信息的表(根据实际需要选择性执行):
exec DBMS_STATS.DROP_STAT_TABLE ('SYSTEM','JINGYU_STATS_20181217');
2.示例database级别统计信息的导出导入
如果想将数据库所有统计信息进行导出导入,方法非常类似,使用对应的过程:
--源端统计信息导出:
begin
DBMS_STATS.CREATE_STAT_TABLE('SYSTEM','DB_STATS_20181217');
DBMS_STATS.EXPORT_DATABASE_STATS(STATTAB => 'DB_STATS_20181217', STATOWN => 'SYSTEM');
end;
/
expdp \'/ as sysdba\' directory=xtts dumpfile=stats.dmp logfile=stats.log tables=system.db_stats_20181217
--目标端统计信息导入:
impdp \'/ as sysdba\' directory=xtts dumpfile=stats.dmp logfile=stats.log cluster=n
exec DBMS_STATS.IMPORT_DATABASE_STATS (STATTAB => 'DB_STATS_20181217', STATOWN => 'SYSTEM');
--删除存放统计信息的表(根据实际需要选择性执行):
exec DBMS_STATS.DROP_STAT_TABLE ('SYSTEM','DB_STATS_20181217');
3.验证统计信息导出导入效果
以数据库级别统计信息的导出导入为例,验证下实际的效果:
目前数据库JINGYU用户下各表在统计信息记录数:
SYS@orcl> select owner, table_name, NUM_ROWS from dba_tables where owner = 'JINGYU';
OWNER TABLE_NAME NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 226
此时按照之前的步骤导出数据库的统计信息,步骤不再赘述。
然后在某一张表插入数据,重新收集该表的统计信息:
SYS@orcl> insert into jingyu.ash_tmp select * from jingyu.ash_tmp;
SYS@orcl> commit;
SYS@orcl> exec dbms_stats.gather_table_stats('JINGYU','ASH_TMP');
PL/SQL procedure successfully completed.
再去查询统计信息记录的该表行数:
SYS@orcl> select owner, table_name, num_rows from dba_tables where owner='JINGYU';
OWNER TABLE_NAME NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 452
此时按照之前的步骤导入数据库的统计信息,步骤不再赘述。
再去查询统计信息记录的该表行数,已经恢复到当时的导出时刻:
SYS@orcl> select owner, table_name, num_rows from dba_tables where owner='JINGYU';
OWNER TABLE_NAME NUM_ROWS
------------------------------ ------------------------------ ----------
JINGYU TEST 100708
JINGYU ASH_TMP 226
SYS@orcl>
另外,需要注意如果统计信息导入的目标环境,数据库版本比源环境高(多发生在数据库升级场景),导入统计信息时会遇到下面这样的错误:
ERROR at line 1:
ORA-20002: Version of statistics table SYSTEM.DB_STATS_20181217 is too old.
Please try upgrading it with dbms_stats.upgrade_stat_table
ORA-06512: at "SYS.DBMS_STATS", line 11648
ORA-06512: at "SYS.DBMS_STATS", line 11665
ORA-06512: at "SYS.DBMS_STATS", line 12800
ORA-06512: at line 1
这时只需要按照提示执行下 dbms_stats.upgrade_stat_table:
exec dbms_stats.upgrade_stat_table('SYSTEM','db_stats_20181217');
再尝试导入统计信息就可以成功了。
测试Oracle统计信息的导出导入的更多相关文章
- 有关Oracle统计信息的知识点[z]
https://www.cnblogs.com/sunmengbbm/p/5775211.html 一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如, ...
- 有关Oracle统计信息的知识点
一.什么是统计信息 统计信息主要是描述数据库中表,索引的大小,规模,数据分布状况等的一类信息.例如,表的行数,块数,平均每行的大小,索引的leaf blocks,索引字段的行数,不同值的大小等,都属于 ...
- PLSQL_统计信息系列07_数据字典统计信息的导出和导入
2014-05-05 Created By BaoXinjian
- [Oracle] oracle统计信息
Oracle统计信息 Oracle数据库里的统计信息可以分为6种类型: 表的统计信息 索引的统计信息 列的统计信息 系统统计信息 数据字典统计信息 内部对象统计信息 图 1: Oracle统计信息 基 ...
- oracle统计信息
手工刷ORACLE统计信息 select count(1) from LOG_TRX_DETAIL; select * from user_tab_statistics where table_n ...
- 收集oracle统计信息
优化器统计范围: 表统计: --行数,块数,行平均长度:all_tables:NUM_ROWS,BLOCKS,AVG_ROW_LEN:列统计: --列中唯一值的数量(NDV),NULL值的数量,数据分 ...
- Oracle基础 数据泵导出/导入Expdp/impdp(转)
一.EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术,数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2 ...
- Oracle 统计信息收集
官网网址参考: https://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_stats.htm#CIHBIEII https://docs.ora ...
- Oracle 统计信息
Oracle数据库中的统计信息是这样一组数据:它存储在数据字典中,且从多个维度描述了Oracle数据库里对象的详细信息. CBO会利用这些统计信息来计算目标SQL各种可能的,不同的执行路径的成本,从中 ...
随机推荐
- ionic入门教程-ionic路由详解(state、route、resolve)(转)
http://blog.csdn.net/onil_chen/article/details/51758696?appinstall=0 今天好好的跟大家讲讲ionic的路由配置. 问到的朋友有点多, ...
- MongoDB 查询总结
1.含日期查询 从起始时间到结束时间 BasicDBObject queryObj = new BasicDBObject(); queryObj.put("date",new B ...
- Linux的rp_filter与策略路由
Linux的rp_filter用于实现反向过滤技术,也即uRPF,它验证反向数据包的流向,以避免伪装IP攻击,但是它和Linux的策略路由却很容易发生冲突,其本质原因在于,uRPF技术强制规定了一个反 ...
- pytest学习 一
网上有很多这样的资料,学起来还是比较简单,为了将学到的东西应用于工程化,参考这样的样板代码: https://github.com/jeffmacdonald/pytest_test 将其下载到C:\ ...
- SpringBoot系统列 5 - 接口版本控制、SpringBoot FreeMarker模板引擎
接着上篇博客的代码继续写 1.接口版本控制 一个系统上线后会不断迭代更新,需求也会不断变化,有可能接口的参数也会发生变化,如果在原有的参数上直接修改,可能会影响线上系统的正常运行,这时我们就需要设置不 ...
- JavaScript学习历程03
一闪一闪亮晶晶 <script type="text/javascript"> var nn = Number(prompt('请输入一个1-9的正整数!')); va ...
- Easy UI combogrid动态加载数据
场景: datagrid的每一行允许编辑,一行中有一个字段,编辑时,提供下拉框选项,供选择. 下拉框选项有多个列.如下图所示:(点击红框内的下拉按钮,会弹出绿框内的内容) 要求: 每行弹出的下拉框内容 ...
- Flask 学习笔记(1)--环境安装
Flask 官网:http://flask.pocoo.org/ Flask文档:http://docs.jinkan.org/docs/flask/ 0x01 安装方式 安装步骤很简单,就是这个样子 ...
- [原]Jenkins(十七) jenkins再出发之配置SVN
创建一个demo project 配置SVN: 配置build project
- nginx配置-为没有后缀的文件(实际上是有html文件)以html形式打开
location ~ index.php@ { add_header content-type "text/html"; }