本文主要总结我oracle导数据的经验(再不写怕忘了...).
oracle导数据有很多方法, 官方推荐的是exp/imp和数据泵(expdp/impdp).
不建议使用exp/imp导数据, 但是有的环境限制了操作系统登录, 没得法采用exp/imp导数据的.
exp是客户端工具, 导出的数据在客户端. 使用exp help=y即可查看帮助. 常用的也就那些.
exp导出的数据文件可以直接用more查看. 所以导出的数据也可以直接用sed之类的修改.
本处的file金额log的文件均是客户端上的,建议写绝对路径.
exp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
file=/u01/exp.dmp \
log=/u01/exp.log \
buffer=65536 feedback=100000 \
tables=user1.table1,user2.table2
exp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
file=/u01/exp.dmp \
log=/u01/exp.log \
buffer=65536 feedback=100000 \
owner=user1
exp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
file=/u01/exp.dmp \
log=/u01/exp.log \
buffer=65536 feedback=100000 \
full=y
导入的话,一般都是直接把该dmp文件全部导入,所以可以不用指明怎么导入
但是往往需要指定到其它用户和其它表空间,所以需要转换.
imp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
fromuser=user1 \
touser=newuser \
commit=y \
ignore=y \
buffer=65536 \
feedback=100000 \
file=/u01/exp.dmp \
log=/u01/imp.log
怎么修改表空间可以看我之前写的https://cloud.tencent.com/developer/article/1647382
数据泵工具是服务端工具,导出的数据在服务端, 所以得先在服务端创建好目录才行(默认目录是DATA_PUMP_DIR).
为方便使用,以下环境均使用system用户作为数据导入导出.
expdp导出的数据是二进制的, 所以可以通过strings expdp.dmp | more查看其内容
SHELL> mkdir -p /u01/expdp
SHELL> chown oracle:oinstall /u01/expdp
SQL> select * from dba_directories;
SQL> CREATE DIRECTORY expdp_dir AS '/u01/expdp';
SQL> grant read,write on directory expdp_dir to system;
还是按表,用户,全库来分.
expdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
DIRECTORY=expdp_dir \
JOB_NAME=expdp_ddcw_table_job \
DUMPFILE=expdp.dmp \
LOGFILE=expdp.log \
TABLES=user1.table1,user2.table2
expdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
DIRECTORY=expdp_dir \
JOB_NAME=expdp_ddcw_table_job \
DUMPFILE=expdp.dmp \
LOGFILE=expdp.log \
SCHEMAS=user1,user2
我的19c自动安装脚本就会生产 ~/scripts/backupdata.sh 脚本备份全库.(需要手动设置定时任务, 会在日志最后一行生成自动导入的命令,方便恢复) 自动安装19C脚本:https://cloud.tencent.com/developer/article/1674412
expdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
DIRECTORY=expdp_dir \
JOB_NAME=expdp_ddcw_table_job \
DUMPFILE=expdp.dmp \
LOGFILE=expdp.log \
FULL=y
和imp导入类似, 不指定导入内容默认就是dump的全部内容.
导入时候也可以替换用户表空间之类的: REMAP_DATA REMAP_DATAFILE REMAP_SCHEMA REMAP_TABLE REMAP_TABLESPACE
注意: 需要把dump文件拷贝到刚才指定的目录.
impdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME \
DIRECTORY=expdp_dir \
JOB_NAME=impdp_ddcw_table_job \
DUMPFILE=expdp.dmp \
LOGFILE=impdp.log \
REMAP_SCHEMA=user1:user2 \
REMAP_TABLESPACE=tablespace1:tablespace2
导出数据时可以用参数 estimate_only=y estimate=blocks 预估数据块的大小(往往会比实际数据大很多,仅作参考.)
也可以用estimate_only=y estimate=statistics 预估, 也有误差.
查看正在进行的数据泵任务
expdp/impdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME attach=JOB_NAME
#JOB_NAME就是expdp/impdp时指定的job名字.
主要是指导出的时候只想导出表的部分数据时,可以用QUERY过滤条件
QUERY=employees:"WHERE department_id > 10"
EXCLUDE=index,statistics,constraint
#排除对象,也可以是表,db_link之类的EXCLUDE=SCHEMA:"='HR'"
单独导出索引DDL(约束之类的也是同理)
INCLUDE=index SQLFILE=index.sql
然后修改该index.sql 加上并行跑快些.
有时候一次导几十张表,都写在命令行不好看.所以可以指定PARFILE, 把参数都写在PARFILE里.
例子:
cat test_parfile.par
DIRECTORY=expdp_dir
JOB_NAME=expdp_ddcw_table_job
DUMPFILE=expdp.dmp
LOGFILE=expdp.log
TABLES=user1.table1,
user2.table2,
user3.table3,
user4.table4
然后
expdp USERNAME/PASSWORD@IP:PORT/SERVICE_NAME parfile=test_parfile.par
最近稍微有点空, 下一篇写redis, 然后pxe 再然后ansible......
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。