免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 9577 | 回复: 12

[分享] 数据库表的备份和还原 [复制链接]

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-07-28 10:38 |显示全部楼层
本帖最后由 toddhai 于 2015-09-01 16:45 编辑

最近在看oracle的书,看到数据库的备份和恢复的时候在机器上练了练,现在把操作的步骤记下来,一边以后的复习和改善



应用实例:fin_test表的备份
操作环境:xp系统,VMware虚拟机,RedHat5.6,Oracle数据库
操作之前的说明:我的RedHat上已经预先安装了Oracle,并且还有oracle用户,并且数据库中还有finance用户

一.Oracle逻辑备份和恢复

   

    1 创建备份文件的存储路径:打开虚拟机登陆RedHat5.6,切换到Oracle用户上(su - oracle),在主目录(/home/oracle)下创建baup_dir,并赋予777权限(mkdir baup_dir;chmod 777 baup_dir)



    2 登陆数据库:sqlplus /nolog conn /as sysdba(以管理员的身份登陆数据库)


    3 在数据库中定义备份文件的保存路径:create directory baup_dir as '/home/oracle/baup_dir'
    然后执行commit


    4 把baup_dir的读、写、执行的权限赋给用户(我的fin_test表属于finance用户):grant all on directory baup_dir to finance,然后执行commit


    最后退出数据库:quit


    5 将finance用户的fin_test表备份到baup_dir目录下(注意,这一语句是在退出数据库之后执行的,也就是说要在redhat命令行上执行):expdp finance/yonghumima directory=baup_dir dumpfile=expdp_fin.dmp logfile=expdp_fin.log tables=fin_test

  

    以上步骤执行完后,在baup_dir目录下出现expdb_fin.dmp和expdb_fin.log两个文件


恢复:
    impdp finance/finance directory=bak_dir table_exists_action=truncate dumpfile=expdb_fin.dmp logfile=expdb_fin.log

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-07-28 16:19 |显示全部楼层
本帖最后由 toddhai 于 2015-07-29 16:20 编辑

二.Oracle冷备份和恢复的通常步骤:(经过实验可行的方案)
1  正常关闭数据库
2  备份所有重要的文件到备份目录(数据文件、控制文件、重做日志文件等)
3  完成备份后启动数据库
  用冷备份进行恢复时,只需要将所有文件恢复到原有位置,就可以启动数据库了 。

1  进入数据库#sqlplus "/as sysdba"
2  如果没有启动则要启动:SQL>startup
3  查询数据文件datafile的所在目录:
SQL>SELECT name FROM v$datafile;
     查询控制文件controlfile的所在目录:
SQL>SELECT name FROM v$controlfile;
     查询重做日志文件的所在目录:
  SQL>SELECT member FROM v$logfile;
4  关闭数据库
   SQL>shutdown
5  备份文件到备份的目录
    #cp /u01/app/oracle/oradata/orcl/*.dbf  /home/mzl/BackupDatabase
    #cp /u01/app/oracle/oradata/orcl/*.ctl  /home/mzl/BackupDatabase
    #cp /u01/app/oracle/oradata/orcl/*.log  /home/mzl/BackupDatabase
6  然后启动数据库
   #sqlplus "/as sysdba"
   SQL>startup

   冷备份完毕!!

转自blog.itpub.net/12778571/viewspace-166613/

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-07-29 16:20 |显示全部楼层
本帖最后由 toddhai 于 2015-09-01 16:46 编辑

三.Oracle联机备份和恢复前的准备:归档模式

   根据我的理解,在联机备份之前,需要先将数据库(oracle)至于归档模式。
    那么什么是归档模式呢?
    oracle数据库有联机重做日志,他能记录对数据库的操作,比如插入、删除和更新。一般的,数据库会有两个及以上联机重做日志,这里我们以两个为例进行说明。当联机重做日志1被写满后,数据库会切换到另一个联机重做日志2中继续记录。那么日志2也被写满了怎么办呢?
    前文讲到联机日志1和2,档两个日志都被写满后,数据库会根据不同的工作模式(归档模式和非归档模式),采取不同的反应。
    处于非归档模式是,当联机重做日志2被写满后,会切换到联机重做日志1中继续写。那么日志1中之前的记录怎么办呢?当然是直接删除了。如此反复,日志中的内容也在被反复的删除和记录。
    处于归档模式时,当联机重做日志1 写满后,会切换到联机重做日志2,此时数据库会将联机重做日志1备份到指定的目录下。这样当联机重做日志2被写满后切换到日志1时,虽然也会将日志1的内容删除,但是因为之前有了备份。也不用担心我的操作记录丢失了。(当然,日志2被写满后也是会备份的)
    说了这么多,接下来就是配置数据库的归档模式(摘自blog.itpub.net/12778571/viewspace-166616/)
    更改数据库的归档模式需要重新启动数据库,在mount模式下修改,简要步骤
