【数据库导入导出、闪回及备份】

1.数据库的导入导出

       1.1什么是数据导入导出?

oracle11g数据库的导入/导出,就是我们通常所说的oracle数据的还原/备份。

数据库导入:.dmp 格式文件从本地导入到数据库服务器中(本地oracle测试数据库中);

数据库导出:把数据库服务器中的数据(本地oracle测试数据库中的数据),导出到本地生成.dmp格式文件。

.dmp 格式文件:就是oracle数据的文件格式(比如视频是.mp4 格式,音乐是.mp3 格式)

      1.2三种导入导出方法

1、传统方法:

通用命令:exp(imp) username/password@SERVICENAME:1521 fifile=“e:\temp.dmp” full = y;

exp:导出命令,导出时必写。

imp:导入命令,导入时必写,

每次操作,二者只能选择一个执行。

username:导出数据的用户名,必写;

password:导出数据的密码,必写;

@:地址符号,必写;

SERVICENAME:Oracle的服务名,必写;

1521:端口号,1521是默认的可以不写,非默认要写;

fifile=“e:\temp.dmp” : 文件存放路径地址,必写;

full=y :表示全库导出。可以不写,则默认为no,则只导出用户下的对象;

方法细分:

1.完全导入导出:

exp(imp) username/password@SERVICENAME:1521 fifile=“e:\temp.dmp” full = y;

2.部分用户表table导入导出:

exp(imp) username/password@SERVICENAME:1521 fifile=“e:\temp.dmp” tabels=(table1,table2,table3,…);

3.表空间tablespaces导入导出:

//一个数据库实例可以有N个表空间(tablespace),一个表空间下可以有N张表(table)

exp(imp) username/password@SERVICENAME:1521 fifile=“e:\temp.dmp” tablespaces=

(tablespace1,tablespace2,tablespace3,…);

4.用户名username对象导入导出:

exp(imp) username/password@SERVICENAME:1521 fifile=“e:\temp.dmp” owner(username1,username2,username3);

2、数据泵方法:

创建directory:

expdp(impdp) username/password@SERVICENAME:1521 schemas=username dumpfifile=fifile1.dmp logfifile=fifile1.log directory=testdata1 remap_schema=test:test;

logfifile=test.log directory=testdata1;

exp:导出命令,导出时必写。

imp:导入命令,导入时必写,每次操作,二者只能选择一个执行。

username:导出数据的用户名,必写;

password:导出数据的密码,必写;

@:地址符号,必写;

SERVICENAME:Oracle的服务名,必写;

1521:端口号,1521是默认的可以不写,非默认要写;

schemas:导出操作的用户名;

dumpfifile:导出的文件;

logfifile:导出的日志文件,可以不写;

directory:创建的文件夹名称;

remap_schema=源数据库用户名:目标数据库用户名,二者不同时必写,相同可以省略;

1.查看表空间:

select form dba_tablespaces;

2.查看管理理员目录(同时查看操作系统是否存在,因为Oracle并不关心该目录是否存在,如果不存在,则出错)

select form dba_directories;

3.创建逻辑目录,该命令不会在操作系统创建真正的目录,最好以system等管理员创建。

create directory testdata1 as ‘d:\test\dump’;

4.给用户赋予在指定目录的操作权限,最好以system等管理员赋予。

grant read,write on directory testdata1 to 用户;

5.导出数据

1)   按用户导 expdp xinxiaoyong/123456@orcl schemas=xinxiaoyong dumpfifile=expdp.dmp directory=testdata1;

  1. 并行进程parallel expdp xinxiaoyong/123456@orcl directory=testdata1 dumpfifile=xinxiaoyong3.dmp parallel=40 job_name=xinxiaoyong3

  1. 按表名导 expdp xinxiaoyong/123456@orcl tables=emp,dept dumpfifile=expdp.dmp directory=testdata1;

  1. 按查询条件导 expdp xinxiaoyong/123456@orcl directory=testdata1 dumpfifile=expdp.dmp tables=emp query=‘WHERE deptno=20’;

  1. 按表空间导 expdp system/manager directory=testdata1 dumpfifile=tablespace.dmp tablespaces=temp,example;

  1. 导整个数据库 expdp system/manager directory=testdata1 dumpfifile=full.dmp FULL=y;

6.还原数据

