关于11g导不出空表的问题

站在巨人的肩膀上,让文章更加完善!

ORACLE 11gexp命令导出库文件备份时,发现只能导出来一部分表而且不提示错误,之前找不到解决方案只能把没导出来的表重新建建立。后来发现是所有的空表都没有导出来。于是想好好查查,因为在11g以前的版本中没有这样的问题。

查资料发现Oracle 11g中有个新特性:新增了一个参数“deferred_segment_creation”含义是段延迟创建,默认是true

 

设置deferred_segment_creation参数:

   设置deferred_segment_creation 参数为FALSE来禁用"段推迟创建"(也就是直接创建segment),无论是空表还是非空表,都分配segment。

 

具体是什么意思呢?

如果这个参数设置为true,你新建了一个表Table1,并且没有向其中插入数据,那么这个表不会立即分配extent,也就是不占数据空间,即表也不分配 segment 以节省空间,所以这些表也没能导出来。在系统表user_tables中也可以看到segment_treated的字段里是“NO”或者“YES”说明了某张表是否分配了segment。说白了是为了可以节省少量的空间。

 

用下面的SQL语句查询,可以发现没有导出的表其 segment_created字段值都是 'NO'

Select segment_created,table_name from user_tables where segment_created = 'NO';

 

解决方法:

1、最原始最笨的办法(不推荐):insert一行,再rollback或者删除就产生segment了。

该方法是在在空表中插入数据,再删除,则产生segment。导出时则可导出空表。

 

2、设置deferred_segment_creation参数:

  设置deferred_segment_creation参数为FALSE来禁用"段推迟创建"(也就是直接创建segment),无论是空表还是非空表,都分配segment

  sqlplus中,执行如下命令:

   SQL>alter system set deferred_segment_creation=false;

  查看:

   SQL>show parameter deferred_segment_creation;

   注意:该值设置后只对后面新增的表产生作用,对之前建立的空表(已经存在的)不起作用,仍不能导出。

  并且要重新启动数据库,让参数生效。

 

我们在建表和导表之前先将oracle11g的配置作如下修改;

alter system set deferred_segment_creation=false;

 

3、使用ALLOCATE EXTENT,可以导出之前已经存在的空表。

  使用ALLOCATE EXTENT可以为数据库对象的每一张表分配Extent(注意针对每一张表,就是说一张表需要一条SQL代码)

  其语法如下:

  -----------

   ALLOCATE EXTENT { SIZE integer [K | M] | DATAFILE 'filename' | INSTANCE integer }

  -----------

  可以针对数据表、索引、物化视图等手工分配Extent

   ALLOCATE EXTENT使用样例:

   ALLOCATE EXTENT

   ALLOCATE EXTENT(SIZE integer [K | M])

   ALLOCATE EXTENT(DATAFILE 'filename')

   ALLOCATE EXTENT(INSTANCE integer)  www.2cto.com

   ALLOCATE EXTENT(SIZE integer [K | M]   DATAFILE 'filename')

   ALLOCATE EXTENT(SIZE integer [K | M]   INSTANCE integer)

  针对数据表操作的完整语法如下:

  -----------

   ALTERT ABLE [schema.] table_name ALLOCATE EXTENT [({ SIZE integer [K | M] | DATAFILE'filename' | INSTANCE integer})]

  -----------

  故,需要构建如下样子简单的SQL命令:

  -----------

   alter table TableName allocate extent

  -----------

  但要是每一张表写一条语句的话太过麻烦,为了方便我们使用SQL命令拼写出每一张表的alter语句。

 

构建对空表分配空间的SQL命令。

  查询当前用户下的所有空表(一个用户最好对应一个默认表空间)。命令如下:

  SQL>select table_name from user_tables where NUM_ROWS=0; 

  根据上述查询,可以构建针对空表分配空间的命令语句,如下:

  SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null(注意:很多教程没有这里,这里是有可能为空的!)

  上述代码可产生批量的修改表extentSQL语句(有多少张空表就产生多少条),我们只需要将其生成的所有sql代码全部执行,就可以给每一张已经存在的表来分配segment,就OK了。

 

