第二十四讲 装库与卸库
本讲内容 对卸库与装库的使用。 卸库与装库直接的异同点。 操作的方法。 操作的模式。 错误处理和疑难问题的解决技术。
卸库与装库的功能 备份与恢复 在不同的Oracle实例间转移数据 在不同的表空间之间转移数据 注:A表空间数据转移到B表空间时,应保证B表空间有足够的容量,装库程序不会给B增加表空间容量。 当某个已经存在的数据库需要重建时,卸库与装库是在重建前保存当前数据库中数据的唯一手段。 注意:在执行全库卸出后,在新的数据库装入原数据库卸出的数据之前,还必须运行许多S Q L语句和一些S Q L脚本程序。
卸库与装库的相同点 卸库与装库的运作方式是相同的,只要学会其中的一个使用方法,基本上就能掌握另一个用法。这两个工具有以下相同点: 都可以交互式运行,也都可以从一个文件中读取执行参数。 都接受关键字(由keyword_value= 起始的参数)或与位置相关的参数(那些在命令行中根据不同的顺序而有不同意义的参数)。 都可以处理Oracle数据库中数据和数据结构的只读副本。 都可以在不同的Oracle帐号和不同的硬件平台之间移动数据。
卸库与装库的不同点 尽管卸库与装库类似,它们还是有一些不同。某些参数只能由卸库使用,而另一些则只能由装库使用。例如,“from user”和“to user”参数就只能由装库使用。同样地,“compress”参数只能在运行卸库时使用。 因为装库要创建并载入数据到Oracle数据库文件中,所以它会报告由于使用它而引起的Oracle的各类错误。 卸库则对卸库文件所在磁盘的空间大小比较敏感。 尽管存在以上不同点,卸库与装库的方法和操作模式是一样的。
操作方法 调用交互式卸库(无参数)。 调用交互式装库(无参数)。 回答提示问题从而使卸库与装库达到最后成功。 运行参数驱动的卸库与装库。 使用parfile关键字参数。 交互式和参数驱动方法的混合使用。
交互式卸库:无参数调用 调用卸库程序 C:\EXP Username 卸库操作人员的用户名和密码 Enter array fetch buffer size 卸库工具将数据写入卸库文件时作为工作区的内存块大小。一般输入一个10K~10M之间的数值(10240~104857 60) Export file 卸库文件名。默认为expdat.dmp,可更改 (2)U(sers) or (3)T(ables) Oracle要知道用户希望用哪一种方法。若选择2,应输入一个或多个用户名;若选择3,应输入一个或多个用户拥有的表名 Export table data(yes/no) 是关于写什么数据到卸库文件中去的指令。Oracle总是将用来创建卸库对象的SQL语句也写到卸库文件中。回答yes则告诉Oracle卸出对象中的数据 Compress extents(yes/no) Oracle需要知道写入卸库文件中的create table语句,是否要求包含一个初始化空间以容纳所有已在表中的数据 Table(T) or Partition(T:P) to be exported 要卸库的表的名字或要被卸库的分过区的大表的分区名
交互式装库:无参数调用 Username 装库操作人员的用户名和密码 Import file 待装库文件名。默认为expdat.dmp,可更改 Enter insert buffer size (minimum is 4096) 装库工具将数据写入表时作为工作区的内存块大小。一般输入一个10K~10M之间的数值(10240~10485760) List contents of import file only (yes/no) 若回答yes,Oracle将把写在装库文件中的SQL语句列出来。若回答no,装库工具将会把数据和数据的定义一起带到数据库中 Ignore create error due to object existence (yes/no) Oracle要知道如果在装库过程中,装库文件内的某个对象在数据库中已经存在了该怎样处理。若回答yes,Oracle就不管该对象存不存在而装入它的数据。若回答no,那么当Oracle发现某个对象在数据库中已经存在时,它会报告错误而去处理下一个对象 Import grants (yes/no) Oracle要知道当装入一个对象之后是否要运行写在装库文件中的g rant语句 Import table data (yes/no) Oracle要知道是否应该装入表数据( yes),或者是只运行SQL语句来创建对象( no) Import entire export file (yes/no) Oracle要知道是装入全部的文件还是只装入其中的某个特定部分。如果回答yes,装库开始;如果回答no,Oracle将会提问想要装库的内容
参数驱动方式的装库 当执行imp命令时,可将一个或多个参数传递给命令行。参数驱动的方法是最灵活和最可靠的装库新技术。其命令格式为 imp keyword1=value1 keyword2=value2 keyword3=value3 通过使用关键字参数,可以命令Oracle从卸库文件中装入什么数据。在操作系统提示符下键入imp help=y命令,就可以得到一张关键字、关键字含义及其默认值的列表。
参数列表 Userid Oracle用户名及口令。如果只给出用户名, Oracle 会提示:请输入口令 None Buffer 数据缓冲区的大小(字节数)。如果要求的缓冲区特别大,Oracle会去努力获取尽可能大的空间 4096 File 写入数据的文件名。如果没有指明文件扩展名,Oracle会假定为.dmp Expdat.dmp Compress 将存储参数写入到卸库文件中,使得在装库时,将所有的表数据放置在一个分区中 Y Grants 将SQL的grant语句写入卸库文件 Y
参数列表 Indexes 将SQL的create index语句写入卸库文件 Y Triggers 指示Oracle是否要把触发子创建语句写入卸库文件 Y Rows 将表的各行数据以及当前对象的定义一起卸出来 Y Constraints 将在装入对象时需要用来重建完整性的SQL语句写入卸库文件(例如,主键和索引语句) Y Log 指示Oracle在卸库操作中把屏幕上的输入/输出信息写入一个磁盘文件 None
参数列表 Full 控制Oracle是否将用来重建所有与系统相关联的数据文件、表空间、回退段等SQL语句写入卸库文件 N Owner 提供一个Oracle帐号清单,以显示谁的对象被写入卸库文件 None Tables 提供一个表的清单,以显示哪些表的定义或数据被写入卸库文件 None RecordLength 写入卸库文件的记录的长度(字节数) Operating system-specific Inctype 正在执行的增量卸库的类型 None
参数列表 Record 指示Oracle跟踪增量卸库写入的数据字典的视图。当使用一个增量卸库文件进行装库时会用到该信息 Y Parfile 包含有卸库所需参数的文件名 None Consistent 指示Oracle维护整张表的一致性。这能保证在进行卸库时,即使被卸出的表正在被使用,卸出的数据仍然是该表在卸库开始时数据的副本 N Statistics 将SQL的analyze语句写入卸库文件 Estimate Direct 使卸库通过直接读取数据来提取数据,而忽略SQL命令处理层。这种方法比传统的路径卸库要快得多 N Feedback 指定在卸库过程中显示一个进程刻度条,刻度条上每走一点,表示若干行已经被卸出 0
Parfile关键字参数 这个参数值得特别注意。可以使用它和一个文件名来为卸库与装库提供参数。使用parfile参数的格式有以下两种: imp parfile=my.parfile 或exp parfile=my.parfile 可以在parfile文件(在本例中为“my.parfile”)中放置一列参数,这些参数会作为“my.parfile”文件的内容而提供给卸库。 userid=wall/the tables=(waters,wright,mason) buffer=102400 compress=y grants=y 而下面的参数会作为“my.parfile”文件的内容提供给装库: userid=delicate/thunder fromuser=pulse touser=strat buffer=102400 grants=y
关于参数文件格式 两个参数文件的格式都是不受限制的。其中卸库参数文件在第一行写了两个参数,然后在第二行写了三个参数。可以轻松地完成下面的两个事情之一: userid=diamond/crazy tables=(dogs,war) buffer=102400 grants=y compress=y 或 userid=diamond/crazy tables=(dogs,war) buffer=102400 grants=y
交互式方法和参数驱动方法的混合使用 可以混合使用两种方法来调用卸库与装库,如下所示: exp floyd/pink buffer=102400 compress=n 当Oracle在命令行中碰到至少一个关键字参数时,它就会立即启动装库或卸库过程,而不会进入交互式对话。例如,使用命令imp mason/nick file=boogie将不会等待其他参数值的提示而立即启动装库。当采用这种方法来调用卸库或装库时,一定要小心。假设要执行一次全库卸出,可以用下面的命令调用卸库程序: exp system/not_manager buffer=102400 rows=n Oracle将一直执行卸库而不会提示用户输入其他的参数。 提示:多尝试卸库与装库,从而不会在最不希望的时候被它们的行为弄得手足无措。
卸库与装库的模式 表模式卸库与装库。 用户模式卸库与装库。 全库模式卸库与装库。
表模式卸库 使用表模式卸库,应告诉Oracle要卸出的一个或多个表的表名。Oracle将这些表的数据写入卸库文件。命令 exp userid=amanda/scholz tables=(feeling,ride,mast) file=fm.dmp 卸出括号内的属于amanda用户的三个表。其卸库文件为fm.dmp。 注意:当在tables关键字后列出多个表时,表名之间要用逗号隔开,并且整个列表都要包含在括号内。
用户模式卸库 使用用户模式卸库, Oracle将卸出一个用户的所有对象,包括视图、同义词、触发子、过程、数据库链接和表。用户模式卸库一般用于整理一个表空间。在用户的对象全部卸出之后,表空间就可以被删除或重建。命令 exp userid=beatles/rusty owner=(john,paul,george,ringo) 卸出括号内的四个用户。其卸出文件为expdat.dmp。 注意:当在owner关键字后列出多个拥有者名字时,名字之间要用逗号隔开,并且整个列表都要包含在括号内。
全库模式卸库 使用全库模式卸库,除SYS数据库用户之外,所有数据库用户的数据和数据库支持文件(数据文件、表空间、回退段等等)的创建语句都被写入卸库文件。命令 exp userid=system/not_manager full=y grants=y indexes=y 将整个数据库卸出到一个expdat.dmp文件中。 注意:在对全库模式卸库进行初始化时,并非每个数据库用户都可以使用full关键字。在许多情况下,往往是使用Oracle的SYSTEM帐号进行全库模式卸库。
表模式装库 使用表模式装库,应告诉Oracle要装入的一个或多个表的表名。Oracle就将这些表的数据写入数据库。命令 imp userid=fletcher/frank tables=(blowup,redmond,flowers) 装入括号内的属于f letcher用户的三个表。卸库文件为expdat.dmp。 提示:如果用户fletcher从另一个用户所有的卸库文件中装入表,那么这些表将在fletcher模式下创建,而不是在其他用户模式下创建。 注意:当在tables关键字后列出多个表名时,表名之间要用逗号隔开,并且整个列表都要包含在括号内。
用户模式装库 使用用户模式装库,Oracle将装入某个特定用户的所有对象,包括视图、同义词、触发子、过程、数据库链接和表。用户模式装库一般在表空间经过整理碎片而被重建之后使用。命令 imp userid=blaster/caster fromuser=(per_man,acc_man) touser=(per_man,acc_man) file=two_users 装入括号内的两个用户。其卸出文件为two_users.dmp。 注意:当在fromuser或touser关键字后列出多个用户名时,名字之间要用逗号隔开,并且整个列表都要包含在括号内。
全库模式装库 全库模式装库分为两步。第一步,执行卸库文件中所有数据库支持文件(数据文件、表空间、回退段等等)的创建语句。这一步完成后,数据库的整个结构就形成了。第二步,将用户的对象装入适当的表空间。命令 imp userid=system/beto full=y file=full_tst 执行了一次从full_tst.dmp文件的全库模式装库。 注意:当初始化全库模式装库时,并非每个数据库用户都可以使用full关键字。在许多情况下,往往使用Oracle的SYSTEM帐号进行全库模式装库。 提示:在使用SQL的create database命令创建了一个新的数据库之后,当用系统帐号执行一次全库模式装库时,不管在整库卸出时使用什么口令,口令一律为manager。
分割表上的卸库与装库 卸库与装库中会话的大多数对象都是表,使用Oracle8i的分割(Partition)功能,可以将分割对象看作源数据。选定分割的卸库可以使用分割级的卸库方式来完成,其命令类似于: exp system/ahbeto file=export.dmp tables=(scott.b:px, scott.b:py, mary.c, d:qb) 在这里,表名包含了属于用户scott表b的px和py分割、属于用户mary的表c以及属于正在运行卸库过程的用户的qb分割。 注意:每个分割名必须与其表名对应。
分割级装卸库 Oracle8i中分割级的装库可以将一个表的一个或多个卸出的分割表或者一个非分割表的卸出文件装入到一个分割的或非分割的目标表中。装库过程从卸库文件中仅读取指定的源分割区的数据行。当装库过程被调用时,这些说明被传送到命令行上,或从参数文件中读取。 提示:如果卸库文件中的数据行超出了目标分割定义的范围,则分割级装库不能将其装入指定的目标分割范围。源分割和目标分割必须有相同的表名。换句话说,表的某个分割中的数据只能装入相同表的另一个分割。
错误情况及解决办法 试图在数据库未打开时运行卸库或装库。 试图读取由数据库管理员所写的卸库文件。 试图在权限不足的情况下执行全库模式的卸库或装库。