ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 执行主备库切换以解决主库存储不足

执行主备库切换以解决主库存储不足

原创 Linux操作系统 作者:myownstars 时间:2011-03-15 17:20:13 0 删除 编辑

背景: 主库存储空间不足,需要添加磁盘;先为物理备库添加磁盘,然后进行主备库切换
由于原来的硬盘是做了raid的,所以系统需要重装,由于备库os重新安装了,因此需要新建一个备库,然后执行切换。
以下是大致步骤

第一步 配置物理备库
首先是安装oracle,备份主库的$ORACLE_HOME,然后解压缩到备库
创建oracle用户和用户组以及相关路径
[root@racdb02 ~]# groupadd -g 700 oinstall
[root@racdb02 ~]# groupadd -g 900 dba
[root@racdb02 ~]# useradd -u 500 -g oinstall oracle --这是一个失误,没有把oracle指定到dba用户组,导致sqlplus / as sysdba 出现权限不足
创建相应目录,解压缩安装文件,然后在$ORACLE_HOME/bin下relink

[oracle@racdb02 bdump]$ sqlplus / as sysdba
SQL*Plus: Release 10.2.0.5.0 - Production on Fri Mar 11 17:45:57 2011

Copyright (c) 1982, 2010, Oracle.  All Rights Reserved.

ERROR:
ORA-01031: insufficient privileges

[oracle@racdb02 admin]$ id oracle
uid=500(oracle) gid=700(oinstall) groups=700(oinstall)
查看后发现oracle只分配到了oinstall组,需要将其也加入dba组
[root@racdb02 ~]# usermod -g oinstall -G dba -U oracle
[oracle@racdb02 admin]$ id oracle
uid=500(oracle) gid=700(oinstall) groups=700(oinstall),900(dba)
此时可以登录,但是无法加载
SQL> startup mount;
ORA-27102: out of memory
Linux-x86_64 Error: 28: No space left on device
原因是没有修改系统参数/etc/sysctl.conf/,为此文件新增参数
kernel.shmall = 33554432
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
然后
[root@racdb02 etc]# sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
kernel.sysrq = 0
kernel.core_uses_pid = 1
kernel.shmall = 33554432
kernel.shmmax = 68719476736
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
即可
SQL> startup mount
ORACLE instance started.
这步本是linux下安装oracle的必须操作,但是以前的OS都已经配备好了kernel参数,所以历次安装时候没有留意,这次在新安装的OS上执行,问题就暴露了
另外参数文件还需要配置,包括口令文件、tnsnames.ora、listener.ora、standby controlfile在此略去

开头说过,主库空间不足了,
[oracle@orac1 ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda2             846G  748G   56G  94% /
/dev/sda1             190M   21M  160M  12% /boot
none                   63G     0   63G   0% /dev/shm
只剩不到60g,但是整库有400g大小,因此不能将主库整个备份传输到备库进行恢复,因此拟定新的恢复计划。
首先需要备份系统表空间,然后应用到备库,以便备库可以开启恢复进程,然后把其余数据文件挨个备份并传输至备库进行恢复,大致步骤如下

1、备份system,sysaux表空间,恢复到备库
RMAN>  backup tablespace system,sysaux;
传输备份集到备库/home/oracle/rman,备库上执行restore
先将数据库处于mount状态
RMAN> catalog start with '/home/oracle/rman';
RMAN> restore tablespace system;
RMAN> restore tablespace sysaux;
开启恢复进程
SQL> recover managed standby database;

2、恢复其余数据文件
通过shell脚本来实现这一步骤
先在备库上将其余数据文件offline drop掉,将其余文件名放在b.txt文件中,通过rman将数据文件copy到/data/pump目录,然后传输到备库,接着将其online
for a in `cat b.txt`
do
    echo "rman target / "
    echo "copy datafile '/data/oracle/oradata /$a' to '/data/pump/$a';"
    echo "exit"
    echo scp /data/pump/$a *.*.*.*:/data/oracle/oradata—传输数据文件到备库
    echo rm /data/pump/$a
    echo "ssh *.*.*.*" –连接到备库
    echo "sqlplus sys/nolog as sysdba"
    echo "alter database datafile '/data/oracle/oradata/$a' online;"
    echo "exit"
    echo " "
    echo "ssh *.*.*.*"—返回主库
    echo " "
done
此步执行完后,还需在为备库添加standby redo log,至此备库就算是建立完全了

 

第二步 执行主备库切换
一、检查工作
1、检查备库是否运行在归档模式
SQL> archive log list;
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /data/oracle/oradata/edw1/arch
Oldest online log sequence     16465
Next log sequence to archive   0
Current log sequence           16472

2、日志传输和应用是否存在延迟
SQL> select * from v$dataguard_stats;--apply lag的值不超过40s

3、主库执行日志切换,查看主备最大日志号是否相同
执行SQL>alter system switch logfile;
SELECT ARCHIVED,APPLIED,REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG order by SEQUENCE#;

4、检查主备库参数
确认相应的归档日志路径已经设置并且enable
SQL> show parameter log_arch

二、主库执行切换

5、 查看主库的状态:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
如果是TO_STANDBY,切换主库到STANDBY库:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
如果是SESSIONS ACTIVE,则处理这些session,如果处理完了还是SESSIONS ACTIVE,则使用
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY  WITH SESSION SHUTDOWN;
切换主库到STANDBY库;
切换前的主库的CONTROLFILE会存储在执行操作的这个session对应的trace文件中,出现问题时这个控制文件可以备用。很慢的时候可以尝试先SHUTDOWN,然后起来后再切换。

6、停主库并重启到MOUNT状态
Shutdown immediate;
Startup mount;
启动到MOUNT状态后,主库已经切换到备用库。

三、备库执行切换

7、查看备用库的状态:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
确认返回的结果是:TO_PRIMARY,以确认备用库是否接收到switch通知并准备转换为主库。如果返回是SESSION ACTIVE,则可以使用WITH SESSION SHUTDOWN选项来切换,或者干脆重启后再进行切换。

8、切换备用库到主库:
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
如果备库在MOUNT状态,则ALTER DATABASE OPEN;如果备库在OPEN状态,则SHUTDOWN IMMEDIATE,然后STARTUP。


四、启动备库并检查
9、登录,执行
alter database recover managed standby database disconnect from session using current logfile;

10、登录,执行日志切换
SQL>alter system switch logfile;
检查主备库的最大日志号是否相同
SELECT ARCHIVED,APPLIED,REGISTRAR, CREATOR, THREAD#, SEQUENCE#, FIRST_CHANGE#,NEXT_CHANGE# FROM V$ARCHIVED_LOG order by SEQUENCE#;

至此整个任务完成

回滚计划
如果切成备库,但切换主库失败,此时需要将重新激活成主库
登录,执行
SQL> alter database recover managed standby database cancel; FORCE关键字将会停止当前活动的RFS进程,以便立刻执行failover。
接着重新激活成主库
SQL> alter database commit to switchover to primary;
如果当前数据库已mount,则直接open;如果是open read only,则先shutdown,然后open

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-689526/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2010-03-18

  • 博文量
    375
  • 访问量
    3119507