起因是alert.log 里经常报
Thread 1 cannot allocate new log, sequence 37255
Checkpoint not complete
相关原因,thomas kyte已经在书中将了一些解决方法。这里仅仅补充一点:如果依靠增加DBWr进程数来解决,并不能缓解此问题,相反会增加日志切换频率,更容易报错。
下面就考虑以增加日志组和 修改日志组大小为例。
当前redo log文件,一个是50M,随着业务增加已经明显不够用了。计划增加redo group数,并把每个redo大小改成300m。
主库上:
SQL> select group#,thread#,sequence#,archived,status, bytes/1024/1024 from v$log;
GROUP# THREAD# SEQUENCE# ARC STATUS BYTES/1024/1024
---------- ---------- ---------- --- ---------------- ---------------
1 1 39472 YES INACTIVE 50
2 1 39473 YES INACTIVE 50
3 1 39474 YES INACTIVE 50
4 1 39476 NO CURRENT 300
5 1 39475 YES ACTIVE 300
注意,这里仅仅能drop 状态为inactive的。
alter database drop logfile group 1;
alter database drop logfile group 2;
然后再添加相应的日志组。 但是主要要先删除磁盘上的对应日志文件。不然会报错。
alter database add logfile group 1 '/data/oracle/oradata/test/redo01.log' size 300m;
alter database add logfile group 2 '/data/oracle/oradata/test/redo02.log' size 300m;
新加的redo log 开始会是unused的状态,切换几次switch logfile,即会变化。
主库基本操作完成。
备库:
首先要停掉备库的日志应用:
alter database recover managed standby database cancel;
再次,要把standby_logfile_management参数改成手动:
alter system set standby_file_management=manual;
现在就可以开始做drop和 add操作了。举例:
alter database add logfile group 4 '/data/oracle/oradata/test/redo04.log' size 300m;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 '/data/oracle/oradata/test/stredo1.log' size 1g;
这里在删除standby redo组的时候会遇到一些特使情况;
1. 首先要清理archive logfile,然后再drop
alter database clear logfile group 2;
alter database drop logfile group 2;
2,如果还是 出现问题,尝试在主库切换下日志。 alter system switch logfile;
3.此外,在clear lofile 的时候可能会报错:
SQL> alter database clear logfile group 2;
alter database clear logfile group 2
*
ERROR at line 1:
ORA-19527: physical standby redo log must be renamed
ORA-00312: online log 2 thread 1: '/u01/app/oracle/oradata/xezf/redo02.log'
ORA报错查询:
ORA-19527:
physical standby redo log must be renamed
Cause:
The CLEAR LOGFILE command was used at a physical standby database. This command cannot be used at a physical standby database unless the LOG_FILE_NAME_CONVERT initialization parameter is set. This is required to avoid overwriting the primary database's logfiles.
Action:
Set the LOG_FILE_NAME_CONVERT initialization parameter.
我们需要设置LOG_FILE_NAME_CONVERT 参数,才能使用clear logfile命令。
SQL> show parameter NAME_CONVERT
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
db_file_name_convert string
log_file_name_convert string
SQL> alter system set log_file_name_convert='/data/oradata/test','/data/oradata/test' scope=spfile;
System altered. 之后重启数据库。
再进行clear logfile 就成功了。
结束后,要还原上面设置,并开启设置开启日志应用。
alter database recover managed standby database cancel;
alter database recover managed standby database using current logfile disconnect from session;