1   导到指定用户下 impdp xinxiaoyong/123456 directory=testdata1 dumpfifile=expdp.dmp schemas=xinxiaoyong;

  1. 改变表的owner impdp system/manager directory=testdata1 dumpfifile=expdp.dmp tables=xinxiaoyong.dept remap_schema =xinxiaoyong:system;

  1. 导入表空间 impdp system/manager directory=testdata1 dumpfifile=tablespace.dmp tablespaces=example;

  1. 导入数据库 impdb system/manager directory=dump_dir dumpfifile=full.dmp FULL=y;

  1. 追加数据 impdp system/manager directory=testdata1 dumpfifile=expdp.dmp schemas=system table_exists_action;

3PLSQL方法:

登录plsql工具,所使用用户为源数据库有导出权限(exp_full_database,dba等)的用户。

     1.导出建表语句(包括存储结构)

              导出步骤tools ->export user object,选择要导出的对象,导出.sql格式文件并等待导出完成,如下图:

【数据库导入导出、闪回及备份】_第1张图片

2.导出数据文件

           导出步骤tools ->export tables,选择要导出的表及导出的格式进行导出。

           导出为dmp格式,如下图:

【数据库导入导出、闪回及备份】_第2张图片

导出为sql格式,如下图:

【数据库导入导出、闪回及备份】_第3张图片

导出为pde格式,如下图:

【数据库导入导出、闪回及备份】_第4张图片

提示说明:采用第三方工具导出导入整个数据库的话,耗时较长,一定要有足够的时间来操作(数据量大的话需要好几个小时)

3.导入建表语句

           导入步骤tools->import tables->SQL Inserts 导入.sql文件

4.导入数据;

            tools->import talbes,然后再根据导出的数据格式选择导入dmp文件,或者sql文件或者pde文件。

            提示说明:导入之前最好把以前的表删除,当然导入另外数据库除外。

            另外导入时当发现进度条一直卡在一个点,而且导出的文件不再增大时,甚至是提示程序未响应,千万不要以为程序卡死了,这个导入导出就是比较缓慢,只要没有提示报错,或者导入完成就不要停止程序

      1.2.1三种方式优缺点描述

1.exp/imp:

优点:代码书写简单易懂,从本地即可直接导入,不用在服务器中操作,降低难度,减少服务器上的操作

也就 保证了服务器上数据文件的安全性。

缺点:这种导入导出的速度相对较慢,合适数据库数据较少的时候。如果文件超过几个G,大众性能的

电 脑,至少需要4~5个小时左右。

2.expdp/impdp:

优点:导入导出速度相对较快,几个G的数据文件一般在1~2小时左右。

缺点:代码相对不易理解,要想实现导入导出的操作,必须在服务器上创建逻辑目录(不是真正的目录)。我

们 都知道数据库服务器的重要性,所以在上面的操作必须慎重。所以这种方式一般由专业的程序人员来

完 成(不一定是DBA(数据库管理员)来干,中小公司可能没有DBA)

3.PL/sql Develpoer:

优点:封装了导入导出命令,无需每次都手动输入命令。方便快捷,提高效率。

缺点:长时间应用会对其产生依赖,降低对代码执行原理的理解。

  • 特别强调

目标数据库:数据即将导入的数据库(一般是项目上正式数据库);

源数据库:数据导出的数据库(一般是项目上的测试数据库);

1.目标数据库要与源数据库有着名称相同的表空间。

2.目标数据在进行导入时,用户名尽量相同(这样保证用户的权限级别相同)。

3.目标数据库每次在进行数据导入前,应做好数据备份,以防数据丢失。

4.使用数据泵时,一定要现在服务器端建立可用的逻辑目录,并检查是否可用。

5.弄清是导入导出到相同版本还是不同版本(oracle10g版本与oracle11g版本)。

6.目标数据导入前,弄清楚是数据覆盖(替换),还是仅插入新数据或替换部分数据表。

7.确定目标数据库磁盘空间是否足够容纳新数据,是否需要扩充表空间。

8.导入导出时注意字符集是否相同,一般Oracle数据库的字符集只有一个,并且固定,一般不改变。

9.导出格式介绍:

  Dmp格式:.dmp是二进制文件,可跨平台,还能包含权限,效率好;

  Sql格式:.sql格式的文件,可用文本编辑器查看,通用性比较好,效率不如第一种,

