最近公司的客户希望使用 oracle 数据库, 所以我们只好将数据从 MySQL 数据库迁移到 oracle 数据库, 并对 oracle 数据库制定了一个备份策略, 之前虽然对 oracle 很熟悉, 但做备份策略还是第一次, 所以详细记录下来并分享, 欢迎大家指教. 我们使用 rman 进行热备份, 并启用了闪回表. 平时在操作重要数据前, 还会通过数据泵 (expdp/impdp) 进行一次逻辑备份.
备份模式
物理备份与逻辑备份
物理备份: 物理备份是磁盘块为基本单位将数据从主机复制到备机.
逻辑备份: 逻辑备份是以文件为基本单位将数据从主机复制到备机, 通过 sql 或者 flatfile 文件为中转进行迁移.
高效性:
物理备份是位于文件系统之下和硬件磁盘驱动之上. 增加了一个软驱动, 它忽略了文件和结构, 处理过程简洁, 因此在执行过程中所花费在搜索操作上的开销较少, 备份的性能很高.
逻辑备份是基于文件级别的备份, 由于每个文件都是由不同的逻辑块组成. 每一个逻辑的文件块存储在连续的物理磁盘块上, 但组成一个文件的不同逻辑块极有可能存储在分散的磁盘块上. 逻辑备份在对非连续存储磁盘上的文件进行备份时需要额外的查找操作. 这些额外的操作增加了磁盘的开销, 降低了磁盘的吞吐率. 所以, 跟物理备份相比较, 备份性能较差.
物理备份避免了当文件出现一个小的改动的时候, 就需要对整个文件做备份, 只是会去做改动部分的备份, 有效的提高了备份效率, 节省了备份时间.
逻辑备份模式下, 文件即使一个很小的改变, 也需将整个文件备份. 这样如果一个文件很大的情况下, 就会大幅度的降低备份效率, 增加磁盘开销和备份时间.
实时性:
物理备份可以做到高效的实时备份, 因为在每次主机往磁盘写数据的时候, 都需要同时将数据写入到备机, 这种写入操作都是基于磁盘扇区的, 所以, 很快就能被识别. 只有在备机完成之后, 才会返回给上层的应用系统来继续下一步工作.
逻辑备份是很难做到实时备份的, 因为它的每次修改都是基于文件的, 而文件的哪部分被修改, 系统很难实时捕获到, 所以备份的时候需要把整个文件读一遍再发到备机 , 实时的效率不是很高.
支持度:
物理备份是在文件系统之下对数据进行复制, 所以它不受文件系统限制, 可以支持各种文件系统包括 RAW 分区.
逻辑备份是以单个文件为单位对数据进行复制, 所以它受文件系统限制, 仅能对部分支持的文件系统做备份, 不支持 RAW 分区.
(原文摘自:)
备份方式
数据泵备份, 热备份和冷备份
数据泵备份
属于逻辑备份, 以文件为备份单位, expdb 的导出模式有:
1, 表模式: 导出用户所有表或者指定的表.
2, 用户模式: 导出用户所有对象以及对象中的数据.
3, 导出表空间: 导出数据库中特定的表空间.
4, 整个数据库: 导出数据库中所有对象.
我们以用户模式为例:
1, 创建逻辑目录, 该命令不会在操作系统创建真正的目录(要先创建真正的目录), 最好以 system 等管理员创建逻辑目录.
- SQL> sqlplus root/root@orcl
- SQL> conn as sysdba;(输入 sys 用户名, 密码)
- SQL> create directory dump_dir as '/data/exp+imp';
2, 查看管理员目录(操作系统下该目录必须存在, 假如不存在, 则出错)
SQL>select * from dba_directories;
3, 给 root 用户赋予在指定目录的操作权限, 最好以 system 等管理员赋予.
SQL>grant read,write on directory dump_dir to root;
4, 导出数据
expdp root/root@orcl schemas=root dumpfile=expdp201810291556.dmp log=expdp201810291556.log directory=dump_dir;
5, 导入数据
在另一台主机需要建相同的文件夹 dump_dir, 从用户 root 导入到用户 root, 不同用户使用 REMAP_SCHEMA=orcldev:orcltwo.
impdp root/root@orcl directory=dump_dir dumpfile=expdp201810291556.dmp schemas=root table_exists_action=replace
实际在使用 expdb/impdb 时有很多参数可以选择, 这里不多讲述, 大家自行参考 oracle 相关资料.
(参考博客: http://lizhiyu.iteye.com/blog/2203081 )
热备份和冷备份
冷备份指在数据库系统 shutdown 之后, 使用操作系统的命令对表空间进行拷贝进行备份. 冷备份只能恢复到之前的某一备份点, 而该备份点到出现问题之间这段时间的数据是无法恢复的.
热备份指在数据库系统不停机的情况下进行备份. 热备份只能在归档模式下进行. 热备份可以在数据库系统崩溃时根据归档日志恢复到之前的任一时间点. 热备份通常用于数据的重要性较高, 数据库系统为 7 X 24 不间歇工作模式时.
我们使用 RMAN 来实现热备份. RMAN 可以用来备份和还原数据库文件, 归档日志和控制文件. 它也可以用来执行完全或不完全的数据库恢复. 但 RMAN 不能用于备份初始化参数文件和口令文件. RMAN 备份和还原的实质是去启动 oracle 中的进程, 使用驱动进程去备份和还原数据.
在进行热备份时我们会同时备份控制文件, 数据文件, 重做日志.
数据文件:
每一个 Oracle 数据库都要有一个或者多个物理的数据文件, 这些数据文件里存储的就是 Oracle 数据库里的数据. 就好比你有一个文件夹, 里面有几个 txt 的文本文件, 文本文件里记录的你这个月的每一笔花销. 如果把文件夹看做是数据库, 那么 txt 文件就是数据文件, 而 txt 文件里面记录的每一笔花销就是数据了.
然而表, 索引等等其实都是数据库的逻辑结构, 这些表, 索引都被物理的存储在了数据文件里面.
数据文件有三个特性:
1, 一个数据文件只能属于一个数据库.
2, 数据库中的数据文件可以被设置成自动的增长.
3, 一个或者多个数据文件就组成了数据库的一个逻辑单元叫做 --- 表空间.
数据文件里的数据, 在需要的时候就会被读取到内容 Oracle 的缓冲区中, 比如当我们想查看一天数据时, 而这条数据恰好又不在 Oracle 的缓冲区中, 那么 Oracle 就会把这条数据从数据文件中读取到 Oracle 的缓冲区中来.
当更改或者新增一天数据时, 也不是马上就写到数据文件里面, 这么做是为了减少对磁盘的访问, 提高效率, 数据先存储在缓冲区, 然后在一次都写入数据文件, 这个过程有一个 dbwn 后台进程来控制.
控制文件:
每一个数据库都拥有控制文件, 它和数据文件一样重要. 控制文件里记录的是对数据库物理结构的详细信息, 例如它包括如下三个信息:
1, 数据库的名称
2, 数据文件的名字和存在位置, 重做日志文件的名字和存储位置
3, 数据库创建的时间标识
Oracle 可以使用多重的控制文件, 也就是说它可以同时维护多个完全一样的控制文件, 这么做就是为了防止数据文件损坏而造成的数据库故障. 比如 Oracle 同时维护 3 个控制文件, 当其中有 1 个控制文件出问题了, 就比较好解决, 把出问题的删了, 在复制一份没有问题的就可以了.
每当 Oracle 数据库的实例启动的时候, 它就会通过控制文件来识别, 要想执行数据库的一些操作, 必须需要哪些数据文件和重做日志文件, 以及这些数据文件和重做日志文件都存在在什么位置. 当数据库的物理构成发生改变的时候, 比如新增加了一个数据文件或者重做日志文件, 那么控制文件就会自动的更新来记录这些变化. 另外在数据库恢复的时候也会用到控制文件.
重做日志文件:
每个 Oracle 数据库都拥有一组文件, 其中包括 2 个或者多个重做日志文件(其实也可以拥有多组, 用途跟多个控制文件一样). 这组文件整体被称为数据库的重做日志, 而重做日志又是由一条一条的重做记录组成的, 所有也被称为重做记录.
重做日志的主要作用就是记录所有的数据变化, 当一个故障导致被修改过的数据没有从内存中永久的写到数据文件里, 那么数据的变化是可以从重做日志中获得的, 从而保证了对数据修改的不丢失.
为了防止重做日志自身的问题导致故障, 所以 Oracle 拥有多重重做日志功能, 也就是可以同时保存多组完全相同的重做日志在不同的磁盘上.
重做日志里的信息只是用于恢复由于系统或者介质故障所引起的数据没法写入数据文件的数据. 比如突然断电导致数据库的关闭, 那么内存中的数据就不能写入到数据文件中, 内存中的数据就会丢失. 但当数据库重新启动时丢失的数据是可以被恢复的, 可以从最近的重做日志中读取丢失信息然后应用到数据文件中, 这样就把数据库恢复到断电前的状态.
在恢复操作中恢复重做日志信息的过程叫做回滚.
热备步骤
--show parameter db_name;
--sqlplus 以 sysdba 身份连接 orcl
conn /@orcl as sysdba;
-- 重启监听: lsnrctl stop/lsnrctl start
--1, 开启归档模式(sqlplus 工具, sys 用户)
-- 查看闪回恢复区的信息.
show parameter db_recover
-- 增大闪回恢复区
alter system set db_recovery_file_dest_size=3G;
-- 修改归档日志的存放路径
alter system set log_archive_dest_1='location=/data/oracleArchive';
-- 查看当前日志操作模式
SELECT log_mode from v$database;
-- 启用归档日志前要先停止数据库
shutdown immediate;
-- 数据库以 mount 方式启动
startup mount;
-- 启用数据库归档
alter database archivelog;
-- 打开数据库
alter database open;
-- 查看归档日志信息
archive log list;
--2, 开启补充日志
-- 查看当前数据库中补充日志状态
- select SUPPLEMENTAL_LOG_DATA_MIN min,
- SUPPLEMENTAL_LOG_DATA_PK pk,
- SUPPLEMENTAL_LOG_DATA_UI ui,
- SUPPLEMENTAL_LOG_DATA_FK fk,
- SUPPLEMENTAL_LOG_DATA_ALL "all"
- from v$database;
-- 最小补充日志是最基本的一种数据库级补充日志,
-- 启用最小补充日志
alter database add supplemental log data ;
-- 关闭最小补充日志
--alter database drop supplemental log data ;
-- 主键补充日志
alter database add supplemental log data (primary key) columns ;
-- 唯一索引补充日志
alter database add supplemental log data (unique) columns ;
-- 外键补充日志
alter database add supplemental log data (foreign key) columns ;
-- 全体字段补充日志
alter database add supplemental log data (all) columns;
--3, 数据库备份, 方式为全库方式
-- 文件结构:
- /data/oracleArchive
- /data/rmanbak/rman_ts
- /data/rmanbak/log
- /data/oracleBackup
- /data/oracleBackup/backup1
- /data/oracleBackup/backup2
--a. 开启归档模式
--b. 创建恢复目录的表空间 rman_ts(sys 用户):
create tablespace rman_ts datafile '/data/rmanbak/rman_ts.dbf' size 20G;
--c. 创建 rman 用户并授权
- create user rman identified by root default tablespace rman_ts temporary tablespace temp;
- grant connect, recovery_catalog_owner, resource to rman;
--d. 创建恢复目录
- rman catalog rman/root target orcl
- create catalog tablespace rman_ts
--e. 注册目标数据库
register database;
--f. 使用 rman 进行完全数据库备份:
-- 自动备份需要写脚本且定时执行, 参见文件 oracle_rman_backup.sh:
--g. 使用 rman 进行恢复
-- 归档日志:
- run{
- allocate channel dev1 type disk;
- restore archivelog all;
- release channel dev1;
- }
-- 恢复数据库, 需要将数据库 mount 或将数据文件 offline
- --rman target sys/root@orcl
- --rman> shutdown immediate
- --rman> startup mount
--RMAN> restore database; -- 恢复到某一备份
--RMAN> recover database; -- 从某一备份根据重做日志恢复到指定时间点
- --RMAN> alter database open;
- run{
- allocate channel dev1 type disk;
set until time "to_date('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss')";-- 可以设置恢复到某一时间点
- restore database;
- recover database;
- release channel dev1;
- }
- --select * from equ as of timestamp to_timestamp('2018-09-21 14:45:50','yyyy-mm-dd hh24:mi:ss');
--flashback table equ to timestamp(to_date('2018-09-26 14:45:50','yyyy-mm-dd hh24:mi:ss')); -- 根据闪回表恢复指定表的数据到指定时间点
- oracle_rman_backup.sh
- # 在 node1 每晚进行全量备份, 同时删除过期备份和归档日志文件
- #!/bin/bash
- ORACLE_SID=ORCL
- ORACLE_HOME=/data/oracle/product/11.2.0/db_1
- ORACLE_BASE=/data/oracle
- export ORACLE_SID
- export ORACLE_HOME
- export ORACLE_BASE
- backtime=`date +%Y%m%d`
- echo $backtime
- $ORACLE_HOME/bin/rman target sys/root@orcl log=/data/rmanbak/log/node1_backupall_$backtime.log<<EOF
- run{
- configure default device type to disk;
- configure device type disk parallelism 2;
- configure channel 1 device type disk format '/data/oracleBackup/back1/backup_%U';
- configure channel 2 device type disk format '/data/oracleBackup/back2/backup_%U';
- configure controlfile autobackup on;
- configure controlfile autobackup format for device type disk to '/data/oracleBackup/back1/ctl_%F';
- configure retention policy to recovery Windows of 7 days;
- }
- run{
- backup database ;
- backup archivelog all delete input;
- report obsolete;
- delete noprompt obsolete;
- crosscheck backup;
- crosscheck archivelog all;
- delete noprompt expired backup;
- }
- EOF
- echo "backup complete!"
- # 当有多个节点进行备份时相互 copy 日志
- #scp /oracle/rmanbak/log/node1_backupall_$backtime.log oracle@OracleNode2:/oracle/rmanbak/log/
- exit
- #RAC rman backup scripts
- # 每晚 1 点开始备份
- ##crontab -e
- ##0 1 * * */data/rmanbak/oracle_rman_backup.sh>> /data/rmanbak/log/oracle_rman_backup.log
来源: https://www.cnblogs.com/little-sheep/p/9871873.html