1   以shutdown immediate 方式关闭数据库
2  启动实例到mount状态
3  更改运行模式并打开数据库


操作步骤:
1   登录数据库查看数据库的归档状态
     SQL> archive log list;
     如果出现信息:
     Database log mode              No Archive Mode
     Automatic archival             Disabled
     则为非归档模式

2  关闭数据库
     SQL>shutdown immediate;

3   启动数据库到mount状态
     SQL>startup mount;

4   启动归档模式
     SQL>alter database archivelog;       (非归档模式为:alter database noarchivelog)
   
5   打开数据库
     SQL>alter database open;
      查看归档模式状态
     SQL>archive log list
      如果出现信息:
      Database log mode              Archive Mode
      Automatic archival             Enabled
      成功改成归档模式

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-07-29 16:47 |显示全部楼层
本帖最后由 toddhai 于 2015-09-01 16:47 编辑

归档模式虽然会占用资源(需要备份联机重做日志嘛),但是它的好处也是大大的!
根据之前做的数据库全备份结合联机重做日志,就可以还原出全备份时间到现在任意一点时间的数据库(理论上)。

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-07-30 15:41 |显示全部楼层
重做日志和归档日志的区别:

重做日志是数据库一直在记录的操作,而归档日志则是数据库在归档模式(数据库的一种运行模式)下备份的重做日志。换句话说,重做日志被备份保存后就变成了归档日志。想想也挺有道理,重做就是已经发生的操作,归档就是保存嘛

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-08-04 16:55 |显示全部楼层
本帖最后由 toddhai 于 2015-08-04 16:55 编辑



    四.联机备份的和恢复之用户管理的热备份

    说到热备份,我就有些迷糊,为什么会分用户管理和oracle管理(rman)两种方式呢?现在还搞不懂,不过不管了,搞了再说。
    用户管理的热备份可以备份表空间,但是之前有一系列的准备过程。
    步骤:
            1:备份前需要显式地发出Begin Backup命令;
            2:在操作系统拷贝文件(包括数据文件、控制文件等);
            3:发出end backup命令通知数据库完成备份;
            4:备份归档日志文件。

    详细的步骤
            注意:首先要让数据库处于归档模式奥!因为前一篇博文中讲过了,所以省略了。
            1:查询表空间位置(拷贝表的时候总得知道人家在哪里吧!)
            select file_id,file_name,tablespace_name,status,bytes from dba_data_files;
            2:发出begin backup命令
            alter tablespace system begin backup;
            通过v$backup视图来检查表空间的备份情况
            select * from v$backup;
            3:拷贝文件(可以再开一个终端,在上面进行拷贝,注意权限)
            cp /oracle/oradata/orcl/system01.dbf /home/liuxz/BackupDatabase/temp_file/ (/oracle/oradata/orcl/system01.dbf是第一部中得到的路径奥)
            4:发出end backup命令,通知数据库完成备份
               alter tablespace system end backup;
            5:用v$backup检查表空间的备份情况
            select * from v$backup;
    完成!
参考blog.itpub.net/12778571/viewspace-166637/

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-08-11 11:14 |显示全部楼层
本帖最后由 toddhai 于 2015-08-11 11:37 编辑

五.RMAN备份之手动备份

首先得登陆RMAN,我的实例只有一个,所以用以下命令登录:rman target / (可自行搜索rman的登陆方法)
备份文件保存路径:/oracle/product/10.2.0/db_1/dbs (每个人的保存路径不尽相同,但是大体路径都是一样的,一般会在/oracle下的dbs中)
以下涉及到的路径是根据我的电脑得到的,并不代表oracle的标准路径

