用户管理的备份与恢复
冷备份非归档模式数据库
- 确定存储备份文件的位置和空间
- 找到需要复制的数据库文件(包含数据文件,临时文件,控制文件,重做日志文件, [参数文件])
- 使用immediate、transational或normal子句关闭数据库
- 将文件(步骤2中找到的)复制到备份位置(步骤1确定的)
- 重启数据库
# step 1
-- 查询数据库大小,单位M. 备份位置空间应该大于查询大小
select sum(sum_bytes)/1024/1024 m_bytes
from (
select sum(bytes) sum_bytes from v$datafile
union all
select sum(bytes) sum_bytes from v$tempfile
union all
select (sum(bytes) * members) sum_bytes from v$log group by members
);
# step 2
-- 查询数据库文件位置
select name from v$datafile
union
select name from v$controlfile
union
select name from v$tempfile
union
select member from v$logfile;
-- 查询spfile参数文件位置
select name, value from v$parameter where lower(name) = 'spfile';
# step 3
shutdown immediate;
# step 4
-- 手动使用cp命令复制
# step 5
startup;
# 自动冷备份脚本
#!/bin/bash
# cold backup, 此脚本没有复制参数文件, 需要手动复制
ORACLE_SID=iddbsvr
ORACLE_HOME=/opt/oracle/product/11.2.0/dbhome_1
BACKUP_BASEDIR=/backup
BACKUP_DIR=$BACKUP_BASEDIR/$ORACLE_SID
# if backup_dir not exists, create it
if ! [ -d $BACKUP_DIR ]; then
mkdir -p $BACKUP_DIR
fi
PATH=$PATH:$ORACLE_HOME/bin
#
sqlplus -s <<EOF
/ as sysdba
set head off pages0 lines 132 verify off feed off trimsp on
define cbdir=$BACKUP_DIR
spool coldbackup_$ORACLE_SID.sql
select 'shutdown immediate;' from dual;
select '!cp ' || name || ' ' || '&&cbdir' from v\$datafile;
select '!cp ' || name || ' ' || '&&cbdir' from v\$tempfile;
select '!cp ' || member || ' ' || '&&cbdir' from v\$logfile;
select '!cp ' || name || ' ' || '&&cbdir' from v\$controlfile;
select 'startup;' from dual;
spool off;
@@coldbackup_$ORACLE_SID.sql
EOF
exit 0
# 冷备份自动恢复脚本
#!/bin/bash
# cold restore
ORACLE_SID=iddbsvr
ORACLE_HOME=/opt/oracle/product/11.2.0/dbhome_1
BACKUP_BASEDIR=/backup
BACKUP_DIR=$BACKUP_BASEDIR/$ORACLE_SID
sqlplus -s <<EOF
/ as sysdba
set head off pages0 lines 132 verify off feed off trimsp on
define cbdir=$BACKUP_DIR
spool coldrestore_$ORACLE_SID.sql
select 'shutdown immediate;' from dual;
select '!cp ' || '&&cbdir/' || substr(name, instr(name, '/', -1, 1)+1) || ' ' || name from v\$datafile;
select '!cp ' || '&&cbdir/' || substr(name, instr(name, '/', -1, 1)+1) || ' ' || name from v\$tempfile;
select '!cp ' || '&&cbdir/' || substr(member, instr(member, '/', -1, 1)+1) || ' ' || member from v\$logfile;
select '!cp ' || '&&cbdir/' || substr(name, instr(name, '/', -1, 1)+1) || ' ' || name from v\$controlfile;
select 'startup;' from dual;
spool off;
EOF
exit 0
冷备份归档模式数据库
- 确定存储备份文件的位置和空间
- 找到需要复制的数据库文件(包含数据文件,控制文件, [参数文件]), 不包含临时文件和在线日志文件
- 使用immediate、transational或normal子句关闭数据库
- 将文件(步骤2中找到的)复制到备份位置(步骤1确定的)
- 重启数据库
备份除了步骤2有差异, 其他和冷备份非归档一样。 恢复方法与热备份恢复数据库方法相同。
# step 2
-- 查询数据库文件位置
select name from v$datafile
union
select name from v$controlfile
-- 查询spfile参数文件位置
select name, value from v$parameter where lower(name) = 'spfile';
创建热备份
- 确保数据库处于归档日志模式
- 确定存储备份文件的位置
- 找到需要备份的文件
- 记下联机重做日志的最大序列号
- 将数据库/表空间更改为备份模式
- 使用OS实用程序,将数据文件复制到步骤2确定的存储位置
- 将数据库/表空间退出备份模式
- 归档当前联机重做日志,并记下联机重做日志的最大序列号
- 备份控制文件
- 备份在执行备份过程中生成的所有归档重做日志
# step 1
-- 确保归档
SYS@iddbsvr SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 1
Next log sequence to archive 1
Current log sequence 1
# step 2
-- 查询数据库大小,单位M. 备份位置空间应该大于查询大小
select sum(bytes) / 1024 / 1024 AS m_bytes from dba_data_files;
# step 3
-- 查询数据文件位置
select name from v$datafile;
set pagesize 150;
column tablespace_name format a30;
column file_name format a80;
select tablespace_name, file_name from dba_data_files order by 1, 2;
# step 4
-- 记下联机重做日志的最大序列号
select thread#, max(sequence#) from v$log group by thread# order by thread#;
# step 5
-- 将数据库/表空间更改为备份模式
alter database begin backup;
alter tablespace <tablespace_name> begin backup;
# step 6
-- 使用OS实用程序,将数据文件复制到步骤2确定的存储位置
# step 7
-- 将数据库/表空间退出备份模式
alter database end backup;
alter tablespace <tablespace_name> end backup;
-- 验证退出(没有数据文件处于active状态)
alter session set nls_date_format = 'DD-MON-RRRR HH24:MI:SS';
select * from v$backup where status = 'ACTIVE';
# step 8
-- 归档当前联机重做日志
alter system archive log current;
-- 并记下联机重做日志的最大序列号
select thread#, max(sequence#) from v$log group by thread# order by thread#;
# step 9
-- 备份控制文件(热备份无法使用cp命令)
alter database backup controlfile to '</backup/dir/control.dbf>' reuse;
# step 10
-- 备份在执行备份过程中生成的所有归档重做日志
cp <archive redo logs generated during backup> <backup directory>