nbu oracle 冷备_oracle命令3 冷备份

用户管理的备份:

备份脚本要自己写;

备份哪些文件要自己选;

恢复时要复制那些文件自己判断;

恢复需要的日志,自己找;

备份,需要备份保存关键SCN信息的文件;

一次完成的备份包括:控制文件,数据文件,日志文件。

冷备份:

一致性关闭数据库后,对文件进行备份,通过操作系统命令直接拷贝 控制文件,数据文件,日志文件。 容易实现,操作简单,但是会影响正常使用。

热备份:

在数据库运行时,对文件进行备份,操作起来将冷备份复杂,不完全影响正常使用;

冷备份:

恢复时,会用永久丢失数据。 备份是关闭数据库,还原是也要关闭数据库。

手动创建备份目录:

# mkdir /u02

# chown -R oracle:onistall /u02

# cd /u02

# mkdir clobak

# mkdir hotbak

SQL> conn hr/hr

SQL> select * from tab; #查看有哪些表

SQL> drop table e purage; #删除e表

SQL> create table before_backup as select * from employees;

SQL> select * from tab; # 验证检查下

查看要备份的表的位置:

SQL> conn / as sysdba

Connected.

SQL> show user

USER is "SYS"

SQL> select name from v$datafile; # 查看数据文件在哪

NAME

-------------------------------------------------------------------------------

/data/oracle/oradata/orcl/system01.dbf

/data/oracle/oradata/orcl/sysaux01.dbf

/data/oracle/oradata/orcl/undotbs01.dbf

/data/oracle/oradata/orcl/users01.dbf

/data/oracle/oradata/orcl/example01.dbf

SQL>

SQL> select name from v$controlfile; # 查看控制文件在哪

NAME

--------------------------------------------------------

/data/oracle/oradata/orcl/control01.ctl

/data/oracle/flash_recovery_area/orcl/control02.ctl

SQL>

SQL> select member from v$logfile; # 查看日志文件在哪

MEMBER

---------------------------------------------------------

/data/oracle/oradata/orcl/redo03.log

/data/oracle/oradata/orcl/redo02.log

/data/oracle/oradata/orcl/redo01.log

SQL>

SQL> shutdown immediate # 一致性关闭数据库,会自动执行检查点

# cp 控制文件,数据文件,日志文件。

会有多个控制文件,不过文件都是一样的;

严谨些,就都复制;不严谨些,就只复制一个就行。

SQL> startup; #直接打开数据库

SQL> hr/hr

SQL> create table after_backup as select * from employees;

SQL> select * from tab;

模拟故障:

# rm -rf *.log

由于缓存原因,有时不会直接报错,因此直接重启数据库;

SQL> shutdown abort

SQL> startup;

提示报错;

只将备份的日志文件拷贝回来,open数据库还是会报错;如,备份日志文件中redo3只记录到6号,备份后,由于其他操作,日志文件已经记录到了 sequece 15,备份恢复回来的日志,从报错中可以看出,日志记录为6,7,8。 而数据块需要的是13,14,15 。 但是13,14,15已经删除,找不回来,所以只能还原到6,7,8 。(冷备份还原也需要先关掉数据库)

所以需要:

# cp 控制文件,数据文件,日志文件。 # 要把所有的控制文件,数据文件,日志文件都要拷贝回来,覆盖原来的文件。

SQL> startup;

SQL> hr/hr

SQL> select * from tab;

发现只有 beforte_backup 的表;

查看日志文件: sequence:6,7,8;

查看检查点: 883667, 发现数据库已经倒回到之前的状态;

冷备份,丢失极少数据:

开启归档,保存日志;

启用归档,三步骤:

1、一致性情况,并启动到mount;

2、修改为归档模式;保存日志的位置优先使用快速恢复区,这个是默认自动选择的。

3、启动数据库。

SQL> archive log list; # 查看归档

Database log mode No Archive Mode

Automatic archival Disabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 3

Current log sequence 5

SQL>

SQL> show parameter recover # 查看快速恢复区位置

NAME TYPE VALUE

------------------------------------ ---------------------- ------------------------------

db_recovery_file_dest string /data/oracle/flash_recovery_ar

ea

db_recovery_file_dest_size big integer 3882M

recovery_parallelism integer 0

SQL>

开启归档:

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount

ORACLE instance started.

Total System Global Area 764121088 bytes

Fixed Size 2217264 bytes

Variable Size 478153424 bytes

Database Buffers 281018368 bytes

Redo Buffers 2732032 bytes

Database mounted.

SQL> alter database archivelog;

Database altered.

SQL> alter database open;

Database altered.

SQL> archive log list;

Database log mode Archive Mode

Automatic archival Enabled

Archive destination USE_DB_RECOVERY_FILE_DEST

Oldest online log sequence 3

