最近客户需要搭建一个测试库,折腾完,正好把的经验整理一下。
一、测试库库创建:
- 在windows下创建数据库最好以管理员权限运行,即使是Administrator登录也要这样操作,一般我们最好是保证使用Administrator来创建。不然后面可能监听无法创建。
- 数据库是OLAP还是OLTP,OLAP最好修改一下数据块
- 字符集一定要和生产库的保持一致,包括Language。同时保证
nls_database_parameter
和nls_instance_parameter
中的language保持一致 - 根据自己情况,修改以下参数:
alter database noarchivelog;
alter database flashback off;
alter system set processes=500 scope=spfile;
alter system set sessions=555 scope=spfile ;
alter profile default limit password_life_time unlimited;
alter profile default limit failed_login_attempts unlimited;
二、生产库数据导出
- 在导出之前我们需要做一下评估,看看要导出的数据需要多少空间,如果太大,数据文件最好分片,不能导出速度太慢
expdp system/test@test schemas=(hr,scott) directory=dumpdir parallel=5 estimate_only=Y estimate=blocks
#这个estimate可以选择根据blocks或者statics来计算
- 我们需要清除是否服务器上安装过多次Oracle软件,也就是说有多个expdp文件,因为要保证使用的Oracle服务器所在目录下的expd最安全。
linux: which expdp
windows: where expdp
- 导出的环境变量中的字符集要与数据库的符集保持一致,在windows中就要核对注册表与数据库的符集是否一致。不然在导出过程中报错:
ORA-39064: 无法写入日志文件
ORA-29285: 文件写入错误
- 如果导出的文件很大且需要网络传送,最好是考虑压缩一下文件,压缩的方式有
ALL, DATA_ONLY, [METADATA_ONLY] and NONE
. 一般就用ALL
就好。 - 导出过程中如果手工停止,有可能后台进程并会停止,仍然在导出,这时就需要手工把相应进程Kill掉。再次导出时可以使用
reuse_dumpfiles=Y
来重用之前的dump文件。 - 在分片导出的情况下可以考虑并行,并行度就要根据服务器的CPU有关,不同服务器计算方式不一样,这里就不建议了,大家看着办。
%U
代表分片的编号。 - expdp导出当然需要先创建目录,我们需要注意的是这个目录要允许数据库创建用户可读写。在windows要保证创建者(一般是adminstrator)和ora_dba组有读写权限,在linux只用保证创建者有读写权限就可以了。
导出命令如下:
sqlplus sys/test@test as sysdba
SQL>create directory dumpdir as '~/dumpdir'
SQL>grant read,write on directory dumpdir to system
SQL>exit
expdp system/test@test schemas=(hr,scott) directory=dumpdir dumpfile=expdb_%U.dmp logfile=expdp.log parallel=5 filesize=5G compression=ALL reuse_dumpfiles=Y
三、测试库导入
- 导入时要考虑服务器的空间,因为即将导入的dump文件需要占用一定的空间,导入数据库完成之前不能删除,导入的过程中数据库也需要大量空间,所以最好是要有生产库的双倍空间,如果dump压缩了就可以不需要这么多空间。
- 环境变量的字符集和luange是否与生产库、测试库中一致。一定要保证一致。原因上面讲过了。
- 创建表空间并添加数据文件,表空间的名最好与生产库相同,如果不同,需要使用
remap_tablespace=prod_tbs:sit_tbs
来映射。添加的文件最好一次性指定大小,不要让数据库在导入的时候自动扩展,这样效率不高。
create tablespace test datafile '/opt/app/oracle/data/test01.dbf' size 30G;
alter tablespace test add datafile '/opt/app/oracle/data/test02.dbf' size 30G;
........
–以下SQL在生产库中查出各表空间的大小
select a.tablespace_name,round(total_size,2),round(free_size,2),round(total_size-free_size,2) as use_size from
(select tablespace_name,sum(bytes)/power(1024,3) total_size from dba_data_files a group by tablespace_name) a,
(select tablespace_name,sum(bytes)/power(1024,3) free_size from dba_free_space a group by tablespace_name) b
where a.tablespace_name=b.tablespace_name
order by 2 desc
- impdp会自动创建schema,不用手工创建,如果创建也没有关系。
- 导入导出的并行度最好是相同
- impdp当然也需要创建目录,注意事项就不再赘述了。
- 如果生产库数据库版本比测试库高,就需要指定version。要保证兼容。
导入命令
sqlplus sys/test@test as sysdba
SQL>create directory dumpdir as '~/dumpdir'
SQL>grant read,write on directory dumpdir to system
SQL>exit
impdp system/test@test schemas=(hr,scott) directory=dumpdir dumpfile=expdb_%U.dmp logfile=impdp.log parallel=5
问题处理:
- impdp时报错如下:
ORA-39002: invalid operation
ORA-39059: dump file set is incomplete
ORA-39246: cannot locate master table within provided dump files
在expdp时导出时提示已成功导出,且复制文件时也没有漏掉。后来在生产库重新创建了目录,然后重新导出,再导入时就没问题了。可能之前在这个目录执行了多次expdp,没有保证上一次expdp的进程完全结束就开始了新一次expdp导致的。也有说部分dump文件的权限oracle无法访问也会导致这种情况。