最后:这时再用exp导出就没有问题了。但是:数据库本身的deferred_segment_creation属性还是TRUE,也是就是说如果再创建新表的话,默认还是不分配segment的。所以还是需要更改deferred_segment_creation的参数,以便以后创建的新表自动分配segment。

总结:

   如果你的数据库还没有创建任何数据表,那么直接修改deferred_segment_creation属性,以后创建的表无论是不是为空都会自动分配segment,就不会出现导不出空表的情况。然而如果你的数据库中已经有很多空表,并且需要导出来,那么光修改deferred_segment_creation属性则没有用的,因为它只对之后创建的表有作用。你需要给已存在的空表分配segment以便可以导出存在的空表,就用到上面讲的allocate extent方法,但此方法只针对已经存在的表的segment属性,所以最好就是:先给已存在的空表分配segment,方便其可以直接导出,然后设定deferred_segment_creation参数以便以后每张表无论是否为空都自动分配segment

 

附录有关第三种方法给已经存在的空表分配segment,下面介绍一种生成脚本来执行sql的方法。

SQL>Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;

批量输出上述生成的SQL语句并写入到一个.sql的脚本文件中。

如: 

1.创建执行脚本文件:我创建一个E:\sql_script.sql文件。内容如下:

   set heading off;

   set echo off;

   set feedback off;

   set termout on;

   spool E:\sql_allocate.sql;

   Select'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0 or num_rows is null;

   spooloff;

  这个脚本的作用就是创建一个E:\sql_allocate.sql脚本文件,将Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0or num_rows is null的执行结果(就是给每张表生成segmentSQL代码)批量输出,存储到一个E:\sql_allocate.sql的脚本文件中。

 

2.执行E:\sql_script.sql文件来生成分配表空间的SQL代码的脚本文件sql_allocate.sql

  命令如下:

   SQL>@E:\sql_script.sql;  (也可写一个批处理文件,命令如下:sqlplus用户名/密码@数据库 @E:\sql_script.sql,这时你打开你的这个文件看里面是不是有内容,如果没有也没关系,就直接讲以上SQL>@E:\sql_script.sql执行后产生的sql语句直接拿到PLSQLsql窗口中执行即可,这样即可忽略此处到步骤3结束了!)

插曲:我做到这步的时候,出现表空间不够,然后扩展表空间,下面这些

alter database datafile '表空间dbf文件位置' resize 4000m

如这些类似的写法,上面随便一句都可以了!

alter database datafile 'D:\oracle\oradata\TEST.dbf' autoextend on next 100m maxsize 10000m

ALTER DATABASE DATAFILE 'D:\TEST.DBF' AUTOEXTEND ON NEXT 512M MAXSIZE 10000M;

 ALTER DATABASE DATAFILE 'D:\TEST.DBF'AUTOEXTEND  ON NEXT 50M MAXSIZE UNLIMITED

但是可能报:ORA-01516 :不存在的日志文件,数据文件或临时文件

用这句alter tablespace TEST add datafile TEST_001.dbf' size 4096M autoextendOFF;(大小自己定吧)

表空间不足的问题搞定!

  执行完毕后,得到E:\sql_allocate.sql脚本文件(里面是给所有空表分配segmentSQL代码) 

  打开该文件会看到,已经得到对所有空表分配空间的SQL语句。

 

3.执行E:\sql_allocate.sql文件来对表分配空间。

  命令如下:SQL>@ E:\sql_allocate.sql

  执行完毕,表已更改。之前存在的空表已分配segment空间!

 查一下是不是都分配好了segment

查询当前用户所有的表数:select count(*)from user_tables

查询设置好了segment的表数:Select segment_created,table_name from user_tables where segment_created = 'YES';(设置好了的表数,NO是看未设置的表数)

如果两数相等说明:

大功告成,此时执行exp命令,即可把包括空表在内的所有表,正常导出。


参考:http://blog.sina.com.cn/s/blog_5f0e9ca50101it7n.html  谢谢!

