IMP/EXP,数据泵,SQL*Loader ,rman

数据库的逻辑备份和恢复:exp和imp
1.导库:导出和导入整个数据库
2.导表空间:导出和导入表空间
3.导表用户:导出和导入用户中所有对象
4.导表:导出和导入表或表分区

(1)commit=y 插入并提交,频繁提交会影响数据库效率。提交数据库过大时可以添加。
(2)ignore=y/n 该参数表示忽略创建错误,并继续执行。
(3)full=y 是否完全导入。

1.导出导入表
备份测试表:
create tables emp_test as select * from emp_test;

exp导出数据库表:
exp scott/123456@orcl file=/oracle/bak_oracle/emp_test.dmp tables="emp_test"
按条件进行选择性导出
exp scott/[email protected]:1521/orcl file=/oracle/bak_oracle/emp_test.dmp tables="emp_test" query=\"where sal between '1000' and '2000'\" log=/oracle/bak_oracle/emp_test.log
用有权限用户导出不同用户的不同表
exp \'sys/syste as sysdba\' file=/oracle/bak_oracle/emp_test.dmp tables="scott.emp_test,test.tab_test"

注:oracle用户登录并且配置了TNSNAME可以直接scott/123456
不是本机备份scott/[email protected]:1521/orcl

删除测试表
drop table emp_test ;
参数purge

imp导入数据库表:
查询该用户存放数据的缺省表空间:select username,default_tablespace from dba_users where username = 'SCOTT';
在特殊情况下有些用户的数据需要放到特殊的表空间中,使用如下的命令进行修改。
修改该用户存放数据的缺省表空间:alter user scott default tablespace XXX;
imp scott/123456 file=/oracle/bak_oracle/emp_test.dmp
用有权限用户导出不同用户的不同表导入到一个用户表中
imp \'sys/system as sysdba\' file=/oracle/bak_oracle/emp_test.dmp fromuser=scott;

查询表是否删除和导入成功
select count(*) from emp_test;

2.导出导入用户
导出一个用户下面的数据
exp scott/123456 file=/oracle/bak_oracle/scott.dmp owner=scott;
删除一个用户
SQL> drop user scott cascade;
drop user scott cascade
*
ERROR at line 1:
ORA-01940: cannot drop a user that is currently connected
(1)查看是否有SQL语句在占用这张表
select sess.INST_ID, sess.machine,
sess.program, sess.sql_id,
sess.sid, sess.serial#,
sess.PROCESS
lo.oracle_username, lo.os_user_name,
lo.locked_mode,
ao.object_name, ao.object_type,
ao.status,
from gv$locked_object lo, dba_objects ao, gv$session sess
where ao.object_id = lo.object_id
and lo.session_id = sess.sid
and sess.username = 'SCOTT'
--杀掉进程 sid,serial#
alter system kill session'10,11562';

(2)查看是否有会话没有结束
SQL> select username,sid,serial#,paddr,status from v$session where username='SCOTT';
USERNAME SID SERIAL# PADDR STATUS


SCOTT 1 281 000000008E51C510 KILLED
SCOTT 20 362 000000008E491150 INACTIVE
SCOTT 21 175 000000008E48D050 INACTIVE
SCOTT 28 169 000000008E51C510 KILLED

SQL> select PROGRAM from v$process where addr='000000008E490110';
PROGRAM
[email protected]

--杀掉进程 sid,serial#
alter system kill session '1,281';
alter system kill session '20,362';
alter system kill session '21,175';
alter system kill session '28,169';
SQL> drop user scott cascade;
User dropped.
导入一个用户下面的数据
先授权(连接数据库和DBA的权限)再导入(用户SCOTT下面的所有表)
grant connect,resource to scott identified by 123456;
grant dba to scott;
imp scott/123456 file=/oracle/bak_oracle/scott.dmp full=y;

用有权限的用户导入表给用户
imp 'sys/[email protected]:1521/orcl as sysdba' file=/oracle/bak_oracle/scott.dmp fromuser=scott touser=scott
注:touser=可以给不同的用户

3.导入导出表空间

---未完待续