1:数据库全备份:backup database;

    备份文件来源:/oracle/oradata/orcl/*.dbf 和 /data/oracle/bank.dbf
    可以用以下命令查看备份文件的保存路径和来源:list backup of database;

2:备份表空间:backup tablespace bank(表空间名);

3:备份数据文件:backup datafile n;

    n:指定的数据文件序号
    n的查询:首先登陆数据库,然后执行select file_name,file_id,tablespace_name from dba_data_files;(注意,这段语句并不是在rman下执行的,是在SQL>下执行的)

4:备份控制文件:backup current controfile;

    做任何操作时,都会自动对控制文件做备份的命令:CONFIGURE CONTROLFILE AUTOBACKUP ON;

5:备份归档日志文件:backup archivelog all;

小结:数据库的全备份是将数据库的所有数据进行备份,剩下的几种备份方式则是对数据库中指定类型的数据进行备份。以下是对各种备份方式的保存路径和来源的查询方式
    数据库:list backup of database;
    表空间:list backup of tablespace bank;
    控制文件:list backup of datafile n;(n的查询在第三条中有介绍)
    归档日志文件:list backup of archivelog all;

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-08-11 11:42 |显示全部楼层
六.RMAN备份之脚本备份

说明:采用0级全库备份脚本和1级增量备份脚本

    1:0级全库备份脚本
#!/bin/bash
. /home/oracle/.bash_profile
BACKUP_LEVEL=0
BACKUP_BASE=/oracle/backup/$ORACLE_SID/rman
LOG_FILE=$BACKUP_BASE/log/Level_$BACKUP_LEVEL\_`date +%Y%m%d.`log
DATA_BACK_PATH=$BACKUP_BASE/`date +%Y%m`/datafile
ARCHLOG_BACK_PATH=$BACKUP_BASE/`date +%Y%m`/archivelog
CTL_BACK_PATH=$BACKUP_BASE/`date +%Y%m`/controlfile
PFILE_PATH=$BACKUP_BASE/`date +%Y%m`/pfile
mkdir -p $BACKUP_BASE/log
date >> $LOG_FILE
mkdir -p $PFILE_PATH >> $LOG_FILE
mkdir -p $DATA_BACK_PATH >> $LOG_FILE
mkdir -p $ARCHLOG_BACK_PATH  >> $LOG_FILE
mkdir -p $CTL_BACK_PATH >> $LOG_FILE
rman  target / >> $LOG_FILE <<EOF
run {
CONFIGURE MAXSETSIZE TO UNLIMITED;
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 90 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '$CTL_BACK_PATH/%d_LVL`echo $BACKUP_LEVEL`_%F.ctl';
allocate channel d1 type disk;
# allocate channel d2 type disk;
# allocate channel d3 type disk;
# allocate channel d4 type disk;
backup incremental level $BACKUP_LEVEL format '$DATA_BACK_PATH/%d_LVL`echo $BACKUP_LEVEL`_%T_%u_s%s_p%p.dbf' database tag='level $BACKUP_LEVEL' include current controlfile;
sql 'alter system archive log current';
backup archivelog all format '$ARCHLOG_BACK_PATH/%d_AL_%T_%u_s%s_p%p.arh' delete input;
crosscheck backup;
delete noprompt obsolete;
delete noprompt expired backup;
release channel d1;
# release channel d2;
# release channel d3;
# release channel d4;
}
exit
EOF
if [ -f $ORACLE_HOME/dbs/init$ORACLE_SID.ora ]; then
cp $ORACLE_HOME/dbs/init$ORACLE_SID.ora $PFILE_PATH/init$ORACLE_SID.ora.`date +%Y%m%d%H%M` >> $LOG_FILE
else
        echo "file `echo $ORACLE_HOME/dbs/init$ORACLE_SID.ora` not exist" >> $LOG_FILE
fi

if [ -f $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora ]; then
  cp $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora $PFILE_PATH/spfile$ORACLE_SID.ora.`date +%Y%m%d%H%M` >> $LOG_FILE
else
        echo "file `echo $ORACLE_HOME/dbs/spfile$ORACLE_SID.ora` not exist" >> $LOG_FILE
fi
date  >> $LOG_FILE
   
    2:   1级增量备份
        只需对0级全库备份脚本稍作修改即可:将“BACKUP_LEVEL=0”改为“BACKUP_LEVEL=1”

论坛徽章:
0
发表于 2015-08-12 10:59 |显示全部楼层
楼主写的好,菜鸟好好学习中

论坛徽章:
5
数据库技术版块每日发帖之星
日期:2015-08-01 06:20:00数据库技术版块每日发帖之星
日期:2015-08-02 06:20:00数据库技术版块每日发帖之星
日期:2016-01-11 06:20:00数据库技术版块每日发帖之星
日期:2016-01-22 06:20:00程序设计版块每日发帖之星
日期:2016-05-09 06:20:00
发表于 2015-08-12 16:50 |显示全部楼层
共勉
回复 9# litzhiai


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP