目的:使用RMAN在本机进行备份,备份完之后,然后进行删除数据操作,记得删除数据的时候记下时间点,然后使用RMAN进行恢复。
一、环境准备
1、环境信息
安装好Oracle19c单机数据库
192.168.184.183 orcl
检查监听和数据库是否启动,如果没启动进行启动
lsnrctl start
lsnrtcl status
su - oracle
sqlplus / as sysdba
startup
2、创建用户和测试表
可参考:
create tablespace test datafile '/u01/app/oracle/oradata/ORCL/test.dbf' size 100m autoextend on next 100m maxsize 400m extent management local;
CREATE TEMPORARY TABLESPACE test_temp
TEMPFILE '/u01/app/oracle/oradata/ORCL/test_temp.dbf'
SIZE 20M
AUTOEXTEND ON
NEXT 5M MAXSIZE 100M;
create user test identified by admin
default tablespace TEST
temporary tablespace TEST_TEMP;
GRANT CONNECT, RESOURCE TO test;
ALTER USER test QUOTA UNLIMITED ON TEST;
CREATE TABLE student_info (
student_id NUMBER(10) PRIMARY KEY,
name VARCHAR2(50) NOT NULL,
gender CHAR(1) CHECK (gender IN ('M', 'F')),
birth_date DATE,
email VARCHAR2(100) UNIQUE,
create_time TIMESTAMP DEFAULT SYSTIMESTAMP
);
-- 单条记录插入
INSERT INTO student_info VALUES
(1, '张三', 'M', TO_DATE('2000-01-15', 'YYYY-MM-DD'), 'zhangsan@edu.cn', DEFAULT);
-- 多条记录插入
INSERT ALL
INTO student_info VALUES (2, '李四', 'M', DATE '2001-03-22', 'lisi@example.com', SYSTIMESTAMP)
INTO student_info VALUES (3, '王芳', 'F', TO_DATE('1999-12-05', 'YYYY-MM-DD'), 'wangfang@mail.com', DEFAULT)
SELECT * FROM DUAL;
commit;
SELECT * FROM student_info;
二、全量备份/恢复
1、创建备份目录
su - oracle
mkdir /u01/app/oracle/backup
chown -R oracle:oinstall /u01/app/oracle/backup/
chmod -R 770 /u01/app/oracle/backup/
2、开始备份
(1)连接到rman
rman target sys/oracle@orcl nocatalog
(2)开始全量备份
这里的%U表示生成唯一的名字
backup database format '/u01/app/oracle/backup/md_%U';
3、查看备份记录
list backup;
4、查看备份文件
cd /u01/app/oracle/backup
ll
5、删除数据
SELECT * FROM student_info;
delete from student_info where student_id = 1;
commit;
SELECT * FROM student_info;
SELECT to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') FROM dual;
6、进行数据恢复
(1)检查备份文件
检查备份文件是否完整且可用
rman target sys/oracle@orcl nocatalog
LIST BACKUP;
(2)确保数据库为归档模式
sqlplus / as sysdba
SELECT log_mode FROM v$database;
(3)关闭数据库,启动到mount状态
su - oracle
sqlplus / as sysdba
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
(4)恢复数据
重新连接rman,之前的连接已经失效了,因为数据库关闭又重启到mount状态了。
rman target sys/oracle@orcl nocatalog
RESTORE DATABASE;
如果控制文件丢失,要先恢复控制文件,这里我没有操作
rman target sys/oracle@orcl nocatalog
RESTORE CONTROLFILE FROM AUTOBACKUP;
ALTER DATABASE MOUNT;
(6)应用归档日志进行恢复
若需要恢复到特定时间点,我这里指定了时间,不然默认使用完全恢复的话,会执行归档日志中的操作。
RECOVER DATABASE UNTIL TIME "TO_DATE('2025-05-16 18:56:00', 'YYYY-MM-DD HH24:MI:SS')";
RMAN的默认恢复是完全恢复(应用所有可用归档日志和在线重做日志),这样就看不出效果了。
rman target sys/oracle@orcl nocatalog
RECOVER DATABASE;
(7)打开数据库
如果是不完全恢复,执行这个,因为我指定了时间点了,所以是不完全恢复
rman target sys/oracle@orcl nocatalog
ALTER DATABASE OPEN RESETLOGS
如果是完全恢复,执行这个
rman target sys/oracle@orcl nocatalog
ALTER DATABASE OPEN;
默认恢复行为:
RMAN的默认恢复是完全恢复(应用所有可用归档日志和在线重做日志),这意味着:如果备份后执行了删除表的操作,并且归档日志中包含该删除操作,恢复时会应用这些日志,导致表仍处于删除状态。
未指定恢复时间点:
如果希望恢复到删除表之前的状态,必须显式指定恢复的终止时间点(SCN或时间戳),否则RMAN会恢复到最新状态(包含删除操作)
(8)查看数据库状态
重新连接的到数据库
sqlplus / as sysdba
SELECT status FROM v$instance;
(9)查看数据
select * from student_info;