背景
oracle版本:12.2.0
目的:将一个用户的表结构和数据复制到另一个用户下(全量备份)
当前环境为虚拟机,已提前做好快照,避免中途出现问题
如果对oracle不熟,最好还是了解下用户,表空间和表之间的关系
数据备份和数据还原下仅列出主要命令,调试用到的命令见其他数据备份 1. 管理员登录 1 sqlplus sys/ 123456 @orcl as sysdba;
2. 创建备份目录 1 2 3 select * from dba_directories;create directory backup as 'd:\backup' ;
3. 赋于要导出数据表所属用户权限 1 grant read,write on directory backup to C##USER1;
4. 数据备份 1 expdp C##USER1/ 123456 @orcl directory= backup dumpfile= backup.dmp logfile= export.log
数据备份并没有遇到多大的阻碍,一路执行就成功了,这里贴出导出成功的日志文件:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 ;;; Export: Release 12.2.0.1.0 - Production on 星期一 10月 31 10:54:38 2022 Copyright (c) 1982, 2017, Oracle and/or its affiliates. All rights reserved. ;;; 连接到: Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 启动 "C##LEGACY"."SYS_EXPORT_SCHEMA_01": C##LEGACY/********@orcl directory=bpdata1 dumpfile=backup.dmp logfile=export.log 处理对象类型 SCHEMA_EXPORT/TABLE/TABLE_DATA 处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/STATISTICS/INDEX_STATISTICS 处理对象类型 SCHEMA_EXPORT/TABLE/STATISTICS/TABLE_STATISTICS 处理对象类型 SCHEMA_EXPORT/STATISTICS/MARKER 处理对象类型 SCHEMA_EXPORT/SYSTEM_GRANT 处理对象类型 SCHEMA_EXPORT/ROLE_GRANT 处理对象类型 SCHEMA_EXPORT/DEFAULT_ROLE 处理对象类型 SCHEMA_EXPORT/PRE_SCHEMA/PROCACT_SCHEMA 处理对象类型 SCHEMA_EXPORT/TABLE/TABLE 处理对象类型 SCHEMA_EXPORT/TABLE/COMMENT 处理对象类型 SCHEMA_EXPORT/TABLE/IDENTITY_COLUMN 处理对象类型 SCHEMA_EXPORT/TABLE/INDEX/INDEX 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/CONSTRAINT 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT . . 导出了 "C##LEGACY"."MSC_HUA_HISTORY" 14.58 GB 71276923 行 . . 导出了 "C##LEGACY"."ROSHAN_CUSTOMERS_ARCHIVE" 2.877 GB 20218000 行 . . 导出了 "C##LEGACY"."CELL_TOWERS" 1.080 GB 16865669 行 . . 导出了 "C##LEGACY"."NEW_CELL_IDS" 2.318 MB 14745 行 . . 导出了 "C##LEGACY"."MSC_DATA" 124.4 KB 246 行 . . 导出了 "C##LEGACY"."MCC_MNC_OPERATOR" 158.0 KB 1511 行 . . 导出了 "C##LEGACY"."DJANGO_ADMIN_LOG" 41.49 KB 145 行 . . 导出了 "C##LEGACY"."DJANGO_SESSION" 21.28 KB 14 行 . . 导出了 "C##LEGACY"."AUTH_USER" 10.00 KB 2 行 . . 导出了 "C##LEGACY"."QUERY_TASK" 9.156 KB 1 行 . . 导出了 "C##LEGACY"."AUTH_PERMISSION" 8.781 KB 32 行 . . 导出了 "C##LEGACY"."DJANGO_MIGRATIONS" 8.437 KB 25 行 . . 导出了 "C##LEGACY"."DJANGO_CONTENT_TYPE" 6.257 KB 8 行 . . 导出了 "C##LEGACY"."AUTH_GROUP" 0 KB 0 行 . . 导出了 "C##LEGACY"."AUTH_GROUP_PERMISSIONS" 0 KB 0 行 . . 导出了 "C##LEGACY"."AUTH_USER_GROUPS" 0 KB 0 行 . . 导出了 "C##LEGACY"."AUTH_USER_USER_PERMISSIONS" 0 KB 0 行 已成功加载/卸载了主表 "C##LEGACY"."SYS_EXPORT_SCHEMA_01" ****************************************************************************** C##LEGACY.SYS_EXPORT_SCHEMA_01 的转储文件集为: C:\BACKUP\BACKUP.DMP 作业 "C##LEGACY"."SYS_EXPORT_SCHEMA_01" 已于 星期一 10月 31 10:56:19 2022 elapsed 0 00:01:38 成功完成
数据还原
注:下述sql命令均在sys账号下执行
1. 新建表空间 1 2 3 create table space bpdatafile 'C:/backup/bp.DBF' size 100 M autoextend on next 50 M maxsize unlimited;
2. 创建用户并赋权 1 2 3 4 5 6 7 8 create user C##USER2 identified by "123456" default tablespace bpprofile DEFAULT ACCOUNT UNLOCK; grant dba to C##USER2;grant resource to C##USER2;
3.数据还原 1 impdp C##USER2/ 123456 @orcl directory= backup dumpfile= backup.dmp remap_schema= C##LEGACY:C##WYX logfile= import.log
若已有相同的数据表(此时会报ORA-39151错误),则添加下述参数:table_exists_action=replace
skip:跳过并处理下一个对象
append:为表增加数据
truncate:清空表,然后为其增加数据
replace:删除已存在表,重新建表并追加数据
本以为到此应该能够成功进行还原了,没想到报了一个数据文件无法扩展的问题,找了下资料发现oracle里一个数据文件最大为32G,故根据提示在对应的表空间新增数据文件:
1 alter table space "USERS" add datafile 'C:\APP\ORACLE\ORADATA\ORCL\USERS02.DBF' size 100 m autoextend on next 100 m maxsize unlimited;
至此,已经能成功导入还原了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 ;;; Import: Release 12.2 .0 .1 .0 - Production on 星期一 10 月 31 18 :51 :06 2022 Copyright (c) 1982 , 2017 , Oracle and / or its affiliates. All rights reserved. ;;; 连接到: Oracle Database 12 c Enterprise Edition Release 12.2 .0 .1 .0 - 64 bit Production 已成功加载/ 卸载了主表 "C##LEGACY"."SYS_IMPORT_FULL_01" ORA-39146 : 方案 "C##WYX2" 不存在 启动 "C##LEGACY"."SYS_IMPORT_FULL_01": C##WYX
其他 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 select * from dba_directories;select * from dba_tablespaces;select * from dba_data_files;select * from dba_users;alter table space "USERS" drop datafile 23 ;SELECT T.TABLESPACE_NAME,D.FILE_NAME,D.AUTOEXTENSIBLE,D.BYTES,D.MAXBYTES,D.STATUSFROM DBA_TABLESPACES T,DBA_DATA_FILES DWHERE T.TABLESPACE_NAME = D.TABLESPACE_NAMEORDER BY TABLESPACE_NAME,FILE_NAME;SELECT a.tablespace_name "表空间名", total "表空间大小", free "表空间剩余大小", (total - free ) "表空间使用大小", total / (1024 * 1024 * 1024 ) "表空间大小(G)", free / (1024 * 1024 * 1024 ) "表空间剩余大小(G)", (total - free ) / (1024 * 1024 * 1024 ) "表空间使用大小(G)", round((total - free ) / total, 4 ) * 100 "使用率 %" FROM (SELECT tablespace_name, SUM (bytes) free FROM dba_free_space GROUP BY tablespace_name) a, (SELECT tablespace_name, SUM (bytes) total FROM dba_data_files GROUP BY tablespace_name) b WHERE a.tablespace_name = b.tablespace_name;