Next log sequence to archive 5

Current log sequence 5

SQL>

SQL> select name from v$datafile

union all

select name from v$controlfile;

union all

select member from v$logfile;

NAME

---------------------------------------------

/data/oracle/oradata/orcl/system01.dbf

/data/oracle/oradata/orcl/sysaux01.dbf

/data/oracle/oradata/orcl/undotbs01.dbf

/data/oracle/oradata/orcl/users01.dbf

/data/oracle/oradata/orcl/example01.dbf

/data/oracle/oradata/orcl/control01.ctl

/data/oracle/flash_recovery_area/orcl/control02.ctl

7 rows selected.

备注: union all 合并两个或多个 SELECT 语句的结果集

可以用SQL语句直接生成拷贝命令:

SQL> select '!cp -v ' ||name|| '/u02/colbak' from v$datafile

union all

select '!cp -v ' ||name|| '/u02/colbak' from v$controlfile

union all

select '!cp -v ' ||member|| '/u02/colbak' from v$logfile;

'!CP-V'||NAME||'/U02/COLBAK'

--------------------------------------------------------------------------------

!cp -v /data/oracle/oradata/orcl/system01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/sysaux01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/undotbs01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/users01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/example01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/control01.ctl/u02/colbak

!cp -v /data/oracle/flash_recovery_area/orcl/control02.ctl/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo03.log/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo02.log/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo01.log/u02/colbak

10 rows selected.

SQL>

写个冷备份脚本:

# su - oracle

$ vi colbak.sh

$ cat colbak.sh

sqlplus / as sysdba << eof

shutdown immediate

!cp -v /data/oracle/oradata/orcl/system01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/sysaux01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/undotbs01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/users01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/example01.dbf/u02/colbak

!cp -v /data/oracle/oradata/orcl/control01.ctl/u02/colbak

!cp -v /data/oracle/flash_recovery_area/orcl/control02.ctl/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo03.log/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo02.log/u02/colbak

!cp -v /data/oracle/oradata/orcl/redo01.log/u02/colbak

startup

exit

eof

$ chmod u+x colbak.sh

$./colbak.sh

可以看日志; alert_orcl.log

备注:

在shell命令中,格式为

命令 << EOF

内容段

EOF

将“内容段”整个作为命令的输入。其实,不一定要用EOF,只要是“内容段”中没有出现的字符串,都可以用来替代EOF,只是一个起始和结束的标志罢了。

这样连接scott时就不会提示密码问题了。

SQL> conn scott/oracle

ERROR:

ORA-28000: the account is locked

SQL> conn / as sysdba

Connected.

SQL> alter user scott account unlock;

User altered.

SQL> alter user scott identified by oracle; # 修改scott密码为oracle

User altered.

SQL> conn scott /oracle

Connected.

SQL> show user

USER is "SCOTT"

SQL> @check #执行sql后缀的文件

$ vi check.sql

$ cat check.sql

!echo "控制文件scn:"

select checkpoint_change# from v$datafile;

echo "数据文件scn:"

select checkpoint_change# from v$datafile_header;

!echo "日志文件scn:"

select group#,SEQUENCE#,FIRST_CHANGE# FIRST_TIME,NEXT_CHANGE# NEXT_TIME from v$log;

$conn / as sysdba

SQL> @check

再发起备份:

$./colbak.sh

SQL> create table after_backup as select * from employees;

模拟故障,删除前,做下日志切换,确保日志切换覆盖:

SQL> alter system switch logfile;

$ cd /u01/app/oracle/oradata/orcl #具体路径,根据查找的实际情况看

$ rm -rf *.log

SQL> shutdown abort

SQL> startup

出现报错;

仅复制丢失的redo,恢复还是会报错;

冷备的特点,停机一起备,停机一起恢复;

SQL> shutdown abort

只复制数据文件,不复制redo,不复制控制文件。

SQL> @check

检查点SCN:887386

数据文件SCN: 886766

说明数据文件老,因为数据文件是从备份拷贝过来的。

控制文件是新的,记录着数据库丢失日志文件时,数据库的检查点状态。

使用日志文件进行恢复:

SQL> recover database;

提示需要归档日志,自己找到了目录

输入: auto

数据库就能自己找,去恢复。进行一系列的恢复后,报错

redo01 记录的19号日志,被删除。 (online log 1 thread 1:"/u01/app/oracle/oradata/orcl/redo01.log")

但是,19号以前的日志,都存在。

命令数据库,对数据进行恢复时,恢复到18号日志即可。19号日志舍去,不再进行恢复。

SQL> recover database until cancel;

提示恢复1号日志;

输入:cancel

SQL> alter database open; 会报错;

SQL> alter database open resetlogs; #已resetlog打开数据库,当前SCN为0,保证SCN的连续性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值