GBase 8a
运维管理
文章

GBASE 8A存储过程代码分离

发表于2026-01-14 11:55:4221次浏览0个评论

           GBASE 8A存储过程代码分离

1.使用gcdump备份元数据信息,备份代码如下:

#!/bin/bash
$HOME/.gbase_profile


dir=/gbase/mpp_aomp/metedata
dir2=/gbase/mpp_aomp/metedata/log
pwdbase=xxxx

##该变量为当天日期的前一天
cur_date1=`date -d "1 day ago" "+%Y%m%d"`

##该变量为当天日期
cur_date2=`date "+%Y%m%d"`

##当前小时和分钟
cur_hour=`date "+%H:%M"`

gccli -ugbase -p${pwdbase} -Nse 'show databases' > ~/shsnc/mpp_aomp/Metadata_backup/databasesname.txt

echo "==========[`date "+%Y-%m-%d %H:%M:%S"`] ddl_backup  Info=========="

##读取databasesename文件中的数据,并且排除gbase,gclusterdb,gctmpdb,information_schema,performance_schema
cat ~/shsnc/mpp_aomp/Metadata_backup/databasesname.txt | grep -v "gbase\|gclusterdb\|gctmpdb\|information_schema\|performance_schema" | while read dbn ; do
      
     gcdump --routines=true -f -t -B  ${dbn} > ${dir}/${dbn}.proc.${cur_date2} 2>> ${dir2}/${dbn}.proc.err.${cur_date2} 
     gcdump  -f -n -B -R ${dbn} > ${dir}/${dbn}.sql.${cur_date2} 2>> ${dir2}/${dbn}.sql.err.${cur_date2}
 
done

##每天五点钟执行
if [ "${cur_hour}" == "05:00" ]; then
    
   ##自动删除60天前的文件
   find ${dir} -type f -name "*.sql.${cur_date2}" -mtime +60 -print | xargs rm -f

cd ${dir}
tar -zcvf ddlbak.${cur_date2}.tar   *.sql.${cur_date1}

fi

2.拆分备份的存储过程代码(由于gcdump备份的存储过程都存在一个sql文件中,需要单独拆分)

使用gcdump命令导出存储过程(如下简单导出)
gcdump  -ugbase -pGBase2O11O531 --routines=true -f -t -B OMRS > OMRS.sql
2.使用db2_getproc.py 分离存储过程代码(先处理导出后的sql文件,才可使用python脚本分离存储过程)
sed -i "s/\` \*\//\` /g;s/;;/\/\//g"  PROCEDURE.sql

python脚本如下:

#!/usr/bin/python
#-*- coding:utf-8 -*-

import re
import sys
import os

def split_stored_procedures(input_file, output_dir):
    # 确保输出目录存在
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)
    
    with open(input_file, 'r') as f:
        content = f.read()

    # 匹配存储过程
    pattern = re.compile(r'(DROP PROCEDURE IF EXISTS.*?DELIMITER\s*;\s*)', re.DOTALL | re.IGNORECASE)
    procedures = pattern.findall(content)

    for proc in procedures:
        # 提取存储过程名称
        name_match = re.search(r'DROP PROCEDURE IF EXISTS `([^`]+)`', proc, re.IGNORECASE)
        if not name_match:
            continue
            
        proc_name = name_match.group(1)
        print "Found procedure: %s" % proc_name

        # 标准化结束标记
        normalized_proc = re.sub(r'DELIMITER\s*;+\s*$'
                                'DELIMITER ;',
                                proc.strip(),
                                flags=re.IGNORECASE)

        # 创建输出文件路径
        output_path = os.path.join(output_dir, "%s.sql" % proc_name)
        
        # 写入文件
        with open(output_path, 'w') as f:
            f.write(normalized_proc + '\n')

if __name__ == '__main__':
    if len(sys.argv) != 3:
        print "Usage: python split_procedures.py "
        print "Example: python split_procedures.py procedures.sql ./output"
        sys.exit(1)
        
    input_file = sys.argv[1]
    output_dir = sys.argv[2]
    
    split_stored_procedures(input_file, output_dir)

 

 

评论

登录后才可以发表评论