<think>嗯,用户的问题是关于vivo手机无法导出日志的解决方法。首先需要理解用户的具体场景:用户可能按照常规方法操作,但遇到了无法导出日志的问题。从用户描述看,用户尝试了在拨号盘输入*#*#112#*#*进入log采集页面,但后续步骤出现问题。 参考之前的引用内容,关键点在于log的保存位置和上传机制。根据引用信息,vivo log通常保存在根目录下的bbklog_zip文件夹,但新机型可能变更了存储路径。用户提到"找不到目录",这可能是核心问题点。 考虑到不同机型差异,需要提供多种可能性解决方案。首先应该确认用户是否彻底关闭了网络连接,这是阻止自动上传的关键。然后需要覆盖不同安卓版本的存储路径变化,特别是Android 10及以上版本可能存在的沙盒机制限制。 另外想到用户可能没有正确触发log生成,需要检查是否在拨号界面输入代码(注意引用中提到的"*#*#112#*#*"格式可能有误,实际应为"*#*#112#*#*")。还有文件管理器权限问题,有些系统会隐藏根目录文件,可能需要第三方文件管理器。 关于上传失败的处理机制也很重要,引用提到上传失败会暂存本地,但具体保存时间未知,用户可能操作不及时致文件被清除。此外,用户可能误解了"导出"的义,实际是获取本地存储的zip文件而非云端下载。 最后需要准备备选方案,包括联系vivo客服、开发者选项等替代途径,以及第三方工具作为最后手段。整个过程要保持逻辑清晰,分步骤说明,同时提醒风险因素如第三方工具可能的数据安全问题。</think>针对vivo手机无法导出日志的问题,请按以下步骤排查解决: --- ### 🔍 排查步骤 1. **确认Log生成状态** - 在拨号盘输入 **`*#*#112#*#*`**(注意格式)→ 进入Log采集页面 → **勾选所需日志类型**(如性能/WLAN/Netlog等)→ 点击"开始抓取" - 操作完成后,**务必将手机调至飞行模式或关闭WiFi/数据流量**(防止自动上传服务器)[^1] 2. **查找日志保存路径** - 优先检查根目录(需用文件管理器查看): ```markdown /bbklog_zip/ /storage/emulated/0/bbklog_zip/ ``` - 新机型可能存放于: ```markdown /Android/data/com.bbk.logcollector/files/Log/ /sdcard/Android/data/com.vivo.abe/files/log/ ``` 3. **授予文件管理器权限** - 若提示"无权限访问",需在设置中开启: `设置 → 应用管理 → 文件管理器 → 权限 → 存储权限 → 允许` --- ### ⚠️ 常见问题解决 | 问题现象 | 解决方案 | |-------------------------|--------------------------------------------------------------------------| | 找不到`bbklog_zip`目录 | 使用第三方文件管理器(如ES文件浏览器/MT管理器)搜索关键词`bbklog`或`log` | | Log采集页面闪退 | 重启手机 → 重新输入`*#*#112#*#*` → 立即开始抓取 | | 日志文件被自动删除 | 关闭网络后,**抓取完成30分钟内**必须手动复制文件(系统会定时清理暂存文件)| | Android 11+无法访问目录 | 通过`设置 → 存储 → 浏览`查看内部存储,或连接电脑用ADB命令导出 | --- ### 💡 替代方案 1. **开发者模式导出** `设置 → 系统管理 → 开发者选项 → 提交错误报告 → 选择完整报告`(生成后通知栏下载) 2. **联系vivo客服** 拨打**400-678-9688**,提供设备型号+系统版本,申请远程协助导出日志 3. **第三方工具** 使用PC端工具(如**ADB命令**)直接提取: ```bash adb pull /sdcard/bbklog_zip/ C:\LocalSavePath ``` --- > 📌 **关键提示**:新机型(如OriginOS 3.0+)可能强制加密日志路径,若上述方法无效,建议优先尝试**开发者选项的错误报告功能**或联系官方客服获取专属工具。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值