第二十章 数据的移动
<p>[TOC]</p>
<h2>Oracle 导出和导入应用程序</h2>
<ul>
<li>导出和导入应用程序能做什么</li>
<li>逻辑备份不能作为备份和恢复策略的基石</li>
<li>导出应用程序名为exp,要有create session权限,exp_full_database角色</li>
<li>导入应用程序名为imp,要有create session权限,imp_full_database角色</li>
<li>不完全恢复前后都要做全备份</li>
<li>启动导出和导入程序的方式
使用命令行,这也是功能最全和数据库管理员使用最多的方法
使用交互方法,即问答方式
使用参数文件
使用OEM,即图形方式</li>
</ul>
<h2>导出应用程序的用法</h2>
<ul>
<li>四种方法
表方式:指定某张表
用户方式:指定用户
表空间方式:整个表空间
全库方式:除sys用户中的对象,数据字典无法导出</li>
<li>$ exp -help</li>
</ul>
<h2>导入应用程序的用法</h2>
<ul>
<li>四种方法
表方式:指定某张表
用户方式:指定用户
表空间方式:整个表空间
全库方式:除sys用户中的对象,数据字典无法导出</li>
<li>$ imp -help</li>
</ul>
<h2>导出和导入程序的应用实例</h2>
<ul>
<li>
<p>环境准备</p>
<pre><code>SQL> connect scott/tiger
SQL> create table emp_dump as select * from emp;
SQL> create table dept_dump as select * from dept;
SQL> select count(*) from emp_dump;
SQL> select count(*) from dept_dump;</code></pre>
</li>
<li>执行逻辑备份、破坏数据、恢复
<pre><code>$ mkdir -p /home/oracle/backup/export
--Linux 5.0之后括号要转义
$ exp scott/tiger file=/home/oracle/backup/export/scott.dmp tables=\(emp_dump,dept_dump\)
--检查逻辑备份的文件是否存在
--破坏数据
select * from scott.emp_dump;
select * from scott.dept_dump;
update emp_dump set job='CEO';
commit;
drop table emp_dump;
drop table dept_dump;
SQL> select * from dept_dump;
ORA-00942: table or view does not exist
SQL> select * from emp_dump;
ORA-00942: table or view does not exist
--恢复丢失的表
$ imp scott/tiger file=/home/oracle/backup/export/scott.dmp
--检查发现数据回来了,回到导出数据的状态
select * from scott.emp_dump;
select * from scott.dept_dump;</code></pre></li>
</ul>
<h2>数据泵</h2>
<ul>
<li>是10g后引入的新工具,包括exp、imp的功能</li>
<li>不再指定绝对路径,而是由数据库目录对象指定,由DBA创建,通过dba_directories查询。</li>
<li>
<p>expdb和impdb应用程序</p>
</li>
<li>
<p>重复上一节操作</p>
<pre><code>-- 查看默认数据库目录对所对应的操作系统目录
-- /u01/app/oracle/admin/orcl/dpdump/
-- DATA_PUMP_DIR
select * from dba_directories where directory_name like 'DATA_PUMP%';
-- 授予读写权限给scott用户
SQL> grant read,write on directory DATA_PUMP_DIR to scott ;
SQL> connect scott/tiger
select * from scott.emp_dump;
select * from scott.dept_dump;</code></pre>
</li>
<li>
<p>逻辑备份</p>
<pre><code>-- 目录、表、文件、备份条件
-- /home/oracle/backup/export/scott_par.txt
DIRECTORY=DATA_PUMP_DIR
tables=(emp_dump,dept_dump)
DUMPFILE=scott_dp.dmp
QUERY=scott.emp_dump:"where job<>'ANALYST' and sal>1250"
--备份(参数过多可以保存在txt文件里)
$ expdp scott/tiger parfile=/home/oracle/backup/export/scott_par.txt
--报错:解决办法加大临时表空间
ORA-39006: internal error
ORA-39065: unexpected master process exception in DISPATCH
ORA-01652: unable to extend temp segment by 256 in tablespace TEMP
ORA-06512: at "SYS.KUPM$MCP", line 5951
ORA-06512: at "SYS.KUPM$MCP", line 20838
ORA-06512: at "SYS.KUPM$MCP", line 5397
-- 检查/u01/app/oracle/admin/orcl/dpdump/scott_dp.dmp文件存在</code></pre>
</li>
<li>
<p>expdp学习
expdp -help
官方文档</p>
</li>
<li>
<p>破坏文件,然后恢复</p>
<pre><code>SQL> connect scott/tiger
drop table emp_dump;
$ impdp scott/tiger parfile=/home/oracle/backup/export/scott_par.txt
--只恢复逻辑备份时指定的数据,不需要恢复的数据会跳过</code></pre>
</li>
<li>impdp 学习
impdp -help
官方文档</li>
</ul>
<h2>不同用户及不同表空间之间的数据移动</h2>
<ul>
<li>
<p>把scott用户绝大多数对象传送到pjinlian用户中,表空间由USERS修改为 PIONEER_DATA
<code>select * from dba_users where username in('SCOTT','PJINLIAN');</code></p>
</li>
<li>
<p>查看数据</p>
<pre><code>select object_name,object_type,status,owner from dba_objects where owner in('SCOTT','PJINLIAN');
select table_name,tablespace_name,owner from dba_tables where owner in('SCOTT','PJINLIAN');
select index_name,tablespace_name,owner from dba_indexes where owner in('SCOTT','PJINLIAN');</code></pre>
</li>
<li>
<p>导出操作</p>
<pre><code>--/home/oracle/backup/export/exp_par.txt
--路径,方案,备份文件名,排除备份
--exclude与include相反,只能使用一个
DIRECTORY=DATA_PUMP_DIR
SCHEMAS=scott
DUMPFILE=schema_scott.dat
EXCLUDE=PACKAGE
EXCLUDE=VIEW
EXCLUDE=TABLE:"LIKE '%DUMP'"
--备份路径
select * from dba_directories where directory_name like 'DATA_PUMP%';
--执行导出
$ expdp system/system parfile=/home/oracle/backup/export/exp_par.txt
$ cd /u01/app/oracle/admin/orcl/dpdump/
$ ll
-rw-r--r-- 1 oracle oinstall 2142 Aug 4 23:46 export.log
-rw-r----- 1 oracle oinstall 438272 Aug 4 23:46 schema_scott.dat
--export.log是日志文件,与界面输出一致</code></pre>
</li>
<li>导入操作
<pre><code>--/home/oracle/backup/export/imp_par.txt
--路径,文件,方案变更,表空间变更
DIRECTORY=DATA_PUMP_DIR
DUMPFILE=schema_scott.dat
REMAP_SCHEMA=SCOTT:PJINLIAN
REMAP_TABLESPACE=USER:PIONEER_DATA
--执行导入
$ impdp system/system parfile=/home/oracle/backup/export/imp_par.txt
$ cd /u01/app/oracle/admin/orcl/dpdump/
$ ll
-rw-r--r-- 1 oracle oinstall 1336 Aug 4 23:05 import.log
--import.log是日志文件,与界面输出一致
--查看导入的数据
select object_name,object_type,status,owner from dba_objects where owner in('','PJINLIAN');
select table_name,tablespace_name,owner from dba_tables where owner in('','PJINLIAN');
select index_name,tablespace_name,owner from dba_indexes where owner in('','PJINLIAN');</code></pre></li>
</ul>
<h2>将Oracle 的数据传给其他软件(系统)</h2>
<ul>
<li>导出scott用户的emp表数据到excel中
<pre><code>--/home/oracle/backup/export/emp.sql
set line 120
set pagesize 100
set feedback off
spool /home/oracle/backup/export/excels/emp
select * from emp;
spool off
--执行文件
SQL> @/home/oracle/backup/export/emp.sql
--导出的emp.lst文件用excel打开即可</code></pre></li>
</ul>
<h2>将其他软件(系统)的数据导入Oracle</h2>
<ul>
<li>
<p>准备外部表</p>
<pre><code>-- 创建目录,创建两个变量的目录,授权,数据字典
create directory data_dir as '/home/oracle/backup/export/etl';
create directory data_log as '/home/oracle/backup/export/etl';
grant read on directory data_dir to scott;
grant write on directory data_log to scott;
select * from dba_directories where directory_path like '%etl';
select * from dba_tab_privs where table_name in ('DATA_DIR','DATA_LOG') and grantee='SCOTT';</code></pre>
</li>
<li>创建外部表
<pre><code>--先不学</code></pre></li>
</ul>
<h2>数据泵操作的自动化</h2>