ARCHIVELOG模式下用户管理恢复控制文件(1)——使用二进制控制文件恢复!

 在生产数据库中,控制文件一般多路复用的。每个控制文件的内容是一模一样的,只要其中有一个没有丢失,那么就可以复制一下,改一下名字就可以用了。

 

首先在数据库中备份执行一个二进制的控制文件,也可以使用操作系统的命令直接复制控制文件来备份。

SQL> startup
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1266392 bytes
Variable Size              62917928 bytes
Database Buffers          100663296 bytes
Redo Buffers                2924544 bytes
数据库装载完毕。
数据库已经打开。

SQL> create tablespace tb1 datafile '/u01/app/oracle/oradata/orcl/tb1.dbf' size 10m; 

表空间已创建。

SQL> create user u1 identified by u1 default tablespace tb1;

用户已创建。

SQL> grant connect,resource to u1;

授权成功。

SQL> conn u1/u1
已连接。

SQL> create table t (id int,value varchar2(10));

表已创建。

SQL> insert into t values(1,'a');

已创建 1 行。

SQL> commit;

提交完成。

SQL> select * from t;

        ID VALUE
---------- ----------
         1 a

SQL> conn /as sysdba
已连接。
SQL> alter system checkpoint;

系统已更改。

SQL> alter system archive log current;

系统已更改。

SQL> alter system switch logfile;

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。

SQL> /

系统已更改。
SQL> alter database backup controlfile to '/u01/app/oracle/controlfile/control.ctl';

数据库已更改。

SQL> shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。


现在关闭数据库后,所有的控制文件丢失了,然后把备份的控制文件复制过去,该一下名字。

[oracle@linux orcl]$ rm -rf control0*
[oracle@linux orcl]$ cp /u01/app/oracle/controlfile/control.ctl .
[oracle@linux orcl]$ mv control.ctl control01.ctl 
[oracle@linux orcl]$ cp control01.ctl control02.ctl 
[oracle@linux orcl]$ cp control01.ctl control03.ctl 


下面记录恢复操作

SQL> startup 
ORACLE 例程已经启动。

Total System Global Area  167772160 bytes
Fixed Size                  1266392 bytes
Variable Size              62917928 bytes
Database Buffers          100663296 bytes
Redo Buffers                2924544 bytes
数据库装载完毕。
ORA-01589: 要打开数据库则必须使用 RESETLOGS 或 NORESETLOGS 选项

SQL> select status from v$instance;

STATUS
------------
MOUNTED

SQL> select * from v$log;

    GROUP#    THREAD#  SEQUENCE#      BYTES    MEMBERS ARC STATUS           FIRST_CHANGE# FIRST_TIME
---------- ---------- ---------- ---------- ---------- --- ---------------- ------------- --------------
         1          1         13   52428800          1 YES INACTIVE                474583 10-10月-11
         3          1         12   52428800          1 YES INACTIVE                474581 10-10月-11
         2          1         14   52428800          1 NO  CURRENT                 474585 10-10月-11

SQL> select member from v$logfile;

MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/orcl/redo03.log
/u01/app/oracle/oradata/orcl/redo02.log
/u01/app/oracle/oradata/orcl/redo01.log

SQL> recover database using backup controlfile;
ORA-00279: 更改 474585 (在 10/10/2011 01:15:57 生成) 对于线程 1 是必需的
ORA-00289: 建议: /u01/app/oracle/flash_recovery_area/ORCL/archivelog/2011_10_10/o1_mf_1_14_%u_.arc
ORA-00280: 更改 474585 (用于线程 1) 在序列 #14 中


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
/u01/app/oracle/oradata/orcl/redo02.log
已应用的日志。
完成介质恢复。

SQL> alter database open resetlogs;

数据库已更改。

SQL> select status from v$instance;

STATUS
------------
OPEN

SQL> conn u1/u1
已连接。
SQL> select * from t;

        ID VALUE
---------- ----------
         1 a
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
不同的数据库管理系统有不同的数据库文件介质恢复语句,我可以为你提供一些常用的示例语句,但是请注意,在实际操作中,语句的具体内容需要根据你的数据库管理系统版本、数据库文件损坏情况等情况进行调整和修改,建议在操作前仔细阅读官方文档并备份好数据。 以下是一些示例语句: 针对 MySQL 数据库: - 使用 mysqlbinlog 工具进行二进制日志恢复: ``` mysqlbinlog binlog.00000X | mysql -u root -p ``` - 使用 InnoDB 引擎的 redo log 进行恢复: ``` SET GLOBAL innodb_force_recovery = 1; # 这里需要停止 MySQL 服务,手动删除所有 InnoDB 数据文件(数据文件路径可以在 my.cnf 中找到),然后重启 MySQL 服务,这时候 InnoDB 引擎会自动进行恢复操作。 ``` 针对 Oracle 数据库: - 使用 LogMiner 工具进行恢复: ``` ALTER DATABASE ADD SUPPLEMENTAL LOG DATA; -- 确认数据库处于归档模式 SELECT NAME FROM V$ARCHIVED_LOG WHERE APPLIED = 'YES' ORDER BY FIRST_TIME DESC; -- 获取需要的归档日志文件名,例如 'archivelog_12345.arc' EXECUTE DBMS_LOGMNR.ADD_LOGFILE('/u01/oracle/archivelog/archivelog_12345.arc', options => DBMS_LOGMNR.NEW); -- 添加需要的归档日志文件 EXECUTE DBMS_LOGMNR.START_LOGMNR(STARTTIME => TO_DATE('2022-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'), ENDTIME => TO_DATE('2022-01-01 23:59:59', 'YYYY-MM-DD HH24:MI:SS')); -- 开始恢复操作 ``` 针对 SQL Server 数据库: - 使用 Transaction Log 进行恢复: ``` RESTORE DATABASE [DatabaseName] FROM DISK = 'D:\Backup\DatabaseName.bak' WITH NORECOVERY; RESTORE LOG [DatabaseName] FROM DISK = 'D:\Backup\DatabaseName.trn' WITH NORECOVERY; -- 恢复备份文件和事务日志文件 RESTORE DATABASE [DatabaseName] WITH RECOVERY; -- 完成恢复操作 ``` 以上是一些常见的数据库文件介质恢复语句示例,具体操作还需要根据实际情况进行调整和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值