所谓数据库的转移,说白了就是把开发使用的数据库服务器上做好的表、数据、存储过程等复制出来,再导入到另一个服务器中。
一般来说方法有三种:
一是利用数据库自己的带参命令exp和imp进行,这种方式古老又低效,但因为其传统又官方,是老DBA彰显水平的必备手段;
二是利用第三方工具借助于数据库本身提供的功能(如Oracle的exp.exe以及imp.exe;SQL Server的Integration Service和“备份/还原”功能)进行图形化界面操作,本质上与第一种方法是一样的,但因为其操作简单方便,莫名其妙的常常被老DBA鄙视;
三是利用第三方工具为用户独创的“脚本输出/脚本执行”功能,也就是将数据库对象的CREATE文输出成SQL文件,然后利用这个SQL文件就可以随时再次创建数据库。这在PL/SQL和Object Browser中都有提供。
本文将以Object Browser为图例对后两种方法进行讲解,因为其中文界面较为简单易懂。最后再简单的交流一下关于DataPump的问题。
那么首先,我们来介绍一下Oracle的导入导出功能。说白了就是数据库对象以二进制文件(.DMP)的形式输出,之后再解析并输入到另一个数据库环境中。
全数据库: | 数据库上所有用户的所有对象全部导出 |
用户指定: | 指定用户下的所有对象 |
表指定: | 只导出指定的表,可指定多张表 |
表空间指定: | 指定表空间下的所有对象全部导出 |
在文件名那一栏里输入要保存的DMP文件的全路径。也可通过浏览选择。目标对象里显示要导出的对象,可选对象里是通过你指定的导出方法列出所有可选的对象。
[连接用户ID]可以指定导出时使用的用户。可以指定为当前连接的用户,也可以指定其他用户。指定其他用户的话需要输入那个用户的用户ID和密码。
[Buffer长度]和[记录长度]可设置buffer字节数和record的字节数。
一般可以使用默认的,但如果有些表里有非常多的字段,或者存储了非常大的数据(比如LOB型等),为了避免出错,需要把它调大一些。
[同时导出的数据库对象]可以指定是否同时导出权限,索引,数据,制约。数据库的转移如果只转移表结构而不包含其中数据的话,就将[数据]取消选中。
[增量导出的种类]如下:
[对象的分析]可以设置在导入时生成的统计信息
[NLS_LANG]里可以设置导出DMP要使用的字符集编码,不添即为数据库默认。
[扩展空间压缩]选中时,在扩展空间里存储的数据被整合在导出的DMP中
[表的制约]选中时,将会在导出过程中检查数据的一致性
[后台运行]选中时,导出过程将不在界面中体现。
[输出记录]可以指定导出结果的日志保存路径
[使用工具]就是Oracle客户端自带的exp.exe
4,点击[执行]按钮。就执行导出,在[结果日志]里会显示执行的结果。导出成功之后,就会在指定目录下生成一个二进制的.DMP文件,数据库转移就是利用此文件导入到新的数据库中。首先,要连接到新的数据库中。
1.从菜单进入导入界面全数据库: | 将DMP以整个数据库的形式导入 |
用户指定: | 将DMP文件中指定用户导入到当前连接数据库的指定用户中(此时点击右侧的[一览]按钮,将列出DMP中所有的用户) |
表指定: | 只导入DMP文件中的指定的表(此时点击右侧的[一览]按钮,将列出DMP中所有的表) |
在目录中可以输入DMP文件的绝对路径,也可以通过文件浏览方式找到DMP文件。
在[选项]页中的设置项与导出时的基本一致,就不多介绍了。
脚本输出也是数据库备份,数据库转移的一种方法。
这里说的脚本,就是创建表,存储过程等各种数据库对象的SQL语句的.SQL(DDL)文件,当然也包括向表中插入数据的INSERT文。
任何第三方工具都可以直接查看,修改,执行这些.SQL文件,从而方便的建立起数据库。
[将同时输出的脚本汇总在一起]选中时,所有的SQL输出到一个文件中。不选中时,每个对象生成单独的SQL文件。
[创建与类型相应的子文件夹]选中时,所有Table的SQL文件将生成到Table文件夹中。所有View的SQL文件将生成到View文件夹中。 各种不同的对象类型将被归类在不同的文件夹中。 不选中时,统一生成在一个文件夹内。
[名称表]是一个很人性化的设置。它让你在数据库中建立一张表,用来表示表明与SQL脚本文件的文件名之间的匹配关系。 也就是说,生成的SQL脚本文件名可以由你按照你自己的意愿和规则自定义。
[输出SCHEMA名]可以设置是否在SQL中带上SHEMA信息。
[在输出TABLE脚本时,包含从属于该表的索引脚本]
[输出TABLE脚本时,同时输出数据(INSERT)语句]这里可以设置insert语句是附加在表的脚本文件中,还是保存在新建的“DATA”目录下, 或者另存为“表名_DATA.SQL”文件中。
[输出EXTANT信息]里可以设置脚本文件中需要包含哪些EXTENT信息。
[输出View脚本时包含项目名]设置是否在“CREATE VIEW 视图名 AS ”之后加上字段名
[输出View脚本时使用FORCE选项]设置是否在VIEW的脚本中附加FORCE设置(只限Oracle)
[输出对象权限]各脚本文件末尾,是否输出赋予对象权限的GRANT语句。
[不导出空白行]可以在导出时自动将脚本中的空行删除。
因为很多人在使用SQL*Plus执行脚本时,经常因为脚本中的空行而错误无法执行的情况。
2.点击[开始]按钮开始导出脚本文件。脚本已输出,看看我们的文件夹下,多么的整齐!
各种对象分门别类的各就各位,数据也以_DATA.SQL另存了出来。
拥有了这些脚本,就相当于拥有了整个数据库!
这些脚本可以理解为数据库的备份,而且还不是不可修改的硬备份,而是随时可以查看修改任你处置的软备份。
接下来,就可以通过执行这些脚本来创建新的数据库。
1.从菜单进入[脚本执行]界面从右侧目录中选择脚本所在文件夹或脚本文件,需要执行的脚本文件或文件夹可以整体移动到左侧,作为脚本执行对象。
2.点击[执行]按钮,在确认对话框中可以设置是否在执行后删除该脚本文件,是否在发生错误时中断处理。这里特殊说一下,
在执行就很多脚本文件的时候经常因为错误而中断,绝大多数都是因为执行顺序的原因。
比如在创建VIEW的时候,他参照的TABLE还没有被创建,就会出错误。
这种情况下,我们选中[将正确完成的SCRIPT从列表中删除]的话,就可以反复执行,直到列表被清空时就说明所有脚本都被正确执行了。
上面我们已经介绍了以DMP和脚本两种方式进行的导入导出。实际操作的时候,有人会问“我该用哪一种方法呢?“
我们把两种方法的优缺点总结一下:
导入/导出 | 脚本输出/脚本执行 | |
输出文件种类 | 二进制DMP文件 | SQL文本文件 |
优点 | 生成的文件较小 可以导出二进制型数据 |
可以查看和修改输出文件的内容 跨不同数据库间也适用 |
缺点 | 跨不同的数据库时有问题 | 存在二进制型数据时有问题 |
最主要的区别就是二进制还是SQL文本。二进制存储,占用空间小;SQL文本形式查看编辑更方便。
如果数据库中存在LOB型的数据时(SQLServer为BINARY型),就只能使用DMP导入导出方式了。
但是,因为Oracle自身的导入导出功能并不保证向下兼容,因此当导入导出的两个数据库版本不同时经常发生问题。
SQLServer也有一样的版本兼容问题,“SQL Server2005向2008转移”的时候往往会发生错误。
因此当导出和导入的数据库版本不一致的时候,推荐使用脚本输出/脚本执行的方式进行。
从Oracle10g开始,除了传统的exp/imp的DMP文件之外,家族里来了个新家伙,叫做DataPump(数据泵)。自出生以来就备受争议,而经过实际使用发现,他与exp/imp并没有本质意义上的不同。
主要区别如下:
1,exp/imp是基于Oracle客户端的。而DataPump是基于Oracle服务端的。
在这一点上,它只解决了Oracle服务器端不需要装客户端的问题…却导致了DataPum导出的文件只能保存在服务器端。
为了解决这个尴尬的情况,Oracle让它支持了网络传输…
2,DataPump导出的数据虽然也是.dmp,但是他与exp/imp导出的.dmp文件并不完全兼容。
3,DataPump号称的支持并行线程,支持挂起重启,支持空间估算等…让高贵的,配置强大的Oracle服务器们情何以堪。
4,非要找出一个优点的话,那就是DataPump允许对导入导出对象进行版本控制,解决了上面说到的DMP版本向下不兼容的问题。
因为DataPump的基本使用方法与exp/imp几乎一样,只是在更多的参数上会有问题。
有问题的同学可以浏览以下官方文档。
导出: http://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_export.htm
导入: http://docs.oracle.com/cd/B19306_01/server.102/b14215/dp_import.htm