项目中要对Oracle的redo.log进行解析,实现数据同步,由于项目运行机制,需要开启归档日志和补充日志。
重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制。
1)重做日志文件以组的形式存在
2)一个oracle数据库至少需要两组,每组至少有一文件
3)在一组里的每一重做日志文件叫做成员
相关文章介绍的很详细:重做日志官方文档介绍
归档日志(Archive Log)是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,当数据库处于ARCHIVELOG模式并进行日志切换式,后台进程ARCH会将重做日志的内容保存到归档日志中.当数据库出现介质失败时,使用数据文件备份,归档日志和重做日志可以完全恢复数据库。
当ORACLE数据库运行在ARCHIVELOG模式时,所有的事务重做日志都将保存.这意味着对数据库进行的所有事务都留有一个备份,尽管重做日志以循环方式工作,但在一个重做日志被覆盖前均将为其建立一个副本.在重做日志文件复制完成之前,ORACLE数据库将停止一切新的操作,在旧的事务记录完成之前ORACLE不对其进行覆盖.有了所有事务的副本,数据库就可以从所有类型的失败中恢复,包括用户错误或磁盘崩溃.这是一种最安全的数据库工作方式。
sqlplus / as sysdba
SQL> archive log list
//输出结果
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 244
Current log sequence 246
No Archive Mode表示当前数据库未开启归档模式
3. 设置归档目录
oracle默认使用闪回恢复区DB_RECOVERY_FILE_DEST作为归档路径,但是闪回恢复区在安装过程中有限制其大小,如果闪回恢复区满了,归档日志会因为无法写入而导致数据库阻塞。解决办法是可以通过增加闪回区大小或者修改归档日志的路径。修改log_archive_dest_1参数即可修改归档日志路径(pfile/spfile中参数db_recovery_file_dest指定的目录将无效),从Oracle 10g开始,可以生成多份一样的日志,保存多个位置,加强安全性,多个位置通过设置不同的log_archive_dest_{n}参数实现,archive log list输出中的Archive destination路径只显示最新修改的路径。
SQL> show parameter log_archive_dest_1
//输出结果
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
log_archive_dest_1 string
log_archive_dest_10 string
log_archive_dest_11 string
log_archive_dest_12 string
log_archive_dest_13 string
log_archive_dest_14 string
log_archive_dest_15 string
log_archive_dest_16 string
log_archive_dest_17 string
log_archive_dest_18 string
log_archive_dest_19 string
我这里是修改归档路径为/oradata/archivelog
SQL> alter system set log_archive_dest_1='location=/oradata/archivelog' scope=spfile;
//输出结果
System altered.
该修改重启后生效
4. 修改归档日志格式
SQL> alter system set log_archive_format='ARC%S_%R.%T_%D.dbf' scope=spfile;
//输出结果
System altered.
修改后归档日志的命名样式为:ARC0000002549_0993570162.0001_e7cda172.dbf;该修改重启后生效
5. 开启归档日志
需要在mount状态下开始数据库归档,重启至mount
SQL> shutdown immediate
//输出结果
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
Total System Global Area 1603411968 bytes
Fixed Size 2213776 bytes
Variable Size 989857904 bytes
Database Buffers 603979776 bytes
Redo Buffers 7360512 bytes
Database mounted.
开启数据库归档:
SQL> alter database archivelog;
//输出结果
Database altered.
查看归档结果:
SQL> archive log list
//输出结果
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archive_log
Oldest online log sequence 244
Next log sequence to archive 246
Current log sequence 246
开启强制归档:
ALTER DATABASE FORCE LOGGING;
打开数据库:
SQL> alter database open;
Database altered.
6.确认数据库为归档模式
SQL> select log_mode from v$database;
//输出结果
LOG_MODE
------------
ARCHIVELOG
SQL> select archiver from v$instance;
ARCHIVE
-------
STARTED
7.强制日志切换,确认是否开启归档成功
先查看当前归档日志视图和归档日志路径:
SQL> select name from v$archived_log;
//输出结果
no rows selected
[oracle@zml-rhel6 archive_log]$ ll
//输出结果
total 0
如结果所示,没有归档日志,下面执行强制日志切换:
SQL> alter system switch logfile;
//输出结果
System altered.
再次查看视图
SQL> select name from v$archived_log;
//输出结果
NAME
--------------------------------------------------------------------------------
/oradata/archivelog/ARC0000002429_0993570162.0001_e7cda172.dbf
有归档日志产生,验证归档日志开启成功
归档日志非常占用物理空间,应定时清理,归档日志的清理分为两部分:
1.物理删除归档日志
该方式是利用linux的脚本和crontab定时任务来查找n天前的日志进行删除,首先编写日志删除脚本:
[oracle@i-F44CBDC1 shell]$ vim deleteArchiveLog.sh
//输入如下指令,意为删除5天前的所有文件
find /oradata/archivelog -mtime +5 -name "*.*" -exec rm -Rf {} \;
保存脚本后,根据实际情况赋予权限或组别,然后操作crontab,本例子均在oracle用户下创建定时任务:
[root@i-F44CBDC1 ~]# crontab -e
//输入如下指令,意为每天0点35分执行删除归档日志脚本,并将脚本的执行记录输出到log文件中
35 0 * * * sh /usr/local/shell/deleteArchiveLog.sh >>/var/local/deletearchivelog.log
保存后,定时任务会到时间执行脚本。
2. 虽然物理删除了归档日志文件,但是控制文件中依然会有这些日志的记录,下面需要在控制文件中清理这些归档日志,利用RMAN进行清理。
//rman登录
rman target/
查看过期日志:
RMAN> list expired archivelog all;
//输出结果
specification does not match any archived log in the repository
信息中显示没有过期日志,这是因为需要先检查归档日志的有效性,再进行删除:
RMAN> crosscheck archivelog all;
//输出结果
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=70 device type=DISK
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002448_0993570162.0001_e7cda172.dbf RECID=415 STAMP=1026952512
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002449_0993570162.0001_e7cda172.dbf RECID=416 STAMP=1026952520
validation succeeded for archived log
archived log file name=/oradata/archivelog/ARC0000002450_0993570162.0001_e7cda172.dbf RECID=417 STAMP=1026952542
validation succeeded for archived log
再次查看过期的归档日志,rm删除的文件便被标记为了过期日志:
RMAN> list expired archivelog all;
//输出结果
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
1 606 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
1 607 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
1 608 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf
删除过期的归档日志:
RMAN> delete expired archivelog all;
//输出结果
released channel: ORA_DISK_1
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=446 device type=DISK
List of Archived Log Copies for database with db_unique_name ORCLWHS
=====================================================================
Key Thrd Seq S Low Time
------- ---- ------- - ---------
1 606 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf
1 607 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf
1 608 X 04-JUN-18
Name: /oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf
//询问是否要删除上述文件,输入YES
Do you really want to delete the above objects (enter YES or NO)? yes
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002609_0993570162.0001_e7cda172.dbf RECID=1 STAMP=977949943
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002610_0993570162.0001_e7cda172.dbf RECID=2 STAMP=977954446
deleted archived log
archived log file name=/oradata/archivelog/ARC0000002611_0993570162.0001_e7cda172.dbf RECID=3 STAMP=977954551
Deleted 3 EXPIRED objects
再次查询过期的归档日志:
RMAN> list expired archivelog all;
//输出结果
specification does not match any archived log in the repository
我们可以将上述流程封装为shell脚本,用定时任务执行,首先创建脚本:
[oracle@i-F44CBDC1 shell]$ vim clearArchiveLog.sh
//输入如下内容
PATH=$PATH:$HOME/bin
export PATH
export NLS_LANG=AMERICAN_AMERICA.zhs16gbk
export ORACLE_SID=zjfwjyptdb
export ORACLE_BASE=/oracle/app
export ORACLE_HOME=/oracle/app/database/ora11g
export SQLPATH=/home/oracle/scripts
export ORA_NLS33=$ORACLE_HOME/ocommon/nls/admin/data
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib:
export PATH=$ORACLE_HOME/bin:/usr/bin:/usr/ccs/bin:/etc:/bin:/usr/openwin/bin:\
/usr/local/bin:/usr/X11R6/bin:/oracle/crs/bin:$PATH
umask 022
$ORACLE_HOME/bin/rman target / log=/home/oracle/del_arch$(date +%Y-%m-%d).log <
保存脚本,然后创建定时任务:
[oracle@i-F44CBDC1 shell]$ crontab -e
//输入如下内容,意为0点40执行clearArchiveLog.sh,并将执行信息输出到archivelogrmanlog.log文件中
40 0 * * * sh /usr/local/shell/clearArchiveLog.sh >>/var/local/archivelogrmanlog.log
保存退出,这样就可以定时清理控制文件中的归档日志记录了。
参考文章:https://www.cnblogs.com/ZeroTiny/p/9135247.html
附加日志(supplemental log)可以指示数据库在日志中添加额外信息到日志流中,用以支持基于日志的工具,可以在数据库和表上设置。本文只介绍数据库级别的设置,而数据库级的设置,又分两类:最小附加日志和标识键日志,可通过以下命令查看补充日志开启情况:
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 allc from v$database;
alter database add supplemental log data;
alter database add supplemental log data(primary key,unique,foreign key,all) columns;
在缺省情况下,Oracle不启用以上任何附加日志。当使用all,primary,unique或foreign附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。 在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。
参考文章:http://blog.itpub.net/31397003/viewspace-2142791/