前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DBA不用再半夜手工执行枯燥的大表DDL Online变更

DBA不用再半夜手工执行枯燥的大表DDL Online变更

原创
作者头像
杨漆
修改2021-07-26 11:11:36
4870
修改2021-07-26 11:11:36
举报
文章被收录于专栏:TidbTidbTidb

**导读**

> 作者:杨漆

> 16年关系型数据库管理,从oracle 9i 、10g、11g、12c到Mysql5.5、5.6、5.7、8.0 到TiDB获得3个OCP、2个OCM;运维路上不平坦,跌过不少坑、熬过许多夜。把工作笔记整理出来分享给大伙儿,希望帮到大家少走弯路、少熬夜。

Online业务,大表DDL都只能在业务低谷期执行,通常为凌晨4点左右,这是人最想睡觉的时候,而DBA却要在这个时点起来工作。

怎样减轻DBA的痛苦,将只能在半夜执行的批量DDL变更让机器自动执行?

答:1.设置定时一次性脚本任务

2.将执行结果批量检查,结果记录到一个日志中,便于DBA检查

## 任务脚本

cat /u01/app/alter_columns/alter_columns.sh

#!/bin/bash

# IP

source ~/.bash_profile

script_dir=`dirname $0`

sqlplus -S "/ as sysdba" <<!

set feedback off

## 批量DDL (都是过亿的大表,执行时间较长)

alter table PPP.CHANNEL_RESUME modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a1 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a1 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a2 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a2 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a3 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a3 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a4 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a4 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a5 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a5 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a6 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a6 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a7 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a7 rebuild online parallel 10;

alter table PPP.CHANNEL_RESUME_a8 modify channel_order varchar2(80) parallel 10;

alter index PPP.idx_channel_order_a8 rebuild online parallel 10;

### 修改字段(上千万的大表启用并行参数,速度更快)

alter table PPP.CHANNEL_RESUME_SUCCESS_ORDER modify channel_order_num varchar2(80) parallel 10;

### 在线重建索引(上千万的大表启用并行参数,速度更快)

alter index PPP.idx_pay_resume_detail_p rebuild online parallel 10;

!

function tbs_query {

sqlplus -S "/ as sysdba" <<!

set linesize 400

set pagesize 200

set feed off

col OWNER for a10

col TABLE_NAME for a30

col DATA_TYPE for a20

col DATA_LENGTH for 999

-- Query columns 将所有字段修改的结果放到日志里便于观察

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME' and COLUMN_NAME=upper('channel_order');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A1' and COLUMN_NAME=upper('channel_order_a1');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A2' and COLUMN_NAME=upper('channel_order_a2');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A3' and COLUMN_NAME=upper('channel_order_a3');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A4' and COLUMN_NAME=upper('channel_order_a4');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A5' and COLUMN_NAME=upper('channel_order_a5');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A6' and COLUMN_NAME=upper('channel_order_a6');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A7' and COLUMN_NAME=upper('channel_order_a7');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_A8' and COLUMN_NAME=upper('channel_order_a8');

select OWNER,TABLE_NAME,COLUMN_NAME,DATA_TYPE,DATA_LENGTH from dba_tab_columns where owner='PPP' and TABLE_NAME='CHANNEL_RESUME_SUCCESS_ORDER' and COLUMN_NAME=upper('channel_order_num');

!

}

tbs_query 2>&1 | sed '/^$/d' | tee $script_dir/results/alter_columns_result_`date +%Y%m%d.rlt`

#### 一次性到点自动执行脚本

## 按装at 软件包

yum -y install at

## 查看at软件包是否已安装

rpm -q at

反馈结果:

at-3.1.8-84.el5

## 确定at安装

chkconfig --list | grep atd

## 启动at服务

service atd restart

/etc/init.d/atd {start|stop|restart|condrestart|status}

chkconfig atd on

## at的访问控制

1.如果系统中有/etc/at.allow文件,那么只有写入/etc/at.allow文件(白名单)中的用户可以使用at命令(/etc/at.deny文件会被忽略)。

2.如果系统中没有/etc/at.allow文件,只有/etc/at.deny文件,那么写入/etc/at.deny文件(黑名单)中的用户不能使用at命令。对root不起作用。

3.如果两个文件都不存在,那么只有root用户可以使用at命令。

设置一次性定时执行任务(at软件都ok的话,可直接执行下面步骤)

## at now + 1 minutes

## at 5pm+3 days

## at -f /u01/app/alter_columns/alter_columns.sh 04:01 2021-07-12

at 4:00 2021-07-12

at> sh /u01/app/alter_columns/alter_columns.sh

crtl + D ## 保存退出

## 查询当前服务器上的at工作

atq

## 显示已经设置的任务内容

at -c 9 ## 9为任务号

## 删除指定的at任务

atrm9 ## 9为即将执行的任务号

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档