需要备份的数据量大时建议选择数据泵
数据库的逻辑备份和恢复:expdp和impdp
数据泵只能在数据库的服务器端使用
在服务器上面创建目录,用于导入导出时存放数据
create directory DATA_BAK as '/oracle';
为目录授权用户读和写的权限
grant read,write on directory DATA_BAK to TEST;
查看目录和拥有者、路径
select * from dba_directories
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第1张图片

IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第2张图片
expdp 用户名/密码@IP/网络服务名 schemas=用户名 directory=创建的目录 dumpfile=数据表名.dmp logfile=数据表名.log
expdp test/[email protected]:1521/orcl schemas='TEST' directory='DATA_BAK' dumpfile=/oracle/xxx.dmp logfile=/oracle/xxx.log
schemas:用户名,directory:创建的存放数据的目录,dumpfile:将要导出的数据库备份dmp文件,logfile:存放导出日志文件,compression:导出时对文件进行压缩

IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第3张图片
用脚本文件导出数据库文件:
[oracle@master oracle]$ cat aa.par
userid=" test/test"
#userid=" / as sysdba" 用dba导出
directory=DATA_BAK
dumpfile=emp_test2.dmp
logfile=emp_test2.log
#parallel=5
compression=all
#nologfile=no
schemas=test
job_name=emp_test2_expdp
使用命令调用:
nohup expdp parfile=aa.par &

用命令导出数据库文件:
expdp test/[email protected]/orcl directory=DATA_BAK dumpfile=emp_test2.dmp logfile=emp_test2.log schemas=test
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第4张图片
数据泵导入数据库语句:
impdp test/[email protected]:1521/orcl REMAP_SCHEMA = test:test table_exists_action = replace directory=DATA_BAK dumpfile=emp_test2.dmp logfile=emp_test2.log

数据库的批量导入:SQL*Loader
连接用户
查看表结构
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第5张图片
 
控制文件:
[oracle@master oracle]$ cat EMP_LOADERTEST2.ctl
LOAD DATA
INFILE '/oracle/EMP_LOADERTEST2.ctl '
TRUNCATE INTO TABLE EMP_LOADERTEST2
FIELDS TERMINATED BY "," OPTIONALLY ENCLOSED BY '"'
(EMPNO,ENAME,JOB)
数据文件:
[oracle@master oracle]$ cat EMP_LOADERTEST2.dat
11,a1,1,11,22,33,44,55
11,a2,2,11,22,33,44,55
11,a3,2,11,22,33,44,55
11,a4,3,11,22,33,44,55
导入时,数据文件中的数据,需要和控制文件中相对应
需要导入的表中的字段类型需要一致
sqlldr test/test control=/oracle/EMP_LOADERTEST2.ctl data=EMP_LOADERTEST2.dat
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份
产生了sqlldr的日志文件
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第6张图片
查看日志文件中数据库导入的情况
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第7张图片
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第8张图片
检查表中是否有数据
IMP/EXP,数据泵,SQL*Loader ,rman,oracle数据库备份_第9张图片

扩展表空间

系统表空间会自动扩大,如果系统表空间莫名其妙的大
1.查询审计功能是否开着,审计表内数据大影响的
查看审计功能是否打开
show parameter audit;
2.关闭审计功能命令
SQL> alter system set audit_sys_operations=FALSE scope=spfile;
System altered.
SQL> alter system set audit_trail=NONE scope=spfile;
System altered.
重启数据库生效

注:audit_sys_operations的参数设置:
none 禁用数据库审计
os 启用数据库审计,并将数据库审计记录定向到操作系统审计记录
db 启用数据库审计,并将数据库所有审计记录定向到数据库的SYS.AUD$表
xml 启用数据库审计,并将所有记录写到XML格式的操作系统文件中。
xml,extended 启用数据库审计,输出审计记录的所有列,包括SqlText和SqlBind的值。

3.查询统计信息是否过多
统计信息时间默认为31天,时间可以修改为10天或一周,过期的统计信息系统自动删除
SQL> select dbms_stats.get_stats_history_retention from dual;
SQL> conn / as sysdba
Connected.
SQL> exec dbms_stats.alter_stats_history_retention(10);