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;
写到这里,磁盘空间不够真是伤不起啊!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端