Oracle数据库表的备份及还原

这里的Oracle数据库表的备份及还原准确得说,是指某用户下数据库表及其数据的导出和将导出的dmp文件导入新用户的过程。以下操作均在Linux命令行中进行。

以SYSDBA身份连接数据库

1
2
3
4
5
--无连接启动sqlplus
sqlplus /nolog;
--以sysdba的身份连接数据库
conn /as sysdba;

创建表空间和用户

1
2
3
4
5
6
7
8
-- 创建表空间,table_space_datafile建议和表空间的名称保持一致
CREATE TABLESPACE your_tablespace_name DATAFILE '/u00/oradata/tablespace_datafile.dbf' SIZE 128M AUTOEXTEND ON NEXT 32M MAXSIZE UNLIMITED;
-- 在上述表空间下创建用户
CREATE USER your_user IDENTIFIED BY your_password DEFAULT TABLESPACE your_tablespace_name;
-- 赋权限给上述创建的用户
GRANT CONNECT,RESOURCE,CREATE TABLE,CREATE VIEW,EXECUTE ANY PROCEDURE,CREATE SYNONYM TO your_user;

创建数据库表、索引并初始化

这里指的是数据库表中数据的初始化。根据业务的不同,在表创建完成后,表中一般是要有初始数据的。下面我们将该用户下的数据表及其数据导出,以作备份。

执行导出命令

1
2
--/home/oracle/dmp/dmp_file_name.dmp为举例路径,根据实际情况指定你自己的路径
exp your_user/your_password file=/home/oracle/dmp/dmp_file_name.dmp;

执行导入命令

如果希望把上述的备份文件导入到新的用户,则可以创建新的表空间和用户,并执行如下命令:

1
2
--此操作需要知道dmp文件导出用户的用户名和密码
imp your_user/your_password file=/home/oracle/dmp/dmp_file_name.dmp fromuser=your_user touser=new_user;

以上即为数据库表备份和还原的一般实现过程。


Tips:用户和表空间的删除

由于在开发过程中需要经常创建和删除用户,一段时间后则需要清理掉不再使用的用户和表空间。对于单个user和tablespace 来说, 可以 依次 使用如下命令来完成:

1
2
3
4
--此操作删除了该user下的schema objects,不会删除相应的tablespace
DROP USER your_user CASCADE;
--删除表空间
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;

如果删除用户时出现如下报错:

1
2
3
4
5
6
> SQL> DROP USER username CASCADE;
> DROP USER username CASCADE
> *
> ERROR at line 1:
> ORA-01940: cannot drop a user that is currently connected
>

可以使用如下操作:

1
2
--查看用户进程,用户名需要大写,如下图
select sid, serial# from v$session where username='YOUR_USER';

1
2
3
--依次将用户占用的会话进程停止
alter system kill session '1075,5234';
alter system kill session '1076,4388';

以下是删除表空间的一些其他操作方式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
--删除空的表空间,但是不包含物理文件
DROP TABLESPACE tablespace_name;
--删除非空表空间,但是不包含物理文件
DROP TABLESPACE tablespace_name INCLUDING CONTENTS;
--删除空表空间,包含物理文件
DROP TABLESPACE tablespace_name INCLUDING DATAFILES;
--删除非空表空间,包含物理文件
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES;
--如果其他表空间中的表有外键等约束关联到了本表空间中的表的字段,就要加上CASCADE CONSTRAINTS
DROP TABLESPACE tablespace_name INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS;