oracle数据库导入、导出、备份方法大放送

费话不上,直接上文:

数据泵导出,根据用户名导出多个用户下的表及数据:
expdp 用户名/密码@IP地址:端口/要连接的数据库实例名 DIRECTORY=BACKUPDIR  schemas=用户口1,用户2,用户3 DUMPFILE=DDL1.dmp logfile=DDL.log parallel=3 compression=ALL

只导出数据结构,在cmd下输入下面命令:

expdp 用户名/密码@IP地址:端口/要连接的数据库实例名 DIRECTORY=BACKUPDIR  schemas=用户口1,用户2,用户3 content=metadata_only DUMPFILE=DDL1.dmp logfile=DDL.log parallel=3 compression=ALL

对于备份目录BACKUPDIR可以用下面的方法创建:

先查询数据库中的备份目录:

select * from dba_directories;

创备份目录:

create or replace direcotry BACKUPDIR as 'd:\data_bak';

然后在d盘下创建目录data_bak;


如果是要把数据导入到新建的数据库中,则要先创建用户及数据表空间:

create user 用户名1 identified by 密码;
grant dba to 用户名1;

create user 用户名2identified by 密码;
grant dba to 用户名2;

create user 用户名3 identified by 密码;
grant dba to 用户名3;

create tablespace  表空间名1 datafile 'd:\data_file\表空间名101.dbf' size 50m uniform size 128k;
create tablespace  表空间名2 datafile 'd:\data_file\表空间名201.dbf' size 50m uniform size 128k;
create tablespace  表空间名3 datafile 'd:\data_file\表空间名301.dbf' size 50m uniform size 128k;

设置数据库表空间为自动增长型:

alter database datafile 'd:\data_file\表空间名101.dbf' autoextend on;
alter database datafile 'd:\data_file\表空间名201.dbf' autoextend on;
alter database datafile 'd:\data_file\表空间名301.dbf' autoextend on;

如果要导入所有数据,又不知道有哪些表空间,可以用下面的sql查询数据库中有哪些表空间:

select * from dba_tablespaces;

其中除了下面5个系统默认的表空间,其他的都是用户创建的了:

SYSTEM
SYSAUX
UNDOTBS1
TEMP
USERS

导入数据,导入所有用户下的数据,在cmd命令提示符下,输入下面命令:

impdp 用户名/密码@IP地址:端口/要连接的数据库实例名 DIRECTORY=BACKUPDIR DUMPFILE=DDL1.dmp full=y


如果导入过程中,数据量太大,空间不够,可用下面的sql添加表空间:

alter tablespace 表空间名1 add datafile 'd:\data_file\表空间名1.dbf' autoextend on next 50m ;--需要先指定文件大小,否则提示无法创建文件

alter tablespace 表空间名2 add datafile 'd:\data_file\表空间名2.dbf' autoextend on next 50m ;

alter tablespace 表空间名3 add datafile 'd:\data_file\表空间名3.dbf' autoextend on next 50m ;


windows下,单个表空间数据文件不能超过32GB,如果超过就会报错::"表 TAT.CURVE 分区 SYS_P179521 无法通过 16 (在表空间 STAT 中) 扩展",就要用上面的方法增加表空间文件,下面是查询各个表空间大小的sql:

--查询系统各个表空间的大小及使用百分比情况
SELECT UPPER(F.TABLESPACE_NAME) "表空间名",D.TOT_GROOTTE_MB "表空间大小(M)",
    D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)",
    TO_CHAR(ROUND((D.TOT_GROOTTE_MB - F.TOTAL_BYTES)/D.TOT_GROOTTE_MB * 100,2),'990.99')"使用比",
    F.TOTAL_BYTES "空闲空间(M)",F.MAX_BYTES "最大块(M)"
  FROM (SELECT TABLESPACE_NAME,ROUND(SUM(BYTES) / (1024 * 1024), 2) TOTAL_BYTES,
               ROUND(MAX(BYTES) / (1024 * 1024), 2) MAX_BYTES
        FROM SYS.DBA_FREE_SPACE
        GROUP BY TABLESPACE_NAME
       ) F,
      (SELECT DD.TABLESPACE_NAME,ROUND(SUM(DD.BYTES) / (1024 * 1024), 2) TOT_GROOTTE_MB
       FROM SYS.DBA_DATA_FILES DD
       GROUP BY DD.TABLESPACE_NAME
      ) D
  WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME
  ORDER BY 4 DESC;

如果是磁盘空间不够了,又想把已导入的部分数据删除,节约出空间,可以用下面的方法,先查询出某用户下的所有表的删除sql,:

select 'truncate table stat.'||table_name||';' from dba_tables where owner='用户名';--注意这里的用户名要用大写(如果数据库里的是大写的)

然后再用上面查询出的sql 把不要的数据删除,数据删除后,再用下面查询生成的sql重新收缩表空间大小,把多余的空间释放出来,就可以继续导入其他数据了;

--生成收缩空闲表空间的sql
--首先,如果没有分配的空间不足100M,则不考虑收缩。
--收缩目标:当前数据文件大小 - (没分配空间- 100M)×0.8
--优点:可以直接执行生成的sql
select /*+ ordered use_hash(a,c) */
  'alter database datafile '''||a.file_name||''' resize '
   ||round(a.filesize - (a.filesize - c.hwmsize-100) *0.8)||'M;',
  a.filesize,
  c.hwmsize
from
(
select file_id,file_name,round(bytes/1024/1024) filesize from dba_data_files
) a,
(
select file_id,round(max(block_id)*8/1024) HWMsize from dba_extents
group by file_id) c
where a.file_id = c.file_id
  and a.filesize - c.hwmsize > 100;


写到这里,磁盘空间不够真是伤不起啊!

猜你喜欢

转载自blog.csdn.net/c_huabo/article/details/46379739
今日推荐