在开发中有一个项目,其中有 32 个表,含有 10 个空表(没有数据),开发过程恰逢自己电脑换系统和新配一台工作电脑,在备份数据库时,感觉有部分记忆点值得记录一下。
¶一、导出、导入数据文件(可用于数据备份,或者不同地点间的数据库同步)
1、使用 PLSQL 12 中自带的 工具——导出表 ,单击第一个表,按住 Shift 键单击最后一个表即可将所有表全部选定,选定导出目录,填写输出文件名称,保存,数据多的时候可以在弹出的窗口中看见导出过程。(这时候可以发现有部分表提示“导出失败,某某表不存在”,查看这些表后发现这些表都有一个共同的特征:无数据,解决办法可跳至第三段)
2、在新电脑中使用 PLSQL 12 中的 工具——导入表,选中刚刚的导出文件,导入数据即可。
¶二、想象中的导出、导入数据文件
¶以下为缺少表空间的错误:
1、在原先正常的电脑上使用 PL SQL 12 导出 32 个表,为 .dmp 格式文件,并在新电脑进行导入表的操作
2、弹出一个窗口后秒关,尝试通过截图快捷键截图查看,以失败告终,请教项目组上的数据库老师后知道了这是缺少表空间的缘故,之后 就是各种恶补表空间知识。
3、在 PLSQL 中新建 SQL 窗口,键入以下语句并执行:
1 | CREATE TABLESPACE OP |
其中第三行语句含有表空间的存放位置,建议放在 Oracle 的安装目录里面,防止误删除。OP 为表空间名字,其他行语句想了解的可自行百度具体含义。删除已经使用的表空间会使得对应的用户无法登录使用,我是重装 Oracle 解决的,就是这么低技术含量,幸好是没有什么重要数据。可以删除表空间后再删除这个 .DBF 文件,删除语句如下:
1 | DROP TABLESPACE OP; |
¶三、解决空表不导出的方法
1、在数据导出的时候,无法导出空表,提示错误“EXP-00011:table 不存在”。
产生原因:Oracle 11g 默认创建一个表时不分配 segment,只有在插入数据时才会产生(当然也可以强制分配),以节省磁盘空间。
2、解决方法:
(1)第一种:在空表中插入一条数据然后再对插入的数据进行删除,便可以进行数据导出(我的那几个表添加假数据很难,如果表少的话可以手动执行,对于多个表的情况可以采用语句进行批量操作的)。
(2)第二种:可以使用手工为空表分配 Extent 的方式,来解决导出之前建立的空表的问题。在 PLSQL 中新建 SQL 窗口,键入以下语句并执行:
1 | SELECT 'ALTER TABLE '||TABLE_NAME||' ALLOCATE EXTENT;' FROM USER_TABLES WHERE SEGMENT_CREATED='NO'; |
可以通过语句导出查询结果,执行导出的语句即可(表数量少的话可以复制粘贴执行查询结果)。
1 | set heading off; |
导出后执行导出的语句:
1 | @ D:\Oracle\product\11.2.0\allocate.sql; |
(3)第三种:设置deferred_segment_creation 参数,该参数值默认是TRUE,当改为FALSE时,无论是空表还是非空表,都分配segment。
(这种方法我没有试过,你可以自行尝试)
1 | SELECT 'ALTER TABLE '||TABLE_NAME||' ALLOCATE EXTENT;' FROM USER_TABLES WHERE NUM_ROWS=0; |
- 实测上面百度到的这句指令不显示空表结果,你可以自己试一试。
- 下面这个语句可在 TNS 连接不上时导入表:
1 | imp scott/tiger@localhost:1521/orcl full=y file= E:\my.dmp ignore=y; |
- 1、写这篇随笔的时候发现在 Atom 中选中单词,按住 Ctrl 后按 K, 再按 U,即可将选中的单词大写
- 2、白天的技巧:Eclipse 中查看方法在哪里被调用了——选中方法,直接Ctrl + Shift + G 或者 Ctrl + Alt + H