两种备份路线
- 逻辑备份:导出对象定义和数据(Data Pump),跨版本迁移、单表恢复方便
- 物理备份:复制数据文件、控制文件、日志(RMAN),整库快速恢复的首选
- RMAN 支持增量备份和块级校验,是生产环境的标准方案
- 逻辑备份不能保证时间点一致性恢复,不能替代物理备份
归档模式:能不能恢复到任意时间点
非归档模式下,重做日志被覆盖后就无法重放,只能恢复到上次全备的时间点。归档模式下,写满的重做日志会被保存下来,因此可以做到时间点恢复(PITR)。
-- 查看当前模式
SELECT log_mode, database_role, open_mode FROM v$database;
-- 切换为归档模式(需要 SYSDBA,且要先 MOUNT)
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
-- 校验归档是否真的在写
ARCHIVE LOG LIST;数据泵:日常最常用的工具
- expdp/impdp 是服务端工具,文件生成在数据库服务器上,不是客户端
- CONTENT=DATA_ONLY 只导数据,METADATA_ONLY 只导结构
- REMAP_SCHEMA / REMAP_TABLESPACE 可以在导入时改 schema,适合开发库还原
- REMAP_TABLE 可以在导入时改表名
-- 需要先建目录对象(操作系统路径必须真实存在)
CREATE OR REPLACE DIRECTORY dp_dir AS '/u01/dump';
GRANT READ, WRITE ON DIRECTORY dp_dir TO app_user;
-- 导出整库(在操作系统命令行执行)
-- expdp system/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=full_%U.dmp -- FULL=Y LOGFILE=exp_full.log PARALLEL=4
-- 只导出某张表
-- expdp hr/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=emp.dmp -- TABLES=employees LOGFILE=exp_emp.log CONTENT=DATA_ONLY
-- 导入
-- impdp hr/pwd@freepdb1 DIRECTORY=dp_dir DUMPFILE=emp.dmp -- TABLES=employees TABLE_EXISTS_ACTION=APPEND LOGFILE=imp_emp.log
-- 查看正在运行的作业
SELECT job_name, operation, job_mode, state FROM dba_datapump_jobs;只作示例阅读:建目录对象、数据库链接、物化视图。请在独立学习数据库中练习。
闪回:误操作的救命稻草
- 闪回查询依赖 UNDO 数据,受 UNDO_RETENTION 和表空间大小限制
- 时间点越久远,需要的 UNDO 越多;窗口内没查到会报 ORA-01555
- 闪回删除靠回收站,表被 PURGE 之后就救不回来了
- 闪回数据库(FLASHBACK DATABASE)是重量级操作,需要先在 MOUNT 状态开启
-- 1) 闪回查询:看过去某个时间点的数据(不需要恢复)
SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE employee_id = 100;
-- 2) 闪回版本查询:看某行被改过几次
SELECT versions_starttime, versions_operation, salary
FROM employees VERSIONS BETWEEN TIMESTAMP
(SYSTIMESTAMP - INTERVAL '30' MINUTE) AND SYSTIMESTAMP
WHERE employee_id = 100;
-- 3) 闪回表:把整张表恢复到某时间点(会移动数据,需先启用行移动)
ALTER TABLE employees_demo ENABLE ROW MOVEMENT;
FLASHBACK TABLE employees_demo TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '5' MINUTE);
-- 4) 闪回删除:从回收站捞回被 DROP 的表
SHOW recyclebin
FLASHBACK TABLE employees_demo TO BEFORE DROP;闪回的前提是:数据在目标时间点已经存在,且对应的 UNDO 还没被覆盖。刚创建的库、或刚重建过的表,没有可用的过去快照,会报 ORA-01466(table definition has changed)或 ORA-08180(no snapshot found)。所以这几个例子要在库运行一段时间之后才看得到效果。