Oracle ADG 切换场景及具体切换步骤 原创
mob604756f191852021-04-23 08:39:48
文章标签java文章分类Java编程语言阅读数1177

■ 计划内切换

(1)检查主库

select switchover_status from v$database;

SWITCHOVER_STATUS

SESSIONS ACTIVE

if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO STANDBY" ];

then { go to next step }

else { cancel switchover and check database }

(2)主库切为备库

alter database commit to switchover to physical standby with session shutdown;

shutdown immediate;

startup mount;

(3)检查备库

select switchover_status from v$database;

SWITCHOVER_STATUS

TO PRIMARY

if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];

then { go to next step }

else { cancel switchover and check database }

(4)备库切为主库

alter database commit to switchover to PRIMARY with session shutdown;

(5)原主库恢复日志应用

alter database recover managed standby database using current logfile disconnect from session;

■ 计划外切换

一、主备库日志没有缺口的场景

(1)备库检查日志缺口

select thread#,low_sequence#,high_sequence# from v$archive_gap;

未选定行

(2)备库停止日志接受并完成已收日志应用

alter database recover managed standby database cancel;

alter database recover managed standby database finish;

(3)检查备库状态

select switchover_status from v$database;

SWITCHOVER_STATUS

TO PRIMARY

if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];

then { go to next step }

else { cancel switchover and check database }

(4)备库切为主库

alter database commit to switchover to PRIMARY with session shutdown;

alter database open;

二、主库可以打开到 mount 状态

(1)将主库日志刷到备库

alter system flush redo to target_db_name;

(2)备库停止日志接受并完成已收日志应用

alter database recover managed standby database cancel;

alter database recover managed standby database finish;

(3)检查备库状态

select switchover_status from v$database;

SWITCHOVER_STATUS

TO PRIMARY

if [ switchover_status = "SESSIONS ACTIVE" | switchover_status = "TO PRIMARY" ];

then { go to next step }

else { cancel switchover and check database }

(4)备库切为主库

alter database commit to switchover to PRIMARY with session shutdown;

alter database open;

三、主备库间日志缺口无法纠正

(1)强制激活备库

alter database activate physical standby database;

alter database open;

oracle 分区表数据归档

随着系统的长期运行,积累的数据量也在不断的增长,随着业务的发展,增长的速度也在加剧。当积累到巨量的数据时,数据库的性能将急剧下降。一条查询SQL就有可能导致整个数据库僵死。为了保证查询的效率,我们需要适时的对几乎不访问的冷数据进行归档。

首先想到的方法是,读取待归档的数据, 插入到归档表,然后再将原表数据进行删除。实际测试的时候,发现在大数据的情况下, 归档过程非常慢,同时,delete数据后是不会主动释放表空间的。

因此,转而寻求其他更高效的方式,使用oracle的分区交换特性,按分区来进行数据归档。

oracle 分区交换
Oracle 交换分区你可以:

将一个分区(或子分区)转换成一个普通表。
将一个普通表转换成一个分区表的分区(或子分区)。
将一个哈希分区表转换成复合*哈希分区表的分区。
将一个复合*哈希分区表的分区转换成一个哈希分区表。
将一个(范围|列表)分区表转换成一个分区组合* 列表范围分区表。
将一个分区的复合*——(范围|列表)分区表转换到一个范围|列表分区表。
oracle在做分区交换的时候, 只涉及到数据字典的更新,因此执行非常快。

使用分区交换归档数据过程
创建备份分区表
创建与原表结构一致的备份分区表, 分区规则和分区名字也保持一致,为了分区交换执行更快,不为备份表创建键和字段约束。

创建于原表一致的中间表(非分区表)

create table tmp_table_name as select * from table_name;
分区交换
-- 先对原表分区与中间表进行分区交换
ALTER TABLE table_name

EXCHANGE PARTITION partition_name WITH TABLE tmp_table_name;

-- 再对中间表与备份分区表进行分区交换
ALTER TABLE his_table_name

EXCHANGE PARTITION partition_name WITH TABLE tmp_table_name;

-- 删除已经归档的分区
ALTER TABLE table_name PARTITION partition_name;
重建索引
分区交换,会导致分区表的全局索引失效,需要对索引进行rebuild。
-- 查询失效的索引,并组装索引重建sql
select 'alter index '||t.index_name||' rebuild online;' from user_indexes t where t.status='UNUSABLE'
执行索引重建SQL。

DONE。
转载:https://www.jianshu.com/p/d523831554d7

1、部署ansible

#vim /etc/yum.repos.d/aliBase.repo
#以下是配置yum源
[Base]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
 
# cat aliEpel.repo
[aliEpel]
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releasever\Server/$basearch/
enabled=1
gpgcheck=0



//首先安装 :
yum install -y epel-release  ##首先安装 epel源
yum install ansible -y    

//查看版本:
[root@localhost ~]# ansible --version

//主要配置文件:
[root@localhost ~]# tree /etc/ansible/    ##树状结构展示文件夹
/etc/ansible/
├── ansible.cfg     ##ansible的配置文件
├── hosts           ##ansible的主仓库,用于存储需要管理的远程主机的相关信息
└── roles           ##角色

1 directory, 2 files


---接下来是在管理端上的部署:

[root@localhost ~]# cd /etc/ansible

    [root@localhost ansible]# vim hosts 
    添加组名和对应的ip地址:
    [aaa]
    192.168.220.140
//配置密钥对验证:
[root@localhost ansible]# ssh-keygen -t rsa
[root@localhost ansible]# ssh-copy-id oracle@192.168.220.140


#!/bin/bash
source /home/oracle/.bash_profile
sqlplus -S "/as sysdba"<<EOF


set lin 200 pages 100
 select current_scn,protection_mode,database_role,force_logging,open_mode,switchover_status from gv\$database;


set pagesize 9999 
set linesize 132 
select
a.tablespace_name,
a.Total_mb,
f.Free_mb,
round(a.total_MB-f.free_mb,2) Used_mb,
round((f.free_MB/a.total_MB)*100) "%_Free"
from
(select tablespace_name, sum(bytes/(1024*1024)) total_MB from dba_data_files group by tablespace_name) a,
(select tablespace_name, round(sum(bytes/(1024*1024))) free_MB from dba_free_space group by tablespace_name) f
WHERE a.tablespace_name = f.tablespace_name(+)
order by "%_Free"
/
exit
EOF


--拷贝文件
ansible Suse -m copy -a "src=/ansible/check_db.sh dest=/home/oracle/scripts" -u oracle
--执行脚本
ansible Suse -m command -a "chmod +x /home/oracle/scripts/check_db.sh" -u oracle
ansible Suse -m shell -a "/home/oracle/scripts/check_db.sh" -u oracle