适合小数据量导入导出。尤其注意的是表中不能有大字段 (blob,clob,long),如果有,会报错;

  Pde格式:.pde格式的文件,.pde为PL/SQL Developer自有的文件格式,只能用PL/SQL

Developer工具

导入导出,不能用文本编辑器查看;

10.确定操作者的账号权限。

2.逻辑备份概述

  在Oracle 9i及其之前的数据库版本中提供了Export和Import实用程序用于逻辑备份与恢复。

在Oracle 11g数据库中又推出了数据泵技术,即Data Pump Export(Expdp)和Data Pump Import(Impdp)实用程序用于逻辑备份与恢复。

  逻辑备份是指利用Oracle提供的导出工具,将数据库中选定的记录集或数据字典的逻辑副本以二进制文件的形式存储到操作系统中。逻辑备份的二进制文件称为转储文件,以dmp格式存储。

  逻辑备份与恢复必须在数据库运行的状态下进行。因此,数据库备份与恢复是以物理备份与恢复为主,逻辑备份与恢复为辅的。

从本质上来讲逻辑备份与恢复实际就是对数据库事实数据的导入和导出。

导出:

导出就是数据库的逻辑备份,实质是读取一个数据库记录并将这个记录集写入一个文件(扩展名通常是dmp),这些记录的导出与物理位置无关

导入:

导入即数据库的逻辑恢复,实质是读取被导出的二进制转储文件并将其恢复到数据库。

数据泵(DATA PUMP)是一种在数据库之间或在数据库与操作系统之间高速传输数据的技术。数据泵工具运行在服务器上,数据库管理员需要指定数据库目录来保存转储的数据。

--使用expdp和impdp时应该注重的事项:

--1、exp和imp是客户端工具程序,它们既可以在客户端使用,也可以在服务端使用。

--2、expdp和impdp是服务端的工具程序,他们只能在oracle服务端使用,不能在客户端使用。

--一、创建逻辑目录,该命令不会在操作系统创建真正的目录

--(请先创建真正的目录),最好以system等管理员创建逻辑目录。

SQL>conn system/123456@orcl as sysdba

SQL>create or replace directory DUMPDIR as 'D:\oracle\backup';

