版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/stevensxiao/article/details/89104365
确认数据库处于非归档模式
[oracle@oracle-12201-vagrant ~]$ sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on Mon Apr 8 19:38:23 2019
Copyright (c) 1982, 2016, Oracle. All rights reserved.
Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> archive log list
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination /opt/oracle/product/12.2.0.1/dbhome_1/dbs/arch
Oldest online log sequence 1
Current log sequence 3
确定需要备份的文件
执行以下的脚本:
set pagesize 0
select name from v$datafile
union
select name from v$controlfile
union
select name from v$tempfile
union
select member from v$logfile;
输出为:
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/sysaux01.dbf
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/system01.dbf
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/temp01.dbf
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/undotbs01.dbf
/opt/oracle/oradata/ORCLCDB/ORCLPDB1/users01.dbf
/opt/oracle/oradata/ORCLCDB/control01.ctl
/opt/oracle/oradata/ORCLCDB/control02.ctl
/opt/oracle/oradata/ORCLCDB/pdbseed/sysaux01.dbf
/opt/oracle/oradata/ORCLCDB/pdbseed/system01.dbf
/opt/oracle/oradata/ORCLCDB/pdbseed/temp012019-04-07_16-00-25-755-PM.dbf
/opt/oracle/oradata/ORCLCDB/pdbseed/undotbs01.dbf
/opt/oracle/oradata/ORCLCDB/redo01.log
/opt/oracle/oradata/ORCLCDB/redo02.log
/opt/oracle/oradata/ORCLCDB/redo03.log
/opt/oracle/oradata/ORCLCDB/sysaux01.dbf
/opt/oracle/oradata/ORCLCDB/system01.dbf
/opt/oracle/oradata/ORCLCDB/temp01.dbf
/opt/oracle/oradata/ORCLCDB/undotbs01.dbf
/opt/oracle/oradata/ORCLCDB/users01.dbf
19 rows selected.
创建表以验证恢复
SQL> show user
USER is "SYS"
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> create table cdb_table(a int);
Table created.
SQL> alter session set container=orclpdb1;
Session altered.
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB1
SQL> create table pdb_table(a int);
Table created.
关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
创建备份目录
[root@oracle-12201-vagrant ~]# mkdir -p /u01/backup
[root@oracle-12201-vagrant ~]# chown oracle:oinstall /u01/backup
备份数据库
注意需要备份的数据库包括ORCLCDB,ORCLPDB和pdbseed。如果利用cp实现拷贝,切记不要输出到同一目录,以免相互覆盖,这也是我们为何采用tar来备份的原因。
[oracle@oracle-12201-vagrant ~]$ cd /u01/backup
[oracle@oracle-12201-vagrant backup]$ cat backupdb.sh
cd /u01/backup
tar -C /opt/oracle/oradata -zcvf ORCLCDB.tar.gz ORCLCDB
[oracle@oracle-12201-vagrant backup]$ time ./backupdb.sh
ORCLCDB/
ORCLCDB/ORCLPDB1/
ORCLCDB/ORCLPDB1/undotbs01.dbf
ORCLCDB/ORCLPDB1/system01.dbf
ORCLCDB/ORCLPDB1/sysaux01.dbf
ORCLCDB/ORCLPDB1/temp01.dbf
ORCLCDB/ORCLPDB1/users01.dbf
ORCLCDB/pdbseed/
ORCLCDB/pdbseed/sysaux01.dbf
ORCLCDB/pdbseed/system01.dbf
ORCLCDB/pdbseed/undotbs01.dbf
ORCLCDB/pdbseed/temp012019-04-07_16-00-25-755-PM.dbf
ORCLCDB/system01.dbf
ORCLCDB/sysaux01.dbf
ORCLCDB/undotbs01.dbf
ORCLCDB/users01.dbf
ORCLCDB/control01.ctl
ORCLCDB/control02.ctl
ORCLCDB/redo01.log
ORCLCDB/redo02.log
ORCLCDB/redo03.log
ORCLCDB/temp01.dbf
real 3m26.867s
user 2m56.764s
sys 0m26.795s
[oracle@oracle-12201-vagrant backup]$ ll
total 666056
-rwxr-xr-x. 1 oracle oinstall 71 Apr 8 20:07 backupdb.sh
-rw-r--r--. 1 oracle oinstall 682033828 Apr 8 20:37 ORCLCDB.tar.gz
启动数据库,并插入数据
SQL> startup
ORACLE instance started.
Total System Global Area 1207959552 bytes
Fixed Size 8792152 bytes
Variable Size 436209576 bytes
Database Buffers 754974720 bytes
Redo Buffers 7983104 bytes
Database mounted.
Database opened.
SQL> insert into cdb_table values(1);
1 row created.
SQL> commit;
Commit complete.
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> alter session set container=orclpdb1;
Session altered.
SQL> show con_name
CON_NAME
------------------------------
ORCLPDB1
SQL> insert into pdb_table values(1);
1 row created.
SQL> commit;
Commit complete.
关闭数据库
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
恢复数据库
删除所有数据
[oracle@oracle-12201-vagrant ~]$ cd $ORACLE_BASE/oradata
[oracle@oracle-12201-vagrant oradata]$ ls
ORCLCDB
[oracle@oracle-12201-vagrant oradata]$ du -sh .
3.3G .
[oracle@oracle-12201-vagrant oradata]$ rm -fr ORCLCDB
[oracle@oracle-12201-vagrant oradata]$ du -sh .
0 .
恢复数据:
[oracle@oracle-12201-vagrant ~]$ cd /u01/backup
[oracle@oracle-12201-vagrant backup]$ ll
total 666056
-rwxr-xr-x. 1 oracle oinstall 71 Apr 8 20:07 backupdb.sh
-rw-r--r--. 1 oracle oinstall 682033828 Apr 8 20:37 ORCLCDB.tar.gz
[oracle@oracle-12201-vagrant backup]$ time tar -C $ORACLE_BASE/oradata -zxvf ORCLCDB.tar.gz
ORCLCDB/
ORCLCDB/ORCLPDB1/
ORCLCDB/ORCLPDB1/undotbs01.dbf
ORCLCDB/ORCLPDB1/system01.dbf
ORCLCDB/ORCLPDB1/sysaux01.dbf
ORCLCDB/ORCLPDB1/temp01.dbf
ORCLCDB/ORCLPDB1/users01.dbf
ORCLCDB/pdbseed/
ORCLCDB/pdbseed/sysaux01.dbf
ORCLCDB/pdbseed/system01.dbf
ORCLCDB/pdbseed/undotbs01.dbf
ORCLCDB/pdbseed/temp012019-04-07_16-00-25-755-PM.dbf
ORCLCDB/system01.dbf
ORCLCDB/sysaux01.dbf
ORCLCDB/undotbs01.dbf
ORCLCDB/users01.dbf
ORCLCDB/control01.ctl
ORCLCDB/control02.ctl
ORCLCDB/redo01.log
ORCLCDB/redo02.log
ORCLCDB/redo03.log
ORCLCDB/temp01.dbf
real 1m50.982s
user 0m43.111s
sys 0m15.127s
[oracle@oracle-12201-vagrant backup]$ ls -l /$ORACLE_BASE/oradata
total 4
drwxr-x---. 4 oracle oinstall 4096 Apr 7 15:59 ORCLCDB
[oracle@oracle-12201-vagrant backup]$ du -sh $ORACLE_BASE/oradata
3.5G /opt/oracle/oradata
启动数据库
SQL> startup
ORACLE instance started.
Total System Global Area 1207959552 bytes
Fixed Size 8792152 bytes
Variable Size 436209576 bytes
Database Buffers 754974720 bytes
Redo Buffers 7983104 bytes
Database mounted.
Database opened.
验证数据库恢复
SQL> show con_name
CON_NAME
------------------------------
CDB$ROOT
SQL> select * from cdb_table;
no rows selected
SQL> alter session set container=orclpdb1;
Session altered.
SQL> select * from pdb_table;
no rows selected
恢复成功了,因为表存在,并且在备份后插入的数据不存在。
补充
事实上,在任何情况下,Redo Log都是无需备份的。我们这个实验备份了Redo Log,这是为了恢复更顺畅。
如果没有备份Redo Log,在恢复时,在数据库处于mount状态下,需要执行以下命令:
SQL> alter database open resetlogs;
如果报错,则执行以下命令:
SQL> recover database until cancel;
SQL> alter database open resetlogs;