--二、查看管理员目录(同时查看操作系统是否存在,

select * from dba_directories;

--三、给scott用户赋予在指定目录的操作权限,

--最好以sys等管理员赋予。

grant read,write on directory DUMPDIR to scott;

如果用户要导出或导入非同名模式的对象,还需要具有EXP_FULL_DATABASE和IMP_FULL_DATABASE权限

GRANT EXP_FULL_DATABASE,IMP_FULL_DATABASE TO ehr;

--创建一个测试用户:

create user tom identified by 123456;

grant connect,resource to tom;

grant read,write on directory DUMPDIR to tom;

--四、用expdp导出数据

--1.导出表:

expdp scott/123456@orcl directory=dumpdir dumpfile=empdept.dmp

tables=emp,dept

--2.导出用户

expdp scott/123456@orcl directory=dumpdir dumpfile=myscott.dmp

schemas=scott

--4.导出表空间

expdp system/123456@orcl directory=dumpdir dumpfile=tabspace.dmp

tablespaces=temp,users

--5.导出全库

expdp system/123456@orcl directory=dumpdir dumpfile=full.dmp

full=y

--五、用impdp导入数据

--导入表:

impdp system/123456 directory=dumpdir dumpfile=empdept.dmp

tables=emp,dept

--导入表(从scott用户中把表dept和emp导入到tom用户中)

impdp system/123456@orcl directory=dumpdir dumpfile=empdept.dmp

tables=scott.emp,scott.dept remap_schema=scott:tom

select * from emp;

drop table dept;

create table dept_bak as select * from dept;

--导入用户(从用户scott导入到用户scott)

impdp scott/123456@orcl directory=dumpdir dumpfile=myscott.dmp

schemas=scott;

--导入表空间

impdp system/123456@orcl directory=dumpdir dumpfile=tabspace.dmp

tablespaces=example;

--导入数据库

impdp system/123456@orcl directory=dumpdir dumpfile=full.dmp

full=y

3.闪回技术

Oracle 9i实现了基于回滚段的闪回查询(Flashback Query)技术,即从回滚段中读取一定时间内对表进行操作的数据,恢复错误的DML操作。

在Oracle 11g中,除提高了闪回查询功能,实现了闪回版本查询、闪回事务查询外,还实现了闪回表、闪回删除和闪回数据库的功能。

利用Oracle数据库的闪回特性,能够完成下列工作:

1.查询数据库过去某一时刻的状态;

2.查询反映过去一段时间内数据变化情况的元数据;

3.将表中数据或将删除了的表恢复到过去的某一个时刻的状态;

4.自动跟踪、存档数据变化信息;

5.回滚事务及其依赖事务的操作

闪回技术分类:

闪回查询(Flashback Query):查询过去某个时间点或某个SCN值时表中的数据信息;

闪回版本查询(Flashback Version Query):查询过去某个时间段或某个SCN段内表中数据的变化情况;

闪回事务查询(Flashback Transaction Query):查看某个事务或所有事务在过去一段时间对数据进行的修改;

闪回表(Flashback Table):将表恢复到过去的某个时间点或某个SCN值时的状态;

闪回删除(Flashback Drop):将已经删除的表及其关联对象恢复到删除前的状态;

闪回数据库(Flashback Database):将数据库恢复到过去某个时间点或某个SCN值时的状态。

闪回数据归档:利用保存在一个或多个表空间中的数据变化信息查询过去某个时刻或某个SCN值时表中数据的快照。

4.闪回查询

闪回查询主要是利用数据库撤销表空间中存放的回退信息,根据指定的过去的一个时刻或SCN值,返回当时已经提交的数据快照。

利用闪回查询可以实现下列功能:

1.返回当前已经丢失或被误操作的数据在操作之前的快照;

2.可以进行当前数据与之前特定时刻的数据快照的比较;

3.可以检查过去某一时刻事务操作的结果;

4.简化应用设计,不需要存储一些不断变化的临时数据。

闪回查询可以返回过去某个时间点已经提交事务操作的结果。

基本语法:

SELECT column_name[,…] FROM table_name

[AS OF SCN|TIMESTAMP expression]

[WHERE condition]

--更改时间格式:

SQL>ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

--打开操作对应的时间信息

SQL>SET TIME ON

15:33:12 SQL>ALTER SESSION SET NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS';

15:33:25 SQL>SELECT empno,sal FROM scott.emp WHERE empno=7369;

15:33:34 SQL>UPDATE scott.emp SET sal=1200 WHERE empno=7369;

15:33:48 SQL>COMMIT;

15:33:56 SQL>UPDATE scott.emp SET sal=1300 WHERE empno=7369;

15:34:05 SQL>UPDATE scott.emp SET sal=1400 WHERE empno=7369;

15:34:12 SQL>COMMIT;

15:34:19 SQL>UPDATE scott.emp SET sal=1500 WHERE empno=7369;

15:34:26 SQL>COMMIT;

查询7369号员工的当前工资值。

15:34:32 SQL>SELECT empno,sal FROM scott.emp WHERE empno=7369;

EMPLOYEE_ID       SALARY

------------           -----------

7369               1500

查询7369号员工前一个小时的工资值。

15:36:34 SQL>SELECT empno,sal FROM scott.emp AS OF TIMESTAMP SYSDATE-1/24 WHERE empno=7369;

EMPLOYEE_ID           SALARY

------------               ----------

7369                    800

查询第一个事务已经提交,第二个事务还没有提交时7369号员工的工资。

15:40:26 SQL>SELECT empno,sal FROM scott.emp AS OF TIMESTAMP TO_TIMESTAMP('2023-3-6 09:25:21','YYYY-MM-DD HH24:MI:SS') WHERE empno=7369;

EMPLOYEE_ID       SALARY

------------           -----------

140               12000

基于AS OF SCN的闪回查询

15:47:07 SQL>SELECT current_scn FROM v$database;

CURRENT_SCN

-------------

9465723

15:52:15 SQL>SELECT empno,sal

FROM scott.emp WHERE empno= 7369;

EMPLOYEE_ID     SALARY

------------         ----------

7369              1500

15:52:29 SQL>UPDATE scott.emp SET sal=1800 WHERE empno=7369;

15:52:37 SQL>COMMIT;

15:52:44 SQL>UPDATE scott.emp SET sal=1900 WHERE empno=7369;

15:52:50 SQL>COMMIT;

15:52:57 SQL>SELECT current_scn FROM v$database;

CURRENT_SCN

-------------

9465820

15:53:07SQL>SELECT empno,sal FROM scott.emp AS OF SCN 18150947 WHERE empno=7369;

EMPLOYEE_ID    SALARY

------------        -----------

7369            12000

5.闪回表

闪回表是将表及附属对象一起恢复到以前的某个时刻的状态。

为了使用闪回表功能,必须满足下列条件:

  1. 用户具有flashback any table 权限;
  2. 具有对表的select,insert,delete,及alter对象权限;
  3. 要对表进行闪回操作,需要启动表的ROW MOVEMENT特性,其方法为:

ALTER TABLE table_name ENABLE ROW MOVEMENT;

  1. Sys用户或以as sysdba身份登录的用户不能执行闪回表操作;

闪回表操作的基本语法为:

FLASHBACK TABLE [schema.]table TO SCN|TIMESTAMP expression [ENABLE|DISABLE TRIGGERS]

--将表恢复到某个时刻的状态:

Flashback table test01 to timestamp to_timestamp(‘2023-3-6’,’YYYY-MM-DD HH24:MI:SS’);

Select * from test01;

--将表恢复到SCN为具体值的状态:

SELECT current_scn FROM v$database;

Flashback table test01 to scn 9510501;

Select * from test01;

6.闪回删除

    闪回删除可恢复使用DROP TABLE语句删除的表,是一种对意外删除的表的恢复机制。

在Oracle 11g数据库中,当执行DROP TABLE操作时,并不立即回收表及其关联对象的空间,而是将它们重命名后放入一个称为“回收站”的逻辑容器中保存,直到用户决定永久删除它们或存储该表的表空间存储空间不足时,表才真正被删除。

为了使用闪回删除技术,必须开启数据库的“回收站”。

启动“回收站”

要使用闪回删除功能,需要启动数据库的“回收站”,即将参数RECYCLEBIN设置为ON。在默认情况下“回收站”已启动。

SQL>SHOW PARAMETER RECYCLEBIN

SQL>ALTER SYSTEM SET RECYCLEBIN=ON;

查看“回收站”

当执行DROP TABLE操作时,表及其关联对象被命名后保存在“回收站”中,可以通过查询USER_RECYCLEBIN,DBA_RECYCLEBIN视图获得被删除的表及其关联对象信息。

SQL>DROP TABLE test;

SQL>SELECT OBJECT_NAME,ORIGINAL_NAME,TYPE FROM USER_RECYCLEBIN; 

--查询原表中的数据:

Select * from "BIN$deTlbgMmT9eeuLAzbBlkWQ==$0";

清除“回收站” :

PURGE [TABLE table]|[INDEX index]|[RECYCLEBIN|

DBA_RECYCLEBIN]|[TABLESPACE tablespace [USER user]]

例如:

--从回收站中清除指定的表,并回收其磁盘空间:

SQL>PURGE TABLE flash_table;

--从回收站中清除指定的索引,并回收其磁盘空间:

SQL>PURGE INDEX "BIN$kkOA+BVXRHW02fg7Y1KUPA==$0";

--清除回收站中指定表空间中的对象,并回收其磁盘空间:

SQL>PURGE TABLESPACE users;

--清除回收站中指定表空间中特定用户的对象,并回收其磁盘空间:

SQL>PURGE TABLESPACE users USER scott;

--清除当前用户的回收站,并回收所有对象的磁盘空间:

SQL>PURGE RECYCLEBIN;

--清除数据库中所有用户的回收站,并回收所有对象的磁盘空间:(sys)

SQL>PURGE DBA_RECYCLEBIN;

闪回删除的基本语法为

FLASHBACK TABLE [schema.]table TO BEFORE

DROP [RENAME TO new_name]

注意

只有采用本地管理的、非系统表空间中的表可以使用闪回删除操作。

示例

SQL>CREATE TABLE example(ID NUMBER PRIMARY KEY,NAME CHAR(20));

SQL>INSERT INTO example VALUES(1,'BEFORE DROP');

SQL>COMMIT;

SQL>DROP TABLE example;

SQL>SELECT OBJECT_NAME,ORIGINAL_NAME,TYPE FROM USER_RECYCLEBIN; 

SQL>FLASHBACK TABLE example TO BEFORE DROP RENAME TO new_example;

SQL>SELECT * FROM new_example;

ID      NAME

   --------------

  1      BEFORE DROP

你可能感兴趣的:(数据库,数据库)